MediaWiki:Gadget-CommonDom.js

Note : après avoir publié vos modifications, il se peut que vous deviez 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 appuyez sur Ctrl + F5 ou Ctrl + R (⌘ + R sur un Mac).
  • Google Chrome : appuyez sur Ctrl + Maj + R (⌘ + Shift + R sur un Mac).
  • Internet Explorer / Edge : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl + F5.
  • Opera : appuyez sur Ctrl + F5.
wgGadget_CommonDomJsVersion = "20120608001";
/*

    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 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.nodeValue.length)?v.nodeValue: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});
}