Aller au contenu

« MediaWiki:Common.js » : différence entre les versions

Une page de Wikiquote, le recueil des citations libres.
Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Copie de WP demandée sur Wikiquote:Requête_aux_administrateurs#Interface_et_gadgets pour faire fonctionner un modèle utilisé
Ligne 524 : Ligne 524 :
}
}
} );
} );

/**
* Transformer les pages du Bistro, du BA et les pages spécifiées en page de discussion
*/
if ( mw.config.get( 'wgNamespaceNumber' ) >= 2 ) {
$( function ( $ ) {
if ( $( '#transformeEnPageDeDiscussion' ).length ) {
$( 'body' ).removeClass( 'ns-subject' ).addClass( 'ns-talk' );
}
} );
}

Version du 30 août 2023 à 22:20

//<pre>
/**
 * Diverses fonctions manipulant les classes
 * Utilise des expressions régulières et un cache pour de meilleures perfs
 * isClass et whichClass depuis http://fr.wikibooks.org/w/index.php?title=MediaWiki:Common.js&oldid=140211
 * hasClass, addClass, removeClass et eregReplace depuis http://drupal.org.in/doc/misc/drupal.js.source.html
 * surveiller l'implémentation de .classList http://www.w3.org/TR/2008/WD-html5-diff-20080122/#htmlelement-extensions
 */

// Récupère proprement le contenu textuel d'un nœud et de ses nœuds descendants
// Copyright Harmen Christophe, http://openweb.eu.org/articles/validation_avancee, CC
function getTextContent(oNode) {
  if (typeof(oNode.textContent)!="undefined") return oNode.textContent;
  switch (oNode.nodeType) {
    case 3: // TEXT_NODE
    case 4: // CDATA_SECTION_NODE
      return oNode.nodeValue;
    case 7: // PROCESSING_INSTRUCTION_NODE
    case 8: // COMMENT_NODE
      if (getTextContent.caller!=getTextContent) return oNode.nodeValue;
      break;
    case 9: // DOCUMENT_NODE
    case 10: // DOCUMENT_TYPE_NODE
    case 12: // NOTATION_NODE
      return null;
  }
  var _textContent = "";
  oNode = oNode.firstChild;
  while (oNode) {
    _textContent += getTextContent(oNode);
    oNode = oNode.nextSibling;
  }
  return _textContent;
}

/**
 * insertAfter : insérer un élément dans une page
 */
function insertAfter(parent, node, referenceNode)
{ parent.insertBefore(node, referenceNode.nextSibling); }

function isClass(element, classe) {
    return hasClass(element, classe);
}
 
function whichClass(element, classes) {
    var s=" "+element.className+" ";
    for(var i=0;i<classes.length;i++)
        if (s.indexOf(" "+classes[i]+" ")>=0) return i;
    return -1;
}
 
function hasClass(node, className) {
  if (node.className == className) {
    return true;
  }
  var reg = new RegExp('(^| )'+ className +'($| )')
  if (reg.test(node.className)) {
    return true;
  }
  return false;
}
 
function addClass(node, className) {
    if (hasClass(node, className)) {
        return false;
    }
    node.className += ' '+ className;
    return true;
}
 
function removeClass(node, className) {
  if (!hasClass(node, className)) {
    return false;
  }
  node.className = eregReplace('(^|\\s+)'+ className +'($|\\s+)', ' ', node.className);
  return true;
}
 
function eregReplace(search, replace, subject) {
    return subject.replace(new RegExp(search,'g'), replace);
}


// ============================================================
// BEGIN Enable multiple onload functions

// setup onload functions this way:
// aOnloadFunctions[aOnloadFunctions.length] = function_name; // without brackets!

if (!window.aOnloadFunctions) {
  var aOnloadFunctions = new Array();
}

window.onload = function() {
  if (window.aOnloadFunctions) {
    for (var _i=0; _i<aOnloadFunctions.length; _i++) {
      aOnloadFunctions[_i]();
    }
  }
}

// END Enable multiple onload functions
// ============================================================
function addLoadEvent(func) 
{
  if (window.addEventListener) 
    window.addEventListener("load", func, false);
  else if (window.attachEvent) 
    window.attachEvent("onload", func);
}

/* </pre>

=== Navigation interprojet ===

<pre>*/

// Initialisation de la navigation interprojets (code adapté de de:wikt:Mediawiki:monobook.js)

$( 'body' ).append( $.parseHTML(
	'<style type="text/css">#interProject {display: none; speak: none;} #p-tb .pBody {padding-right: 0;}<\/style>'
) );

 function iProject() {
  if (document.getElementById("interProject")) {
   var iProject = document.getElementById("interProject").innerHTML;
   var interProject = document.createElement("div");
   interProject.style.marginTop = "0.7em";
   interProject.innerHTML = '<h5>Autres projets<\/h5><div class="pBody">'+iProject+'<\/div>';
   document.getElementById("p-tb").appendChild(interProject);
  }
 }
 $( iProject );

// Navigation interprojets

/**
 * Permet d'ajouter d'un jeu de caractères spéciaux dans le menu déroulant
 * paramètres :
 * - nom du jeu de caractères
 * - contenu HTML. Les caractères spéciaux doivent être dans des spans
 *   exemple : "caractères : <span>â ê î ô û</span>"
 */
function addSpecialCharsetHTML(title, charsHTML) {
  var specialchars = document.getElementById('specialcharsets');
  if (!specialchars) return;
 
  // Ajout des caractères spéciaux. Les liens seront initialisé par initializeCharSubset()
  // lors de la sélection
  var specialcharsets = document.getElementById('specialcharsets');
  var p = document.createElement("p");
  p.style.display = "none";
  p.title = title;
  p.innerHTML = charsHTML;
  specialcharsets.appendChild(p);
}
 
/**
 * Permet d'ajouter d'un jeu de caractères spéciaux dans le menu déroulant
 * paramètres :
 * - nom du jeu de caractères
 * - caractères spéciaux
 * exemple d'utilisation : addSpecialCharset("Français", "â ê î ô û");
 */
function addSpecialCharset(title, chars) {
  addSpecialCharsetHTML(title, "<span>" + chars + "</span>");
}
/*</pre>

=== Boites déroulantes ===
<pre> */

// set up the words in your language
var NavigationBarHide = 'Enrouler';
var NavigationBarShow = 'Dérouler';

// set up max count of Navigation Bars on page,
// if there are more, all will be hidden
// NavigationBarShowDefault = 0; // all bars will be hidden
// NavigationBarShowDefault = 1; // on pages with more than 1 bar all bars will be hidden
var NavigationBarShowDefault = 0;


// shows and hides content and picture (if available) of navigation bars
// Parameters:
//     indexNavigationBar: the index of navigation bar to be toggled
function toggleNavigationBar(indexNavigationBar)
{
    var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);
    var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);

    if (!NavFrame || !NavToggle) {
        return false;
    }

    // if shown now
    if (NavToggle.firstChild.data == NavigationBarHide) {
        for (
                var NavChild = NavFrame.firstChild;
                NavChild != null;
                NavChild = NavChild.nextSibling
            ) {
            if (NavChild.className == 'NavPic') {
                NavChild.style.display = 'none';
            }
            if (NavChild.className == 'NavContent') {
                NavChild.style.display = 'none';
            }
            if (NavChild.className == 'NavToggle') {
                NavChild.firstChild.data = NavigationBarShow;
            }
        }

    // if hidden now
    } else if (NavToggle.firstChild.data == NavigationBarShow) {
        for (
                var NavChild = NavFrame.firstChild;
                NavChild != null;
                NavChild = NavChild.nextSibling
            ) {
            if (NavChild.className == 'NavPic') {
                NavChild.style.display = 'block';
            }
            if (NavChild.className == 'NavContent') {
                NavChild.style.display = 'block';
            }
            if (NavChild.className == 'NavToggle') {
                NavChild.firstChild.data = NavigationBarHide;
            }
        }
    }
}

// adds show/hide-button to navigation bars
function createNavigationBarToggleButton()
{
    var indexNavigationBar = 0;
    // iterate over all <div>-elements
    for(
            var i=0; 
            NavFrame = document.getElementsByTagName("div")[i]; 
            i++
        ) {
        // if found a navigation bar
        if (NavFrame.className == "NavFrame") {

            indexNavigationBar++;
            var NavToggle = document.createElement("a");
            NavToggle.className = 'NavToggle';
            NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
            NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');

            var NavToggleText = document.createTextNode(NavigationBarHide);
            NavToggle.appendChild(NavToggleText);

            // add NavToggle-Button as first div-element 
            // in <div class="NavFrame">
            NavFrame.insertBefore(
                NavToggle,
                NavFrame.firstChild
            );
            NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
        }
    }
    // if more Navigation Bars found than Default: hide all
    if (NavigationBarShowDefault < indexNavigationBar) {
        for(
                var i=1; 
                i<=indexNavigationBar; 
                i++
        ) {
            toggleNavigationBar(i);
        }
    }

}

aOnloadFunctions[aOnloadFunctions.length] = createNavigationBarToggleButton;
/* NOUVEAUX CODE POUR LES BOUTON SUPPRIMÉS */

mw.loader.using(['mediawiki.util', 'ext.gadget.mediawiki.toolbar']).then(function() {

  if (['edit', 'submit'].indexOf(mw.config.get('wgAction')) == -1)
    return;

  $.each([
    // Format : pour chaque bouton
    // [
    //   'Texte à insérer avant la sélection', 'Texte à insérer après la sélection',
    //   'Image du bouton (après « commons/ » et sans « .png » à la fin)',
    //   'Texte apparaissant dans la bulle au survol du bouton',
    //   'Identifiant de l'image ; importance faible, mais il faut s'assurer que l'identifiant est unique, ne change pas et n'utilise ni espace, ni caractères spéciaux'
    // ],
    [
     '<!--', '-->',
      '3/37/Btn_toolbar_commentaire',
      'Commentaire',
      'Commentaire'
    ],
    [
     '[[Catégorie:', ']]',
      'b/b4/Button_category03',
      'Catégorie',
      'Nom de la catégorie'
    ],
    [
     '{{', '}}',
      'e/eb/Button_plantilla',
      'Balise modèle',
      'Nom du modèle'
    ],
    [
     '{{w|','}}',
      '6/65/Button_wikificare',
      'Lien vers le portail ou la catégorie',
      'Titre'
    ],
    [
     '{{autres projets','\n|w=\n|w-it=\n|w-en=\n|w-es=\n|w-de=\n|w-ca=\n|w-pt=\n|s=\n|wikt=\n|b=\n|n=\n|v=\n|wikispecies=\n|commons=\n|m=\n}}',
      '4/4c/Button_interprojet',
      'Lien interprojet',
      'Étiquette'
    ],
    [
     '{{Citation|','}}',
      '4/44/Button_comillas_latinas',
      'Citation',
      'Texte de la citation'
    ],
    [
     ,'&nbsp\;',
      '4/4b/Button_nbsp',
      'Espace insécable',
      ''
    ],
    [
     '<s>','</s>',
      '3/30/Btn_toolbar_rayer',
      'Rayer',
      ''
    ],
    [
     '#REDIRECT[[',']]',
      'c/c8/Button_redirect',
      'Redirection',
      'Nom de la destination'
    ],
    [
     '{{citation|citation=','\n|original=\n|langue=\n|précisions=\n}}',
      'e/e2/Button_contexto',
      'Modèle Citation',
      'Texte de la citation'
    ],
    [
     '{{Réf Livre|titre=','\n|auteur=\n|éditeur=\n|année=\n|page=\n|tome=\n|partie=\n|chapitre=\n|acte=\n|scène=\n|section=\n|ISBN=\n|traducteur=\n|année d’origine=\n|collection=\n|auteur de la contribution=\n|titre de la contribution=\n|traducteur de la contribution=\n|année de la contribution=\n|vers=\n|s=\n|langue=\n}}',
      '0/02/Button_fuente_primaria',
      'Source Livre',
      'Titre du livre'
    ],
    [
     '{{Réf Article\n|titre=','\n|auteur=\n|publication=\n|numéro=\n|date=\n|page=\n|ISSN=\n|ISBN=\n|s=\n}}',
      '3/38/Button_plume',
      'Source Article',
      'Titre de l’article'
    ],
    [
     '{{Réf Film|titre=','\n|auteur=\n|date=\n|acteur=\n}}',
      '9/9a/Button_references',
      'Source Film',
      'Titre du film'
    ],
    [
     '{{Réf Série\n|acteur=','\n|auteur=\n|traducteur=\n|série=\n|saison=\n|épisode=\n|langue=\n|diffusion=\n|diffuseur=\n}}',
      'b/be/Topdown',
      'Source Série',
      'Nom de l’acteur'
    ],
    [
     '{{Réf Chanson|titre=','\n|auteur=\n|interprète=\n|album=\n|date=\n|label=\n|traducteur=\n}}',
      'b/b0/Button_note',
      'Source Chanson',
      'Titre de la chanson'
    ],
    [
     '{{Réf Émission|émission=','\n|auteur=\n|diffuseur=\n|date=\n|langue=\n}}',
      '8/82/Button_publication',
      'Source Émission',
      'Titre de l’émission'
    ],
    [
     '{{Réf Pub|nom=','\n|date=\n|lieu=\n|source=\n|parution=\n|auteur=\n|précision=\n}}',
      'f/fb/Button_references2_new',
      'Source discours',
      'Nom de l’auteur'
    ],
    [
     '{{Réf Jeu vidéo|titre=','\n|auteur=\n|éditeur=\n|développeur=\n|date=\n|personnage=\n}}',
      '1/11/Button_source_jv',
      'Source jeu vidéo',
      'Nom du jeu vidéo'
    ],
    [
     '{{Personnage|','}}',
      '2/29/Button_user',
      'Modèle Personnage',
      'Nom du Personnage'
    ],
    [
     '{{romain|','}}',
      '4/4e/Button_romain',
      'Modèle Romain',
      'Texte à mettre en caractères romains'
    ],
    [
     '<br />','',
      '1/13/Button_enter',
      'Aller à la ligne',
      ''
    ],
    [
     '<poem>\n','\n</poem>',
      '8/8f/Button_poeme',
      'Poésie',
      'Texte'
    ],
], function(_, button) {
    mw.toolbar.addButton('//upload.wikimedia.org/wikipedia/commons/' + button[2] + '.png', button[3], button[0], button[1], (button[0] ? button[4] : ''), 'mw-editbutton-' + button[4]);
  });

});
/*
    [
     '','',
      '',
      '',
      ''
    ],
*/
//</pre>

/**
 * Pour [[Modèle:Boîte déroulante]]
 */

var BoiteDeroulante_Derouler = '[afficher]';
var BoiteDeroulante_Enrouler = '[masquer]';

function BoiteDeroulante_toggle(NavToggle){
	var NavFrame = NavToggle.parentNode;

	var caption = [];
	caption[0] = NavFrame.dataset.boiteDeroulanteDerouler;
	caption[1] = NavFrame.dataset.boiteDeroulanteEnrouler;

	var $NavContent = $(NavFrame).find('.NavContent').first();

	if ( NavToggle.textContent === caption[1] ) {
		NavToggle.textContent = caption[0];
		$NavContent.hide();
	} else {
		NavToggle.textContent = caption[1];
		$NavContent.show();
	}
}

function BoiteDeroulante( $content ) {

	$content.find( '.NavFrame' ).each( function ( _, NavFrame ) {
		var CustomTexts, Derouler, Enrouler, NavToggle;

		if (NavFrame.title && NavFrame.title.indexOf("/") !== -1) {
			CustomTexts = NavFrame.title.split("/");
			Derouler = CustomTexts[0];
			Enrouler = CustomTexts[1];
		} else {
			Derouler = BoiteDeroulante_Derouler;
			Enrouler = BoiteDeroulante_Enrouler;
		}
		NavFrame.title = '';
		NavFrame.dataset.boiteDeroulanteDerouler = Derouler;
		NavFrame.dataset.boiteDeroulanteEnrouler = Enrouler;

		NavToggle = document.createElement("a");
		NavToggle.className = 'NavToggle';
		NavToggle.href = 'javascript:';
		NavToggle.onclick = function (e) {
			e.preventDefault();
			BoiteDeroulante_toggle(e.target);
		};
		NavToggle.textContent = Enrouler;

		NavFrame.insertBefore(NavToggle, NavFrame.firstChild);

		BoiteDeroulante_toggle(NavToggle);
	} );

	// permet de dérouler/enrouler les boîtes en cliquant n'importe où sur l'entête
	$content.find( '.NavHead' )
		.click( function ( e ) {
			if ( $( e.target ).closest( 'a' ).length ) {
				return;
			}
			var toggle = $( this ).siblings( 'a.NavToggle' )[0];
			if ( toggle ) {
				toggle.click(); // pas du jquery, mais du vanilla js
			}
		} )
		.css( 'cursor', 'pointer' );
}

mw.hook( 'wikipage.content' ).add( BoiteDeroulante );


/**
 * Fonctionnement du [[Modèle:Animation]]
 * Le JavaScript principal se situe dans [[MediaWiki:Gadget-Diaporama.js]]
 */
mw.hook( 'wikipage.content' ).add( function ( $content ) {
	if ( $content.find( '.diaporama' ).length ) {
		mw.loader.using( 'ext.gadget.Diaporama', function () {
			Diaporama_Init( $content );
		} );
	}
} );

/**
 * Transformer les pages du Bistro, du BA et les pages spécifiées en page de discussion
 */
if ( mw.config.get( 'wgNamespaceNumber' ) >= 2 ) {
	$( function ( $ ) {
		if ( $( '#transformeEnPageDeDiscussion' ).length ) {
			$( 'body' ).removeClass( 'ns-subject' ).addClass( 'ns-talk' );
		}
	} );
}