<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://fr.buckwiki.ddns.net/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-mediawiki.toolbar.js</id>
	<title>MediaWiki:Gadget-mediawiki.toolbar.js - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://fr.buckwiki.ddns.net/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-mediawiki.toolbar.js"/>
	<link rel="alternate" type="text/html" href="https://fr.buckwiki.ddns.net/index.php?title=MediaWiki:Gadget-mediawiki.toolbar.js&amp;action=history"/>
	<updated>2026-04-05T13:50:37Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://fr.buckwiki.ddns.net/index.php?title=MediaWiki:Gadget-mediawiki.toolbar.js&amp;diff=1627&amp;oldid=prev</id>
		<title>LIMAFOX76 : Page créée avec « /**  * Interface for the classic edit toolbar.  *  * Adapted from MediaWiki Core, before it was removed from it on 2018-10-17  *  * Dependencies:  * - jquery.textSelection... »</title>
		<link rel="alternate" type="text/html" href="https://fr.buckwiki.ddns.net/index.php?title=MediaWiki:Gadget-mediawiki.toolbar.js&amp;diff=1627&amp;oldid=prev"/>
		<updated>2022-02-21T08:41:23Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « /**  * Interface for the classic edit toolbar.  *  * Adapted from MediaWiki Core, before it was removed from it on 2018-10-17  *  * Dependencies:  * - jquery.textSelection... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * Interface for the classic edit toolbar.&lt;br /&gt;
 *&lt;br /&gt;
 * Adapted from MediaWiki Core, before it was removed from it on 2018-10-17&lt;br /&gt;
 *&lt;br /&gt;
 * Dependencies:&lt;br /&gt;
 * - jquery.textSelection, used when calling insertTags() (when clicking on a button, or manually called)&lt;br /&gt;
 */&lt;br /&gt;
( function () {&lt;br /&gt;
	&amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	var toolbar, deferred, currentFocused;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Internal helper that does the actual insertion of the button into the toolbar.&lt;br /&gt;
	 *&lt;br /&gt;
	 * For backwards-compatibility, passing `imageFile`, `speedTip`, `tagOpen`, `tagClose`,&lt;br /&gt;
	 * `sampleText` and `imageId` as separate arguments (in this order) is also supported.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @private&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param {Object} button Object with the following properties.&lt;br /&gt;
	 *  You are required to provide *either* the `callback` parameter, or the three parameters&lt;br /&gt;
	 *  `tagOpen`, `tagClose` and `sampleText`, but not both (they&amp;#039;re mutually exclusive).&lt;br /&gt;
	 * @param {string} [button.imageFile] Image to use for the button.&lt;br /&gt;
	 * @param {string} button.speedTip Tooltip displayed when user mouses over the button.&lt;br /&gt;
	 * @param {Function} [button.callback] Function to be executed when the button is clicked.&lt;br /&gt;
	 * @param {string} [button.tagOpen]&lt;br /&gt;
	 * @param {string} [button.tagClose]&lt;br /&gt;
	 * @param {string} [button.sampleText] Alternative to `callback`. `tagOpen`, `tagClose` and&lt;br /&gt;
	 *  `sampleText` together provide the markup that should be inserted into page text at&lt;br /&gt;
	 *  current cursor position.&lt;br /&gt;
	 * @param {string} [button.imageId] `id` attribute of the button HTML element. Can be&lt;br /&gt;
	 *  used to define the image with CSS if it&amp;#039;s not provided as `imageFile`.&lt;br /&gt;
	 * @param {string} [speedTip]&lt;br /&gt;
	 * @param {string} [tagOpen]&lt;br /&gt;
	 * @param {string} [tagClose]&lt;br /&gt;
	 * @param {string} [sampleText]&lt;br /&gt;
	 * @param {string} [imageId]&lt;br /&gt;
	 */&lt;br /&gt;
	function insertButton( button, speedTip, tagOpen, tagClose, sampleText, imageId ) {&lt;br /&gt;
		var oldButton, $button;&lt;br /&gt;
&lt;br /&gt;
		// Backwards compatibility&lt;br /&gt;
		if ( typeof button !== &amp;#039;object&amp;#039; ) {&lt;br /&gt;
			button = {&lt;br /&gt;
				imageFile: button,&lt;br /&gt;
				speedTip: speedTip,&lt;br /&gt;
				tagOpen: tagOpen,&lt;br /&gt;
				tagClose: tagClose,&lt;br /&gt;
				sampleText: sampleText,&lt;br /&gt;
				imageId: imageId&lt;br /&gt;
			};&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( button.imageId ) {&lt;br /&gt;
			var oldButton = document.getElementById( button.imageId );&lt;br /&gt;
			if ( oldButton ) {&lt;br /&gt;
				oldButton.parentNode.removeChild( oldButton );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( button.imageFile ) {&lt;br /&gt;
			$button = $( &amp;#039;&amp;lt;img&amp;gt;&amp;#039; ).attr( {&lt;br /&gt;
				src: button.imageFile,&lt;br /&gt;
				alt: button.speedTip,&lt;br /&gt;
				title: button.speedTip,&lt;br /&gt;
				id: button.imageId || undefined,&lt;br /&gt;
				&amp;#039;class&amp;#039;: &amp;#039;mw-toolbar-editbutton&amp;#039;&lt;br /&gt;
			} );&lt;br /&gt;
		} else {&lt;br /&gt;
			$button = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).attr( {&lt;br /&gt;
				title: button.speedTip,&lt;br /&gt;
				id: button.imageId || undefined,&lt;br /&gt;
				&amp;#039;class&amp;#039;: &amp;#039;mw-toolbar-editbutton&amp;#039;&lt;br /&gt;
			} );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		$button.click( function ( e ) {&lt;br /&gt;
			e.preventDefault();&lt;br /&gt;
&lt;br /&gt;
			if ( button.callback ) {&lt;br /&gt;
				button.callback();&lt;br /&gt;
			} else {&lt;br /&gt;
				toolbar.insertTags( button.tagOpen, button.tagClose, button.sampleText );&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		getToolbar().append( $button );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Get the toolbar, lazy-creating it the first time this function is called.&lt;br /&gt;
	 *&lt;br /&gt;
	 * The result is a jQuery object, that may be empty if toolbar creation failed.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @private&lt;br /&gt;
	 * @return {jQuery}&lt;br /&gt;
	 */&lt;br /&gt;
	function getToolbar() {&lt;br /&gt;
		var $toolbar, textbox;&lt;br /&gt;
&lt;br /&gt;
		if ( !getToolbar.$cache ) {&lt;br /&gt;
			$toolbar = $( &amp;#039;#toolbar&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
			if ( !$toolbar.length ) {&lt;br /&gt;
				textbox = getTextbox();&lt;br /&gt;
				if ( textbox ) {&lt;br /&gt;
					$toolbar = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).attr( &amp;#039;id&amp;#039;, &amp;#039;toolbar&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
					// Undo #toolbar {height:22px} added by MediaWiki,&lt;br /&gt;
					// which causes troubles if the toolbar takes several lines&lt;br /&gt;
					$toolbar.css(&amp;#039;height&amp;#039;, &amp;#039;auto&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
					$toolbar.insertBefore( textbox );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			getToolbar.$cache = $toolbar;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return getToolbar.$cache;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Get the wpTextbox1 element, using a cache for performance.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @private&lt;br /&gt;
	 * @return {HTMLTextAreaElement|null}&lt;br /&gt;
	 */&lt;br /&gt;
	function getTextbox() {&lt;br /&gt;
		if ( !getTextbox.cache ) {&lt;br /&gt;
			getTextbox.cache = document.getElementById( &amp;#039;wpTextbox1&amp;#039; );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return getTextbox.cache;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * @private&lt;br /&gt;
	 * @property {jQuery.Deferred}&lt;br /&gt;
	 * Deferred object that will be resolved when the toolbar is ready to be populated.&lt;br /&gt;
	 */&lt;br /&gt;
	deferred = $.Deferred();&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * @class mw.toolbar&lt;br /&gt;
	 * @singleton&lt;br /&gt;
	 */&lt;br /&gt;
	toolbar = {&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * Add buttons to the toolbar.&lt;br /&gt;
		 *&lt;br /&gt;
		 * Takes care of race conditions and time-based dependencies by placing buttons in a queue if&lt;br /&gt;
		 * this method is called before the toolbar is created.&lt;br /&gt;
		 *&lt;br /&gt;
		 * For backwards-compatibility, passing `imageFile`, `speedTip`, `tagOpen`, `tagClose`,&lt;br /&gt;
		 * `sampleText` and `imageId` as separate arguments (in this order) is also supported.&lt;br /&gt;
		 *&lt;br /&gt;
		 * @inheritdoc #insertButton&lt;br /&gt;
		 */&lt;br /&gt;
		addButton: function () {&lt;br /&gt;
			var buttonArguments = [].slice.call( arguments );&lt;br /&gt;
&lt;br /&gt;
			deferred.done( function () {&lt;br /&gt;
				insertButton.apply( toolbar, buttonArguments );&lt;br /&gt;
			} );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * Add multiple buttons to the toolbar (see also #addButton).&lt;br /&gt;
		 *&lt;br /&gt;
		 * Example usage:&lt;br /&gt;
		 *&lt;br /&gt;
		 *     addButtons( [ { .. }, { .. }, { .. } ] );&lt;br /&gt;
		 *     addButtons( { .. }, { .. } );&lt;br /&gt;
		 *&lt;br /&gt;
		 * @param {...Object|Array} [buttons] An array of button objects or the first&lt;br /&gt;
		 *  button object in a list of variadic arguments.&lt;br /&gt;
		 */&lt;br /&gt;
		addButtons: function ( buttons ) {&lt;br /&gt;
			if ( !Array.isArray( buttons ) ) {&lt;br /&gt;
				buttons = [].slice.call( arguments );&lt;br /&gt;
			}&lt;br /&gt;
			buttons.forEach( function ( button ) {&lt;br /&gt;
				this.addButton( button );&lt;br /&gt;
			} );&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * Apply tagOpen/tagClose to selection in currently focused textarea.&lt;br /&gt;
		 *&lt;br /&gt;
		 * Uses `sampleText` if selection is empty.&lt;br /&gt;
		 *&lt;br /&gt;
		 * @param {string} tagOpen&lt;br /&gt;
		 * @param {string} tagClose&lt;br /&gt;
		 * @param {string} sampleText&lt;br /&gt;
		 */&lt;br /&gt;
		insertTags: function ( tagOpen, tagClose, sampleText ) {&lt;br /&gt;
			var target = this.getCurrentFocused();&lt;br /&gt;
			if ( !target ) {&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			$( target ).textSelection(&lt;br /&gt;
				&amp;#039;encapsulateSelection&amp;#039;, {&lt;br /&gt;
					pre: tagOpen || &amp;#039;&amp;#039;,&lt;br /&gt;
					peri: sampleText || &amp;#039;&amp;#039;,&lt;br /&gt;
					post: tagClose || &amp;#039;&amp;#039;&lt;br /&gt;
				}&lt;br /&gt;
			);&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * Get the element whose selection is to be manipulated.&lt;br /&gt;
		 *&lt;br /&gt;
		 * @return {HTMLTextAreaElement|HTMLInputElement|null}&lt;br /&gt;
		 */&lt;br /&gt;
		getCurrentFocused: function () {&lt;br /&gt;
			if ( !currentFocused ) {&lt;br /&gt;
				currentFocused = getTextbox();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			return currentFocused;&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// Expose API publicly&lt;br /&gt;
	mw.toolbar = toolbar;&lt;br /&gt;
&lt;br /&gt;
	$( function ( $ ) {&lt;br /&gt;
		deferred.resolve();&lt;br /&gt;
&lt;br /&gt;
		// Apply to dynamically created textboxes as well as normal ones&lt;br /&gt;
		$( document ).on( &amp;#039;focus&amp;#039;, &amp;#039;textarea, input:text, .CodeMirror&amp;#039;, function () {&lt;br /&gt;
			if ( this.classList.contains( &amp;#039;CodeMirror&amp;#039; ) ) {&lt;br /&gt;
				// CodeMirror hooks into #wpTextbox1 for textSelection changes&lt;br /&gt;
				currentFocused = getTextbox();&lt;br /&gt;
			} else {&lt;br /&gt;
				currentFocused = this;&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>LIMAFOX76</name></author>
	</entry>
</feed>