Utilisateur:Dr Brains/DoubleRedirections.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.
/*
Script de vérification de doubles redirections

Original = http://fr.wikipedia.org/wiki/Utilisateur:Maloq/DR.js

Licence : non-spécifiée. par défaut CC-BY-SA 3.0
*/


if( (mw.config.get('wgTitle').indexOf("/DoubleRedirections")!=-1) && (mw.config.get('wgTitle').indexOf(".js")==-1) && (mw.config.get('wgAction') == "view") ){
		//constante pour les messages
		var DR_END = 0
		var DR_START = 1
		var DR_EMPTY_LIST = 2
		var DR_DOMPARSER_FAILURE = 3
		var DR_USERPAGE = 4
		var DR_CANT_EXTRACT_PAGENAME_FROM_HREF = 5
		var DR_FAILURE_P1_NOT_REDIRECT = 6
		var DR_FAILURE_P2_NOT_REDIRECT = 7
		var DR_FAILURE_PI_DOESNT_POINT_P2 = 8
		var DR_SUCCESS = 9
		var DR_DONT_FIND_TWO_ANCHORS = 10
		
		var DR_list

		
		addOnloadHook(DR_launch)
}
	



function DR_launch(){
	var req=new XMLHttpRequest()
	
	document.getElementById('contentSub').style.whiteSpace='nowrap'
	
	req.onreadystatechange = function(){
		if(req.readyState == 4)
			if(req.status==200)
				DR_solve(req.responseText)
	}
	
	req.open("GET","/w/index.php?title=Special:DoubleRedirects&limit=5000&offset=0", true)
	req.send(null)
}

function DR_getAnchorPage(Page){
	var a = document.createElement('a')
	
	a.textContent = Page
	a.href = "/w/index.php?title=" + encodeURIComponent(Page) 
	
	return a
}


function DR_getAnchorPageDiff(Page){
	var a = document.createElement('a')
	
	a.textContent = "(diff)"
	a.href = "/w/index.php?title=" + encodeURIComponent(Page) + "&diff=cur&oldid=prev"
	
	return a
}

function DR_getAnchorPageNoRedirect(Page){
	var a = document.createElement('a')
	
	a.textContent = "(nr)"
	a.href = "/w/index.php?title=" + encodeURIComponent(Page) + "&redirect=no"
	
	return a
}

function DR_newMessage(type, args){
	var div = document.getElementById('contentSub')
	
	switch(type){
		case (DR_DOMPARSER_FAILURE):{
			div.appendChild(document.createTextNode('erreur lors du parsing de la page de redirection'))
			break
		}
		case (DR_EMPTY_LIST):{
			div.appendChild(document.createTextNode('liste de double redirection vide'))
			break
		}
		case (DR_START):{
			div.appendChild(document.createTextNode('Job commencé:' + DR_list.length + " à traiter"))
			break
		}
		case (DR_END):{
			div.appendChild(document.createTextNode('Job fini!'))
			break
		}
		case (DR_USERPAGE):{
			div.appendChild(document.createTextNode(args.i + ": La page à modifier est une page utilisateur: "))
			div.appendChild(DR_getAnchorPage(args.target1))
			div.appendChild(DR_getAnchorPageNoRedirect(args.target1))
			break
		}
		case (DR_CANT_EXTRACT_PAGENAME_FROM_HREF):{
			div.appendChild(document.createTextNode(args.i + ": href bizzare: "))
			div.appendChild(DR_getAnchorPage(args.anchor1.cloneNode(true)))
			div.appendChild(document.createTextNode(" et "))
			div.appendChild(DR_getAnchorPageNoRedirect(args.anchor2.cloneNode(true)))
			break
		}
		
		case (DR_FAILURE_P1_NOT_REDIRECT):{
			div.appendChild(document.createTextNode(args.i + ": La page à modifier n'est pas une redirection: "))
			div.appendChild(DR_getAnchorPage(args.target1))
			div.appendChild(DR_getAnchorPageNoRedirect(args.target1))
			div.appendChild(document.createTextNode(" text:" + args.text1))
			
			break
		}
		case (DR_FAILURE_P2_NOT_REDIRECT):{
			div.appendChild(document.createTextNode(args.i + ": La page pointée n'est pas une redirection: "))
			div.appendChild(DR_getAnchorPage(args.target2))
			div.appendChild(DR_getAnchorPageNoRedirect(args.target2))
			div.appendChild(document.createTextNode(" text:" + args.text2))
			break
		}
		
		case (DR_FAILURE_PI_DOESNT_POINT_P2):{
			div.appendChild(document.createTextNode(args.i + ": La page à modifier "))
			div.appendChild(DR_getAnchorPage(args.target1))
			div.appendChild(DR_getAnchorPageNoRedirect(args.target1))
			div.appendChild(document.createTextNode(" pointe sur "))
			div.appendChild(DR_getAnchorPage(args.page1Target))
			div.appendChild(DR_getAnchorPageNoRedirect(args.page1Target))
			div.appendChild(document.createTextNode(" et non sur "))
			div.appendChild(DR_getAnchorPage(args.target2))
			div.appendChild(DR_getAnchorPageNoRedirect(args.target2))
			break
		}
		
		case (DR_DONT_FIND_TWO_ANCHORS):{
			div.appendChild(document.createTextNode(args.i + ": "))
			div.appendChild(document.createTextNode(" ligne non valide: "))
			div.innerHTML = div.innerHTML + args.initialLine.innerHTML
			break;
		
		}

		case (DR_SUCCESS):{
			div.appendChild(document.createTextNode(args.i + ": "))
			div.appendChild(DR_getAnchorPage(args.target1))
			div.appendChild(DR_getAnchorPageNoRedirect(args.target1))
			div.appendChild(document.createTextNode(" pointe vers "))
			div.appendChild(DR_getAnchorPage(args.target2))
			div.appendChild(DR_getAnchorPageNoRedirect(args.target2))
			div.appendChild(document.createTextNode(" qui pointe vers "))
			div.appendChild(DR_getAnchorPage(args.page2Target))
			div.appendChild(DR_getAnchorPageNoRedirect(args.page2Target))
			
			div.appendChild(document.createTextNode("corrigé:"))
			div.appendChild(DR_getAnchorPageDiff(args.target1))
			break
		}
		
		default:
			div.appendChild(document.createTextNode("Unknow message type: " + type))
	}
	
	div.appendChild(document.createElement('br'))
	
	return false
}
	
	

function DR_solve(htmlPage){
	var parser = new DOMParser();
	var doc = parser.parseFromString(htmlPage, "text/xml");
	var div
	
	if(!doc) return DR_newMessage(DR_DOMPARSER_FAILURE) 
	
	div = doc.getElementById("bodyContent")
	DR_list = div.getElementsByTagName("ol")
	
	if(DR_list.length == 0) return DR_newMessage(DR_EMPTY_LIST)
	
	DR_list = DR_list[0].getElementsByTagName("li")
	
	DR_newMessage(DR_START)
	
	DR_solveNumber(0)
}

function DR_getPageFromHref(href){
	var reg = new RegExp(/\/w\/index.php\?title=([^&]+)&redirect=no/)
	var match = reg.exec(href)
	
	if(match) return decodeURIComponent(match[1]).replace(/_/g, " ")
	
	return false
}

function DR_solveNumber(i){
	if(i>=DR_list.length) return DR_newMessage(DR_END)
	
	var anchors = DR_list[i].getElementsByTagName("a")
	var data = new Object()
	var nexti = i+1
	
	if(anchors){
		data.initialLine = DR_list[i]
		data.anchor1 = anchors[0]
		data.anchor2 = anchors[2]
		data.i = i
		
		if(anchors[0] && anchors[2]){
			data.target1 = DR_getPageFromHref(data.anchor1.href)
			data.target2 = DR_getPageFromHref(data.anchor2.href)
			
			
			if(data.target1 != false && data.target2 != false) {
				if(data.target1.indexOf("Utilisateur:") == -1) 
					DR_solveRedirection(data)
				else{
					DR_newMessage(DR_USERPAGE, data)
					setTimeout("DR_solveNumber(" + nexti + ")", 0)
				}
					
			}else{
				DR_newMessage(DR_CANT_EXTRACT_PAGENAME_FROM_HREF, data)
				setTimeout("DR_solveNumber(" + nexti + ")", 0)
			}
		}else{
			DR_newMessage(DR_DONT_FIND_TWO_ANCHORS, data)
			setTimeout("DR_solveNumber(" + nexti + ")", 0)
		}
	}
}


function DR_solveRedirection(data){
	var req1=new XMLHttpRequest()
	var req2=new XMLHttpRequest()
		
	data.text1 = false
	data.text2 = false
	
	req1.data=data
	req2.data=data
	
	req1.onreadystatechange = function(){
		if(req1.readyState == 4)
			if(req1.status==200){
				req1.data.text1 = req1.responseText
				if(req1.data.text2 != false) DR_compareData(req1.data)
			}
	}
	
	req2.onreadystatechange = function(){
		if(req2.readyState == 4)
			if(req2.status==200){
				req2.data.text2 = req2.responseText
				if(req2.data.text1 != false) DR_compareData(req2.data)
			}
	}
	
	req1.open("GET","/w/index.php?title=" + encodeURIComponent(data.target1) + "&action=raw", true)
	req2.open("GET","/w/index.php?title=" + encodeURIComponent(data.target2) + "&action=raw", true)
	
	req1.send(null)
	req2.send(null)
}

function DR_getPageFromRedirection(redir){
	var reg = new RegExp(/#(REDIRECT|Redirect|redirect)[ ]?\[\[([^\]]+)\]\]/)
	var match = reg.exec(redir)
	
	if(match) return decodeURIComponent(match[2]).replace(/_/g, " ")
	
	return false
}

function DR_compareData(data){
	var nexti = data.i+1
	
	data.page2Target = DR_getPageFromRedirection(data.text2)
	data.page1Target = DR_getPageFromRedirection(data.text1)
	
	if(data.page1Target == false){
		setTimeout("DR_solveNumber(" + nexti + ")", 0)
		return DR_newMessage(DR_FAILURE_P1_NOT_REDIRECT, data) 
	}
	
	if(data.page2Target == false){
		setTimeout("DR_solveNumber(" + nexti + ")", 0) 
		return DR_newMessage(DR_FAILURE_P2_NOT_REDIRECT, data)
	}
 
	if(data.page1Target != data.target2){
		setTimeout("DR_solveNumber(" + nexti + ")", 0) 
		return DR_newMessage(DR_FAILURE_PI_DOESNT_POINT_P2, data) 
	}
	
	wpEditPage(data.target1, {}, DR_editFoo, DR_saveFoo, {_text : "[[" + data.page2Target + "]]" , DR_args:data})

}

function DR_editFoo(wpTextbox1, wpSummary, doc, data){

	wpTextbox1 =  "#REDIRECT " + data._text
	wpSummary = "Résolution de double redirection vers " + data._text

	return { wpTextbox1: wpTextbox1, wpSummary: wpSummary, data: data };
}

function DR_saveFoo(doc, data){
	var nexti = data.DR_args.i+1
	
	DR_newMessage(DR_SUCCESS, data.DR_args)
	setTimeout("DR_solveNumber(" + nexti + ")", 30000) 
}