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

De BoyWiki
Aucun résumé des modifications
(test)
Ligne 388 : Ligne 388 :


/* Ordre alphabétique des caractères latins et équivalents non accentués */
/* Ordre alphabétique des caractères latins et équivalents non accentués */
var alphabeticordereplmap = {'a':'a','à':'a','á':'a','â':'a','ã':'a','ä':'a','å':'a','ā':'a','ă':'a','æ':'ae',
'b':'b','c':'c','ć':'c','č':'c','ç':'c','d':'d','ð':'d','e':'e','è':'e','é':'e','ê':'e','ë':'e','ē':'e','ĕ':'e','f':'f','g':'g','h':'h','ì':'i','í':'i','î':'i','ï':'i','ī':'i','':'i','ĭ':'i','j':'j','k':'k','l':'l','m':'m','n':'n','ñ':'n','o':'o','ò':'o','ó':'o','ô':'o','õ':'o','ö':'o','ō':'o','ŏ':'o','ø':'o','ǿ':'o','œ':'oe','p':'p','q':'q','r':'r','s':'s','ś':'s','š':'s','ş':'s','t':'t','u':'u','ù':'u','ú':'u','û':'u','ü':'u','ū':'u','ŭ':'u','v':'v','w':'w','x':'x','y':'y','ý':'y','z':'z','ž':'z','0':'0','1':'1','2':'2','3':'3','4':'4','5':'5','6':'6','7':'7','8':'8','9':'9',' ':'','-':''}
var alphabeticorder = 'aàáâãäåāăæbcćčçdðeèéêëēĕfghiìíîïīĭjklmnñoòóôõöōŏøǿœpqrsśšştuùúûüūŭvwxyýzž0123456789 -';
var alphabeticorder = 'aàáâãäåāăæbcćčçdðeèéêëēĕfghiìíîïīĭjklmnñoòóôõöōŏøǿœpqrsśšştuùúûüūŭvwxyýzž0123456789 -';
var alphareplcorder = 'aaaaaaaaaabccccddeeeeeeefghiiiiiiijklmnnooooooooooopqrsssstuuuuuuuvwxyyzz0123456789 -';
var alphareplcorder = 'aaaaaaaaaabccccddeeeeeeefghiiiiiiijklmnnooooooooooopqrsssstuuuuuuuvwxyyzz0123456789 -';
Ligne 396 : Ligne 399 :
   var bb = '';
   var bb = '';
   var n = Math.min(a.length,b.length);
   var n = Math.min(a.length,b.length);
   for (var i = 0; i < n ; i++) aa = aa.concat(alphareplcorder.charAt(alphabeticorder.indexOf(a[i].toLowerCase())));
   //for (var i = 0; i < n ; i++) aa = aa.concat(alphareplcorder.charAt(alphabeticorder.indexOf(a[i].toLowerCase())));
   for (var i = 0; i < n ; i++) bb = bb.concat(alphareplcorder.charAt(alphabeticorder.indexOf(b[i].toLowerCase())));
   //for (var i = 0; i < n ; i++) bb = bb.concat(alphareplcorder.charAt(alphabeticorder.indexOf(b[i].toLowerCase())));
   var n = Math.min(aa.length,bb.length);
 
   for (var i = 0; i < n ; i++) {
for (var i = 0; i < n ; i++) aa = aa.concat(alphabeticordereplmap[a[i].toLowerCase()] || a[i].toLowerCase());
      var x = alphabeticorder.indexOf(aa[i]) - alphabeticorder.indexOf(bb[i]);
for (var i = 0; i < n ; i++) bb = bb.concat(alphabeticordereplmap[b[i].toLowerCase()] || b[i].toLowerCase());
      if (x != 0) return x;
 
   }
   //var n = Math.min(aa.length,bb.length);
   //for (var i = 0; i < n ; i++) {
  //  var x = alphabeticorder.indexOf(aa[i]) - alphabeticorder.indexOf(bb[i]);
  //  if (x != 0) return x;
   //}
 
  if (aa < bb) return -1;
  if (aa > bb) return 1;
 
   // si aa bb identiques
   // si aa bb identiques
   if (a.length < b.length) return -1;
   if (a.length < b.length) return -1;

Version du 13 juillet 2013 à 20:45

/* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */


/* Fonctions importées de Wikipédia */


/**
 * Diverses fonctions manipulant les classes (utilisées par les boîtes déroulantes)
 * 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
 */

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);
}




/** 
 * Boîtes déroulantes
 *
 * Pour [[Modèle:Méta palette de navigation]]
 */

var autoCollapse = 2;
var collapseCaption = '[ Enrouler ]';
var expandCaption = '[ Dérouler ]';
 
function collapseTable( tableIndex ) {
  var Button = document.getElementById( "collapseButton" + tableIndex );
  var Table = document.getElementById( "collapsibleTable" + tableIndex );
  if ( !Table || !Button ) return false;
 
  var Rows = Table.getElementsByTagName( "tr" ); 
 
  if ( Button.firstChild.data == collapseCaption ) {
    for ( var i = 1; i < Rows.length; i++ ) {
      Rows[i].style.display = "none";
    }
    Button.firstChild.data = expandCaption;
  } else {
    for ( var i = 1; i < Rows.length; i++ ) {
      Rows[i].style.display = Rows[0].style.display;
    }
    Button.firstChild.data = collapseCaption;
  }
}
 
function createCollapseButtons() {
  var tableIndex = 0;
  var NavigationBoxes = new Object();
  var Tables = document.getElementsByTagName( "table" );
 
  for ( var i = 0; i < Tables.length; i++ ) {
    if ( hasClass( Tables[i], "collapsible" ) ) {
      NavigationBoxes[ tableIndex ] = Tables[i];
      Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );
 
      var Button     = document.createElement( "span" );
      var ButtonLink = document.createElement( "a" );
      var ButtonText = document.createTextNode( collapseCaption );
 
      Button.style.styleFloat = "right";
      Button.style.cssFloat = "right";
      Button.style.fontWeight = "normal";
      Button.style.textAlign = "right";
      Button.style.width = "6em";
 
      ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
      ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );
      ButtonLink.appendChild( ButtonText );
 
      Button.appendChild( ButtonLink );
 
      var Header = Tables[i].getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
      /* only add button and increment count if there is a header row to work with */
      if (Header) {
        Header.insertBefore( Button, Header.childNodes[0] );
        tableIndex++;
      }
    }
  }
 
  for (var i = 0; i < tableIndex; i++) {
    if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) collapseTable( i );
  }
}
addOnloadHook(createCollapseButtons);


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

var NavigationBarShowDefault = 0;
 
function toggleNavigationBar(indexNavigationBar) {
  var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);
  var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);
 
  if (!NavFrame || !NavToggle) return;
 
  // surcharge des libellés dérouler/enrouler grâce a l'attribut title
  // exemple : title="[déroulade]/[enroulade]"
  var caption = [expandCaption, collapseCaption];
  if (NavFrame.title && NavFrame.title.length > 0) {
    caption = NavFrame.title.split("/");
    if (caption.length < 2) caption.push(collapseCaption);
  }
 
  // if shown now
  if (NavToggle.firstChild.data == caption[1]) {
    for ( var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
      if (hasClass(NavChild, 'NavPic')) NavChild.style.display = 'none';
      if (hasClass(NavChild, 'NavContent')) NavChild.style.display = 'none';
      if (hasClass(NavChild, 'NavToggle')) NavChild.firstChild.data = caption[0];
    }
 
  // if hidden now
  } else if (NavToggle.firstChild.data == caption[0]) {
    for ( var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
      if (hasClass(NavChild, 'NavPic')) NavChild.style.display = 'block';
      if (hasClass(NavChild, 'NavContent')) NavChild.style.display = 'block';
      if (hasClass(NavChild, 'NavToggle')) NavChild.firstChild.data = caption[1];
    }
  }
}
 
// adds show/hide-button to navigation bars
function createNavigationBarToggleButton() {
  var indexNavigationBar = 0;
  var NavFrame;
  // iterate over all < div >-elements
  for( var i=0; NavFrame = document.getElementsByTagName("div")[i]; i++ ) {
    // if found a navigation bar
    if (hasClass(NavFrame, "NavFrame")) {
      indexNavigationBar++;
      var NavToggle = document.createElement("a");
      NavToggle.className = 'NavToggle';
      NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
      NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
 
      // surcharge des libellés dérouler/enrouler grâce a l'attribut title
      var caption = collapseCaption;
      if (NavFrame.title && NavFrame.title.indexOf("/") > 0) {
         caption = NavFrame.title.split("/")[1];
      }
 
      var NavToggleText = document.createTextNode(caption);
      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);
    }
  }
}
addOnloadHook(createNavigationBarToggleButton);


/**
 * Redéfinition fonction insertTags() de la page /w/skins/common/edit.js non éditable
 *  mise en variable de la zone de texte éditable (la version originale ne permet que textarea)
 *  (d'après Wikipedia)
 */

var currentFocused;

function insertTags(tagOpen, tagClose, sampleText) {
  var txtarea;
  if (currentFocused) {
    txtarea = currentFocused;
  } else {
    return;
  }
  var selText, isSample = false;

  if (txtarea.selectionStart || txtarea.selectionStart == '0') { // Firefox

    //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, txtarea.value.length);
    //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;

  } else if (document.selection  && document.selection.createRange) { // IE

    //save window scroll position
    if (document.documentElement && document.documentElement.scrollTop)
      var winScroll = document.documentElement.scrollTop
    else if (document.body)
      var winScroll = document.body.scrollTop;
    //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;
  }

  function checkSelectedText(){
    if (!selText) {
      selText = sampleText;
      isSample = true;
    } else if (selText.charAt(selText.length - 1) == ' ') { //exclude ending space char
      selText = selText.substring(0, selText.length - 1);
      tagClose += ' '
    }
  }
}

/* init variable currentFocused pour pages edition article */
hookEvent( 'load', function() {
  if ( document.editform ) {
    currentFocused = document.editform.wpTextbox1;
    document.editform.wpTextbox1.onfocus = function() { currentFocused = document.editform.wpTextbox1; };
    document.editform.wpSummary.onfocus = function() { currentFocused = document.editform.wpSummary; };
  }
} );


/*-----------------------------------------------------------------*/

/* Fonctions utilitaires autres */


/* Spécifique IE qui partage apparemment un unique curseur d'insertion pour tout le document */

var text_cursor_position;

/* Retourne la position du curseur dans un champ texte */
function getpositiontxtcursor(objtxtarea) {
   /* IE */
   if (!document.selection  || !document.selection.createRange) return -1;
   /* sauve le contenu avant modification */
   objtxtarea.focus();
   var oldtxt = objtxtarea.value;
   var range = document.selection.createRange();
   var oldrangetxt = range.text;
   /* chaine marqueur identifiable */
   /*var tag = String.fromCharCode(28)+String.fromCharCode(29)+String.fromCharCode(30);*/
   var tag = '§;¤;§';
   /* insère marqueur à emplacement curseur */
   range.text = oldrangetxt + tag; range.moveStart('character', (0 - oldrangetxt.length - tag.length));
   /* sauve nouvelle chaine */
   var newtxt = objtxtarea.value;
   /* reinit contenu à ancienne valeur */
   range.text = oldrangetxt;
   /* recherche marqueur dans nouvelle chaine et retourne la position */
   /*for (i=0; i <= newtxt.length; i++) {
      var sTemp = newtxt.substring(i, i + tag.length);
      if (sTemp == tag) {
         var cursorpos = (i - oldrangetxt.length);*/
      var i = newtxt.search(tag);
      var cursorpos = (i - oldrangetxt.length);
      return cursorpos;
}


/* Insère texte à position curseur */
function insertxtatcursorpos(objtxtarea,cursorpos,txt) { 
   /* IE */
   if (!document.selection  || !document.selection.createRange) return -1;
   /* si position curseur inconnue insère txt à la fin */
   if (typeof(cursorpos) == 'undefined') {
      objtxtarea.value += txt;
   }else {
      var start = objtxtarea.value.substring(0, cursorpos);
      var end = objtxtarea.value.substring(cursorpos,objtxtarea.value.length);
      objtxtarea.value = start + txt + end;
   }
}

/*-----------------------------------------------------------------*/

/* Création objet http pour requête serveur */

function createxhrobject() {
   if (window.XMLHttpRequest) { // Firefox
      return new XMLHttpRequest();
   }
   else if (window.ActiveXObject) { // IE
      return new ActiveXObject("Msxml2.XMLHTTP");
   }
   else return null;
}

/*-----------------------------------------------------------------*/

/* Ajoute un menu portlet (voir addPortletLink dans wikibits.js) */

/*   text = (string) titre du menu
*    id = (string) identifiant unique (p-cactions, p-personal, p-logo, p-navigation, p-search, p-tb : déjà utilisés)
*    nextnode = (node) pour insérer avant un menu existant, par défaut ajout à la fin (optionnel)
*/

function addPortletMenu(text, id, nextnode) {
   var marge = document.getElementById('column-one');
   if (marge == null) return;
   var menu = document.createElement('div');
   menu.className = 'portlet';
   menu.setAttribute('id', id);
   menu.innerHTML = '<h5>' + text + '</h5><div class="pBody"><ul></ul></div>';
   marge.insertBefore(menu, nextnode);
}

/*-----------------------------------------------------------------*/

/* Tri alphabétique ou par dates */

/* Ordre alphabétique des caractères latins et équivalents non accentués */
var alphabeticordereplmap = {'a':'a','à':'a','á':'a','â':'a','ã':'a','ä':'a','å':'a','ā':'a','ă':'a','æ':'ae',
'b':'b','c':'c','ć':'c','č':'c','ç':'c','d':'d','ð':'d','e':'e','è':'e','é':'e','ê':'e','ë':'e','ē':'e','ĕ':'e','f':'f','g':'g','h':'h','ì':'i','í':'i','î':'i','ï':'i','ī':'i','':'i','ĭ':'i','j':'j','k':'k','l':'l','m':'m','n':'n','ñ':'n','o':'o','ò':'o','ó':'o','ô':'o','õ':'o','ö':'o','ō':'o','ŏ':'o','ø':'o','ǿ':'o','œ':'oe','p':'p','q':'q','r':'r','s':'s','ś':'s','š':'s','ş':'s','t':'t','u':'u','ù':'u','ú':'u','û':'u','ü':'u','ū':'u','ŭ':'u','v':'v','w':'w','x':'x','y':'y','ý':'y','z':'z','ž':'z','0':'0','1':'1','2':'2','3':'3','4':'4','5':'5','6':'6','7':'7','8':'8','9':'9',' ':'','-':''}

var alphabeticorder = 'aàáâãäåāăæbcćčçdðeèéêëēĕfghiìíîïīĭjklmnñoòóôõöōŏøǿœpqrsśšştuùúûüūŭvwxyýzž0123456789 -';
var alphareplcorder = 'aaaaaaaaaabccccddeeeeeeefghiiiiiiijklmnnooooooooooopqrsssstuuuuuuuvwxyyzz0123456789 -';

/* Comparaison externe de 2 mots pour sort */
function alphacompare(a,b) {
   var aa = '';
   var bb = '';
   var n = Math.min(a.length,b.length);
   //for (var i = 0; i < n ; i++) aa = aa.concat(alphareplcorder.charAt(alphabeticorder.indexOf(a[i].toLowerCase())));
   //for (var i = 0; i < n ; i++) bb = bb.concat(alphareplcorder.charAt(alphabeticorder.indexOf(b[i].toLowerCase())));

for (var i = 0; i < n ; i++) aa = aa.concat(alphabeticordereplmap[a[i].toLowerCase()] || a[i].toLowerCase());
for (var i = 0; i < n ; i++) bb = bb.concat(alphabeticordereplmap[b[i].toLowerCase()] || b[i].toLowerCase());

   //var n = Math.min(aa.length,bb.length);
   //for (var i = 0; i < n ; i++) {
   //   var x = alphabeticorder.indexOf(aa[i]) - alphabeticorder.indexOf(bb[i]);
   //   if (x != 0) return x;
   //}

   if (aa < bb) return -1;
   if (aa > bb) return 1;

   // si aa bb identiques
   if (a.length < b.length) return -1;
   if (a.length > b.length) return 1;
   return 0;
}

/* Ordre des mois */
var datemonthorder = 'janv Janv févr Févr mars Mars avri Avri mai Mai juin Juin juil Juil août Août sept Sept octo Octo nove Nove déce Déce';

/* Comparaison externe de 2 chaines-date-mois ou ans ou siecle pour sort */
function datecymcompare(a,b) {
   var aa = a.split(' ');
   var bb = b.split(' ');
   // cas 2 années ou 2 mois
   if (aa.length==1 && bb.length==1) {
      // 2 années
      if (parseInt(a)) return parseInt(a) - parseInt(b);
      // 2 mois
      else return datemonthorder.search(a.substr(0,4)) - datemonthorder.search(b.substr(0,4));
   }
 
   // cas 2 siecles
   if (aa.length>=2 && bb.length>=2 && aa[1].match(/siècle/)) {
      if (aa[2] && aa[2].match(/AEC/)) {
         if (bb[2] && bb[2].match(/AEC/)) {return romantoarab(bb[0]) - romantoarab(aa[0]);}
         else return -1;
      } else {
         if (bb[2] && bb[2].match(/AEC/)) return 1;
         else {return romantoarab(aa[0]) - romantoarab(bb[0]);}
      }
   }

   // cas 2 dates+mois
   if (aa.length==2 && bb.length==2) {
      var dm = datemonthorder.search(aa[1].substr(0,4)) - datemonthorder.search(bb[1].substr(0,4));
      if (dm==0) return parseInt(aa[0]) - parseInt(bb[0]);
      else return dm;
   }
   // cas 1 année + 1 siecle
   // if (aa.length==1 && bb.length==2 && bb[1].match(/siècle/)) return 1;

   // cas 1 année + 1 mois
   if (aa.length==1 && bb.length==2) return -1;
   return 1;
}