User:Þjarkur/GregU's hotkeys.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// This defines some control-key shortcuts you can use in text fields.
// IE not supported.  See talk page for documentation.
// by Greg Ubben

// Add some control hotkeys for easily entering right-arrows (→) and other
// characters and phrases in the edit summary, edit box, or other text fields.
// hotkeys[] can be defined to augment the defaults. Type Ctrl-? to list all.

$.ready.then(function () {
  function hotkey(e) {
    if (e && e.ctrlKey && hotkeys[String.fromCharCode(e.charCode)]) {
      var newtxt = hotkeys[String.fromCharCode(e.charCode)];
      var before = this.value.slice(0, this.selectionStart);
      var after = this.value.slice(this.selectionEnd);
      var scroll = this.scrollTop;

      if (newtxt == "MENU") { // type Ctrl-? for a list
        var menu = "";
        for (var key in hotkeys) {
          var name = key.toUpperCase().replace(",", "<").replace(".", ">");
          var value = hotkeys[key].replace(/\n/g, "•").slice(0, 40);
          if (value && value != newtxt)
            menu += "\u200E" + name + " \t" + value + "\n";
        }
        alert(menu);
        return false;
      }
      //  hack to not override Ctrl-F, Ctrl-T, etc. in main text area
      //
      if (newtxt.search(/\[\[WP:|\bfix/i) >= 0 && this.id == "wpTextbox1") {
        return true;
      }
      if (newtxt.search(/^\[*\w./) >= 0 && this.id != "wpTextbox1") {
        if (before.search(/[^\s;,]$/) >= 0) before += "; ";
        if (after.search(/^[^\s;,]/) >= 0) newtxt += "; ";
      }
      this.value = before + newtxt + after;
      this.selectionStart = this.selectionEnd = before.length + newtxt.length;
      this.scrollTop = scroll; // don't lose our position
      return false;
    }
    return true;
  }

  var defaultCtrl = {
    ",": "←", // Ctrl <   left arrow
    ".": "→", // Ctrl >   right arrow
    "-": "–", // Ctrl -   en dash
    "=": "—", // Ctrl =   em dash
    "7": "&" + "nbsp;", // Ctrl &   non-breaking space
    "l": "link rename",
    "r": "reverted [[WP:VAND|vandalism]]",
    "s": "[[WP:STYLE]]",
    "/": "MENU" // special function
  };
  var fields = { wpSummary: 0, wpTextbox1: 0, wpReason: 0, wpUploadDescription: 0 };

  if (mw.config.get('wgAction') != "view") {
    if (typeof (hotkeys) == 'undefined') hotkeys = {};
    for (var key in defaultCtrl) {
      if (hotkeys[key] == null)
        hotkeys[key] = defaultCtrl[key];
    }
    for (var field in fields) {
      var f = document.getElementById(field);
      if (f) f.onkeypress = hotkey;
    }
  }
})