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