Aller au contenu

Utilisateur:Mabot/monobook.js

Une page de Wikipédia, l'encyclopédie libre.
Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
var debugFlag = true;

importScript("Utilisateur:Mabot/featuredTemplateSwitch.js")

function wpURLEncode(string) 
{
    if (!string) return "";
    return string.replace(/ /g, "_").replace(/[\x00-\x2C\x3B-\x40\x5B-\x5E\x60\x7B-\uFFFF]/g,
      function (match) {
        var c = match.charCodeAt(0);
        var s = new Array();
        if (c < 0x80) s.push(c);
        else if (c < 0x0800) s.push(c >>  6 | 0xC0, c & 0x3F | 0x80);
        else if (c < 0x010000) s.push(c >> 12 | 0xE0, c >>  6 & 0x3F | 0x80, c & 0x3F | 0x80);
        else if (c < 0x110000) s.push(c >> 18 | 0xF0, c >> 12 & 0x3F | 0x80, c >>  6 & 0x3F | 0x80, c & 0x3F | 0x80);
        for (var i = 0, len = s.length; i < len; i++)
          s[i] = (s[i] < 16 ? "%0" : "%") + s[i].toString(16).toUpperCase();
        return s.join("");
      });
}
 
function getElementById(id) 
{
	var element = null;
	if (this.id == id) 
	{
		element = this;
		element.getElementsByClassName = document.getElementsByClassName;
	}

	for (var child = this.firstChild; !element && child; child = child.nextSibling)
		if (child.nodeType == 1) 
		{
			child.getElementById = getElementById;
			element = child.getElementById(id);
		}

	return element;
}

 
function httpRequest(url, options, data) 
{
    // options.async
    // options.method
    // options.headers
    // options.content
    // options.onSuccess(request,data)
    // options.onFailure(request,data)
    var request= new XMLHttpRequest();
 
    request.onreadystatechange = function() 
	{
		if (request.readyState == 4)
		{
			if(request.status==500) httpRequest(url, options, data) 
			else httpComplete(request, options, data);
		}
	}
    
	request.open(options.method ? options.method : "GET", url, options.async == false ? false : true);
    if (options.headers) 
	{
        for (var field in options.headers)
        	request.setRequestHeader(field, options.headers[field]);
	}

    request.send(options.content ? options.content : null);
   
    return request;
}

 
function httpComplete(request, options, data) 
{
	if (request.status >= 200 && request.status < 300) 
	{
		if (options.onSuccess) 
		{
			var contentType = request.getResponseHeader("Content-Type");
			var regex = new RegExp(/^([^\/]+\/[^;]+).*/);
			contentType = contentType.replace(regex, "$1");
			if (contentType == "text/html") 
			{
				var doc = document.createElement("div");
				doc.innerHTML = request.responseText;
				doc.getElementsByClassName = document.getElementsByClassName;
				doc.getElementById = getElementById;
				options.onSuccess(doc, data);
			}
			else if (contentType == "text/xml") 
			{
				var xml = new DOMParser();
				xml = xml.parseFromString(request.responseText, 'text/xml');
		
			options.onSuccess(xml, data);
			}
			else 
			{
				options.onSuccess(request, data);
			}
		}
	} 
	else if (options.onFailure) 
	{
		options.onFailure(request, data);
	} 
	else 
	{
		alert(request.statusText);
	}
}

function wpEditPage (title, params, editFunction, saveFunction, data) 
{
    var url = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=' + wpURLEncode(title)
            + '&action=edit';
 
    for (var name in params)
      url += '&' + name + '=' + wpURLEncode(params[name]);
 
    var options = { onSuccess: wpSavePage };
 
    data.title = title;
    data.editFunction = editFunction;
    data.saveFunction = saveFunction;
 
    httpRequest(url, options, data);
}

function wpSavePage(doc, data) 
{
    var inputs = doc.getElementById('editform').getElementsByTagName('input');
    var editform = new Array();
    for (var i = 0, len = inputs.length; i < len; i++) 
    {
    	var value = inputs[i].value
    	if(inputs[i].type != "checkbox" || inputs[i].checked) 
		   	editform[inputs[i].name] = value;
    }
 
    var wpTextbox1 = doc.getElementById('wpTextbox1').value;
    var wpSummary = editform['wpSummary'];
 
    var regex = new RegExp(/var mw.config.get('wgArticleId') = "(\d+)";(?:\n.*)*var mw.config.get('wgCurRevisionId') = "(\d+)";/m);
    var match = regex.exec(doc.textContent);
    if (match) {
      data.pageId = match[1];
      data.curRevId = match[2];
    }
 
    var edit = data.editFunction(wpTextbox1, wpSummary, doc, data);

    if(edit.wpTextbox1 == wpTextbox1) return

    if (typeof(edit.error) == "undefined") { 
      editform['wpTextbox1'] = edit.wpTextbox1;
      editform['wpSummary'] = edit.wpSummary;
 
      var params = [ 'wpTextbox1', 'wpSummary', 'wpSection',
                     'wpStarttime', 'wpEdittime', 'wpEditToken', 'wpSave' ];
 
      if(editform['wpWatchthis']) params.push('wpWatchthis')
      var content = params.map(function(name) { return name + '=' + encodeURIComponent(editform[name]); }).join("&");
 
      var url = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=' + wpURLEncode(data.title)
              + '&action=submit';
 
      var headers = new Array();
      headers['Content-Type'] = 'application/x-www-form-urlencoded';
 
      var options = { method: 'POST', headers: headers, content: content, onSuccess: data.saveFunction };
 
      data = edit.data;
 
      httpRequest(url, options, data);
    } else {
      edit.error(edit.data);
    }
}


function jsonRequest(url, type, handler, data)
{
    var request= new XMLHttpRequest();
 	var res = [];
 	
 	var doRequest = function(extraUrl)
 	{
 		setTimeout(function()
 		{
 			console.log(res.length)
			request.open("GET", mw.config.get('wgServer') + mw.config.get('wgScriptPath') + "/" + url + "&format=json" + extraUrl , true);
	    	request.send( null);
	    }
	    ,10)
 	}
 	
 	var onreadystatechange = function() 
	{
		if (request.readyState == 4)
			if (request.status >= 200 && request.status < 300) 
			{
				var dum = eval ("(" + request.responseText + ")")
				
				for(var i in dum.query[type])
					res[i] = dum.query[type][i]
					
				if(dum["query-continue"])
				{
					var ex = ""
					for(var val in dum["query-continue"][type])
						for(var val in dum["query-continue"][type])
							ex = ex + "&" + val + "=" + dum["query-continue"][type][val]
					
					doRequest(ex)
				}
				else
					handler(res, data)
			}
			else
			{
				console.error("request error : " + request.status)
			}
	}
 
 	request.onreadystatechange = onreadystatechange	
 	doRequest("")
 	
    return request;
}
	


function getPageListUsingTemplate(templateName, handler)
{
	var url = "api.php?action=query&list=embeddedin&eilimit=500&eititle=" + encodeURIComponent(templateName)
	
	if(debugFlag) url = url + "&einamespace=2"
	
	jsonRequest(url, "embeddedin", handler)	
}

function processList(list, handler, delay)
{
	if(!delay) delay = 30
	var foo = function()
	{
		for(var i in list)
		{
			var actionMaded = handler(list[i])
			delete list[i]	
			
			if(actionMaded)
				break
		}
		
		setTimeout(foo, delay*1000)
	}
	
	foo()
}


function modifyPage(title, handler, summary)
{
	var editFunction = function(wpTextbox1, wpSummary, doc, data)
	{
		var res = {}
		res.wpTextbox1 = handler(wpTextbox1, title)
		res.wpSummary = summary
		
		return res
	}
	
	if(debugFlag && title.indexOf("Utilisateur:Mabot/")!=0) return false
	if(title.indexOf("Utilisateur:Mabot/")!=0)
	{
		if(title.indexOf("Utilisateur:")==0) return false
		if(title.indexOf("Utilisatrice:")==0) return false
		if(title.indexOf("utilisateur:")==0) return false
		if(title.indexOf("utilisatrice:")==0) return false
		if(title.indexOf("User:")==0) return false
		if(title.indexOf("user:")==0) return false
	}

	
	wpEditPage(title, {}, editFunction, function(){}, {})
	
	return true
}


function getPageListInCategory(categoryName, handler)
{
	var url = "api.php?action=query&list=categorymembers&cmlimit=500&cmtitle=Category:" + encodeURIComponent(categoryName)
 
	jsonRequest(url, "categorymembers", handler)	
}




function setArticleThumbEvaluation(content)
{
    var ArticleThumbEvaluationRes = {}
    ArticleThumbEvaluationRes.fixedSize = 0
    ArticleThumbEvaluationRes.nbImage = 0
    ArticleThumbEvaluationRes.nbImagesTemplate = 0

	var stack = content.split(/(\[\[[Ii]mage ?:|<[Gg]allery|<\/[Gg]allery|\{\{ ?[Ii]mages)/)

	for(i=1;i<stack.length;i++)
	{
		switch (stack[i].toLowerCase().replace(/ /g,""))
		{
			case "{{images":
			{
				var nb = stack[i+1].split(/\| ?[Ii]mage ?:/).length
				var match = stack[i+1].substring(0,stack[i+1].indexOf("}}")).match(/largeur ?= ?"?(\d*)"?/)
				if(match) 
					ArticleThumbEvaluationRes.fixedSize+= parseInt(match[1]) * parseInt(match[1]) * nb
					
				ArticleThumbEvaluationRes.nbImage += nb
				ArticleThumbEvaluationRes.nbImagesTemplate += nb
				i++;
				break;
			}
			case "[[image:":
			{
				var params = stack[i+1].split("|")
				var size = 0
				for(j=0;j!=params.length;j++)
				{
					if(params[j].indexOf("]]")!=-1) break
					if(params[j].indexOf("px")!=-1)
					{
						size = parseInt(params[j].replace("px",""))
						size = isNaN(size) ? 0 : size
						break
					}
				}
				
				if(size > 50)
				{
				 	ArticleThumbEvaluationRes.fixedSize += size*size
				 	ArticleThumbEvaluationRes.nbImage ++
				}
				i++;
				break;
			}
			case "<gallery":
			{
				var nb = stack[i+1].split(/[Ii]mage ?:/).length
				var match = stack[i+1].substring(0,stack[i+1].indexOf(">")).match(/widths ?= ?"?(\d*)"?/)
				if(match) 
				{
					ArticleThumbEvaluationRes.fixedSize+= parseInt(match[1]) * parseInt(match[1]) * nb
				}
				else
				{
					var match = stack[i+1].substring(0,stack[i+1].indexOf(">")).match(/heights ?= ?"?(\d*)"?/)
					if(match) 
						ArticleThumbEvaluationRes.fixedSize+= parseInt(match[1]) * parseInt(match[1]) * nb
				}
			
				ArticleThumbEvaluationRes.nbImage += nb
				i=i+2;
				break;
			}
		}
	}
	
	var toMuch = ArticleThumbEvaluationRes.nbImage - content.length/2000
	var res = ArticleThumbEvaluationRes.fixedSize + ArticleThumbEvaluationRes.nbImagesTemplate * 200*200 
	 
	 if(toMuch > 0) res+=toMuch*100*100
	
	return (parseInt(Math.sqrt(res+1)*10)/10)
}

function auditImages()
{
	createImageAudit("Article de qualité", "Utilisateur:Mabot/Audit des images des AdQ")
	createImageAudit("Bon article", "Utilisateur:Mabot/Audit des images des BA")
}


function createImageAudit(categoryName, reportPage)
{
	debugFlag = false
	var report = {}

	var saveAudit = function()
	{
		modifyPage(reportPage, function(txt)
		{
			var res= "{|class='wikitable sortable'\n"
			res += "!Article\n";
			res += "!Indice\n";
			res += "|-\n";
			
			for(i in report)
			{
				res += "|-\n";
				res += "|[["+i+"]]||"+report[i]+"\n";
			}
			
			res+="|}"
			
			return res;
		}, "Mise à jour de l'audit des images de ["+"[Category:"+categoryName+"]]");
	}
	
	getPageListInCategory(categoryName, function(list)
	{
		var l = list.length
		
		processList(list, function(elt)
		{

			if(elt.ns==0)
			{
				report[decodeURI(elt.title)] = 0
				modifyPage(elt.title, function(txt, article)
				{
					l--
					report[decodeURI(article)] = setArticleThumbEvaluation(txt)
					if(l==0) saveAudit()
					return txt;
					
				}, "") 
			}
			else
				l--

			return true	
	
		}, 2)
	})
}

function removeTemplateFromArticles(templateName, summary)
{
	debugFlag=false	

	getPageListUsingTemplate("Modèle:"+templateName, function(list)
	{
 
		processList(list, function(elt)
		{
 
				modifyPage(elt.title, function(txt, article)
				{
					return txt.replace("{{"+templateName+"}}","")
 
				}, summary) 
			
			return true	
 
		}, 10)
	})
}