Difference between revisions of "MediaWiki:Edittools.js"

From Biowikifarm Metawiki
Jump to: navigation, search
(Code from http://species-id.net/wiki/MediaWiki:Edittools.js - which in turn modified code from en.wikipedia.org)
 
m (local get of MediaWiki:Edittools.css)
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 +
/*
 +
  EditTools support
  
// Code here is modified after [http://en.wikipedia.org/wiki/MediaWiki:Edittools.js Wikipedia],
+
  Add a selector, change into true buttons, enable for all text input fields
//   written by [http://en.wikipedia.org/w/index.php?title=MediaWiki:Edittools.js&action=history these authors],
+
   If enabled in preferences, the script puts the buttons into the WikiEditor Toolbar
//   licensed under Creative commons (2009-07-16). Symbols are modified corresponding to updates in [[MediaWiki:Edittools]]
+
   The special characters to insert are defined at [[MediaWiki:Edittools]].
// <source lang="javascript">
+
*/
 +
// <nowiki>
 +
/*jshint curly:false, white:true, indent:2 */
 +
/*global importStylesheetURI:false, jQuery:false, mediaWiki:false */
  
if (typeof (EditTools_set_focus) === 'undefined') {
+
(function ($, mw) {
var EditTools_set_focus = true;
+
  "use strict";
}
+
  var EditTools;
  
if (typeof (EditTools_set_focus_initially) === 'undefined') {
+
  // mw.loader.load('//commons.wikimedia.org/?title=MediaWiki:Edittools.css&action=raw&ctype=text/css', 'text/css');
var EditTools_set_focus_initially = EditTools_set_focus;
+
   mw.loader.load(
}
+
    mw.config.get('wgServer')
var EditTools = {
+
    + mw.config.get('wgScript') + '?title=MediaWiki:Edittools.css&action=raw&ctype=text/css', 'text/css'
   charinsert : {
+
  );
  charinsert : {
+
  window.EditTools = EditTools = {
    'Insert': ' – — ♀ ♂ ← ↔ → ↗ ⚥ ≤ ≥ ≠ ≈ ≡ ± · × ÷ − µ ‚+‘ „+“ ‘+’ “+” … ° ″ ′  Sign_your_posts_on_talk_pages: ~~\~~  Cite_your_sources: <ref>+</ref>',
+
    createSelector: function () {
    '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>',
+
      var $spec = $('#specialchars');
    'Symbols': '− — ♀ ♂ ⚥ ≤ ≥ ≠ ≈ ≡ ± · × ÷ − ∅ µ © ® ™ † |: ’ ‚+‘ „+“ »+« ›+‹ ‘+’ “+” «+» ‹+› |: … ° ″ ′ |: ¡ ¿ ← → ↑ ↓ ↔ ↕ ↗ |: ► ▪ • ● ♦ ♢ ¶ # ✔ ½ ⅓ ⅔ ¼ ¾ ⅛ ⅜ ⅝ ⅞ ∞ ‰ m² m³ |: ┌ ┬ ┐ └ ┴ ┘ │ ─ ├ ┼ ┤',
+
      var $sb = $('#specialchars p.specialbasic');
    '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",
+
      // Only care if there is more than one
 +
      if (!$spec.length || $sb.length <= 1)
 +
        return;
  
  extraCSS : '\
+
      var $sel = $('<select>');
    #editpage-specialchars {\
+
      margin-top: 15px;\
+
      border-width: 1px;\
+
      border-style: solid;\
+
      border-color: #aaaaaa;\
+
      padding: 2px;\
+
    }\
+
    #editpage-specialchars a {\
+
    }\
+
    #editpage-specialchars a:hover {\
+
    }\
+
  ',
+
  
  appendExtraCSS : function () {
+
      $sel.change(function () {
    appendCSS(EditTools.extraCSS);
+
        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))
 +
        );
 +
      });
  
  cookieName : 'edittoolscharsubset',
+
      $spec.prepend($sel);
  
  createEditTools : function (placeholder) {
+
      this.chooseCharSubset();
    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
+
    chooseCharSubset: function () {
    if (window.charinsertCustom) {
+
       var $sb = $('#specialchars p.specialbasic');
       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
+
      var id = $('#specialchars select').val();
    if (window.editToolsRecall) {
+
      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 $wanted = $sb.eq(id);
    try {
+
      this.makeButtons($wanted);
        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);
+
      $sb.hide();
    selectSubset();
+
    return;
+
  
    function selectSubset () {
+
      $wanted.css('display', 'inline');
      //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) {
+
     },
     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) {
+
    bindOnClick: function ($button, self) {
      var a = document.createElement('a');
+
      var onclick = self.getAttribute("onclick"),
      tagOpen = tagOpen.replace(/\./g,' ');
+
        $self = $( self ),
      tagClose = tagClose ? tagClose.replace(/_/g,' ') : '';
+
        start,
      name = name || tagOpen + tagClose;
+
        end;
      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));
+
    }
+
  },
+
  
 +
      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();
 +
          };
 +
        }
 +
      }
 +
    },
  
  enableForAllFields : function () {
+
    makeButtons: function ($wanted) {
    if (typeof (insertTags) != 'function' || window.WikEdInsertTags) return;
+
      var $links = $wanted.find('a');
    // insertTags from the site-wide /skins-1.5/common/edit.js just inserts in the first
+
      var self = this;
    // textarea in the document. Evidently, that's not good if we have multiple textareas.
+
    // My first idea was to simply add a hidden textarea as the first one, and redefine
+
    // insertTags such that it copied first the last active textareas contents over to that hidden
+
    // 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
+
    // active field. Unfortunately, that is just as complex as simply copying the whole code
+
    // from wikibits to here and let it work on the right text field in the first place.
+
    var texts = document.getElementsByTagName ('textarea');
+
    for (var i = 0; i < texts.length; i++) {
+
      addHandler (texts[i], 'focus', EditTools.registerTextField);
+
    }
+
    // While we're at it, also enable it for input fields
+
    texts = document.getElementsByTagName ('input');
+
    for (var i = 0; i < texts.length; i++) {
+
      if (texts[i].type == 'text') addHandler (texts[i], 'focus', EditTools.registerTextField);
+
    }
+
    insertTags = EditTools.insertTags; // Redefine the global insertTags
+
  },
+
  
  last_active_textfield : null,
+
      $links.each(function () {
 +
        var $button = $('<button type="button">');
 +
        $button.text($(this).text());
  
  registerTextField : function (evt) {
+
        self.bindOnClick($button, this);
    var e = evt || window.event;
+
    var node = e.target || e.srcElement;
+
    if (!node) return;
+
    EditTools.last_active_textfield = node.id;
+
    return true;
+
  },
+
  
  getTextArea : function () {
+
        $(this).replaceWith($button);
    var txtarea = null;
+
        $(this).blur();
    if (EditTools.last_active_textfield && EditTools.last_active_textfield != "") {
+
      });
      txtarea = document.getElementById (EditTools.last_active_textfield);
+
      $wanted.contents().not('button').remove();
    };
+
    },
    if (!txtarea) {
+
    makeToolbarButtons: function () {
      // Fallback option: old behaviour
+
      var self = this;
      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) {
+
      // Add  Edittool section
    var txtarea = EditTools.getTextArea ();
+
      $('#wpTextbox1').wikiEditor('addToToolbar', {
    if (!txtarea) return;
+
        sections: {
 +
          'Edittools': {
 +
            type: 'booklet',
 +
            label: 'Edittools',
 +
            pages: {
 +
              'Edittools1': {
 +
                layout: 'characters',
 +
                label: 'Edittools2'
 +
              }
 +
            }
 +
          }
 +
        }
 +
      });
  
    /* Usability initiative compatibility */
 
    if ( typeof $j != 'undefined' && typeof $j.fn.textSelection != 'undefined' ) {
 
          $j( txtarea ).textSelection(
 
          'encapsulateSelection', { 'pre': tagOpen, 'peri': sampleText, 'post': tagClose }
 
          );
 
          return;
 
    }
 
  
 +
      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());
  
    var selText, isSample = false;
+
        self.bindOnClick($button, this);
 +
        $section.append($button);
 +
      });
 +
      $('.mw-editTools').remove();
 +
    },
  
    function checkSelectedText () {
+
    last_active_textfield: null,
  if (!selText) {
+
    selText = sampleText; isSample = true;
+
  } else if (selText.charAt (selText.length - 1) == ' ') { // Exclude ending space char
+
    selText = selText.substring (0, selText.length - 1);
+
    tagClose += ' ';
+
  }
+
    }
+
  
    if (document.selection && document.selection.createRange) { // IE/Opera
+
    enableForAllFields: function () {
  // Save window scroll position
+
      $('textarea, input').focus(function () {
  var winScroll = 0;
+
        EditTools.last_active_textfield = this.id;
  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 () {
+
    getTextArea: function () {
    var placeholder = document.getElementById("editpage-specialchars");
+
      var $txtarea = {};
    if (!placeholder) return;  // has this already been run once?
+
      if (EditTools.last_active_textfield !== null) $txtarea = $('#' + EditTools.last_active_textfield).eq(0);
    EditTools.appendExtraCSS ();
+
      if ($txtarea.length !== 1) {
    EditTools.createEditTools (placeholder);
+
        $txtarea = $('#bodyContent textarea').eq(0);
    EditTools.enableForAllFields ();
+
      }
  }
+
      return $txtarea;
 +
    },
  
}; // end EditTools
+
    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;
 +
    },
  
// Do not use addOnloadHook; it runs *before* the onload event fires. At that time, onclick or
+
    setup: function () {
// onfocus handlers may not yet be set up properly.
+
      // Decide whether to use the toolbar or the bottom div
hookEvent ('load', EditTools.setup);
+
      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;
  
// </source>
+
    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>