User:Gary/disambiguation navigator.js

// Generated by CoffeeScript 2.1.1 (function { /*    DISAMBIGUATION NAVIGATOR    Description: Makes navigation of disambiguation pages easier by associating      each article with a keyboard key. Click on a key, such as "5", to click on      the fifth article in a disambiguation page. Works with all numbers and      letters on the keyboard.  */  var DisambiguationLinks;

DisambiguationLinks = class DisambiguationLinks { static init { var disambigBoxes, i, j, k, keys, letters, numbers, setIndexBox; disambigBoxes = $('#disambigbox'); setIndexBox = $('#setindexbox'); if ((!disambigBoxes.length && !setIndexBox.length) || window.mw.config.get('wgCanonicalNamespace') !== '' || window.mw.config.get('wgAction') !== 'view') { return false; }     DisambiguationLinks.setCss; numbers = '1234567890'; letters = 'abcdefghijklmnopqrstuvwxyz'; // Loop through each disambiguation list item // Place either a number or letter next to each one DisambiguationLinks.setKeyForItems(letters); // 49 to 57, 48, 65 to 90 keys = {}; j = 0; k = 0; i = 49; while (i <= 57) { keys[i] = numbers.charAt(j); i++; j++; }     keys[48] = numbers.charAt(j); i = 65; while (i <= 90) { keys[i] = letters.charAt(k); i++; k++; }     // keys contains numbers and letters $.merge(keys, letters); return $('html').on('keydown', (event) => {       if (!DisambiguationLinks.isModifierKey(event) && !DisambiguationLinks.isInInputField(event)) {          DisambiguationLinks.goToDisambigLink(event, keys);          return event.preventDefault;        }      }); }

static goToDisambigLink(e, keys) { var href, id; if (!keys[e.which]) { return false; }     id = $('#disambig-link-' + keys[e.which]); href = id.attr('href'); if (!href) { return false; }     // Remove highlight from other links, then highlight the link's line $('.selected-disambig-link').removeClass('selected-disambig-link'); id.closest('li').addClass('selected-disambig-link'); // Go to the link return location.href = href; }

static isInInputField(event) { if (['INPUT', 'TEXTAREA'].indexOf(event.target.nodeName) > -1) { return true; } else { return false; }   }

static isModifierKey(event) { if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) { return true; } else { return false; }   }

static setCss { return window.mw.util.addCSS('.disambig-link { color: #777; display: inline-block; width: 20px; } .catlinks .disambig-link { display: none; } .selected-disambig-link { background-color: #ff9; }'); }

static setKeyForItems(letters) { var charIndex, listIndex; listIndex = 1; charIndex = 0; return $('#bodyContent').find('li').each(function(index, element) {       var article, links, styledLinks;        article = $(element);        // Don't use this LI if it's part of the TOC        if (article.closest('#toc').length) {          return true;        }        links = article.find('a');        styledLinks = article.find('b > a, i > a, u > a');        // There are no links in the current line.        // The first link is wrapped in another tag.        // The same as the above two but for styled links.        if ((!links.length || links.first.parent[0] !== article[0]) && (!styledLinks.length || styledLinks.first.parent.parent[0] !== article[0])) {          return true;        }        links.first.attr('id', 'disambig-link-' + listIndex);        article.prepend(' (' + listIndex + ') ');        // Increment index. Numbers from 1 to 0, then a to z. Covers 36 links. if (listIndex === 9) { listIndex = 0; } else if (listIndex === 0 || typeof listIndex === 'string') { listIndex = letters.charAt(charIndex); if (!listIndex) { return false; }         charIndex++; } else { listIndex++; }       if (listIndex === '') { return false; }     });    }

};

$(function {   return DisambiguationLinks.init;  });

}).call(this);