Aller au contenu

MediaWiki:Gadget-DevTools.js

Un livre de Wikilivres.

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.
/*

    Outils de développement de scripts (Gadget, common, ...).

*/
wgGadget_DevToolsJsVersion = "20240815001";

var wgVersion = mw.config.get('wgVersion');
var mwinfo = "MediaWiki version "+wgVersion+"\nAPI: read=yes write=yes";

function devtype(obj)
{
  var t = typeof(obj);
  if (t=='object') t = getObjectClassName(obj);
  return t;
}

function devdump(obj)
{
  var t = devtype(obj);
  var s = "\n\nType: " + t;
  if (t == 'function')
  {
    s += '\nName: ' + obj.name;
  }
  if (t != 'undefined')
  {
    for(var i in obj)
      s += '\n'+i+': ' + obj[i];
    s += '\nValue: '+obj;
  }
  return s;
}

function devdumptree(obj,ind,done)
{
  var s = '';
  if (ind===undefined) {ind='';s='\n';}
  if (done===undefined) done=[];
  done.push(obj);
  var t = devtype(obj);
  var s = "\n"+ind+"Type: " + t;
  if (t == 'function')
  {
    s += '\n'+ind+'Name: ' + obj.name;
  }
  if (t != 'undefined')
  {
    s += '\n'+ind+'Value: '+obj;
    // séparateur pour repérer la fin des valeurs très longues (source de fonction par ex)
    s += '\n'+ind+'--------------------------------------'.substring(ind.length);
    if (typeof(obj)=='object')
    for(var i in obj)
      s += '\n'+ind+i+' ('+devtype(obj[i])+')' + (obj[i]==obj?' (this)' : (done.indexOf(obj[i])>=0)?' (done)' : ': ' + devdumptree(obj[i],ind+'    ',done));
  }
  return s;
}

var devfind_done=[];
var devfind_error=false;

function isAStringNumber(num)
{
  var s=''+num;
  var n = parseInt(s);
  return !isNaN(n) && (n==s);
}

function dev_pathadd(path, index)
{
    if (isAStringNumber(index))
    {
        if (path=='') path='window';
        return path+'['+index+']';
    }
    if (path.length>0) path=path+".";
    return path+index;
}

function devfind_excludetype(t)
{
  for(var i=0;i<devfind_exclude_types.length;i++)
  {
    var exc = devfind_exclude_types[i];
    if (exc.ends('*')?t.starts(exc.substring(0,exc.length-1)):t==exc) return true;
  }
  return false;
}

function devfind_from(obj,path,what,excluded)
{
  try
  {
  if (obj===null || obj===undefined) return;
  if (devfind_done.indexOf(obj)>=0) return;
  devfind_done.push(obj);
  var t = typeof(obj);
  t = devtype(obj);
  if (devfind_excludetype(t)) return;
  if (obj[what]!==undefined) return dev_pathadd(path,what);
  for(var i in obj)
  {
    if (excluded!==undefined && excluded.indexOf(i)>=0)
    {
       devfind_done.push(obj[i]);
    }
    else
    {
      try
      {
        var p = devfind_from(obj[i], dev_pathadd(path,i), what);
        if (p!==undefined) return p;
      }
      catch(e)
      {
        //if (devfind_error) throw e;
        devfind_error = true;
        //throw 'ERROR AT '+dev_pathadd(path,i)+'\n'+e;
      }
    }
  }
  if (obj.prototype!==undefined)
  {
    try
    {
      var p = devfind_from(obj.prototype, dev_pathadd(path,'prototype'), what);
      if (p!==undefined) return p;
    }
    catch(e)
    {
      //if (devfind_error) throw e;
      devfind_error = true;
      //throw 'ERROR AT '+dev_pathadd(path,'prototype')+'\n'+e;
    }
  }
  }catch(e){}
}

function devfind(what)
{
  devfind_done=[]; devfind_error=false;
  var p=undefined;
  if (p===undefined) p=devfind_from(String.prototype,'String.prototype',what);
  if (p===undefined) p=devfind_from(Array.prototype,'Array.prototype',what);
  if (p===undefined) p=devfind_from(Number.prototype,'Number.prototype',what);
  if (p===undefined) p=devfind_from(Date.prototype,'Date.prototype',what);
  if (p===undefined) p=devfind_from(Object.prototype,'Object.prototype',what);
  if (p===undefined) p=devfind_from(window,'',what,['globalStorage','history']);
  return p;
}

var devfind_exclude_types=[];//'MimeType','HTML*','Moz*'];

function infoNavigator()
{
    var s = "navigator:";
    for(var i in navigator)
    {
        var v = navigator[i], t = new String(typeof(v)).toLowerCase();
        if (t!='object' && t!='function')
            s += '\n  - '+i+': ' + v;
    }
    return s;
}
function infoSetup()
{
    var s = "usersetup:";
    var values = mw.user.options.get();
    for(var i in values)
    {
        if ((new String(i)).ends('token')) continue;
        var v = values[i];
        s += '\n  - '+i+': ' + v;
    }
    return s;
}
function displayInfo()
{
  document.getElementById("dev_result").style.color="blue";
  document.getElementById("dev_result").value =  'Copiez-collez le texte ci-dessous dans la page Utilisateur:'+mw.config.get('wgUserName')+'/MaConfiguration :\n\n'+infoNavigator()+'\n'+infoSetup();
}

function devSetResult(error, res)
{
  var js_result="";
  if (error)
  {
    document.getElementById("dev_result").style.color="red";
    js_result = res;
  }
  else
  {
    document.getElementById("dev_result").style.color="black";
    var t = typeof res;
    js_result = "Type: "+t;
    if (t != "undefined") js_result += "\nValue: "+res;
  }
  document.getElementById("dev_result").value = js_result;
}

function devClearJS()
{
  document.getElementById("dev_source").value = "";
  document.getElementById("dev_result").value = "";
}

function devExecJS()
{
  var js_source = document.getElementById("dev_source").value;
  if (js_source=='?') displayInfo();
  else
  {
    try{ devSetResult(false, eval(js_source)); }
    catch(e){ devSetResult(true, e); }
  }
}

var wx, wy, moving=false;
var winx, winy;
function devMMove(e)
{
  if (!moving) return false;
  if (!e) var e = window.event;
  var nwx=e.clientX, nwy=e.clientY;
  winx += nwx-wx;
  winy += nwy-wy;
  dev_tools.style.left = ''+winx+'px';
  dev_tools.style.top = ''+winy+'px';
  wx=nwx; wy=nwy;
  return true;
}
function devMUp(e)
{
  if (!e) var e = window.event;
  moving=false;
  return true;
}
function devMDown(e)
{
  if (!e) var e = window.event;
  wx=e.clientX; wy=e.clientY;
  winx=dev_tools.offsetLeft;
  winy=dev_tools.offsetTop;
  moving=true;
  return true;
}

var dev_tools = undefined;
var dev_tools_shadow = undefined;
var dev_tools_reduced = false;
var dev_tools_h;

function devReduceSwitch()
{
    if (dev_tools_reduced)
    {
        var hh = dev_tools_h;
    }
    else
    {
        dev_tools_h = dev_tools.offsetHeight;
        var hh = 150;
    }
    dev_tools_reduced = !dev_tools_reduced;
    dev_tools.style.height = ''+hh+'px';
}
function devOpenConsole()
{
  dev_tools.style.display = 'block';
  dev_tools_shadow.style.display = 'block';
}
function devCloseConsole()
{
  dev_tools_shadow.style.display = 'none';
  dev_tools.style.display = 'none';
}
function devSwitchToDebugLog()
{
  if (debug_div)
  {
    debug_div.style.display="block";
    devCloseConsole();
  }
}

var prev_debug_log_count = -1;
function openDevTools()
{
    if (typeof(dev_tools)=="undefined" || debug_log_count!=prev_debug_log_count)
    {
        prev_debug_log_count = debug_log_count;
        var win_title_bar = genDOM(
                [ "table", { 'class':'dev_titlebar', 'style':{'width':'100%'} },
                    [ "tr",
                        [ "td",
                            [ "b", 'Console Javascript et outils de débogage' ]
                        ],
                        [ "td", { 'style':{'width':'120px'} },
                            [ "input", { 'type':'button', 'name':'reducesw', 'value':'Reduce/Restore', 'onclick':devReduceSwitch } ]
                        ],
                        [ "td", { 'style':{'width':'50px'} },
                            [ "div", { 'class':'dev_close', 'onclick':devCloseConsole } ]
                        ]
                    ]
                ]
            );
        win_title_bar.onmousedown = devMDown;
        win_title_bar.onmouseup = devMUp;
        win_title_bar.onmousemove = devMMove;
        dev_tools = genDOM( [ "div", {'id':'dev_console'},
            [ "form", { 'onsubmit':'return false;', 'style':{'width':'100%', 'height':'99%'} },
                win_title_bar,
                [ "div",
                    [ "b", "Console javascript" ],
                    [ "input", { 'type':'button', 'name':'go', 'value':'Exécuter', 'onclick':devExecJS } ],
                    [ "input", { 'type':'button', 'name':'clear', 'value':'Effacer', 'onclick':devClearJS } ],
                    (debug_log_count>0 ?
                        [ "input", { 'type':'button', 'name':'openlog',
                            'value':debug_log_count+' message'+(debug_log_count>1?'s':''),
                            'onclick':devSwitchToDebugLog } ] :
                        "pas de messages")
                ],
                [ "table", { 'style':{'width':'100%', 'height':'80%'} },
                    [ "tr",
                        [ "td", { 'style':{'width':'50%', 'height':'90%'} },
                            [ "i", "Code source" ],
                            [ "textarea", { 'id':'dev_source', 'name':'dev_source', 'style':{'width':'100%', 'height':'90%'} } ],
                        ],
                        [ "td", { 'style':{'width':'50%', 'height':'90%'} },
                            [ "i", "Résultat" ],
                            [ "textarea", { 'id':'dev_result', 'name':'dev_result', 'readonly':'readonly', 'style':{'width':'100%', 'height':'90%'} } ],
                        ]
                    ]
                ],
            ]
        ] );
        dev_tools_shadow = genDOM( [ "div", {'id':'dev_shadow'}, " " ] );
        var tc=document.getElementById("bodyContent");
        tc.appendChild(dev_tools_shadow);
        tc.appendChild(dev_tools);
    }
    devOpenConsole();
}

function devSetup()
{
    if (typeof(DevToolsConfig)=='undefined') DevToolsConfig = {};
    var portletId = DevToolsConfig.portletId || 'p-personal';
    var nextNode = DevToolsConfig.nextNodeId ? document.getElementById(DevToolsConfig.nextNodeId) : 'pt-logout';
    // Create portlet link
    var dev_portlet_link = mw.util.addPortletLink(portletId, '#',
        'outils de script', 'ca-dev-tools', 'Outils de développement de scripts', undefined, nextNode);
    // Bind click handler
    $(dev_portlet_link).click( function( e ) { e.preventDefault(); openDevTools(); });
}
$(devSetup);