MediaWiki:Gadget-CommonDom.js

Attention : Depuis MediaWiki 1.18 les pages se terminant avec l'extension .js ou .css sont interprétées comme des pages wiki ! En particulier les modèles (subst ou non) et les liens. Vous devez donc migrer le code source et effectuer vos changements en évitant ces éléments de syntaxe wiki (peu importe leurs emplacements dans le code source : commentaire, chaine) :

  • Double accolades ouvrantes (en particulier avec subst:) : séparer les deux accolades "{"+"{" du reste de la chaine
  • Double crochets ouvrants : même technique de séparation.
  • Signature (tildes ~ multiples) : même technique de séparation.

Note : après avoir enregistré vos préférences, vous devrez attendre que le serveur mette à jour la feuille de style globale avant de forcer le rechargement complet du cache de votre navigateur pour voir les changements.

  • Firefox / Safari : Maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ou Ctrl-R (⌘-R sur un Mac) ;
  • Google Chrome : Appuyez sur Ctrl-Maj-R (⌘-Shift-R sur un Mac) ;
  • Internet Explorer : Maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ;
  • Konqueror : Cliquez sur Actualiser ou pressez F5 ;
  • Opera : Videz le cache dans Outils → Préférences.
wgfrwikibooks_Gadget_CommonDomJsVersion = "20180404002";
/*

    Fonctions utiles pour générer une barre d'outils d'édition évoluée.

*/

function style_name(name)
{ return name.replace(/([A-Z])/g,"-$1").toLowerCase(); }

function styleName(name)
{
    var name_parts=name.split(/(-[a-z])/g);
    for(var i=0;i<name_parts.length;i++)
        if (name_parts[i].charAt(0)=='-')
            name_parts[i] = name_parts[i].substring(1).toUpperCase();
    return name_parts.join('');
}

// Obtenir la classe d'un objet
function getObjectClassName(obj)
{
    if (obj===undefined) return undefined;
    if (obj===null) return null;
    try{
    if (obj && obj.constructor && obj.constructor.toString)
    {
        var p = obj.constructor.toString().match(/function\s*(\w+)/);
        if (p && p.length == 2) return p[1];
    }}catch(e){}
    var s = obj.toString();
    if (s.substring(0,8)=="[object ") return s.substring(8,s.length-1);
    return typeof(obj);
}

/*
    Facilite la construction DOM (Document Object Model).
    def: Définition des nœuds à générer.

         DOM node -> DOM node
         "..."    -> array of DOM text node and <br/> elements
         [ "nom", { "N": "V" }, ... ]  -> <nom N="V">...</nom>
*/
function genDOM(def)
{
    while (getObjectClassName(def)=="Function") def=def();
    if (typeof(def)=="string")
    {
    	// Remplacement des \n par des <br />
    	var res=[];
    	var lines=def.split("\n");
    	for(var i=0;i<lines.length;i++)
    	{
    		if (i>0) res.push(document.createElement("br"));
    		if (lines[i].length>0) res.push(document.createTextNode(lines[i]));
    	}
        return res;
    }
    if (getObjectClassName(def)=="Array")
    {
        var e = document.createElement(def[0]);
        var j = 1;
        if ((def.length>1)&&(getObjectClassName(def[1])=="Object"))
        {
            var attrs = def[1];
            j++;
            for(name in attrs)
            {
                if ((name=="style")&&(typeof(attrs[name])=="object"))
                {
                    var styles = attrs[name];
                    for(nom in styles)
                    {
                        e.style[nom] = styles[nom];
                        var autre = styleName(nom); if (autre!=nom) e.style[autre] = styles[nom];
                        autre = style_name(nom); if (autre!=nom) e.style[autre] = styles[nom];
                    }
                }
                else if ((name.substring(0,2)=="on")&&(typeof(attrs[name])=="function"))
                    e.addEventListener(name.substring(2), attrs[name]);
                else e.setAttribute(name,attrs[name]);
            }
        }
        for(;j<def.length;j++)
        {
            var n = genDOM(def[j]);
            if (getObjectClassName(n)=="Array")
            {
                for(k=0;k<n.length;k++)
                    e.appendChild( n[k] );
            }
            else e.appendChild( n );
        }
        return e;
    }
    else return def;
}

/*
    Syntaxe :
      node, def, def, ...
*/
function appendDOM(e)
{
    for(var i=1;i<arguments.length;i++)
    {
        var n = genDOM(arguments[i]);
        if (getObjectClassName(n)=="Array")
        {
            for(k=0;k<n.length;k++)
                e.appendChild( n[k] );
        }
        else e.appendChild( n );
    }
}

function setNodeAt(e, pos, node)
{
    if (!e.hasChildNodes() || pos >= e.childNodes.length) e.appendChild(node);
    else e.insertBefore(node, e.childNodes[pos]);
} 

/*
    Syntaxe :
      node, position, def, def, ...
*/
function setDomAt(e, pos)
{
    for(var i=2;i<arguments.length;i++)
    {
        var n = genDOM(arguments[i]);
        if (getObjectClassName(n)=="Array")
        {
            for(k=0;k<n.length;k++)
                setNodeAt(e, pos++, n[k]);
        }
        else setNodeAt(e, pos++, n);
    }
}

/**
 * retourne la valeur d'un attribut html, sinon une valeur par défaut
 */
function getAttr(node, name, defvalue) {
    if (!node.attributes) return defvalue;
    var v=node.attributes.getNamedItem(name);
    return (v&&v.value.length)?v.value:defvalue;
}

function removeAllSubnodes(node)
{
    while (node.hasChildNodes())
        node.removeChild(node.lastChild);
}

function setDOM(e)
{
    removeAllSubnodes(e);
    for(var i=1;i<arguments.length;i++)
    {
        var n = genDOM(arguments[i]);
        if (getObjectClassName(n)=="Array")
        {
            for(k=0;k<n.length;k++)
                e.appendChild( n[k] );
        }
        else e.appendChild( n );
    }
}


// Retourne une version Javascript de la chaîne de caractère
function jesc(s)
{ return s.replace(/\\/g,'\\\\').replace(/"/g,'\\"').replace(/\n/g,'\\n').replace(/\t/g,'\\t').replace(/\r/g,'\\r'); }

// Retourne la valeur sous forme d'une fonction ou d'une chaine de caractères
function jvalue(v)
{ return typeof(v)=="function"?v.toString().match(/function\s*(\w+)/)[1]:'"'+jesc(v)+'"'; }

// Insertion de tag avec possibilité d'appel de fonction
function addTags(tagOpen, tagClose, sampleText)
{
    if (typeof(tagOpen)=="function") tagOpen=tagOpen();
    if (typeof(tagClose)=="function") tagClose=tagClose();
    if (typeof(sampleText)=="function") sampleText=sampleText();
    insertTags(tagOpen,tagClose,sampleText);
}

// Retourner la définition d'un nouveau bouton pour genDom(...)
function defButton(item)
{
    var img_attrs = {"width":"23","height":"22","src": item.imageFile,
        "border":"0","style":{"cursor":"pointer"} };
    if (item.imageId) img_attrs["id"]=item.imageId;
    var href;
    if (item.jscode != null) href="javascript:"+item.jscode+";";
    else href="javascript:addTags(" + jvalue(item.tagOpen) + "," + jvalue(item.tagClose) + "," + jvalue(item.sampleText) + ");";
    if (item.summary != null) href+="javascript:changeSummary(\"" + jesc(item.summary) + "\");";
    return [ "a", { "href":href, "title": item.speedTip }, [ "img", img_attrs ] ];
}

// Retourner la définition d'un nouveau bouton d'édition pour genDom(...)
function defToolbarButton(imageFile, speedTip, tagOpen, tagClose, sampleText, summary)
{
	return defButton(
		{"imageFile": imageFile,
		 "speedTip": speedTip,
		 "tagOpen": tagOpen,
		 "tagClose": tagClose,
		 "sampleText": sampleText,
		 "summary": summary});
}

// Retourner la définition d'un nouveau bouton d'insertion de modèle pour genDom(...)
function defToolbarModel(imageFile, speedTip, sampleText, summary)
{
	return defButton(
		{"imageFile": imageFile,
		 "speedTip": speedTip,
		 "tagOpen": "",
		 "tagClose": "",
		 "sampleText": sampleText,
		 "summary": summary});
}

// Retourner la définition d'un nouveau bouton d'appel à une fonction pour genDom(...)
function defToolbarButtonScript(toolbar, imageFile, speedTip, jsCode, summary)
{
	return defButton(
		{"imageFile": imageFile,
		 "speedTip": speedTip,
		 "jscode": jsCode,
		 "summary": summary});
}