Jump to content

User:Axmann8/PageWatcher.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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 );