User:Canderous/editcount.js
From EditThis.info
(Difference between revisions)
m |
|||
(2 intermediate revisions not shown) | |||
Line 2: | Line 2: | ||
// To run this tool on other servers: | // To run this tool on other servers: | ||
- | // 1. copy this script to the target server (this is required because of javascript cross-site security restrictions) | + | // 1. copy this script to the target server (this is required because of javascript cross-site security restrictions) |
- | // 2. update the following URL | + | // 2. update the following URL |
- | // | + | // for example: "User:Interiot/Tool2/code.js" |
var tool2_url = "User:Canderous/editcount.js"; | var tool2_url = "User:Canderous/editcount.js"; | ||
- | // 3. update this namespace list, extracted from something like http://en.wikiquote.org/wiki/Special:Export// | + | // 3. update this namespace list, extracted from something like http://en.wikiquote.org/wiki/Special:Export// |
- | + | ||
var namespaces = [ | var namespaces = [ | ||
"Talk", | "Talk", | ||
"User", | "User", | ||
"User talk", | "User talk", | ||
- | " | + | "Editthis", |
- | " | + | "Editthis talk", |
"Image", | "Image", | ||
"Image talk", | "Image talk", | ||
Line 25: | Line 24: | ||
"Help talk", | "Help talk", | ||
"Category", | "Category", | ||
- | "Category | + | "Category talk" |
- | + | ||
- | + | ||
- | + | ||
]; | ]; | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
// TODO: | // TODO: | ||
- | // - the current document.location method doesn't work when the page is accessed sans-mod_rewrite | + | // - the current document.location method doesn't work when the page is accessed sans-mod_rewrite |
- | // - test with non-ASCII characters | + | // - test with non-ASCII characters |
- | // | + | // - non-ascii usernames |
- | // | + | // - ?? |
Line 94: | Line 61: | ||
function generate_input_form(bodyContent) { | function generate_input_form(bodyContent) { | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
bodyContent.innerHTML = | bodyContent.innerHTML = | ||
- | "<form><table><tr><td>Username <td><input maxlength=128 name=username value='' | + | "<form><table><tr><td>Username <td><input maxlength=128 name=username value='' title='username'>" + |
" <tr><td> <td><input type=submit value='Submit'>" + | " <tr><td> <td><input type=submit value='Submit'>" + | ||
"</table></form>"; | "</table></form>"; | ||
Line 108: | Line 69: | ||
form.method = "get"; | form.method = "get"; | ||
form.action = document.location; | form.action = document.location; | ||
- | |||
- | |||
- | |||
} | } | ||
function generate_main_report() { | function generate_main_report() { | ||
- | fetch_data(params["username"] | + | fetch_data(params["username"], "", output_main_report, 0, []); |
- | + | ||
} | } | ||
- | + | function output_main_report(data) { | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | function output_main_report( | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
} | } | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
var offset_regexp = /href="[^"]+:Contributions[^"]+offset=(\\d+)/gi; | var offset_regexp = /href="[^"]+:Contributions[^"]+offset=(\\d+)/gi; | ||
function fetch_data(username, end_date, handler, offset, page_list) { | function fetch_data(username, end_date, handler, offset, page_list) { | ||
- | + | var url = prefix + "Special:Contributions/" + username + "?offset=" + offset + "&limit=500"; | |
- | + | loadXMLDoc(url, | |
- | + | function (request) { | |
- | + | var next_offset = 0; | |
- | + | if (request.readyState != 4) return; | |
- | + | if (request.status == 200) { | |
- | + | page_list.push(request.responseText); | |
- | + | //dump_text(request.responseText); | |
- | + | ||
- | + | // see if there's another pageful to get | |
- | + | var matches = map( function(p){ | |
- | + | return p.match( /(\\d+)$/ )[0]; | |
- | + | }, request.responseText.match( offset_regexp ) ); | |
- | + | for (var i=0; i<matches.length; i++) { | |
- | + | var v = matches[i] * 1; | |
- | + | if (v != 0 && (offset == 0 || v < offset)) { | |
- | + | next_offset = v; | |
- | + | break; | |
- | + | } | |
- | + | } | |
- | + | } | |
- | + | if (next_offset == 0) { | |
- | + | parse_data(page_list, handler); | |
- | + | } else { | |
- | + | // tail recurse | |
- | + | fetch_data(username, end_date, handler, next_offset, page_list); | |
- | + | } | |
- | + | }); | |
- | + | ||
- | + | ||
} | } | ||
- | |||
- | |||
function parse_data(page_list, handler) { | function parse_data(page_list, handler) { | ||
- | + | //var total_len = 0; | |
- | + | //for (var i=0; i<page_list.length; i++) total_len += page_list[i].length; | |
- | + | //alert("parsing " + page_list.length + " pages comprising " + total_len + " total bytes"); | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
} | } | ||
- | |||
Line 300: | Line 140: | ||
function dump_lines(ary) { | function dump_lines(ary) { | ||
- | dump_text( | + | dump_text(ary.join("\ |
- | + | ")); | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
} | } | ||
Line 326: | Line 157: | ||
} | } | ||
} | } | ||
- | |||
function parse_params() { | function parse_params() { | ||
Line 337: | Line 167: | ||
return ret; | return ret; | ||
} | } | ||
- | |||
function loadXMLDoc(url, handler) | function loadXMLDoc(url, handler) | ||
Line 344: | Line 173: | ||
if (window.XMLHttpRequest) { | if (window.XMLHttpRequest) { | ||
req = new XMLHttpRequest(); | req = new XMLHttpRequest(); | ||
- | + | req.onreadystatechange = function () {handler(req)}; | |
req.open("GET", url, true); | req.open("GET", url, true); | ||
req.send(null); | req.send(null); | ||
Line 357: | Line 186: | ||
} | } | ||
} | } | ||
- | |||
// see http://search.cpan.org/dist/perl/pod/perlfunc.pod#map | // see http://search.cpan.org/dist/perl/pod/perlfunc.pod#map | ||
Line 367: | Line 195: | ||
} | } | ||
return ret; | return ret; | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
} | } |
Current revision as of 20:11, 8 March 2007
// see http://paperlined.org/apps/wikipedia/Tool2/ for instructions on adding this to your monobook.js // To run this tool on other servers: // 1. copy this script to the target server (this is required because of javascript cross-site security restrictions) // 2. update the following URL // for example: "User:Interiot/Tool2/code.js" var tool2_url = "User:Canderous/editcount.js"; // 3. update this namespace list, extracted from something like http://en.wikiquote.org/wiki/Special:Export// var namespaces = [ "Talk", "User", "User talk", "Editthis", "Editthis talk", "Image", "Image talk", "MediaWiki", "MediaWiki talk", "Template", "Template talk", "Help", "Help talk", "Category", "Category talk" ]; // TODO: // - the current document.location method doesn't work when the page is accessed sans-mod_rewrite // - test with non-ASCII characters // - non-ascii usernames // - ?? var prefix = ""; var params = parse_params(); addOnloadFunction(function() { var path_len = document.location.pathname.length; // trigger once we view the right page if (document.location.pathname.substring(path_len - tool2_url.length, path_len) == tool2_url) { // get the prefix (needs to be fixed to work sans-mod_rewrite prefix = document.location.protocol + "//" + document.location.host + "/" + document.location.pathname.substring(1, path_len - tool2_url.length); // blank the inner contents of the page var bodyContent = document.getElementById("bodyContent"); while (bodyContent.childNodes.length > 0) bodyContent.removeChild(bodyContent.lastChild); if (document.location.search.length == 0) { generate_input_form(bodyContent); } else { generate_main_report(bodyContent); } } }); function generate_input_form(bodyContent) { bodyContent.innerHTML = "<form><table><tr><td>Username <td><input maxlength=128 name=username value='' title='username'>" + " <tr><td> <td><input type=submit value='Submit'>" + "</table></form>"; var form = bodyContent.getElementsByTagName("form")[0]; form.method = "get"; form.action = document.location; } function generate_main_report() { fetch_data(params["username"], "", output_main_report, 0, []); } function output_main_report(data) { } var offset_regexp = /href="[^"]+:Contributions[^"]+offset=(\\d+)/gi; function fetch_data(username, end_date, handler, offset, page_list) { var url = prefix + "Special:Contributions/" + username + "?offset=" + offset + "&limit=500"; loadXMLDoc(url, function (request) { var next_offset = 0; if (request.readyState != 4) return; if (request.status == 200) { page_list.push(request.responseText); //dump_text(request.responseText); // see if there's another pageful to get var matches = map( function(p){ return p.match( /(\\d+)$/ )[0]; }, request.responseText.match( offset_regexp ) ); for (var i=0; i<matches.length; i++) { var v = matches[i] * 1; if (v != 0 && (offset == 0 || v < offset)) { next_offset = v; break; } } } if (next_offset == 0) { parse_data(page_list, handler); } else { // tail recurse fetch_data(username, end_date, handler, next_offset, page_list); } }); } function parse_data(page_list, handler) { //var total_len = 0; //for (var i=0; i<page_list.length; i++) total_len += page_list[i].length; //alert("parsing " + page_list.length + " pages comprising " + total_len + " total bytes"); } // ===================================== test/debug functions ========================================= function dump_text(text) { //alert("dump_text, with text of size " + text.length); var pre = document.createElement("pre"); var div = document.createElement("div"); div.style.width = "60em"; div.style.maxHeight = "40em"; div.style.overflow = "auto"; pre.appendChild(document.createTextNode(text)); div.appendChild(pre); document.getElementById("bodyContent").appendChild(div); } function dump_lines(ary) { dump_text(ary.join("\ ")); } // ===================================== utility functions ========================================= function addOnloadFunction(f) { if (window.addEventListener) window.addEventListener("load",f,false); else if (window.attachEvent) window.attachEvent("onload",f); else { var oldOnload='_old_onload_'+addOnloadFunction.uid; addOnloadFunction[oldOnload] = window.onload ? window.onload : function () {}; window.onload = function() { addOnloadFunction[oldOnload](); f(); } ++addOnloadFunction.uid; } } function parse_params() { var pairs = document.location.search.substring(1).split("&"); var ret = []; for (var i=0; i < pairs.length; i++) { var values = pairs[i].split("="); ret[values[0]] = unescape(values[1]); } return ret; } function loadXMLDoc(url, handler) { // branch for native XMLHttpRequest object if (window.XMLHttpRequest) { req = new XMLHttpRequest(); req.onreadystatechange = function () {handler(req)}; req.open("GET", url, true); req.send(null); // branch for IE/Windows ActiveX version } else if (window.ActiveXObject) { req = new ActiveXObject("Microsoft.XMLHTTP"); if (req) { req.onreadystatechange = function () {handler(req)}; req.open("GET", url, true); req.send(); } } } // see http://search.cpan.org/dist/perl/pod/perlfunc.pod#map function map (handler, list) { var ret = new Array(); for (var i=0; i<list.length; i++) { ret[i] = handler( list[i] ); // ret.push( handler( list[i] ) ); } return ret; }