Revision as of 19:37, 19 June 2008 view sourceMZMcBride (talk | contribs)Extended confirmed users190,643 edits updated code← Previous edit | Revision as of 05:23, 30 June 2008 view source East718 (talk | contribs)Extended confirmed users26,172 editsm guess JS doesn't have mode modifiersNext edit → | ||
(One intermediate revision by the same user not shown) | |||
Line 192: | Line 192: | ||
ips = Array( | ips = Array( | ||
Array(/\b63\.162\.143\.21\b/, 'the ]'), | Array(/\b63\.162\.143\.21\b/, 'the ]'), | ||
Array(/\b82\.148\.( |
Array(/\b82\.148\.9(6\.68|7\.69)\b/, ']'), | ||
Array(/\b128\.183\.103\.97\b/, ']'), | Array(/\b128\.183\.103\.97\b/, ']'), | ||
Array(/\ |
Array(/\b(((2|5)?6|7|1|2(2|8|9)|3(0|3)|55)\.(?\d\d?|2(5|\d))|130\.22|)(\.(?\d\d?|2(5|\d))){2}\b/, 'the ]'), | ||
Array(/\b138\.16( |
Array(/\b138\.16(\.(?\d\d?|2(5|\d))){2}\b/, 'the ]'), | ||
Array(/\b143\.2( |
Array(/\b143\.2(2|3)(\.(?\d\d?|2(5|\d))){2}\b/, 'the ]'), | ||
Array(/\b149\.101\. |
Array(/\b149\.101(\.(?\d\d?|2(5|\d))){2}\b/, 'the ]'), | ||
Array(/\b156\.33\. |
Array(/\b156\.33(\.(?\d\d?|2(5|\d))){2}\b/, 'the ]'), | ||
Array(/\ |
Array(/\b(162\.4\.(?\d\d?|2(5|\d))|198\.81\.(128|129|1\d|191))\.(?\d\d?|2(5|\d))\b/, 'the ]'), | ||
Array(/\b192\.197\.( |
Array(/\b192\.197\.(7|8)\.(?\d\d?|2(5|\d))\b/, 'the ]'), | ||
Array(/\b\ |
Array(/\b(51(\.(?\d\d?|2(5|\d))){2}|194.60.\d?)\.(?\d\d?|2(5|\d))\b/, 'the ]'), | ||
Array(/\ |
Array(/\b66\.230\.(19|2\d)\.(?\d\d?|2(5|\d))\b/, 'the ]'), | ||
Array(/\ |
Array(/\b91\.198\.174\.(19|2(\d|2))\b/, 'the ]') | ||
Array(/\b91\.198\.174\.(19|2((0|1)|2))\b/, 'the ]') | |||
); | ); | ||
ip = document.getElementById('mw-bi-target').value; | ip = document.getElementById('mw-bi-target').value; | ||
if (/\b(?:(?:25|2|??)\.){3}(?:25|2|??)\b/.test(ip)) | if (/\b(?:(?:25|2|??)\.){3}(?:25|2|??)\b/.test(ip)) | ||
{ | { | ||
for (i=0; i < ips.length; i++) | for (i = 0; i < ips.length; i++) | ||
{ | { | ||
if (ip.match(ips)) | if (ip.match(ips)) |
Revision as of 05:23, 30 June 2008
/** Creates a button to invert checkboxes on Special:Undelete */ if (wgCanonicalNamespace == "Special" && wgCanonicalSpecialPageName == "Undelete") { (function () { var form = document.forms; if( !form ) { return; } var elements = form.elements; var submitButton = elements; if( !submitButton ) { return; } var toggleButton = document.createElement("input"); toggleButton.type = "button"; toggleButton.value = "Invert selection"; toggleButton.onclick = function () { for( var i = 0; i < elements.length; ++i ) { var input = elements; if( input.type != "checkbox" ) { continue; } input.checked = !input.checked; } }; submitButton.parentNode.insertBefore( toggleButton, submitButton ); })(); } /** Clean CSD G10 deletion summaries ****************************************** * * Description: Replaces autogenerated deletion summaries for articles tagged * for speedy deletion as attack pages (CSD G10) with a neutral * summary that avoids including any part of the article content * in the deletion log. * Maintainers: ] */ if (wgAction == "delete") { (function () { var wpReason = document.getElementById("wpReason"); if (!wpReason) return; var regexp = /\{\{\s*(msg:\s*)?(template:\s*)?(db-a(p|tk)?|((csd|db))?(a6|attack(pages?|template)?|g10))\s*/i; if (regexp.test(wpReason.value)) wpReason.value = "]: ]"; })(); } /* * Note: These are the known redirects to ] as of 7 Jun 2007. * The regexp above should catch these as well as a number of possible variants. * * ] * ] * ] * ] * ] * ] * ] * ] * ] * ] * ] * ] * ] * ] */ /** Automatic deletion dropdown ******************************************************* * * Description: Augments the drop-down menu of standard deletion reasons * generated from ], to * automatically pick a reason from the list based on speedy * deletion tags. * Maintainers: ] */ if (wgAction == 'delete' && typeof(csdDeleteForm) == 'undefined') { (function() { // scope var list = document.getElementById('wpDeleteReasonList'); if(!list) return; var summaryBox = document.getElementById('wpReason') || document.getElementById('wpComment'); if(!summaryBox) return; var re = /\\|]*\|)?(]*)\]\]/g; // convert pipe links to their display text. for(var i=0;i<list.options.length;i++) { var o=list.options; o.text = o.text.replace(re,'$2'); } function csdChangeBox() { if(summaryBox.value.indexOf('content was:') != -1) summaryBox.value = ''; } function addEvent(obj, evType, fn, useCapture){ //alert(obj); if (obj.addEventListener) { obj.addEventListener(evType, fn, useCapture); return true; } else if (obj.attachEvent) { var r = obj.attachEvent("on"+evType, fn); return r; } else { alert("Handler could not be attached"); } } function findCSD(s) { // s e.g. "U1", "G10" for(var i=0;i<list.options.length;i++) { var o=list.options; if (o.text.indexOf("CSD "+s+":") == 0) return o; if (o.text.indexOf(s+":") == 0) return o; //TODO fine-tuning for A7 and G6 } } var reasons_regex = { 'G10': // copied from ]'s script, covers more bases than the others since it's more important (this script should blank the summary in _all_ cases where the other script does /\{\{\s*(msg:\s*)?(template:\s*)?(db-a(p|tk)?|((csd|db))?(a6|attack(pages?|template)?|g10))\s*/i, // other regexes are simpler and cover probably 99% of actual tags. 'G1': /\{\{\s*(db-|csd)?(nonsense|ns|g1)\s*\}\}/i, 'G2': /\{\{\s*(db-|csd)?(test|g2)\s*\}\}/i, 'G3': /\{\{\s*(db-|csd)?(vandalism|vandal|vand|g3)\s*\}\}/i, 'G4': /\{\{\s*((db-|csd)?(repost|g4)|deleteagain)\s*\}\}/i, 'G5': /\{\{\s*(db-|csd)?(banned|ban|g5)\s*\}\}/i, 'G6': /\{\{\s*(db-|csd)?(maintenance|move|histmerge|g6)\s*\}\}/i, // db-move and db-histmerge should be covered elsewhere if possible 'G7': /\{\{\s*(db-|csd)?(author|blanked|g7)\s*\}\}/i, 'G8': /\{\{\s*(db-|csd)?(talk|g8)\s*\}\}/i, // G9 is for office, there is no tag. // G10 is covered above 'G11': /\{\{\s*(db-|csd)?(spam|ad|advert|g11)\s*\}\}/i, 'G12': /\{\{\s*(db-|csd)?(copyvio|cv|cvio|g12|a8)\s*(\}\}|\|)/i, 'A1': /\{\{\s*(db-|csd)?((no)?context|a1)\s*\}\}/i, 'A3': /\{\{\s*(db-|csd)?((no)?content|a3|contact|a4)\s*\}\}/i, // A4 = A3 // A6 = G10 'A7 (bio)': /\{\{\s*(nn-|db-|csd)?(a7|notability|bio|person)\s*\}\}/i, 'A7 (web)': /\{\{\s*(nn-|db-|csd)?(web(site)?|inter(net|tubes))\s*\}\}/i, 'A7 (group)': /\{\{\s*(db-|csd|nn-)?(band|club|music|inc|corp|comp(any)?)\s*\}\}/i, // TODO separate for music/band? // A8 = G12 'C1': /(\{\{\s*(db-|csd)?(emptycat|c1)\s*\}\}|empty category)/i, 'U1': /\{\{\s*(db-|csd)?(userreq|u1|user)\s*\}\}/i, 'I2': /\{\{\s*(db-|csd)?(noimage|i2)\s*\}\}/i, 'R1': /\{\{\s*(db-|csd)?(redirnone|r1)\s*\}\}/i, // no point in including the other image categories here, this will only work // when deleting a description page with no image 'dummy': /this will never be reached, it is there to allow every entry above to end in a comma/ } function autopick_deletion_reason() { for(var csd in reasons_regex) { if(reasons_regex.test(summaryBox.value)) { var option = findCSD(csd); if(!option) { if(csd == 'G10') summaryBox.value = "]: ]"; // last resort, if G10 can't be found in the menu. return; } list.selectedIndex = option.index; csdChangeBox(); // clear summary box } } // TODO "content before blanking" and A7, etc. // TODO We can autodetect G8 from the namespace and a redlinked tab. var xfdregex = /.*\{\{AfDM\|page=(*)\|.*/; if(xfdregex.test(summaryBox.value)) { summaryBox.value = summaryBox.value.replace(xfdregex,']'); return; } xfdregex = /.*\{\{mfdtag\|(*)\}\}.*/; if(xfdregex.test(summaryBox.value)) { summaryBox.value = summaryBox.value.replace(xfdregex,']'); return; } xfdregex = /.*\{\{dated prod\|concern = (\{\{\{concern\|)?(.*?)(\}\}\})?\|month.*/; if(xfdregex.test(summaryBox.value)) { summaryBox.value = summaryBox.value.replace(xfdregex,'], reason was \'$2\'.'); return; } if(summaryBox.value.indexOf('\{\{rfd\}\}') != -1) { // best we can do without a direct link summaryBox.value = ']'; return; } xfdregex = /.*\{\{((db|delete).*?)\}\}.*/; if(xfdregex.test(summaryBox.value)) { // last resort for unhandled speedy tags summaryBox.value = summaryBox.value.replace(xfdregex,'$1'); return; } } addEvent(list, "change", csdChangeBox, false); autopick_deletion_reason(); })(); // scope } // Sensitive IP checker - maintained by east718 if (wgPageName == 'Special:BlockIP') { ips = Array( Array(/\b63\.162\.143\.21\b/, 'the ]'), Array(/\b82\.148\.9(6\.68|7\.69)\b/, ']'), Array(/\b128\.183\.103\.97\b/, ']'), Array(/\b(((2|5)?6|7|1|2(2|8|9)|3(0|3)|55)\.(?\d\d?|2(5|\d))|130\.22|)(\.(?\d\d?|2(5|\d))){2}\b/, 'the ]'), Array(/\b138\.16(\.(?\d\d?|2(5|\d))){2}\b/, 'the ]'), Array(/\b143\.2(2|3)(\.(?\d\d?|2(5|\d))){2}\b/, 'the ]'), Array(/\b149\.101(\.(?\d\d?|2(5|\d))){2}\b/, 'the ]'), Array(/\b156\.33(\.(?\d\d?|2(5|\d))){2}\b/, 'the ]'), Array(/\b(162\.4\.(?\d\d?|2(5|\d))|198\.81\.(128|129|1\d|191))\.(?\d\d?|2(5|\d))\b/, 'the ]'), Array(/\b192\.197\.(7|8)\.(?\d\d?|2(5|\d))\b/, 'the ]'), Array(/\b(51(\.(?\d\d?|2(5|\d))){2}|194.60.\d?)\.(?\d\d?|2(5|\d))\b/, 'the ]'), Array(/\b66\.230\.(19|2\d)\.(?\d\d?|2(5|\d))\b/, 'the ]'), Array(/\b91\.198\.174\.(19|2(\d|2))\b/, 'the ]') ); ip = document.getElementById('mw-bi-target').value; if (/\b(?:(?:25|2|??)\.){3}(?:25|2|??)\b/.test(ip)) { for (i = 0; i < ips.length; i++) { if (ip.match(ips)) { jsMsg('<table><tr><td valign="center"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Nuvola_apps_important.svg/48px-Nuvola_apps_important.svg.png" /></td><td valign="center">You are blocking a sensitive IP address belonging to ' + ips.replace(']', '</a>') + '. Please be sure to <a href="http://meta.wikimedia.org/Communications_committee/Notifications" class="extiw" title="meta:Communications_committee/Notifications">notify</a> the <a href="http://meta.wikimedia.org/Communications_committee" class="extiw" title="meta:Communications_committee">Wikimedia Foundation Communications Committee</a> immediately.</td></tr></table>'); } } } }