MediaWiki:Edittools.js: Difference between revisions

From MandrakeWiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
// copied from [[mw:User:Alex Smotrov/edittools.js]], modified for use on the English Wikipedia.
// <source lang="javascript">
// enableForAllFields() feature from [[commons:MediaWiki:Edittools.js]]
/*
// combined and modified by [[User:Ilmari Karonen]]
  EditTools support: add a selector, change into true buttons, enable for all text input fields
// after making changes to this page and testing them, update the number after "edittools-version-" in [[MediaWiki:Edittools]] to purge the cache for everyone
  If enabled in preferences, the script puts the buttons into the WikiEditor Toolbar
  The special characters to insert are defined at [[MediaWiki:Edittools]].
*/
   
   
if (typeof (EditTools_set_focus) == 'undefined')
/*jshint curly:false */
  var EditTools_set_focus = true;
/*global importStylesheetURI:false, jQuery:false, oldEdittools:false */
   
   
if (typeof (EditTools_set_focus_initially) == 'undefined')
( function ( $ ) {
  var EditTools_set_focus_initially = EditTools_set_focus;
"use strict";
var EditTools, insertTags;
   
   
var EditTools =
importStylesheetURI('//commons.wikimedia.org/?title=MediaWiki:Edittools.css&action=raw&ctype=text/css');
{
window.insertTags = insertTags = function (tagOpen, tagClose, sampleText) {
  charinsert : {
    var $txtarea = EditTools.getTextArea();
    'Insert': ' – — ‘+’ “+” ° ″ ′ ≈ ≠ ≤ ≥ ± − × ÷ √ ← → · §  Sign_your_posts_on_talk_pages: ~~\~~  Cite_your_sources: <ref>+</ref>',
    if ($txtarea.length !== 1) return;
    'Wiki markup': 'Insert:  – — ‘+’ “+” ° ″ ′ ≈ ≠ ≤ ≥ ± − × ÷ √ ← → · § ~~\~~ <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"|name=""}} {\{Reflist}}  <references/>  <includeonly>+</includeonly>  <noinclude>+</noinclude>  {\{DEFAULTSORT:+}}  <nowiki>+</nowiki>  <!--.+_-->  <span.class="plainlinks">+</span>',
   
    'Symbols': '~ | ¡¿†‡↔↑↓•¶  # ½⅓⅔¼¾⅛⅜⅝⅞∞  ‘+’ “+” ‹+› «+» ⟨+⟩  ¤₳฿₵¢₡₢$₫₯€₠₣ƒ₴₭₤ℳ₥₦№₧₰£៛₨₪৳₮₩¥  ♠♣♥♦  m² m³  ♭♯♮  ©®™ ◌ {\{Unicode|+}}',
    /* Usability initiative compatibility */
    '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|+}}',
    if (typeof $.fn.textSelection !== 'undefined') {
    'Greek': 'ΆάΈέΉήΊίΌόΎύΏώ  ΑαΒβΓγΔδ  ΕεΖζΗηΘθ  ΙιΚκΛλΜμ  ΝνΞξΟοΠπ  ΡρΣσςΤτΥυ  ΦφΧχΨψΩω  ᾼᾳᾴᾺὰᾲᾶᾷἈἀᾈᾀἉἁᾉᾁἌἄᾌᾄἊἂᾊᾂἎἆᾎᾆἍἅᾍᾅἋἃᾋᾃἏἇᾏᾇ  ῈὲἘἐἙἑἜἔἚἒἝἕἛἓ  ῌῃῄῊὴῂῆῇἨἠᾘᾐἩἡᾙᾑἬἤᾜᾔἪἢᾚᾒἮἦᾞᾖἭἥᾝᾕἫἣᾛᾓἯἧᾟᾗ  ῚὶῖἸἰἹἱἼἴἺἲἾἶἽἵἻἳἿἷ  ῸὸὈὀὉὁὌὄὊὂὍὅὋὃ  ῤῬῥ  ῪὺῦὐὙὑὔὒὖὝὕὛὓὟὗ  ῼῳῴῺὼῲῶῷὨὠᾨᾠὩὡᾩᾡὬὤᾬᾤὪὢᾪᾢὮὦᾮᾦὭὥᾭᾥὫὣᾫᾣὯὧᾯᾧ  {\{Polytonic|+}}',
      $txtarea.textSelection('encapsulateSelection', {
    'Cyrillic': 'АаБбВвГг  ҐґЃѓДдЂђ  ЕеЁёЄєЖж  ЗзЅѕИиІі  ЇїЙйЈјКк  ЌќЛлЉљМм  НнЊњОоПп  РрСсТтЋћ  УуЎўФфХх  ЦцЧчЏџШш  ЩщЪъЫыЬь  ЭэЮюЯя ӘәӨөҒғҖҗ ҚқҜҝҢңҮү ҰұҲҳҸҹҺһ  ҔҕӢӣӮӯҘҙ  ҠҡҤҥҪҫӐӑ  ӒӓӔӕӖӗӰӱ  ӲӳӸӹӀ  ҞҟҦҧҨҩҬҭ  ҴҵҶҷҼҽҾҿ  ӁӂӃӄӇӈӋӌ  ӚӛӜӝӞӟӠӡ  ӤӥӦӧӪӫӴӵ  ́',
        'pre': tagOpen,
    'Hebrew': 'אבגדהוזחטיךכלםמןנסעףפץצקרשת  ׳ ״  װױײ',
        'peri': sampleText,
    'Arabic': '  Transcription: ʾ ṯ ḥ ḫ ẖ ḏ š ṣ ḍ ṭ ẓ ʿ ġ ẗ ا ﺁ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه ة و ي ى ء أ إ ؤ ئ',
        'post': tagClose
    'IPA (English)': 'ˈ ˌ ŋ ɡ tʃ dʒ ʃ ʒ θ ð ʔ  iː ɪ uː ʊ ʌ ɜr eɪ ɛ æ oʊ ɒ ɔː ɔɪ ɔr ɑː ɑr aɪ aʊ  ə ər ɨ ɵ ʉ  {\{IPA-en|+}} {\{IPA|/+/}} ⟨+⟩',
      });
    'IPA': 'ʈɖɟɡɢʡʔ  ɸβθðʃʒɕʑʂʐçʝɣχʁħʕʜʢɦ  ɱɳɲŋɴ  ʋɹɻɰ  ʙⱱʀɾɽ  ɬ ɮ ɺ ɭʎʟ  ʍɥɧ  ʼ ɓɗʄɠʛ  ʘǀǃǂǁ  ɨʉɯ ɪʏʊ øɘɵɤ ə ɛœɜɞʌɔ æ ɐ ɶɑɒ  ʰʱʷʲˠˤˀ ᵊ k̚ ⁿˡ  ˈˌːˑ t̪ d̪ s̺ s̻ θ̼ s̬ n̥ ŋ̊ a̤ a̰  β̞ ˕ r̝ ˔ o˞ ɚ ɝ e̘ e̙ u̟ i̠ ɪ̈ e̽ ɔ̹ ɔ̜ n̩ ə̆ ə̯ ə̃ ȷ̃ ɫ z̴ ə̋ ə́ ə̄ ə̀ ə̏ ə̌ ə̂ ə᷄ ə᷅ ə᷇ ə᷆ ə᷈ ə᷉ t͡ʃ d͡ʒ t͜ɬ ‿  ˥ ˦ ˧ ˨ ˩ ꜛ ꜜ | ‖ ↗ ↘  k͈ s͎ {\{IPA|+}}',
      return;
    'Math and logic': '− × ÷ ⋅ ° ∗ ∘ ± ∓ ≤ ≥ ≠ ≡ ≅ ≜ ≝ ≐ ≃ ≈ ⊕ ⊗ ⇐ ⇔ ⇒ ∞ ← ↔ → ≪ ≫ ∝ √ ∤ ≀ ◅ ▻ ⋉ ⋊ ⋈ ∴ ∵ ↦ ¬ ∧ ∨ ⊻ ∀ ∃ ∈ ∉ ∋ ⊆ ⊈ ⊊ ⊂ ⊄ ⊇ ⊉ ⊋ ⊃ ⊅ ∪ ∩ ∑ ∏ ∐ ′ ∫ ∬ ∭ ∮ ∇ ∂ ∆ ∅ ℂ ℍ ℕ ℙ ℚ ℝ ℤ ℵ ⌊ ⌋ ⌈ ⌉ ⊤ ⊥ ⊢ ⊣ ⊧ □ ∠ ⟨ ⟩ {\{frac|+|}} &nbsp; &minus; <math>+</math> {\{math|+}}'
    }
  },
};
window.EditTools = EditTools = {
  createSelector: function () {
    var $spec = $('#specialchars');
    var $sb = $('#specialchars p.specialbasic');
   
   
  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 () {
  {
      EditTools.chooseCharSubset();
    appendCSS(EditTools.extraCSS);
    });
  },
   
   
    $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 +'>' + decodeURIComponent (id) + '</option>');
    });
   
   
  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 (id in charinsertCustom)
  if (!EditTools.charinsert[id]) EditTools.charinsert[id] = '';
   
   
    //create drop-down select
    var id = $('#specialchars select').val();
    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 $wanted = $sb.eq(id);
    if (window.editToolsRecall) {
    this.makeButtons($wanted);
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
    $sb.hide();
    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);
    $wanted.css('display', 'inline');
    selectSubset();
    return;
   
   
    function selectSubset ()
    {
//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'; }
  var tokens = EditTools.charinsert[id];
  if (window.charinsertCustom && charinsertCustom[id]){
      if (tokens.length > 0) tokens += ' ';
      tokens += charinsertCustom[id];
  }
  EditTools.createTokens(p, tokens);
  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, '');
    }
    return;
   
   
    function addLink (tagOpen, tagClose, name)
  bindOnClick: function ($button, _this) {
    {
    var onclick = _this.getAttribute("onclick");
        var handler;
        var dle = tagOpen.indexOf('\x10');
        if (dle > 0){
            var path = tagOpen.substring(dle+1).split('.');
            tagOpen = tagOpen.substring(0,dle);
            var handler = window;
            for (var i = 0; i < path.length; i++) {
                handler = handler[path[i]];
            }
        } else {
    tagOpen = tagOpen.replace(/\./g,' ');
    tagClose = tagClose ? tagClose.replace(/_/g,' ') : '';
            handler = new Function( "evt", "insertTags('" + tagOpen + "', '" + tagClose + "', ''); return killEvt( evt );" );
        }
var a = document.createElement('a');
name = name || tagOpen + tagClose;
name = name.replace(/\\n/g,'');
a.appendChild(document.createTextNode(name));
a.href = "#";
addHandler( a, 'click', handler );
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));
    }
  },
   
   
    // if onclick is not a function, it's not IE7, so use setAttribute
    if('function' !== typeof onclick) {
        $button[0].setAttribute('onclick', onclick); // for FF,IE8,Chrome
   
   
  enableForAllFields : function ()
    // if onclick is a function, use the IE7 method and call onclick() in the anonymous function
  {
    } else {
    if (typeof (insertTags) != 'function' || window.WikEdInsertTags) return;
        $button[0].onclick = function() {
    // insertTags from the site-wide /skins-1.5/common/edit.js just inserts in the first
            onclick();
    // textarea in the document. Evidently, that's not good if we have multiple textareas.
        }; // for IE7
    // 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,
   makeButtons: function ($wanted) {
    var $links = $wanted.find('a');
    var _this = this;
   
   
  registerTextField : function (evt)
    $links.each(function () {
  {
      var $button = $('<button type="button">');
    var e = evt || window.event;
      $button.text($(this).text());
    var node = e.target || e.srcElement;
    if (!node) return;
      _this.bindOnClick($button, this);
    EditTools.last_active_textfield = node.id;
    return true;
  },
   
   
  getTextArea : function ()
      $(this).replaceWith($button);
  {
      $(this).blur();
    var txtarea = null;
    });
    if (EditTools.last_active_textfield && EditTools.last_active_textfield != "")
    $wanted.contents().not('button').remove();
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;
   },
   },
  makeToolbarButtons: function () {
    var _this = this;
   
   
  insertTags : function (tagOpen, tagClose, sampleText)
    // Add  Edittool section
  {
    $('#wpTextbox1').wikiEditor('addToToolbar', {
    var txtarea = EditTools.getTextArea ();
      'sections': {
    if (!txtarea) return;
        'Edittools': {
          'type': 'booklet',
          'label': 'Edittools',
          'pages': {
            'Edittools1': {
              'layout': 'characters',
              'label': 'Edittools2'
            }
          }
        }
      }
    });
   
   
   
   
    /* Usability initiative compatibility */
    var $section = $('.page-Edittools1 div');
    if ( typeof $j != 'undefined' && typeof $j.fn.textSelection != 'undefined' ) {
    var $links = $('#specialchars p.specialbasic').eq(0).find('a');
          $j( txtarea ).textSelection(
    $links.each(function () {
          'encapsulateSelection', { 'pre': tagOpen, 'peri': sampleText, 'post': tagClose }
      var $button = $('<span>');
          );
      $button.text($(this).text());
          return;
    }
   
   
      _this.bindOnClick($button, this);
      $section.append($button);
    });
    $('.mw-editTools').remove();
  },
   
   
    var selText, isSample = false;
  last_active_textfield: null,
   
   
    function checkSelectedText ()
  enableForAllFields: function () {
    {
    $('textarea, input').focus(function () {
if (!selText) {
      EditTools.last_active_textfield = this.id;
  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
  getTextArea: function () {
// Save window scroll position
    var $txtarea = {};
var winScroll = 0;
    if (EditTools.last_active_textfield !== null) $txtarea = $('#' + EditTools.last_active_textfield).eq(0);
if (document.documentElement && document.documentElement.scrollTop)
    if ($txtarea.length !== 1) {
  winScroll = document.documentElement.scrollTop;
      $txtarea = $('#bodyContent textarea').eq(0);
else if (document.body)
    }
  winScroll = document.body.scrollTop;
    return $txtarea;
// 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 ()
   registerTextField : function (evt)
   {
   {
    var placeholder = document.getElementById("editpage-specialchars");
    var e = evt || window.event;
    if (!placeholder) return;  // has this already been run once?
    var node = e.target || e.srcElement;
    EditTools.appendExtraCSS ();
    if (!node) return;
    EditTools.createEditTools (placeholder);
    EditTools.last_active_textfield = node.id;
    EditTools.enableForAllFields ();
    return true;
  },
   
  setup: function () {
    //Decide whether to use the toolbar or the bottom div
    if ( ( typeof oldEdittools !== 'undefined' && oldEdittools === true ) || $('#wpUploadDescription').length || !$.wikiEditor || !$.wikiEditor.isSupported()) {
      EditTools.createSelector();
      EditTools.enableForAllFields();
    } else {
      EditTools.makeToolbarButtons();
      EditTools.enableForAllFields();
    }
   }
   }
};
}; // end EditTools
$(document).ready(function () {
    if ( $('#specialchars').length !== 1 ) return; // Don't do anything if no edittools present.
// No need to hook this, as the loading of this page is itself hooked.
    EditTools.setup();
EditTools.setup();
});
// </source>
}( jQuery ));

Revision as of 16:24, 13 March 2012

// <source lang="javascript">
/*
  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]].
*/
 
/*jshint curly:false */
/*global importStylesheetURI:false, jQuery:false, oldEdittools:false */
 
( function ( $ ) {
"use strict";
var EditTools, insertTags;
 
importStylesheetURI('//commons.wikimedia.org/?title=MediaWiki:Edittools.css&action=raw&ctype=text/css');
window.insertTags = insertTags = function (tagOpen, tagClose, sampleText) {
    var $txtarea = EditTools.getTextArea();
    if ($txtarea.length !== 1) return;
 
    /* Usability initiative compatibility */
    if (typeof $.fn.textSelection !== 'undefined') {
      $txtarea.textSelection('encapsulateSelection', {
        'pre': tagOpen,
        'peri': sampleText,
        'post': tagClose
      });
      return;
    }
};
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 +'>' + decodeURIComponent (id) + '</option>');
    });
 
    $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, _this) {
    var onclick = _this.getAttribute("onclick");
 
    // if onclick is not a function, it's not IE7, so use setAttribute
    if('function' !== typeof onclick) { 
        $button[0].setAttribute('onclick', onclick); // for FF,IE8,Chrome
 
    // if onclick is a function, use the IE7 method and call onclick() in the anonymous function
    } else {
        $button[0].onclick = function() {
            onclick();
        }; // for IE7
    }
  },
 
  makeButtons: function ($wanted) {
    var $links = $wanted.find('a');
    var _this = this;
 
    $links.each(function () {
      var $button = $('<button type="button">');
      $button.text($(this).text());
 
      _this.bindOnClick($button, this);
 
      $(this).replaceWith($button);
      $(this).blur();
    });
    $wanted.contents().not('button').remove();
  },
  makeToolbarButtons: function () {
    var _this = this;
 
    // Add  Edittool section
    $('#wpTextbox1').wikiEditor('addToToolbar', {
      'sections': {
        'Edittools': {
          'type': 'booklet',
          'label': 'Edittools',
          'pages': {
            'Edittools1': {
              'layout': 'characters',
              'label': 'Edittools2'
            }
          }
        }
      }
    });
 
 
    var $section = $('.page-Edittools1 div');
    var $links = $('#specialchars p.specialbasic').eq(0).find('a');
    $links.each(function () {
      var $button = $('<span>');
      $button.text($(this).text());
 
      _this.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 ( ( typeof oldEdittools !== 'undefined' && oldEdittools === true ) || $('#wpUploadDescription').length || !$.wikiEditor || !$.wikiEditor.isSupported()) {
      EditTools.createSelector();
      EditTools.enableForAllFields();
    } else {
      EditTools.makeToolbarButtons();
      EditTools.enableForAllFields();
    }
  }
};
$(document).ready(function () {
    if ( $('#specialchars').length !== 1 ) return; // Don't do anything if no edittools present.
    EditTools.setup();
});
// </source>
}( jQuery ));