Jump to content

User:Axmann8/PageWatcher.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
//Version 0.32 - Anpassung an "modern"-Skin
//Version 0.31 - Rücknahme der Version 0.3 (faktisch also Version 0.2), da
//               in Version 0.3 nun jedesmal die "Aboliste" sichtbar editiert wird.
//Version 0.3 - Besserer Schutz der Privatsphäre durch Vermeidung der
//              Übertragung des PageWatcher-Cookies zum Server bei jedem Seitenaufruf. 
//Version 0.2 - Schutz der Privatsphäre durch Verwendung von Cookies
//             (mit fallback: [[MediaWiki:PageWatcher-File]])
//Version 0.1
//(c) 2008 by Exxu
//Released under GPL or CC-by-SA 2.5 (http://creativecommons.org/licenses/by-sa/2.5/deed.de)
//at your choice
//******************************************************************************************
// Änderungsüberwachung für Einträge in der "Aboliste" ([[MediaWiki:PageWatcher-File]]).
// Es wird jeder Eintrag der Form:
// [[Lemma_des_interessierenden_Artikels]]
// berücksichtigt. Ausgeschlossen werden derartige Links auf Spezialseiten, Kategorien,
// und die eigene oder fremde Abolisten.
// Nach Änderungen wird der Nutzer durch eine Meldung auf der aktuellen Seite informiert,
// wenn eine Seite zum Ansehen aufgerufen wird. Ausnahmen bilden hiervon Spezialseiten, 
// die Aboliste und der Aufruf irgendeiner Seite zum Bearbeiten.
// Insoweit wird die Meldung verzögert.
//******************************************************************************************
// Verwendete MediaWiki-Dateien:
// [[MediaWiki:PageWatcher-File]] - Lemma der Aboliste (ohne "/");
//      Diese sollte auf ".js" enden, weil dadurch nur der Eigentümer (oder ein Admin)
//      Änderungen durchführen kann. Diese Datei wird im Benutzernamensraum erwartet.
//      Beispiel: Benutzer:Anonymous/Aboliste.js.
//    Fehlt diese Datei wird "WatchFile.js" angenommen.
// [[MediaWiki:PageWatcher-Summary]] - Zusammenfassungstext für automatische Edits
//    Fehlt diese Datei, wird "Updates" angenommen
// [[MediaWiki:PageWatcher-Updates]] - Text für die Benutzerinformation bei Änderungen
//    Fehlt diese Datei, wird "There are updates for files you are watching" angenommen.
//******************************************************************************************
// Verwendete Javascript-Variablen:
// wgAction, wgCanonicalName, wgServer, wgScript, wgUserName,
//******************************************************************************************
var PageWatcher = {
	_msgUpdated : null,
	_watchfile : null,
	_msgSummary : null,
	_myDate : null,
	_HTTPReqObj : {
		_HRO : null,
		call : function(method,uri,async,callback,options){
			PageWatcher._HRO = (!PageWatcher._HRO && typeof sajax_init_object == 'function') ? sajax_init_object() : PageWatcher._HRO;
			if(!PageWatcher._HRO){
				if(window.XMLHttpRequest){
					PageWatcher._HRO = new XMLHttpRequest();
				}else{
					try{
						PageWatcher._HRO = new ActiveXObject("Msxml2.XMLHTTP");
					}catch(e){
						try{
							PageWatcher._HRO = new ActiveXObject("Microsoft.XMLHTTP");
						}catch(e){
						}
					}
				}
			}
			if(PageWatcher._HRO){
				PageWatcher._HRO.open(method,uri,async);
				if (options && options.headers){
					for (key in options.headers){
						PageWatcher._HRO.setRequestHeader(key,options.headers[key]);
					}
				}
				PageWatcher._HRO.onreadystatechange = (callback)?callback:null;
				PageWatcher._HRO.send((options && options['data'])?options['data']:null);
			}
			return PageWatcher._HRO;
		}
	},
	_editAboList : function(links){
		var request = PageWatcher._get('User:'+wgUserName+PageWatcher._watchfile,'edit');
		if(!request || request.status >= 400){return false;}
		var div = document.createElement("div");
		div.innerHTML = request.responseText;
		var form = div.getElementsByTagName('form');
		if (typeof form == 'undefined' || form.length < 1){ return false; }
		form = form[0];
		var content = form.getElementsByTagName('textarea');
		if (typeof content == 'undefined' || content.length < 1){ return false; }
		return PageWatcher._postData(form,links);
	},
	_extractLinks : function(text){
		var links = {};
		var regexp = /\[\[([^\|\]]+)[\|\]][^\]]*\]([^\d\*]*(\d[^\n$]*))?[\n$]?/g;
		while (regx = regexp.exec(text)){	// Überwachungslinks extrahieren
			if(regx[1].match(/^Spe[cz]ial:/i) ||	// Spezialseiten ausschließen
			   regx[1].match(/^[CK]ategor[iy]e?:/i) ||	// Kategorielinks ausschließen
			   regx[1].indexOf(PageWatcher._watchfile) > 0){	// Aboliste ausschließen
				continue;
			}
			links[regx[1].replace(/ /g, "_")] = regx[3];
		};
		return links;
	},
	_formatLinks : function(links){
		data = "";
		for (key in links){
			data += PageWatcher._myEncodeURIComponent("* [["+key.replace(/_/g, " ")+"]] "+links[key]+"\n");
		}
		return data;
	},
	/* Read some file by given action. If cached equals to false, read it from server */
	_get : function(file,action,cached){
		return PageWatcher._HTTPReqObj.call('GET',
				mw.config.get('wgServer')+mw.config.get('wgScript')+'?title='+file+'&action='+action+
				(!cached ? '&'+PageWatcher._myDate.getTime():''),false);
	},
	/* Read content of MediaWiki-Files perhaps from the browser's cache */
	_getText : function(msg,file,val){
		if (!msg){
			request = PageWatcher._get(file,'raw',true);
			return ((!request || request.status >= 400) ? val : request.responseText);
		}else{
			return msg;
		}
	},
	_hasCookies : function(){
		return document.cookie && document.cookie.indexOf("PageWatcher=")==0;
	},
	_lastModified : function(lemma){
		var request = PageWatcher._get(lemma,'history');
		if (!request || request.status >= 400 || !request.responseText){return null;}
		var div = document.createElement('div');
		div.innerHTML = request.responseText;
		var ul = div.getElementsByTagName('ul');
		var lastversion = null;
		for (i=0; i<ul.length; i++){
			if (ul[i].getAttribute('id') == 'pagehistory'){
				lastversion = ul[i];
				break;
			}
		}
		if (!lastversion){ return null; }
		var anchors = lastversion.getElementsByTagName('li')[0].getElementsByTagName('a');
		if(typeof anchors == 'undefined'){return null;}
		for (i=0; i<anchors.length; i++){
			if(!anchors[i].firstChild.nodeValue.match(/(\d\d:\d\d,.+\d\d\d\d)/)){continue;}
			return RegExp.$1;
		}
		return null;
	},
	_myEncodeURIComponent : function(val){
		val = val.replace(/\&lt;/gi, "<");
		val = val.replace(/\&gt;/gi, ">");
		val = val.replace(/\&quot;/gi, "\"");
		val = val.replace(/\&amp;/gi, "&");
		return encodeURIComponent(val);
	},
	_postData : function(form,links) {
		PageWatcher._msgSummary = PageWatcher._getText(PageWatcher._msgSummary,"MediaWiki:PageWatcher-Summary","Updates");
		var data = "";
		var inputFields = form.getElementsByTagName('input');
		for (var i=0; i<inputFields.length; i++){
			if (inputFields[i].type == 'submit' && inputFields[i].name != 'wpSave') continue;
			data += "&"+inputFields[i].name;
			data +=	(inputFields[i].name == 'wpMinoredit') ? "=1" :
				(inputFields[i].name == 'wpWatchthis') ? "=1" :
				(inputFields[i].name == 'wpSummary') ? '='+PageWatcher._msgSummary :
				"="+PageWatcher._myEncodeURIComponent(inputFields[i].value);
		}
		data += "&wpTextbox1="+PageWatcher._formatLinks(links);
		return PageWatcher._HTTPReqObj.call('POST',form.action,false,null,
			{ 'data' : data,
			'headers' : {	'Content-Type' : "application/x-www-form-urlencoded",
					'Referer' : mw.config.get('wgServer')+mw.config.get('wgScript')+"?title=User:"+wgUserName+PageWatcher._watchfile+"&action=edit"
				}
			}
		);
	},
	_setCookies : function(links){
		var futdate = new Date();		//Get the current time and date
		var expdate = futdate.getTime();  //Get the milliseconds since Jan 1, 1970
		expdate += 3600*1000*24*90;  //expires in 90 days (milliseconds)
		futdate.setTime(expdate);
		var newCookie="PageWatcher="+PageWatcher._formatLinks(links);
		newCookie +="; path=/; domain=de.wikiversity.org;";
		newCookie += " expires=" + futdate.toGMTString();
		window.document.cookie=newCookie; //Write the cookie
	},
	_usermsg : function(files){
		PageWatcher._msgUpdated = PageWatcher._getText(PageWatcher._msgUpdated,"MediaWiki:PageWatcher-Updates","There are updates for files you are watching");
		var msg = document.createElement('a');
		var reducedWatchfile = PageWatcher._watchfile;
		if(reducedWatchfile.indexOf(".")>0){	// Ziellink als Lemma ohne Punkt-Anhang
			reducedWatchfile = reducedWatchfile.substr(0,reducedWatchfile.indexOf("."));
		}
		msg.setAttribute('href',wgServer+"/wiki/User:"+wgUserName+reducedWatchfile);
		msg.setAttribute('title',"User:"+wgUserName+reducedWatchfile);
		msg.appendChild(document.createTextNode(PageWatcher._msgUpdated));
		var msgDiv=document.createElement('div');
		msgDiv.setAttribute('class','usermessage mw-topbox');
		msgDiv.appendChild(msg);
		for (key in files){
			var aFile = document.createElement('a');
			aFile.setAttribute('href',wgServer+"/wiki/"+key);
			aFile.setAttribute('title',key.replace(/_/g, " "));
			aFile.appendChild(document.createTextNode(key.replace(/_/g, " ")));
			msgDiv.appendChild(document.createTextNode(' '));
			msgDiv.appendChild(aFile);
			msgDiv.appendChild(document.createTextNode(';'));
		}
		var msgContainer = document.getElementById("bodyContent");
		if (!msgContainer && getElementsByClassName(document,"div","mw-topboxes")){
			msgContainer = getElementsByClassName(document,"div","mw-topboxes")[0];
		}
		msgContainer.insertBefore(msgDiv,msgContainer.firstChild);
	},
	watch : function(){
		if(	typeof wgAction != 'undefined' && wgAction == 'edit' ||	// im Editmodus keine Überwachung
			wgCanonicalNamespace == "Special"	// auf Spezialseiten keine Überwachung
		){ return false; }
		PageWatcher._myDate = new Date();
		PageWatcher._watchfile = "/"+PageWatcher._getText(PageWatcher._watchfile,"MediaWiki:PageWatcher-File","WatchFile.js");
		PageWatcher._watchfile = PageWatcher._watchfile.replace(/\s/g, "");
		if (wgPageName.indexOf(PageWatcher._watchfile)>1){return false;}	// auf der Aboliste keine Überwachung
		request = PageWatcher._get('User:'+wgUserName+PageWatcher._watchfile,'raw');
		if(!request || request.status >= 400){return false;}	// keine Aboliste -> keine Überwachung
		var links = PageWatcher._extractLinks(request.responseText);
		var cookies = {};
		if (PageWatcher._hasCookies()){
			var content = decodeURIComponent(document.cookie.substring(document.cookie.indexOf("=")+1));
			cookies = PageWatcher._extractLinks(content);
		}
		var unbold = false;
		var updated = false;
		var updatedFiles = {};
		for (key in links){
			if (cookies[key]){ links[key] = cookies[key]; }
			if (!links[key]){links[key] = "00.00, 0000";} 
			if (links[key].indexOf("'") >= 0){ unbold = true; }
			links[key] = links[key].replace(/'/g, "");
			var lastversion = PageWatcher._lastModified(key);
			if(lastversion && links[key] != lastversion){
				links[key] = "'''"+lastversion+"'''";
				updated = true;
				updatedFiles[key] = 1;
			}
		}
		PageWatcher._setCookies(links);
		if ((unbold || updated) && (PageWatcher._hasCookies() || PageWatcher._editAboList(links))){
			if(updated){PageWatcher._usermsg(updatedFiles);}
		}
	}
};
 
addOnloadHook ( PageWatcher.watch );