Szerkesztő:Winston/WatchCat test.js
Megjelenés
Megjegyzés: közzététel után frissítened kell a böngésződ gyorsítótárát, hogy lásd a változásokat.
- Firefox / Safari: tartsd lenyomva a Shift gombot és kattints a Frissítés gombra a címsorban, vagy használd a Ctrl–F5 vagy Ctrl–R (Macen ⌘–R) billentyűkombinációt
- Google Chrome: használd a Ctrl–Shift–R (Macen ⌘–Shift–R) billentyűkombinációt
- Edge: tartsd nyomva a Ctrl-t, és kattints a Frissítés gombra, vagy nyomj Ctrl–F5-öt
//WatchCat
//Created by [[:hu:User:Winston]]
//Test version!!! Under heavy development!!!
//
//Todo:
//- fix IE ordering bug
//- add options (set namespaces, hide hidden categories, set ordering etc.)
//
$(function() {
if (document.getElementsByTagName("h1")[0].firstChild.nodeValue == "Figyelőlistám") {
addPortletLink_mod('p-cactions', 'WatchCat', 'ca-WCat', 'WatchCat teszt');
var target = document.getElementById("ca-WCat");
if( target.attachEvent ){
target.attachEvent('onclick', watchCatLoader);
} else {
target.addEventListener('click', watchCatLoader, false);
}
pic = new Image();
pic.src="http://upload.wikimedia.org/wikipedia/commons/f/f3/WatchCat_load_indicator_monobook.gif";
}
});
function getElementsByClassName_win(className, tag, elm){
var testClass = new RegExp("(^|\\\\s)" + className + "(\\\\s|$)");
var tag = tag || "*";
var elm = elm || document;
var elements = (tag == "*" && elm.all) ? elm.all : elm.getElementsByTagName(tag);
var returnElements = [];
var current;
var length = elements.length;
for(var i=0; i<length; i++){
current = elements[i];
if(testClass.test(current.className)){
returnElements.push(current);
}
}
return returnElements;
}
function addPortletLink_mod(portlet, text, id, tooltip, accesskey, nextnode) {
var node = document.getElementById(portlet);
if ( !node ) return null;
node = node.getElementsByTagName( "ul" )[0];
if ( !node ) return null;
var link = document.createElement( "a" );
link.appendChild( document.createTextNode( text ) );
var item = document.createElement( "li" );
item.appendChild( link );
if ( id ) item.id = id;
if ( accesskey ) {
link.setAttribute( "accesskey", accesskey );
tooltip += " ["+accesskey+"]";
}
if ( tooltip ) {
link.setAttribute( "title", tooltip );
}
if ( accesskey && tooltip ) {
updateTooltipAccessKeys( new Array( link ) );
}
if ( nextnode && nextnode.parentNode == node )
node.insertBefore( item, nextnode );
else
node.appendChild( item ); // IE compatibility (?)
return item;
}
function watchCatLoader () {
url = "http://hu.wikipedia.org/w/api.php";
params0 = "action=query&meta=userinfo&uiprop=groups&format=json";
preResponse = new Array();
watchCatArr = new Array();
displayLoading();
ajaxFunction(url, params0, 0);
};
function ajaxFunction(url, params, ver, optional, wlc, clc) {
var xmlHttp;
try {
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e) {
// Internet Explorer
try {
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
alert("Your browser does not support AJAX!");
return false;
}
}
}
xmlHttp.onreadystatechange=function() {
if(xmlHttp.readyState==4) {
if (ver == 0) {
preResponse[0] = eval( "(" + xmlHttp.responseText + ")" );
params1 = "action=query&generator=watchlist&gwllimit=max&cllimit=max&prop=categories&format=json";
if (xmlHttp.responseText.match(/sysop/) || xmlHttp.responseText.match(/patrol/)) {
params2 = "action=query&list=watchlist&wllimit=max&wlprop=timestamp|ids|sizes|patrol|flags|user|comment&format=json";
} else {
params2 = "action=query&list=watchlist&wllimit=max&wlprop=timestamp|ids|sizes|flags|user|comment&format=json";
}
ajaxFunction(url, params1, 1, 0, "", "|");
}
else if (ver == 1) {
if ((undefined !== optional) && (0 != optional)) {
preResponse[1][optional] = eval( "(" + xmlHttp.responseText + ")" );
} else {
preResponse[1] = new Array();
preResponse[1][optional] = eval( "(" + xmlHttp.responseText + ")" );
}
if (undefined !== preResponse[1][optional]["query-continue"]) {
if (undefined !== preResponse[1][optional]["query-continue"]["categories"]) {
gwlstart = wlc;
clcontinue = preResponse[1][optional]["query-continue"]["categories"]["clcontinue"];
params1 = "action=query&generator=watchlist&gwllimit=max&cllimit=max&prop=categories&format=json&gwlstart=" + gwlstart + "&clcontinue=" + clcontinue;
} else {
gwlstart = preResponse[1][optional]["query-continue"]["watchlist"]["gwlstart"];
clcontinue = "|";
params1 = "action=query&generator=watchlist&gwllimit=max&cllimit=max&prop=categories&format=json&gwlstart=" + gwlstart + "&clcontinue=" + clcontinue;
}
optional++;
ajaxFunction(url, params1, 1, optional, gwlstart, clcontinue);
} else {
ajaxFunction(url, params2, 2, 0);
}
}
else if (ver == 2) {
if ((undefined !== optional) && (0 != optional)) {
preResponse[2][optional] = eval( "(" + xmlHttp.responseText + ")" );
} else {
preResponse[2] = new Array();
preResponse[2][optional] = eval( "(" + xmlHttp.responseText + ")" );
}
if (undefined !== preResponse[2][optional]["query-continue"]) {
params2c = params2 + "&wlstart=" + preResponse[2][optional]["query-continue"]["watchlist"]["wlstart"]
optional++;
ajaxFunction(url, params2c, 2, optional);
} else {
responseHandler(preResponse);
}
}
else if (ver == 3) {
unwatchResponse = eval( "(" + xmlHttp.responseText + ")" );
removeWatched(unwatchResponse, optional);
}
}
}
xmlHttp.open("POST",url,true);
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttp.setRequestHeader("Content-length", params.length);
xmlHttp.setRequestHeader("Connection", "close");
xmlHttp.send(params);
}
function pageidSearch (arr, id) {
for (elem in arr) {
if (arr[elem]['pageid'] == id) {
return arr[elem];
}
}
return false;
}
function realLength (arr) {
var i = 0;
for (key in arr) {
i++;
}
return i;
};
function timeProcessor (timestamp) {
modDateTime = new Array();
rawDate = timestamp.split("T");
date = rawDate[0].split("-");
rawTime = rawDate[1].split("Z");
time = rawTime[0].split(":");
modDateTime['date'] = date;
modDateTime['time'] = time;
return modDateTime;
}
/**
*
* Javascript trim, ltrim, rtrim
* http://www.webtoolkit.info/
*
**/
function trim(str, chars) {
return ltrim(rtrim(str, chars), chars);
}
function ltrim(str, chars) {
chars = chars || "\\s";
return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
function rtrim(str, chars) {
chars = chars || "\\s";
return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}
function commentProcessor (rawComment) {
hasChapter = rawComment.match(/\*\//);
a = trim(rawComment, "\/\* ");
a = a.split(" */ ");
a.unshift(hasChapter);
return a;
}
function ksort(array) {
// http://kevin.vanzonneveld.net
// + original by: GeekFG (http://geekfg.blogspot.com)
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + improved by: Brett Zamir (http://brett-zamir.me)
// + modified by: Winston (http://hu.wikipedia.org/wiki/User:Winston)
// % note: The examples are correct, this is a new way
// * example 1: data = {2: 'van', 3: 'Zonneveld', 1: 'Kevin'};
// * example 1: ksort(data);
// * results 1: data == {1: 'Kevin', 2: 'van', 3: 'Zonneveld'}
// * returns 1: true
var tmp_arr={}, keys=[], i, key, that=this;
// Make a list of key names
for (key in array) {
keys.push(key);
}
keys.sort();
// Rebuild array with sorted key names
for (i = 0; i < keys.length; i++) {
key = keys[i];
tmp_arr[key] = array[key];
delete array[key];
}
for (i in tmp_arr) {
array[i] = tmp_arr[i];
}
return true;
}
function uasort (inputArr, sorter) {
// Sort an array with a user-defined comparison function and maintain index association
//
// version: 905.3122
// discuss at: http://phpjs.org/functions/uasort
// + original by: Brett Zamir (http://brett-zamir.me)
// + improved by: Brett Zamir (http://brett-zamir.me)
// * example 1: fruits = {d: 'lemon', a: 'orange', b: 'banana', c: 'apple'};
// * example 1: uasort(fruits, function (a, b) { if (a > b) {return 1;}if (a < b) {return -1;} return 0;});
// * results 1: fruits == {c: 'apple', b: 'banana', d: 'lemon', a: 'orange'}
if (typeof sorter === 'string') {
sorter = this[sorter];
} else if (sorter instanceof Array) {
sorter = this[sorter[0]][sorter[1]];
}
var valArr = [], keyArr=[], tempKeyVal, tempValue, ret;
var k = '', i = 0;
var sorterNew = function (keyArr, valArr) {
for (var i=valArr.length-2; i >=0; i--) {
for (var j=0; j <= i; j++) {
ret = sorter(valArr[j+1], valArr[j]);
if (ret < 0) {
tempValue = valArr[j];
valArr[j] = valArr[j+1];
valArr[j+1] = tempValue;
tempKeyVal = keyArr[j];
keyArr[j] = keyArr[j+1];
keyArr[j+1] = tempKeyVal;
}
}
}
};
for (k in inputArr) { // Get key and value arrays
valArr.push(inputArr[k]);
keyArr.push(k);
delete inputArr[k];
}
try {
sorterNew(keyArr, valArr); // Sort our new temporary arrays
} catch(e) {
return false;
}
for (i = 0; i < valArr.length; i++) { // Repopulate the old array
inputArr[keyArr[i]] = valArr[i];
}
return true;
}
function in_array(needle, haystack, argStrict) {
// Checks if the given value exists in the array
//
// version: 905.3120
// discuss at: http://phpjs.org/functions/in_array
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + improved by: vlado houba
// * example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);
// * returns 1: true
// * example 2: in_array('vlado', {0: 'Kevin', vlado: 'van', 1: 'Zonneveld'});
// * returns 2: false
// * example 3: in_array(1, ['1', '2', '3']);
// * returns 3: true
// * example 3: in_array(1, ['1', '2', '3'], false);
// * returns 3: true
// * example 4: in_array(1, ['1', '2', '3'], true);
// * returns 4: false
var key = '', strict = !!argStrict;
if (strict) {
for (key in haystack) {
if (haystack[key] === needle) {
return true;
}
}
} else {
for (key in haystack) {
if (haystack[key] == needle) {
return true;
}
}
}
return false;
}
function sortByDateDesc(a,b) {
var x = a.timestamp;
var y = b.timestamp;
return ((x < y) ? 1 : ((x > y) ? -1 : 0));
}
function child_search(needle,haystack){
for(var i in haystack){
if(haystack[i].id==needle){return parseInt(i);}
}
return false;
}
function responsePreprocessor (preResp) {
response = new Array();
response[0] = preResp[0]
response[1] = new Array();
response[2] = new Array();
for (var i=0;i<realLength(preResp[1]);i++) {
for (pageid in preResp[1][i].query.pages) {
if (undefined === response[1][pageid] || undefined !== preResp[1][i].query.pages[pageid]["categories"]) {
response[1][pageid] = preResp[1][i].query.pages[pageid];
}
}
}
var count = 0;
for (var i=0;i<realLength(preResp[2]);i++) {
for (j in preResp[2][i].query.watchlist) {
response[2][count++] = preResp[2][i].query.watchlist[j];
}
}
return response;
}
function responseHandler (resp) {
response = responsePreprocessor(resp);
if (undefined!==response[0].query.userinfo.groups) {
sysop = in_array("sysop", response[0].query.userinfo.groups);
}
for (pageid in response[1]) {
if (undefined===response[1][pageid].categories) {
response[1][pageid].categories = new Array();
response[1][pageid].categories[0] = new Array();
response[1][pageid].categories[0].title = "Speciális:Kategorizálatlan lapok"
}
for (i=0;i<response[1][pageid].categories.length;i++) {
catName = response[1][pageid].categories[i].title;
if (undefined===window.watchCatArr[catName]){
watchCatArr[catName] = new Array();
}
watchCatArr[catName][pageid] = new Array();
response2Elem = pageidSearch(response[2], pageid);
watchCatArr[catName][pageid]['title'] = response[1][pageid].title;
watchCatArr[catName][pageid]['timestamp'] = response2Elem.timestamp;
watchCatArr[catName][pageid]['timeArr'] = timeProcessor (response2Elem.timestamp);
watchCatArr[catName][pageid]['revid'] = response2Elem.revid;
watchCatArr[catName][pageid]['lendiff'] = response2Elem.newlen - response2Elem.oldlen;
watchCatArr[catName][pageid]['user'] = response2Elem.user;
watchCatArr[catName][pageid]['comment'] = commentProcessor(response2Elem.comment);
if (undefined!==window.response2Elem.patrolled) {
watchCatArr[catName][pageid]['patrolled'] = true;
} else { watchCatArr[catName][pageid]['patrolled'] = false; }
if (undefined!==window.response2Elem['new']) {
watchCatArr[catName][pageid]['new'] = true;
} else { watchCatArr[catName][pageid]['new'] = false; }
if (undefined!==window.response2Elem.minor) {
watchCatArr[catName][pageid]['minor'] = true;
} else { watchCatArr[catName][pageid]['minor'] = false; }
if (undefined!==window.response2Elem.bot) {
watchCatArr[catName][pageid]['bot'] = true;
} else { watchCatArr[catName][pageid]['bot'] = false; }
}
}
watchCatString = watchCatOutput(watchCatArr);
changeWl(watchCatString);
addRemoverLink();
}
function watchCatOutput(watchCatArr) {
ksort(watchCatArr);
clearLoading = true;
for (catName in watchCatArr) {
outputString = "";
if (realLength(watchCatArr[catName]) > 1) {
uasort(watchCatArr[catName], sortByDateDesc);
}
outputString += '<div class="watchCategory"><h4><a title="' + catName + '" href="/wiki/' + catName + '">' + catName + '</a></h4>';
for (pageid in watchCatArr[catName]) {
outputString += '<table cellspacing="0" cellpadding="0" border="0" style="background: none" id="' + pageid + '"><tr><td valign="top" style="white-space: nowrap"><tt><img src="/skins-1.5/common/images/Arr_.png" width="12" height="12" alt=" " title="" /> ';
if (true === watchCatArr[catName][pageid]['new']) {
outputString += '<span class="newpage">Ú</span>';
} else { outputString += ' '; }
if (true === watchCatArr[catName][pageid]['minor']) {
outputString += '<span class="minor">a</span>';
} else { outputString += ' '; }
if (true === watchCatArr[catName][pageid]['bot']) {
outputString += '<span class="bot">b</span>';
} else { outputString += ' '; }
// if (true === watchCatArr[catName][pageid]['patrolled']) {
outputString += ' ';
// } else { outputString += '<span class="unpatrolled">!</span>'; }
outputString += ' ';
outputString += watchCatArr[catName][pageid]['timeArr']['date'][0] + '. ' + watchCatArr[catName][pageid]['timeArr']['date'][1] + '. ' + watchCatArr[catName][pageid]['timeArr']['date'][2] + '. ' + watchCatArr[catName][pageid]['timeArr']['time'][0] + ':' + watchCatArr[catName][pageid]['timeArr']['time'][1];
outputString += ' </tt></td><td> <a href="/wiki/' + watchCatArr[catName][pageid]['title'] + '" title="' + watchCatArr[catName][pageid]['title'] + '">' + watchCatArr[catName][pageid]['title'] + '</a>';
outputString += ' (<a href="/w/index.php?title=' + watchCatArr[catName][pageid]['title'] + '&curid=' + pageid + '&diff=' + watchCatArr[catName][pageid]['revid'] + '">eltér</a>;';
outputString += ' <a href="/w/index.php?title=' + watchCatArr[catName][pageid]['title'] + '&curid=' + pageid + '&action=history">történet</a>;';
outputString += ' <a title="' + watchCatArr[catName][pageid]['title'] + '" name="' + pageid + '" class="removerLink">lapfigyelés vége</a>) . . ';
if (0 == watchCatArr[catName][pageid]['lendiff']) {
outputString += '<span class="mw-plusminus-null">(' + watchCatArr[catName][pageid]['lendiff'] + ')</span>';
} else if (0 < watchCatArr[catName][pageid]['lendiff']) {
outputString += '<span class="mw-plusminus-pos">(' + watchCatArr[catName][pageid]['lendiff'] + ')</span>';
} else if (0 > watchCatArr[catName][pageid]['lendiff']) {
outputString += '<span class="mw-plusminus-neg">(' + watchCatArr[catName][pageid]['lendiff'] + ')</span>';
}
outputString += ' . . <a href="/wiki/Szerkeszt%C5%91:' + watchCatArr[catName][pageid]['user'] + '" title="Szerkesztő:' + watchCatArr[catName][pageid]['user'] + '" class="mw-userlink">' + watchCatArr[catName][pageid]['user'] + '</a>';
outputString += ' <span class="mw-usertoollinks">(<a href="/wiki/Szerkeszt%C5%91vita:' + watchCatArr[catName][pageid]['user'] + '" title="Szerkesztővita:' + watchCatArr[catName][pageid]['user'] + '">vitalap</a>'
outputString += ' | <a href="/wiki/Speci%C3%A1lis:Szerkeszt%C5%91_k%C3%B6zrem%C5%B1k%C3%B6d%C3%A9sei/' + watchCatArr[catName][pageid]['user'] + '" title="Speciális:Szerkesztő közreműködései/' + watchCatArr[catName][pageid]['user'] + '">szerkesztései</a>';
if (true === sysop) {
outputString += ' | <a href="/wiki/Speci%C3%A1lis:Blokkol%C3%A1s/' + watchCatArr[catName][pageid]['user'] + '" title="Speciális:Blokkolás/' + watchCatArr[catName][pageid]['user'] + '">blokkolás</a>';
}
outputString += ')</span>';
if ((realLength(watchCatArr[catName][pageid]['comment']) == 3) || (realLength(watchCatArr[catName][pageid]['comment']) == 2 && watchCatArr[catName][pageid]['comment'][1] != "")) {
outputString += ' <span class="comment">(';
if (realLength(watchCatArr[catName][pageid]['comment']) == 3) {
outputString += '<span class="autocomment"><a href="/wiki/' + watchCatArr[catName][pageid]['title'] + '#' + watchCatArr[catName][pageid]['comment'][1] + '" title="' + watchCatArr[catName][pageid]['title'] + '">→</a>' + watchCatArr[catName][pageid]['comment'][1] + ':</span> ' + watchCatArr[catName][pageid]['comment'][2] + ')</span>';
} else {
outputString += watchCatArr[catName][pageid]['comment'][1] + ')</span>';
}
}
outputString += '</td></tr></table>';
}
outputString += '</div>';
changeWl(outputString, clearLoading);
}
}
function displayLoading() {
bodyCont = document.getElementById("bodyContent");
key = child_search("mw-watchlist-options", bodyCont.childNodes) + 2;
while (bodyCont.childNodes.length>key) {
bodyCont.removeChild(bodyCont.lastChild);
}
watchCatContainer = document.createElement("div");
watchCatContainer.id = "watchCatLoadingContainer";
watchCatContainer.innerHTML = '<div style="width:100%; text-align:center;"><h3>A WatchCat töltődik</h3><img src="http://upload.wikimedia.org/wikipedia/commons/f/f3/WatchCat_load_indicator_monobook.gif" /></div>';
bodyCont.appendChild(watchCatContainer);
}
function changeWl(outputStr, clearL) {
if (clearL) {
clearLoading = false;
bodyCont = document.getElementById("bodyContent");
key = child_search("mw-watchlist-options", bodyCont.childNodes) + 2;
while (bodyCont.childNodes.length>key) {
bodyCont.removeChild(bodyCont.lastChild);
}
watchCatContainer = document.createElement("div");
watchCatContainer.id = "watchCatContainer";
bodyCont.appendChild(watchCatContainer);
}
watchCatContainer.innerHTML += outputStr;
}
function unwatchHandler(ev) {
// vagy megkapjuk az esemény objektumot, vagy meg kell szereznünk
ev || (ev = window.event);
var target = ev.target || ev.srcElement;
params3 = "action=watch&title=" + target.title + "&unwatch=''&format=json";
ajaxFunction(url, params3, 3, target)
// eseménnyel mi foglalkoztunk, nem kell továbbvinni
if (ev.preventDefault) {
ev.preventDefault(); ev.stopPropagation();
}
else {
ev.cancelBubble = true; ev.returnValue = false;
}
return false;
}
function removeWatched (resp, targ) {
if (undefined !== resp.watch.unwatched) {
table = document.getElementById(targ.name);
table.parentNode.removeChild(table);
}
}
function addRemoverLink() {
removers = getElementsByClassName_win("removerLink");
if(removers[0].attachEvent){
for (var i=0;i<removers.length;i++) {
removers[i].attachEvent('onclick', unwatchHandler);
}
} else {
for (var i=0;i<removers.length;i++) {
removers[i].addEventListener('click', unwatchHandler, false);
}
}
}