MediaWiki:Edittools.js

From Wikiversity

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/*
  EditTools support: add a selector, change into true buttons, enable for all text input fields
  The special characters to insert are defined at [[MediaWiki:Edittools]]. Based on code from
  [[Commons:MediaWiki:Edittools.js]].
*/
(function () {
mw.loader.load('//commons.wikimedia.org/w/index.php?title=MediaWiki:Edittools.css&action=raw&ctype=text/css', 'text/css');
var insertTags = function (tagOpen, tagClose, sampleText) {
  var $textarea = EditTools.getTextArea ();
  if ($textarea.length !== 1) return;

  /* Usability initiative compatibility */
  if (typeof $.fn.textSelection != 'undefined') {
    $textarea.textSelection('encapsulateSelection', {
      'pre': tagOpen,
      'peri': sampleText,
      'post': tagClose
    });
  }
  return;
},

EditTools = {
  createSelector : function () {
    var $spec = $('#specialchars'),
        $sb   = $spec.find('.specialbasic');

    if ( !$spec.length || $sb.length <= 1 ) return;

    var $sel = $('<select title="select special character set">').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 .specialbasic'),
         id     = $('#specialchars select').val(),
        $wanted = $sb.eq(id);

    this.makeButtons($wanted);
    $sb.hide();
    $wanted.css('display', 'inline');
  },

  makeButtons : function ($wanted) {
    var $button;
    $wanted.find('a').each( function() {
      $button = $('<button type="button"></button>');

      $button.text( $(this).text() );
      // FIXME: Don't use onclick attribute strings. Use function callbacks instead.
      // See https://phabricator.wikimedia.org/T11424
      $button.attr('onclick', $(this).attr('onclick') );
      $(this).replaceWith($button);
      $(this).blur();
    });

    $wanted.contents().not('button').remove();
  },

  last_active_textfield : null,

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

    if (EditTools.last_active_textfield !== null) {
      $textarea = $('#' + EditTools.last_active_textfield).eq(0);
    }
    if ($textarea.length !== 1) {
      $textarea = mw.util.$content.find('textarea:first');
    }

    return $textarea;
  },

  setup : function () {
    EditTools.createSelector();
    EditTools.enableForAllFields();
  }
};

$(document).ready(function () {
  // Don't do anything if no edittools present.
  if ( $('#specialchars').length === 0 ) return;

  EditTools.setup();
});
}());