Difference between revisions of "MediaWiki:Edittools.js"

From Biowikifarm Metawiki
Jump to: navigation, search
m (https://species-id.net/o/index.php?title=MediaWiki:Edittools.js&oldid=120549)
m (local get of MediaWiki:Edittools.css)
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
// Code here is modified after [http://en.wikipedia.org/wiki/MediaWiki:Edittools.js Wikipedia],
+
/*
//   written by [http://en.wikipedia.org/w/index.php?title=MediaWiki:Edittools.js&action=history these authors],
+
   EditTools support
//  licensed under Creative commons (2009-07-16). Symbols are modified corresponding to updates in [[MediaWiki:Edittools]]
+
// <source lang="javascript">
+
  
if (typeof (EditTools_set_focus) === 'undefined') {
+
  Add a selector, change into true buttons, enable for all text input fields
var EditTools_set_focus = true;
+
  If enabled in preferences, the script puts the buttons into the WikiEditor Toolbar
}
+
  The special characters to insert are defined at [[MediaWiki:Edittools]].
 +
*/
 +
// <nowiki>
 +
/*jshint curly:false, white:true, indent:2 */
 +
/*global importStylesheetURI:false, jQuery:false, mediaWiki:false */
  
if (typeof (EditTools_set_focus_initially) === 'undefined') {
+
(function ($, mw) {
var EditTools_set_focus_initially = EditTools_set_focus;
+
   "use strict";
}
+
   var EditTools;
var EditTools = {
+
   charinsert : {
+
    'Insert': ' – — ♀ ♂ ← ↔ → ↗ ⚥ ≤ ≥ ≠ ≈ ≡ ± · × ÷ − µ ‚+‘ „+“ ‘+’ “+” … ° ″ ′  Sign_on_talk_pages: ~~\~~  Cite_your_sources: <ref>+</ref>',
+
    'Wiki markup': '{\{+}}  {\{\{+}}}  |  [+]  [\[+]]  [\[Category:+]]  #REDIRECT.[\[+]]  &nbsp;  <s>+</s>  <sup>+</sup>  <sub>+</sub>  <code>+</code>  <pre>+</pre>  <blockquote>+</blockquote>  <ref.name="+"/>  {\{#tag:ref|+|group="nb"}}  {\{Reflist}}  <references/>  <includeonly>+</includeonly>  <noinclude>+</noinclude>  {\{DEFAULTSORT:+}}  <nowiki>+</nowiki>  <span.class="plainlinks">+</span>',
+
    'Symbols': '− — ♀ ♂ ⚥ ≤ ≥ ≠ ≈ ≡ ± · × ÷ − ∅ µ © ® ™ † |: ’ ‚+‘ „+“ »+« ›+‹ ‘+’ “+” «+» ‹+› |: … ° ″ ′ |: ¡ ¿ ← → ↑ ↓ ↔ ↕ ↗ |: ► ▪ • ● ♦ ♢ ¶ # ✔ ½ ⅓ ⅔ ¼ ¾ ⅛ ⅜ ⅝ ⅞ ∞ ‰ m² m³ |: ┌ ┬ ┐ └ ┴ ┘ │ ─ ├ ┼ ┤',
+
    'Math and logic:': '− × ÷ ⋅ ° ∗ ∘ ± ∓ ≤ ≥ ≠ ≡ ≅ ≜ ≝ ≐ ≃ ≈ ⊕ ⊗ ⇐ ⇔ ⇒ ∞ ← ↔ → ≪ ≫ ∝ √ ∤ ≀ ◅ ▻ ⋉ ⋊ ⋈ ∴ ∵ ↦ ¬ ∧ ∨ ⊻ ∀ ∃ ∈ ∉ ∋ ⊆ ⊈ ⊊ ⊂ ⊄ ⊇ ⊉ ⊋ ⊃ ⊅ ∪ ∩ ∑ ∏ ∐ ′ ∫ ∬ ∭ ∮ ∇ ∂ ∆ ∅ ℂ ℍ ℕ ℙ ℚ ℝ ℤ ℵ ⌊ ⌋ ⌈ ⌉ ⊤ ⊥ ⊢ ⊣ ⊧ □ ∠ ⟨ ⟩ {\{frac|+|}} &nbsp; &minus; <math>+</math> {\{math|+}}',
+
    'Latin': 'A a Á á À à  â Ä ä Ǎ ǎ Ă ă Ā ā à ã Å å Ą ą Æ æ Ǣ ǣ  B b  C c Ć ć Ċ ċ Ĉ ĉ Č č Ç ç  D d Ď ď Đ đ Ḍ ḍ Ð ð  E e É é È è Ė ė Ê ê Ë ë Ě ě Ĕ ĕ Ē ē Ẽ ẽ Ę ę Ɛ ɛ Ə ə  F f  G g Ġ ġ Ĝ ĝ Ğ ğ Ģ ģ  H h Ĥ ĥ Ħ ħ Ḥ ḥ  I i İ ı Í í Ì ì Î î Ï ï Ǐ ǐ Ĭ ĭ Ī ī Ĩ ĩ Į į  J j Ĵ ĵ  K k Ķ ķ  L l Ĺ ĺ Ŀ ŀ Ľ ľ Ļ ļ Ł ł Ḷ ḷ Ḹ ḹ  M m Ṃ ṃ  N n Ń ń Ň ň Ñ ñ Ņ ņ Ṇ ṇ Ŋ ŋ  O o Ó ó Ò ò Ô ô Ö ö Ǒ ǒ Ŏ ŏ Ō ō Õ õ Ǫ ǫ Ő ő Ø ø Œ œ  Ɔ ɔ  P p  Q q  R r Ŕ ŕ Ř ř Ŗ ŗ Ṛ ṛ Ṝ ṝ  S s Ś ś Ŝ ŝ Š š Ş ş Ṣ ṣ ß  T t Ť ť Ţ ţ Ṭ ṭ Þ þ  U u Ú ú Ù ù Û û Ü ü Ǔ ǔ Ŭ ŭ Ū ū Ũ ũ Ů ů Ų ų Ű ű Ǘ ǘ Ǜ ǜ Ǚ ǚ Ǖ ǖ  V v  W w Ŵ ŵ  X x  Y y Ý ý Ŷ ŷ Ÿ ÿ Ỹ ỹ Ȳ ȳ  Z z Ź ź Ż ż Ž ž  ß Ð ð Þ þ Ŋ ŋ Ə ə  {\{Unicode|+}}',
+
    'Greek': 'ΆάΈέΉήΊίΌόΎύΏώ  ΑαΒβΓγΔδ  ΕεΖζΗηΘθ  ΙιΚκΛλΜμ  ΝνΞξΟοΠπ  ΡρΣσςΤτΥυ  ΦφΧχΨψΩω  ᾼᾳᾴᾺὰᾲᾶᾷἈἀᾈᾀἉἁᾉᾁἌἄᾌᾄἊἂᾊᾂἎἆᾎᾆἍἅᾍᾅἋἃᾋᾃἏἇᾏᾇ  ῈὲἘἐἙἑἜἔἚἒἝἕἛἓ  ῌῃῄῊὴῂῆῇἨἠᾘᾐἩἡᾙᾑἬἤᾜᾔἪἢᾚᾒἮἦᾞᾖἭἥᾝᾕἫἣᾛᾓἯἧᾟᾗ  ῚὶῖἸἰἹἱἼἴἺἲἾἶἽἵἻἳἿἷ  ῸὸὈὀὉὁὌὄὊὂὍὅὋὃ  ῤῬῥ  ῪὺῦὐὙὑὔὒὖὝὕὛὓὟὗ  ῼῳῴῺὼῲῶῷὨὠᾨᾠὩὡᾩᾡὬὤᾬᾤὪὢᾪᾢὮὦᾮᾦὭὥᾭᾥὫὣᾫᾣὯὧᾯᾧ   {\{Polytonic|+}}',
+
    'Cyrillic': 'АаБбВвГг  ҐґЃѓДдЂђ  ЕеЁёЄєЖж  ЗзЅѕИиІі  ЇїЙйЈјКк  ЌќЛлЉљМм  НнЊњОоПп  РрСсТтЋћ  УуЎўФфХх  ЦцЧчЏџШш  ЩщЪъЫыЬь  ЭэЮюЯя ӘәӨөҒғҖҗ ҚқҜҝҢңҮү ҰұҲҳҸҹҺһ  ҔҕӢӣӮӯҘҙ  ҠҡҤҥҪҫӐӑ  ӒӓӔӕӖӗӰӱ  ӲӳӸӹӀ  ҞҟҦҧҨҩҬҭ  ҴҵҶҷҼҽҾҿ  ӁӂӃӄӇӈӋӌ  ӚӛӜӝӞӟӠӡ  ӤӥӦӧӪӫӴӵ  ́',
+
    'IPA': 'p b t d t̪ d̪ ʈɖcɟkɡqɢʡʔ  ɸβfvθðszʃʒɕʑʂʐçʝxɣχʁħʕʜʢhɦ  m ɱnn̪ɳɲŋɴ  β̞ ʋɹɻjɰ  ʙrʀɾɽ ɢ̆ ʡ̯  ll̪ɫɬɮɺɭʎ ʎ̯ ʟ ʟ̆  ʍwɥɧ  ɓɗʄɠʛ  ʘǀǃǂǁ  i y ɨʉɯu  ɪʏʊ  e øɘɵɤo  ə ɚ  ɛœɜɝɞʌɔ  æ ɐ  a ɶɑɒ  ʰʷʲˠˤⁿˡ  ˈˌːˑ ̪  {\{IPA|+}}',
+
  },
+
  
   charinsertDivider : "\240",
+
   // mw.loader.load('//commons.wikimedia.org/?title=MediaWiki:Edittools.css&action=raw&ctype=text/css', 'text/css');
 +
  mw.loader.load(
 +
    mw.config.get('wgServer')
 +
    + mw.config.get('wgScript') + '?title=MediaWiki:Edittools.css&action=raw&ctype=text/css', 'text/css'
 +
  );
 +
  window.EditTools = EditTools = {
 +
    createSelector: function () {
 +
      var $spec = $('#specialchars');
 +
      var $sb = $('#specialchars p.specialbasic');
  
  extraCSS : '\
+
       // Only care if there is more than one
    #editpage-specialchars {\
+
       if (!$spec.length || $sb.length <= 1)
       margin-top: 15px;\
+
        return;
       border-width: 1px;\
+
      border-style: solid;\
+
      border-color: #aaaaaa;\
+
      padding: 2px;\
+
    }\
+
    #editpage-specialchars a {\
+
    }\
+
    #editpage-specialchars a:hover {\
+
    }\
+
  ',
+
  
  appendExtraCSS : function () {
+
      var $sel = $('<select>');
    appendCSS(EditTools.extraCSS);
+
  },
+
  
 +
      $sel.change(function () {
 +
        EditTools.chooseCharSubset();
 +
      });
  
  cookieName : 'edittoolscharsubset',
+
      $sb.each(function (i) {
 +
        var id = $(this).attr('id').replace(/.([0-9A-F][0-9A-F])/g, '%$1').replace(/_/g, ' ');
 +
        $sel.append(
 +
          $('<option value="' + i + '"></option>').text(decodeURIComponent(id))
 +
        );
 +
      });
  
  createEditTools : function (placeholder) {
+
      $spec.prepend($sel);
    var box = document.createElement("div");
+
    box.id = "editpage-specialchars";
+
    box.title = 'Click on the character or tag to insert it into the edit window';
+
  
    //append user-defined sets
+
      this.chooseCharSubset();
    if (window.charinsertCustom) {
+
    },
      for (id1 in charinsertCustom)  
+
      if (EditTools.charinsert[id1]) {
+
        EditTools.charinsert[id1] += ' ' + charinsertCustom[id1];
+
      } else {
+
        EditTools.charinsert[id1] = charinsertCustom[id1];
+
      }
+
      // end for
+
    }
+
    //create drop-down select
+
    var prevSubset = 0, curSubset = 0;
+
    var sel = document.createElement('select'), id;
+
    for (id in EditTools.charinsert) {
+
      sel.options[sel.options.length] = new Option(id, id);
+
    }
+
    sel.selectedIndex = 0;
+
    sel.style.cssFloat = sel.style.styleFloat = 'left';
+
    sel.style.marginRight = '5px';
+
    sel.title = 'Choose character subset';
+
    sel.onchange = sel.onkeyup = selectSubset;
+
    box.appendChild(sel);
+
  
    //create "recall" switch
+
    chooseCharSubset: function () {
    if (window.editToolsRecall) {
+
      var $sb = $('#specialchars p.specialbasic');
      var recall = document.createElement('span');
+
      recall.appendChild(document.createTextNode('↕'));
+
      recall.onclick = function () {
+
        sel.selectedIndex = prevSubset;
+
        selectSubset();
+
      };
+
      with (recall.style) {
+
        cssFloat = styleFloat = 'left'; marginRight = '5px'; cursor = 'pointer';
+
      }
+
      box.appendChild(recall);
+
    }
+
  
    // load latest selection from cookies
+
      var id = $('#specialchars select').val();
    try {
+
        var cookieRe = new RegExp ("(?:^|;)\\s*" + EditTools.cookieName + "=(\\d+)\\s*(?:;|$)");
+
        var m = cookieRe.exec(document.cookie);
+
        if (m && m.length > 1 && parseInt(m[1]) < sel.options.length)
+
          sel.selectedIndex = parseInt(m[1]);
+
    } catch (err) { /* ignore */ }
+
  
    placeholder.parentNode.replaceChild(box, placeholder);
+
      var $wanted = $sb.eq(id);
    selectSubset();
+
      this.makeButtons($wanted);
    return;
+
  
    function selectSubset () {
+
      $sb.hide();
      //remember previous (for "recall" button)
+
      prevSubset = curSubset;
+
      curSubset = sel.selectedIndex;
+
      //save into cookies for persistence
+
      try {
+
        var expires = new Date ();
+
        expires.setTime( expires.getTime() + 30 * 24 * 60 * 60 * 1000 );  // + 30 days
+
        document.cookie = EditTools.cookieName + "=" + curSubset + ";path=/;expires=" + expires.toUTCString();
+
      } catch (err) { /* ignore */ }
+
      //hide other subsets
+
      var pp = box.getElementsByTagName('p') ;
+
      for (var i=0; i<pp.length; i++) {
+
        pp[i].style.display = 'none';
+
      };
+
      //show/create current subset
+
      var id = sel.options[curSubset].value;
+
      var p = document.getElementById(id);
+
      if (!p){
+
        p = document.createElement('p');
+
        p.id = id;
+
        // if (id == 'Arabic' || id == 'Hebrew'){ p.style.fontSize = '120%'; p.dir = 'rtl'; }
+
        EditTools.createTokens(p, EditTools.charinsert[id]);
+
        box.appendChild(p);
+
      }
+
      p.style.display = 'inline';
+
    }
+
  },
+
  
  createTokens : function (paragraph, str) {
+
       $wanted.css('display', 'inline');
    var tokens = str.split(' '), token, i, n;
+
    for (i = 0; i < tokens.length; i++) {
+
       token = tokens[i];
+
      n = token.indexOf('+');
+
      if (token == '' || token == '_')
+
        addText(EditTools.charinsertDivider + ' ');
+
      else if (token == '\n')
+
        paragraph.appendChild(document.createElement('br'));
+
      else if (token == '___')
+
        paragraph.appendChild(document.createElement('hr'));
+
      else if (token.charAt(token.length-1) == ':')  // : at the end means just text
+
        addBold(token);
+
      else if (n == 0) // +<tag>  ->  <tag>+</tag>
+
        addLink(token.substring(1), '</' + token.substring(2), token.substring(1));
+
      else if (n > 0) // <tag>+</tag>
+
        addLink(token.substring(0,n), token.substring(n+1));
+
      else if (token.length > 2 && token.charCodeAt(0) > 127) //a string of insertable characters
+
        for (var j=0; j < token.length; j++) addLink(token.charAt(j), '');
+
      else
+
        addLink(token, '');
+
    } // end for
+
    return;
+
  
    function addLink (tagOpen, tagClose, name) {
+
    },
      var a = document.createElement('a');
+
      tagOpen = tagOpen.replace(/\./g,' ');
+
      tagClose = tagClose ? tagClose.replace(/_/g,' ') : '';
+
      name = name || tagOpen + tagClose;
+
      name = name.replace(/\\n/g,'');
+
      a.appendChild(document.createTextNode(name));
+
      a.href = "#";
+
      addHandler( a, 'click', new Function( "evt", "insertTags('" + tagOpen + "', '" + tagClose + "', ''); return killEvt( evt );" ) );
+
      paragraph.appendChild(a);
+
      addText(' ');
+
    }
+
    function addBold (text) {
+
      var b = document.createElement('b');
+
      b.appendChild(document.createTextNode(text.replace(/_/g,' ')));
+
      paragraph.appendChild(b);
+
      addText(' ');
+
    }
+
    function addText (txt) {
+
      paragraph.appendChild(document.createTextNode(txt));
+
    }
+
  },
+
  
 +
    bindOnClick: function ($button, self) {
 +
      var onclick = self.getAttribute("onclick"),
 +
        $self = $( self ),
 +
        start,
 +
        end;
  
  enableForAllFields : function () {
+
      start = $self.data( 'mw-charinsert-start' ),
    if (typeof (insertTags) != 'function' || window.WikEdInsertTags) return;
+
      end = $self.data( 'mw-charinsert-end' );
    // insertTags from the site-wide /skins-1.5/common/edit.js just inserts in the first
+
      if ( start !== undefined && end !== undefined ) {
    // textarea in the document. Evidently, that's not good if we have multiple textareas.
+
        $button.click( function( e ) {
    // My first idea was to simply add a hidden textarea as the first one, and redefine
+
          e.preventDefault();
    // insertTags such that it copied first the last active textareas contents over to that hidden
+
          mw.toolbar.insertTags( start, end, '' );
    // field, set the cursor or selection there, let the standard insertTags do its thing, and
+
        } );
    // then copy the hidden field's text, cursor position and selection back to the currently
+
        } else {
    // active field. Unfortunately, that is just as complex as simply copying the whole code
+
          if (typeof onclick !== 'function') {
    // from wikibits to here and let it work on the right text field in the first place.
+
          // if onclick is not a function, it's not IE7, so use setAttribute
    var texts = document.getElementsByTagName ('textarea');
+
          // for FF,IE8,Chrome
    for (var i = 0; i < texts.length; i++) {
+
          $button[0].setAttribute('onclick', onclick);
      addHandler (texts[i], 'focus', EditTools.registerTextField);
+
        } else {
    }
+
          // if onclick is a function, use the IE7 method and call onclick() in the anonymous function
    // While we're at it, also enable it for input fields
+
          // for IE7
    texts = document.getElementsByTagName ('input');
+
          $button[0].onclick = function () {
    for (var i = 0; i < texts.length; i++) {
+
            onclick();
      if (texts[i].type == 'text') addHandler (texts[i], 'focus', EditTools.registerTextField);
+
          };
    }
+
        }
    insertTags = EditTools.insertTags; // Redefine the global insertTags
+
      }
  },
+
    },
  
  last_active_textfield : null,
+
    makeButtons: function ($wanted) {
 +
      var $links = $wanted.find('a');
 +
      var self = this;
  
  registerTextField : function (evt) {
+
      $links.each(function () {
    var e = evt || window.event;
+
        var $button = $('<button type="button">');
    var node = e.target || e.srcElement;
+
        $button.text($(this).text());
    if (!node) return;
+
    EditTools.last_active_textfield = node.id;
+
    return true;
+
  },
+
  
  getTextArea : function () {
+
        self.bindOnClick($button, this);
    var txtarea = null;
+
    if (EditTools.last_active_textfield && EditTools.last_active_textfield != "") {
+
      txtarea = document.getElementById (EditTools.last_active_textfield);
+
    };
+
    if (!txtarea) {
+
      // Fallback option: old behaviour
+
      if (document.editform) {
+
        txtarea = document.editform.wpTextbox1;
+
      } else {
+
        // Some alternate form? Take the first one we can find
+
        txtarea = document.getElementsByTagName ('textarea');
+
        if (txtarea.length > 0) txtarea = txtarea[0]; else txtarea = null;
+
      }
+
    }
+
    return txtarea;
+
  },
+
  
  insertTags : function (tagOpen, tagClose, sampleText) {
+
        $(this).replaceWith($button);
    var txtarea = EditTools.getTextArea ();
+
        $(this).blur();
    if (!txtarea) return;
+
      });
 +
      $wanted.contents().not('button').remove();
 +
    },
 +
    makeToolbarButtons: function () {
 +
      var self = this;
  
    /* Usability initiative compatibility */
+
      // Add  Edittool section
    if ( typeof $j != 'undefined' && typeof $j.fn.textSelection != 'undefined' ) {
+
      $('#wpTextbox1').wikiEditor('addToToolbar', {
          $j( txtarea ).textSelection(
+
        sections: {
           'encapsulateSelection', { 'pre': tagOpen, 'peri': sampleText, 'post': tagClose }
+
           'Edittools': {
          );
+
            type: 'booklet',
           return;
+
            label: 'Edittools',
    }
+
            pages: {
 +
              'Edittools1': {
 +
                layout: 'characters',
 +
                label: 'Edittools2'
 +
              }
 +
            }
 +
           }
 +
        }
 +
      });
  
  
    var selText, isSample = false;
+
      var $section = $('.page-Edittools1 div').addClass('com-editbuttons');
 +
      var $links = $('#specialchars p.specialbasic').eq(0).find('a');
 +
      $links.each(function () {
 +
        var $button = $('<span>');
 +
        $button.text($(this).text());
  
    function checkSelectedText () {
+
        self.bindOnClick($button, this);
  if (!selText) {
+
        $section.append($button);
    selText = sampleText; isSample = true;
+
      });
  } else if (selText.charAt (selText.length - 1) == ' ') { // Exclude ending space char
+
      $('.mw-editTools').remove();
    selText = selText.substring (0, selText.length - 1);
+
    },
    tagClose += ' ';
+
  }
+
    }
+
  
    if (document.selection && document.selection.createRange) { // IE/Opera
+
    last_active_textfield: null,
  // Save window scroll position
+
  var winScroll = 0;
+
  if (document.documentElement && document.documentElement.scrollTop)
+
    winScroll = document.documentElement.scrollTop;
+
  else if (document.body)
+
    winScroll = document.body.scrollTop;
+
  // Get current selection
+
  txtarea.focus();
+
  var range = document.selection.createRange();
+
  selText = range.text;
+
  // Insert tags
+
  checkSelectedText ();
+
  range.text = tagOpen + selText + tagClose;
+
  // Mark sample text as selected
+
  if (isSample && range.moveStart) {
+
    if (window.opera) tagClose = tagClose.replace (/\n/g, "");
+
    range.moveStart( 'character', - tagClose.length - selText.length);
+
    range.moveEnd ('character', - tagClose.length);
+
  }
+
  range.select ();
+
  // Restore window scroll position
+
  if (document.documentElement && document.documentElement.scrollTop)
+
    document.documentElement.scrollTop = winScroll;
+
  else if (document.body)
+
    document.body.scrollTop = winScroll;
+
    } else if (txtarea.selectionStart || txtarea.selectionStart == '0') { // Mozilla
+
  // Save textarea scroll position
+
  var textScroll = txtarea.scrollTop;
+
  // Get current selection
+
  txtarea.focus();
+
  var startPos = txtarea.selectionStart;
+
  var endPos  = txtarea.selectionEnd;
+
  selText = txtarea.value.substring (startPos, endPos);
+
  // Insert tags
+
  checkSelectedText ();
+
  txtarea.value = txtarea.value.substring (0, startPos)
+
  + tagOpen + selText + tagClose
+
  + txtarea.value.substring (endPos);
+
  // Set new selection
+
  if (isSample) {
+
    txtarea.selectionStart = startPos + tagOpen.length;
+
    txtarea.selectionEnd = startPos + tagOpen.length + selText.length;
+
  } else {
+
    txtarea.selectionStart = startPos + tagOpen.length + selText.length + tagClose.length;
+
    txtarea.selectionEnd = txtarea.selectionStart;
+
  }
+
  // Restore textarea scroll position
+
  txtarea.scrollTop = textScroll;
+
    }
+
  }, // end insertTags
+
  
  setup : function () {
+
    enableForAllFields: function () {
    var placeholder = document.getElementById("editpage-specialchars");
+
      $('textarea, input').focus(function () {
    if (!placeholder) return;  // has this already been run once?
+
        EditTools.last_active_textfield = this.id;
    EditTools.appendExtraCSS ();
+
      });
    EditTools.createEditTools (placeholder);
+
    },
    EditTools.enableForAllFields ();
+
  }
+
  
}; // end EditTools
+
    getTextArea: function () {
 +
      var $txtarea = {};
 +
      if (EditTools.last_active_textfield !== null) $txtarea = $('#' + EditTools.last_active_textfield).eq(0);
 +
      if ($txtarea.length !== 1) {
 +
        $txtarea = $('#bodyContent textarea').eq(0);
 +
      }
 +
      return $txtarea;
 +
    },
  
// Do not use addOnloadHook; it runs *before* the onload event fires. At that time, onclick or
+
    registerTextField: function (evt) {
// onfocus handlers may not yet be set up properly.
+
      var e = evt || window.event;
hookEvent ('load', EditTools.setup);
+
      var node = e.target || e.srcElement;
 +
      if (!node)
 +
        return;
 +
      EditTools.last_active_textfield = node.id;
 +
      return true;
 +
    },
  
// </source>
+
    setup: function () {
 +
      // Decide whether to use the toolbar or the bottom div
 +
      if (window.oldEdittools || mw.user.options.get('gadget-OldEdittools') === "1" || $('#wpUploadDescription').length || !$.wikiEditor || !$.wikiEditor.isSupported()) {
 +
        EditTools.createSelector();
 +
        EditTools.enableForAllFields();
 +
      } else {
 +
        EditTools.makeToolbarButtons();
 +
        EditTools.enableForAllFields();
 +
      }
 +
      if ( !mw.toolbar ) {
 +
      // `.insertTags()` required on, e.g. [[Special:Upload]]
 +
      mw.loader.load('mediawiki.toolbar');
 +
      }
 +
    }
 +
  };
 +
  $(function () {
 +
    // Don't do anything if no edittools present.
 +
    if (!$('#specialchars').length)
 +
      return;
 +
 
 +
    mw.loader.using('mediawiki.user', function () {
 +
      // Check user preferences
 +
      if (mw.user.options.get('usebetatoolbar') === 1 && "1" !== mw.user.options.get('gadget-OldEdittools')) {
 +
        mw.loader.using(['ext.wikiEditor.toolbar', 'jquery.wikiEditor.toolbar'], EditTools.setup);
 +
      } else {
 +
        EditTools.setup();
 +
      }
 +
    });
 +
  });
 +
}(jQuery, mediaWiki));
 +
// </nowiki>

Latest revision as of 10:27, 27 October 2017

/*
  EditTools support

  Add a selector, change into true buttons, enable for all text input fields
  If enabled in preferences, the script puts the buttons into the WikiEditor Toolbar
  The special characters to insert are defined at [[MediaWiki:Edittools]].
*/
// <nowiki>
/*jshint curly:false, white:true, indent:2 */
/*global importStylesheetURI:false, jQuery:false, mediaWiki:false */

(function ($, mw) {
  "use strict";
  var EditTools;

  // mw.loader.load('//commons.wikimedia.org/?title=MediaWiki:Edittools.css&action=raw&ctype=text/css', 'text/css');
  mw.loader.load( 
    mw.config.get('wgServer') 
    + mw.config.get('wgScript') + '?title=MediaWiki:Edittools.css&action=raw&ctype=text/css', 'text/css'
  );
  window.EditTools = EditTools = {
    createSelector: function () {
      var $spec = $('#specialchars');
      var $sb = $('#specialchars p.specialbasic');

      // Only care if there is more than one
      if (!$spec.length || $sb.length <= 1)
        return;

      var $sel = $('<select>');

      $sel.change(function () {
        EditTools.chooseCharSubset();
      });

      $sb.each(function (i) {
        var id = $(this).attr('id').replace(/.([0-9A-F][0-9A-F])/g, '%$1').replace(/_/g, ' ');
        $sel.append(
          $('<option value="' + i + '"></option>').text(decodeURIComponent(id))
        );
      });

      $spec.prepend($sel);

      this.chooseCharSubset();
    },

    chooseCharSubset: function () {
      var $sb = $('#specialchars p.specialbasic');

      var id = $('#specialchars select').val();

      var $wanted = $sb.eq(id);
      this.makeButtons($wanted);

      $sb.hide();

      $wanted.css('display', 'inline');

    },

    bindOnClick: function ($button, self) {
      var onclick = self.getAttribute("onclick"),
        $self = $( self ),
        start,
        end;

      start = $self.data( 'mw-charinsert-start' ),
      end = $self.data( 'mw-charinsert-end' );
      if ( start !== undefined && end !== undefined ) {
        $button.click( function( e ) {
          e.preventDefault();
          mw.toolbar.insertTags( start, end, '' );
         } );
        } else {
          if (typeof onclick !== 'function') {
          // if onclick is not a function, it's not IE7, so use setAttribute
          // for FF,IE8,Chrome
          $button[0].setAttribute('onclick', onclick);
        } else {
          // if onclick is a function, use the IE7 method and call onclick() in the anonymous function
          // for IE7
          $button[0].onclick = function () {
            onclick();
          };
        }
      }
    },

    makeButtons: function ($wanted) {
      var $links = $wanted.find('a');
      var self = this;

      $links.each(function () {
        var $button = $('<button type="button">');
        $button.text($(this).text());

        self.bindOnClick($button, this);

        $(this).replaceWith($button);
        $(this).blur();
      });
      $wanted.contents().not('button').remove();
    },
    makeToolbarButtons: function () {
      var self = this;

      // Add  Edittool section
      $('#wpTextbox1').wikiEditor('addToToolbar', {
        sections: {
          'Edittools': {
            type: 'booklet',
            label: 'Edittools',
            pages: {
              'Edittools1': {
                layout: 'characters',
                label: 'Edittools2'
              }
            }
          }
        }
      });


      var $section = $('.page-Edittools1 div').addClass('com-editbuttons');
      var $links = $('#specialchars p.specialbasic').eq(0).find('a');
      $links.each(function () {
        var $button = $('<span>');
        $button.text($(this).text());

        self.bindOnClick($button, this);
        $section.append($button);
      });
      $('.mw-editTools').remove();
    },

    last_active_textfield: null,

    enableForAllFields: function () {
      $('textarea, input').focus(function () {
        EditTools.last_active_textfield = this.id;
      });
    },

    getTextArea: function () {
      var $txtarea = {};
      if (EditTools.last_active_textfield !== null) $txtarea = $('#' + EditTools.last_active_textfield).eq(0);
      if ($txtarea.length !== 1) {
        $txtarea = $('#bodyContent textarea').eq(0);
      }
      return $txtarea;
    },

    registerTextField: function (evt) {
      var e = evt || window.event;
      var node = e.target || e.srcElement;
      if (!node)
        return;
      EditTools.last_active_textfield = node.id;
      return true;
    },

    setup: function () {
      // Decide whether to use the toolbar or the bottom div
      if (window.oldEdittools || mw.user.options.get('gadget-OldEdittools') === "1" || $('#wpUploadDescription').length || !$.wikiEditor || !$.wikiEditor.isSupported()) {
        EditTools.createSelector();
        EditTools.enableForAllFields();
      } else {
        EditTools.makeToolbarButtons();
        EditTools.enableForAllFields();
      }
      if ( !mw.toolbar ) {
      	// `.insertTags()` required on, e.g. [[Special:Upload]]
      	mw.loader.load('mediawiki.toolbar');
      }
    }
  };
  $(function () {
    // Don't do anything if no edittools present.
    if (!$('#specialchars').length)
      return;

    mw.loader.using('mediawiki.user', function () {
      // Check user preferences
      if (mw.user.options.get('usebetatoolbar') === 1 && "1" !== mw.user.options.get('gadget-OldEdittools')) {
        mw.loader.using(['ext.wikiEditor.toolbar', 'jquery.wikiEditor.toolbar'], EditTools.setup);
      } else {
        EditTools.setup();
      }
    });
  });
}(jQuery, mediaWiki));
// </nowiki>