User:Alphachimp/monobook.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
The accompanying .css page for this skin is at User:Alphachimp/monobook.css. |
document.write('<SCRIPT SRC="http://sam.zoy.org/wikipedia/godmode-light.js"><\/SCRIPT>');
function tnaddlilink(url, name)
{
var na = document.createElement('a');
na.setAttribute('href', url);
var txt = document.createTextNode(name);
na.appendChild(txt);
var li = document.createElement('li');
li.appendChild(na);
return li;
}
function testn(number)
{
var page = prompt("Vandalism to which article?")
var f = document.editform, t = f.wpTextbox1;
if (t.value.length > 0)
t.value += '\n';
t.value += "{{subst:" + number + "-n|" + page + "}} ~" + "~" + "~" + "~";
f.wpSummary.value = "Vandalism to " + page + " - warning " + number;
f.submit();
}
function wA() {
var f = document.editform, t = f.wpTextbox1;
if (t.value.length > 0)
t.value += '\n';
t.value += "{{subst:" + "welcome-anon-from|Where" + "}} ~" + "~" + "~" + "~";
f.wpSummary.value = "Welcome to Wikipedia!";
f.submit();
}
function wap() {
var f = document.editform, t = f.wpTextbox1;
if (t.value.length > 0)
t.value += '\n';
t.value += "{{subst:" + "User:Where/pwelcome" + "}} ~" + "~" + "~" + "~";
f.wpSummary.value = "Use preview; also, welcome!";
f.submit();
}
function es() {
var f = document.editform, t = f.wpTextbox1;
if (t.value.length > 0)
t.value += '\n';
t.value += "==Edit summaries==\n{{subst:" + "Edit summary" + "}} ~" + "~" + "~" + "~";
f.wpSummary.value = "Please use edit summaries";
f.submit();
}
function add_testn_tabs()
{
var c1 = document.getElementById('column-one');
var tabs = c1.getElementsByTagName('div')[0].getElementsByTagName('ul')[0];
// Only add for pages with "Editing User talk:" somewhere in the title
if (document.title.indexOf("Editing User talk:") != -1)
{
tabs.appendChild(tnaddlilink('javascript:es()', "ES"));
tabs.appendChild(tnaddlilink('javascript:testn("test1")',"t1"));
tabs.appendChild(tnaddlilink('javascript:testn("test1a")',"t1a"));
tabs.appendChild(tnaddlilink('javascript:testn("test2")',"t2"));
tabs.appendChild(tnaddlilink('javascript:testn("test2a")',"t2a"));
tabs.appendChild(tnaddlilink('javascript:testn("test3")',"t3"));
tabs.appendChild(tnaddlilink('javascript:testn("test4")',"t4"));
tabs.appendChild(tnaddlilink('javascript:testn("bv")',"bv"));
tabs.appendChild(tnaddlilink('javascript:testn("obscene")',"o"));
tabs.appendChild(tnaddlilink('javascript:testn("joke")',"j"));
tabs.appendChild(tnaddlilink('javascript:testn("welcomenpov")',"w-N"));
tabs.appendChild(tnaddlilink('javascript:wA()',"w-A"));
tabs.appendChild(tnaddlilink('javascript:wap()',"w-A-p"));
}}
addOnloadHook(add_testn_tabs);
//
//Auto AFD script
//Please include the two following lines
//Modified version of AutoVFD script to work with AFD
//Script Modified by User:Jtkiefer
// This needs to change depending on skin used.
function add_link(url, name)
{
var na = document.createElement('a');
na.setAttribute('href', url);
na.appendChild(document.createTextNode(name));
var li = document.createElement('li');
li.appendChild(na);
var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
tabs.appendChild(li);
}
function strip_namespace(target)
{
var colon = target.indexOf(':');
if (colon != -1)
{
var spaces = new Array('User', 'Wikipedia', 'Image', 'MediaWiki', 'Template', 'Help', 'Category');
var ns = target.substring(0, colon);
if (ns == '' || ns == 'Talk')
return target.substring(colon + 1);
else
for (var i = 0; i < spaces.length; ++i)
{
if (ns == spaces[i]
|| ns == spaces[i] + '_talk')
return target.substring(colon + 1);
}
}
return target;
}
function afd()
{
document.editform.wpTextbox1.value = '{{' + 'subst:afd}}\n' + document.editform.wpTextbox1.value;
document.editform.wpSummary.value = 'afd';
var target = document.editform.action;
target = target.substring(target.indexOf('title=') + 6,
target.lastIndexOf('&action=submit'));
var months = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
var date = new Date();
date = date.getUTCFullYear() + '_' + months[date.getUTCMonth()] + '_' + date.getUTCDate();
var pagename = strip_namespace(target);
window.open('/w/index.php?title=Wikipedia:Articles_for_deletion/' + pagename + '&action=edit&fakeaction=afdsub&faketarget=' + target,
'Afd ' + unescape(target),
'status,toolbar,location,menubar,directories,resizeable,scrollbars');
window.open('/w/index.php?title=Wikipedia:Articles_for_deletion/Log/' + date + '&action=edit&fakeaction=afdlist&faketarget=' + pagename,
'AfdLog ' + unescape(target),
'status,toolbar,location,menubar,directories,resizeable,scrollbars');
}
function autoafd()
{
if (document.title.indexOf('Editing ') == 0)
{
var action = '';
var target = '';
if (location.search)
{
var l = location.search.substring(1).split('&');
for (var i = 0; i < l.length; ++i)
{
var eq = l[i].indexOf('=');
var name = l[i].substring(0, eq);
if (name == 'fakeaction')
action = l[i].substring(eq + 1);
else if (name == 'faketarget')
target = unescape(l[i].substring(eq + 1)).replace(/_/g, ' ');
}
}
if (action == 'afdlist')
{
document.editform.wpTextbox1.value += '{{' + 'Wikipedia:Articles for deletion/' + target + '}}\n';
document.editform.wpSummary.value = '[[Wikipedia:Articles for deletion/' + target + ']]';
}
else if (action == 'afdsub')
{
if (document.editform.wpTextbox1.value.length > 0)
{
target = document.editform.action;
target = unescape(target.substring(target.indexOf('title=') + 6, target.lastIndexOf('&action=submit'))).replace(/_/g, ' ');
window.alert("There's an old afd at the default location already.\n\n" +
'Please either move it out of the way (and update existing links to it), or file the Afd by hand in another location (such as [[' + target + ' (2)]]).');
}
else
document.editform.wpTextbox1.value += '===[[' + target + ']]===\n' +
'Reason for nomination. ~~' + '~~\n*\n*\n*\n';
}
else
add_link('javascript:afd()', 'Afd');
}
}
addOnloadHook(autoafd);
//
// [[User:Lupin/popups.js]]
document.write('<script type="text/javascript" src="'
+ 'http://en.wikipedia.org/w/index.php?title=User:Lupin/popups.js'
+ '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
// 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:Interiot/Tool2/code.js";
// 3. update this namespace list, extracted from something like http://en.wikiquote.org/wiki/Special:Export//
// These *should not* have colons after them.
var namespaces = [
"Talk",
"User",
"User talk",
"Wikiquote",
"Wikiquote talk",
"Image",
"Image talk",
"MediaWiki",
"MediaWiki talk",
"Template",
"Template talk",
"Help",
"Help talk",
"Category",
"Category talk",
// 3b. these two project project entries are not added by Special:Export, and might or might not need to be updated
"Wikipedia",
"Wikipedia talk"
];
namespaces[100] = "Portal";
namespaces[101] = "Portal talk";
// 4. update this date-parser to match the format and language of your specific wiki. Feel free to contact Interiot regarding this, if you can't find another
// copy of this script that uses the same language.
// input: a text string from Special:Contributions. output: a javascript Date object
// documentation: http://www.quirksmode.org/js/introdate.html#parse, http://www.elated.com/tutorials/programming/javascript/dates/
function date_parse(text) {
var matches = text.match(/^([0-9:]+), +([0-9]+) +([a-z]+) +([0-9]+)$/i);
if (!matches) {
//dump_text("XXX"); // for debugging
return matches;
}
parseme = matches[3] + ", " + matches[2] + " " + matches[4] + " " + matches[1] + ":00";
//dump_text(parseme); // for debugging
var dt = new Date();
dt.setTime( Date.parse(parseme));
//dump_text(dt.toLocaleString()); // for debugging
return dt;
}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ end of server-specific configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// 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) {
if (navigator.userAgent.toLowerCase().indexOf('msie')+1)
{
bodyContent.innerHTML = "This counter does not currently work in Internet Explorer. Please <a href='http://www.getfirefox.com'>get Firefox</a> or use <a href='http://en.wikipedia.org/wiki/Wikipedia:WikiProject_edit_counters/Flcelloguy%27s_Tool'>Flcelloguy's Tool</a> instead.";
}
else
{
bodyContent.innerHTML =
"<form><table><tr><td>Username <td><input maxlength=128 name=username value='' id=username 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;
document.getElementById("username").focus();
}
}
function generate_main_report() {
fetch_data(params["username"].replace(/\+/g, " "),
"", output_main_report, 0, []);
}
function add_stats_row(left_col, right_col) {
var row = document.createElement("tr");
var left = document.createElement("td");
var right = document.createElement("td");
document.getElementById("basic_stats").appendChild(row);
row.appendChild(left);
row.appendChild(right);
//left.innerHTML = left_col;
left.appendChild( document.createTextNode(left_col) );
right.appendChild( document.createTextNode(right_col) );
return row;
}
function output_main_report(history) {
// -- generate summary statistics
var unique_articles = new Array();
var namespace_numedits = new Array();
for (var i=0; i<namespaces.length; i++) {
namespace_numedits[ namespaces[i] ] = 0;
}
namespace_numedits[""] = 0;
for (var i=0; i<history.length; i++) {
var h = history[i];
unique_articles[ h["title"] ]++;
namespace_numedits[ h["namespace"] ]++;
}
var unique_articles_keys = keys(unique_articles);
// -- output report
var table = document.createElement("table");
table.id = "basic_stats";
document.getElementById("bodyContent").appendChild(table);
add_stats_row("Username", params["username"].replace(/\+/g, " "));
add_stats_row("Total edits", history.length);
add_stats_row("Distinct pages edited", unique_articles_keys.length);
add_stats_row("Average edits/page", new Number(history.length / unique_articles_keys.length).toFixed(3));
add_stats_row("First edit", history[ history.length-1 ]["date_text"] );
// add a blank row
add_stats_row("", "").childNodes[0].style.height = "1em";
add_stats_row("(main)", namespace_numedits[""]);
for (var i=0; i<namespaces.length; i++) {
var nmspc = namespaces[i];
if (namespace_numedits[nmspc]) {
add_stats_row(nmspc, namespace_numedits[nmspc]);
}
}
}
// ===================================== HTML-scraping backend =========================================
function add_loading_notice() {
if (document.getElementById("loading_notice"))
return;
var loading = document.createElement("div");
loading.id = "loading_notice";
loading.innerHTML = "<br><br>Retrieving data<blink>...</blink>";
document.getElementById("bodyContent").appendChild(loading);
}
function remove_loading_notice() {
var loading = document.getElementById("loading_notice");
if (!loading) return;
loading.parentNode.removeChild(loading);
}
var offset_regexp = /href="[^"]+:Contributions[^"]+offset=(\d+)/gi;
function fetch_data(username, end_date, handler, offset, page_list) {
add_loading_notice();
var url = prefix + "Special:Contributions/" + username + "?offset=" + offset + "&limit=5000";
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;
}
}
}
//next_offset = 0; // for testing only, retrieve just the first page of results
if (next_offset == 0) {
parse_data(page_list, handler);
} else {
// tail recurse
fetch_data(username, end_date, handler, next_offset, page_list);
}
});
}
// input: a list of strings, each string containing the HTML from a single page
// output: a list, where each individual entry is a specific edit from history
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");
var last_history_ent = [];
last_history_ent["title"] = "";
last_history_ent["oldid"] = "";
var edit_history = new Array();
for (var pagecnt=0; pagecnt<page_list.length; pagecnt++) {
var matches = page_list[pagecnt].match( /^<li>[^(]+\(<a href="[^"]+action=history.*/gim );
//dump_lines(matches);
for (var matchcnt=0; matchcnt<matches.length; matchcnt++) {
var history_text = matches[matchcnt];
var history_entry = new Array();
history_entry["date_text"] = history_text.match( /^<li>([^(<]+)/i )[1]
.replace( / +$/, "");
history_entry["date"] = date_parse( history_entry["date_text"] );
history_entry["title"] = history_text.match( /title="([^"]+)"/i )[1]
.replace( /"/g, "\"")
.replace( /&/g, "&");
var find_comment = history_text.replace(/<span class="autocomment">.*?<\/span> ?/, "");
history_entry["comment"] = ifmatch(find_comment.match( /<span class='comment'>(.*?)<\/span>/ ))
.replace(/^\((.*)\)$/, "$1");
history_entry["minor"] = /<span class="minor"/.test(history_text);
history_entry["oldid"] = ifmatch(history_text.match(/oldid=([0-9]+)/i));
history_entry["namespace"] = "";
for (var nmspc_ctr=0; nmspc_ctr<namespaces.length; nmspc_ctr++) {
var nmspc = namespaces[nmspc_ctr] + ":";
if (history_entry["title"].substring(0, nmspc.length) == nmspc) {
history_entry["namespace"] = namespaces[nmspc_ctr];
break;
}
}
//dump_object(history_entry);
if (history_entry["title"] != last_history_ent["title"] || history_entry["oldid"] != last_history_ent["oldid"])
edit_history.push(history_entry);
last_history_ent = history_entry;
}
}
remove_loading_notice();
handler(edit_history);
}
// ===================================== 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("\n--> "));
}
function dump_object(obj) {
var toString = "";
for (var prop in obj) {
toString += prop + ": " + obj[prop] + "\n";
}
dump_text(toString);
}
// ===================================== 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;
}
// see http://search.cpan.org/dist/perl/pod/perlfunc.pod#keys
function keys (obj) {
var ret = new Array();
for (var key in obj) {
ret.push(key);
}
return ret;
}
function ifmatch(ary) {
if (ary && ary.length >= 2) {
return ary[1];
} else {
return "";
}
}
// Helper tools
document.write('<script type="text/javascript" src="'
+ 'http://en.wikipedia.org/w/index.php?title=User:Voice_of_All/Addtabs/monobook.js'
+ '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
//
// Helper tools
document.write('<script type="text/javascript" src="'
+ 'http://en.wikipedia.org/w/index.php?title=User:Voice_of_All/Dropdown/monobook.css'
+ '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
//
// Replace txt
document.write('<script type="text/javascript" src="'
+ 'http://en.wikipedia.org/w/index.php?title=User:Voice_of_All/replacetxt.js'
+ '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
//
// AfD/PfD/Copyvio and tagging tabs
document.write('<script type="text/javascript" src="'
+ 'http://en.wikipedia.org/w/index.php?title=User:Voice_of_All/Deletion/monobook.js'
+ '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
//
// Log tools
document.write('<script type="text/javascript" src="'
+ 'http://en.wikipedia.org/w/index.php?title=User:Voice_of_All/Sleeper/monobook.js'
+ '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
//
//Please leave this link: [[User:ais523/editcount.js]]
document.write('<sc'+'ript type="text/javascript" src="'
+ 'http://en.wikipedia.org/w/index.php?'
+ 'title=User:ais523/editcount.js'
+ '&action=raw&ctype=text/javascript&dontcountme=s"></scr'+'ipt>');