Difference between revisions of "MediaWiki:Gadget-Edittools.js"

From Earthwise
Jump to navigation Jump to search
(Created page with "/** * EditTools support: add a selector, change <a> into buttons. * The special characters to insert are defined at MediaWiki:Edittools. * * @author Arnomane, 2006 (on...")
 
 
Line 12: Line 12:
 
/*global jQuery, mediaWiki*/
 
/*global jQuery, mediaWiki*/
 
(function ($, mw) {
 
(function ($, mw) {
    "use strict";
+
"use strict";
  
    var conf, editTools, $sections;
+
var conf, editTools, $sections;
  
    conf = {
+
conf = {
        initialSubset: window.EditTools_initial_subset === undefined ? window.EditTools_initial_subset : 0
+
initialSubset: window.EditTools_initial_subset === undefined ? window.EditTools_initial_subset : 0
    };
+
};
  
    editTools = {
+
editTools = {
  
        /**
+
/**
        * Creates the selector
+
* Creates the selector
        */
+
*/
        setup: function () {
+
setup: function () {
            var $container, $select, initial;
+
var $container, $select, initial;
  
            $container = $('#mw-edittools-charinsert');
+
$container = $('#mw-edittools-charinsert');
            if (!$container.length) {
+
if (!$container.length) {
                return;
+
return;
            }
+
}
            $sections = $container.find('.mw-edittools-section');
+
$sections = $container.find('.mw-edittools-section');
            if ($sections.length <= 1) {
+
if ($sections.length <= 1) {
                // Only care if there is more than one
+
// Only care if there is more than one
                return;
+
return;
            }
+
}
  
            $select = $('<select>').css('display', 'inline');
+
$select = $('<select>').css('display', 'inline');
  
            initial = conf.initialSubset;
+
initial = conf.initialSubset;
            if (isNaN(initial) || initial < 0 || initial >= $select.length) {
+
if (isNaN(initial) || initial < 0 || initial >= $select.length) {
                initial = 0;
+
initial = 0;
            }
+
}
  
            $sections.each(function (i, el) {
+
$sections.each(function (i, el) {
                var $section, sectionTitle, $option;
+
var $section, sectionTitle, $option;
  
                $section = $(el);
+
$section = $(el);
                sectionTitle = $section.data('sectionTitle');
+
sectionTitle = $section.data('sectionTitle');
  
                $option = $('<option>')
+
$option = $('<option>')
                    .text(sectionTitle)
+
.text(sectionTitle)
                    .prop('value', i)
+
.prop('value', i)
                    .prop('selected', i === initial);
+
.prop('selected', i === initial);
  
                $select.append($option);
+
$select.append($option);
            });
+
});
  
            $select.change(editTools.handleOnchange);
+
$select.change(editTools.handleOnchange);
            $container.prepend($select);
+
$container.prepend($select);
  
            editTools.chooseSection(initial);
+
editTools.chooseSection(initial);
        },
+
},
  
        /**
+
/**
        * Handle onchange event of the <select>
+
* Handle onchange event of the <select>
        *
+
*
        * @context {Element}
+
* @context {Element}
        * @param e {jQuery.Event}
+
* @param e {jQuery.Event}
        */
+
*/
        handleOnchange: function () {
+
handleOnchange: function () {
            editTools.chooseSection(Number($(this).val()));
+
editTools.chooseSection(Number($(this).val()));
  
            return true;
+
return true;
        },
+
},
  
        /**
+
/**
        * Toggle the currently visible section
+
* Toggle the currently visible section
        *
+
*
        * @param sectionNr {Number}
+
* @param sectionNr {Number}
        * @param setFocus {Boolean}
+
* @param setFocus {Boolean}
        */
+
*/
        chooseSection: function (sectionNr) {
+
chooseSection: function (sectionNr) {
            var $choise = $sections.eq(sectionNr);
+
var $choise = $sections.eq(sectionNr);
            if ($choise.length !== 1) {
+
if ($choise.length !== 1) {
                return;
+
return;
            }
+
}
  
            // Making these buttons is a little slow,
+
// Making these buttons is a little slow,
            // If we made them all at once the browser would hang
+
// If we made them all at once the browser would hang
            // for over 2 seconds, so instead we're doing it on-demand
+
// for over 2 seconds, so instead we're doing it on-demand
            // for each section. No need to do it twice thoguh, so remember
+
// for each section. No need to do it twice thoguh, so remember
            // in data whether it was done already
+
// in data whether it was done already
            if (!$choise.data('charInsert.buttonsMade')) {
+
if (!$choise.data('charInsert.buttonsMade')) {
                $choise.data('charInsert.buttonsMade', true);
+
$choise.data('charInsert.buttonsMade', true);
                editTools.makeButtons($choise);
+
editTools.makeButtons($choise);
            }
+
}
  
            $choise.show();
+
$choise.show();
            $sections.not($choise).hide();
+
$sections.not($choise).hide();
        },
+
},
  
        /**
+
/**
        * Convert the <a onclick> links to buttons in a given section.
+
* Convert the <a onclick> links to buttons in a given section.
        *
+
*
        * @param $section {jQuery}
+
* @param $section {jQuery}
        */
+
*/
        makeButtons: function ($section) {
+
makeButtons: function ($section) {
            var $links;
+
var $links;
  
            if (!$section.length) {
+
if (!$section.length) {
                return;
+
return;
            }
+
}
  
            $links = $section.find('a');
+
$links = $section.find('a');
            $links.each(function (i, a) {
+
$links.each(function (i, a) {
                var $a, button;
+
var $a, $button, start, end;
                $a = $(a);
+
$a = $(a);
                button = document.createElement('input');
+
$button = $( '<input>' ).attr( 'type', 'button' );
                button.type = 'button';
+
start = $a.data( 'mw-charinsert-start' );
                button.onclick = a.onclick;
+
end = $a.data( 'mw-charinsert-end' );
                button.value = $a.text();
+
if ( start !== undefined && end !== undefined ) {
                $a.replaceWith(button);
+
$button.click( function( e ) {
            });
+
e.preventDefault();
        }
+
$('#wpTextbox1').textSelection('encapsulateSelection', {pre: start, post: end});
 +
} );
 +
} else {
 +
$button[0].onclick = a.onclick;
 +
                                }
 +
$button[0].value = $a.text();
 +
$a.replaceWith($button);
 +
});
 +
}
  
    };
+
};
  
    $(document).ready(editTools.setup);
+
$(document).ready(editTools.setup);
  
 
}(jQuery, mediaWiki));
 
}(jQuery, mediaWiki));

Latest revision as of 14:50, 28 November 2019

/**
 * EditTools support: add a selector, change <a> into buttons.
 * The special characters to insert are defined at [[MediaWiki:Edittools]].
 *
 * @author Arnomane, 2006 (on the commons.wikimedia.org/wiki/MediaWiki:Edittools.js)
 * @author Kaganer, 2007 (adapting to www.mediawiki.org)
 * @author Krinkle, 2012
 * @source www.mediawiki.org/wiki/MediaWiki:Gadget-Edittools.js
 * @revision 2012-02-29
 */
/*jslint browser: true*/
/*global jQuery, mediaWiki*/
(function ($, mw) {
	"use strict";

	var conf, editTools, $sections;

	conf = {
		initialSubset: window.EditTools_initial_subset === undefined ? window.EditTools_initial_subset : 0
	};

	editTools = {

		/**
		 * Creates the selector
		 */
		setup: function () {
			var $container, $select, initial;

			$container = $('#mw-edittools-charinsert');
			if (!$container.length) {
				return;
			}
			$sections = $container.find('.mw-edittools-section');
			if ($sections.length <= 1) {
				// Only care if there is more than one
				return;
			}

			$select = $('<select>').css('display', 'inline');

			initial = conf.initialSubset;
			if (isNaN(initial) || initial < 0 || initial >= $select.length) {
				initial = 0;
			}

			$sections.each(function (i, el) {
				var $section, sectionTitle, $option;

				$section = $(el);
				sectionTitle = $section.data('sectionTitle');

				$option = $('<option>')
					.text(sectionTitle)
					.prop('value', i)
					.prop('selected', i === initial);

				$select.append($option);
			});

			$select.change(editTools.handleOnchange);
			$container.prepend($select);

			editTools.chooseSection(initial);
		},

		/**
		 * Handle onchange event of the <select>
		 *
		 * @context {Element}
		 * @param e {jQuery.Event}
		 */
		handleOnchange: function () {
			editTools.chooseSection(Number($(this).val()));

			return true;
		},

		/**
		 * Toggle the currently visible section
		 *
		 * @param sectionNr {Number}
		 * @param setFocus {Boolean}
		 */
		chooseSection: function (sectionNr) {
			var $choise = $sections.eq(sectionNr);
			if ($choise.length !== 1) {
				return;
			}

			// Making these buttons is a little slow,
			// If we made them all at once the browser would hang
			// for over 2 seconds, so instead we're doing it on-demand
			// for each section. No need to do it twice thoguh, so remember
			// in data whether it was done already
			if (!$choise.data('charInsert.buttonsMade')) {
				$choise.data('charInsert.buttonsMade', true);
				editTools.makeButtons($choise);
			}

			$choise.show();
			$sections.not($choise).hide();
		},

		/**
		 * Convert the <a onclick> links to buttons in a given section.
		 *
		 * @param $section {jQuery}
		 */
		makeButtons: function ($section) {
			var $links;

			if (!$section.length) {
				return;
			}

			$links = $section.find('a');
			$links.each(function (i, a) {
				var $a, $button, start, end;
				$a = $(a);
				$button = $( '<input>' ).attr( 'type', 'button' );
				start = $a.data( 'mw-charinsert-start' );
				end = $a.data( 'mw-charinsert-end' );
				if ( start !== undefined && end !== undefined ) {
					$button.click( function( e ) {
						e.preventDefault();
						$('#wpTextbox1').textSelection('encapsulateSelection', {pre: start, post: end});
					} );
				} else {
					$button[0].onclick = a.onclick;
                                }
				$button[0].value = $a.text();
				$a.replaceWith($button);
			});
		}

	};

	$(document).ready(editTools.setup);

}(jQuery, mediaWiki));