MediaWiki:Gadget-contribsrange.js: diferenças entre revisões
Conteúdo apagado Conteúdo adicionado
m A versão do Commons é identica a da Wikipédia (w:en:MediaWiki:Gadget-contribsrange.js), exceto por um addOnloadHook que virou $j(document).ready |
Troca de um fork desatualizado por "mw.loader.load('//pt.wikipedia.org/w/index.php?title=MediaWiki:Gadget-contribsrange.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400');" |
||
Linha 1: | Linha 1: | ||
mw.loader.load('//pt.wikipedia.org/w/index.php?title=MediaWiki:Gadget-contribsrange.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400'); |
|||
/* Special:Contributions Wildcard/CIDR lookup, version [0.2.7] |
|||
Originally from version 312947638 as of September 10, 2009 from [[w:en:User:Splarka/contribsrange.js]] |
|||
Notes: |
|||
* Uses the API which is faster than most CIDR contrib tools. |
|||
** Needs 1.14 r42198+ for advanced continue. |
|||
* Currently uses a GET json via <script src=""> to avoid ajax problems. |
|||
* Only currently works if submitted (or called by URL parameter, eg Special:Contributions/User). |
|||
** Checks namespace and date options in form. |
|||
** Also utilizes &ucstart and &ucend date parameters if supplied manually (not supported in the UI atm). |
|||
*** These parameter soverride the form date options. |
|||
* Uses: Submit any IP CIDR range /16 or from /24 to /32. Submit any string (at least 3 characters) with a suffixed asterisk. |
|||
** eg: [123.123.123.0/24 ] or [123.123.123.* ] or [Willy* ]. |
|||
* Now keeps searching until it finds crMax (or forever with crshowall=true URI parameter). |
|||
** Puts them in a nice collapsed div stack, like enhanced recent changes. |
|||
* /25 and /26 ranges now disabled, since they are inaccurate (50 parameter limit), please use /24 (ucuserprefix) or /27 (32 parameters) |
|||
To do: |
|||
* use ajax (let sysops/bots = 5000)? |
|||
*/ |
|||
if(wgCanonicalSpecialPageName == 'Contributions' && wgEnableAPI) { |
|||
$j(document).ready(prefixContribsInit); |
|||
var crContURI = ''; //query URI for continuing later |
|||
var crLimit = 500; //limit for each query |
|||
var crMax = 10000; //bypass with &crshowall=true URI parameter |
|||
var crImgHid = stylepath + '/common/images/Arr_r.png'; |
|||
var crImgSho = stylepath + '/common/images/Arr_d.png'; |
|||
appendCSS('.cr-list {padding-left:5px;}\n.cr-toggle-hidden {padding-left:16px;background: transparent no-repeat center left url("' + crImgHid + '")}' |
|||
+ '\n.cr-toggle-shown {padding-left:16px;background: transparent no-repeat center left url("' + crImgSho + '")}\n.mw-mightexist {font-style:italic;}' |
|||
+ '\n#results-from-CIDR {border:1px solid black;padding:.5em}\n#prefixcontribs-tog {float:right;border:1px solid black;text-decoration:none;color:black;padding:0 5px;}'); |
|||
} |
|||
function prefixContribsInit() { |
|||
var show = document.getElementById('contentSub') || document.getElementById('topbar'); |
|||
if(show) show.appendChild(document.createTextNode(' \u2022 Javascript-enhanced contributions lookup 0.2 enabled. You may enter a CIDR range or append an asterisk to do a prefix search.')); |
|||
var ucfrm = document.getElementsByTagName('form')[0]; |
|||
if(!ucfrm.target) return; |
|||
//general optionlets independent of type of search. |
|||
var opt_ns = (parseInt(ucfrm.namespace[ucfrm.namespace.selectedIndex].value) > -1) ? '&ucnamespace=' + ucfrm.namespace[ucfrm.namespace.selectedIndex].value : ''; |
|||
var opt_ts = ''; |
|||
var m = '' + ucfrm.month.selectedIndex; |
|||
var y = ucfrm.year.value; |
|||
if(m.length == 1) m = '0' + m |
|||
if(y > 2000 && y < 2100) opt_ts = '&ucstart=' + y + '-' + m + '-01T00:00:00Z' |
|||
var opts_se = ''; |
|||
if(queryString('ucstart')) opts_se += '&ucstart=' + encodeURIComponent(queryString('ucstart')) |
|||
if(queryString('ucend')) opts_se += '&ucend=' + encodeURIComponent(queryString('ucend')) |
|||
if(opts_se == '') { |
|||
var options = opt_ns + opt_ts; |
|||
} else { |
|||
var options = opt_ns + opts_se + '&ucdir=newer'; |
|||
} |
|||
var patternCIDR = /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(2[7-9]|3[0-2]|24|16)/i ; |
|||
var patternWild = /^.{3,}\*$/i ; |
|||
var url = wgServer + wgScriptPath + '/api.php?action=query&format=json&callback=prefixContribs&list=usercontribs' + options + '&uclimit=' + parseInt(crLimit); |
|||
if(ucfrm.target.value.search(patternCIDR) == 0) { |
|||
prefixContribsStartbox(ucfrm.parentNode); |
|||
var cidr = ucfrm.target.value.match(patternCIDR)[0]; |
|||
var range = cidr.match(/[^\/]\d{1,2}$/i)[0]; |
|||
if(range == 24 || range == 16) { |
|||
//prefixable CIDR, lets do-er |
|||
if(range == 24) { |
|||
cidr = cidr.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\./)[0]; |
|||
} else { |
|||
cidr = cidr.match(/\d{1,3}\.\d{1,3}\./)[0]; |
|||
} |
|||
url += '&ucuserprefix=' + cidr; |
|||
} else { |
|||
//complex CIDR, lets figure it out |
|||
var oct3 = cidr.match(/\.\d{1,3}\//i)[0].replace(/(\.|\/)/g,''); |
|||
cidr = cidr.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\./)[0]; |
|||
var num = Math.pow(2,32 - range); |
|||
var start = oct3 - oct3 % num; |
|||
url += '&ucuser='; |
|||
for(var i=start;i<=start + num;i++) { |
|||
url += '' + cidr + i; |
|||
if(i != start + num) url += '|' |
|||
} |
|||
} |
|||
} else if(ucfrm.target.value.search(patternWild) == 0) { |
|||
//very simple wildcard, lets do-er |
|||
prefixContribsStartbox(ucfrm.parentNode); |
|||
var prefix = ucfrm.target.value.replace(/\*$/,''); |
|||
prefix = prefix.substr(0,1).toUpperCase() + prefix.substr(1); |
|||
url += '&ucuserprefix=' + prefix; |
|||
} |
|||
importScriptURI(url); |
|||
crContURI = url; |
|||
} |
|||
function prefixContribsStartbox(parent) { |
|||
var res = document.createElement('div'); |
|||
res.setAttribute('id','results-from-CIDR'); |
|||
addlinkchild(res,'javascript:prefixContribsToggleAll();','toggle all','prefixcontribs-tog'); |
|||
var spin = document.createElement('span'); |
|||
spin.setAttribute('id','prefixcontribs-prog') |
|||
spin.appendChild(document.createTextNode('Searching.')); |
|||
res.appendChild(spin); |
|||
injectSpinner(spin,'prefixcontribs-spin'); |
|||
parent.appendChild(res); |
|||
} |
|||
function prefixContribs(obj) { |
|||
if(!obj['query'] || !obj['query']['usercontribs']) return |
|||
cidr = obj['query']['usercontribs']; |
|||
var res = document.getElementById('results-from-CIDR'); |
|||
if(cidr.length == 0) { |
|||
res.appendChild(document.createTextNode(' No changes were found for this wildcard/CIDR range.')); |
|||
removeSpinner('prefixcontribs-spin'); |
|||
return; |
|||
} |
|||
for(var i=0;i<cidr.length;i++) { |
|||
var id = 'cr-' + escapeID(cidr[i].user); |
|||
var etitle = encodeURIComponent(cidr[i].title.replace(/ /g,'_')).replace('%2F','/').replace('%3A',':'); |
|||
var euser = encodeURIComponent(cidr[i].user.replace(/ /g,'_')).replace('%2F','/').replace('%3A',':'); |
|||
// group each result set based on the user name, create new div for new names |
|||
if(!document.getElementById(id)) { |
|||
var hdiv = document.createElement('div'); |
|||
hdiv.setAttribute('id','d-' + id) |
|||
addlinkchild(hdiv,'javascript:prefixContribsToggleDiv("' + id +'")',cidr[i].user,'m-' + id,'cr-toggle-hidden'); |
|||
res.appendChild(hdiv); |
|||
res.appendChild(document.createTextNode('\n')); |
|||
var rul = document.createElement('ul'); |
|||
rul.setAttribute('id',id); |
|||
rul.setAttribute('class','cr-list'); |
|||
rul.style.display = 'none'; |
|||
res.appendChild(rul); |
|||
res.appendChild(document.createTextNode('\n')); |
|||
} |
|||
var ul = document.getElementById(id); |
|||
ul.appendChild(document.createTextNode('\n')); |
|||
var li = document.createElement('li'); |
|||
li.appendChild(document.createTextNode(cidr[i].timestamp.replace(/T[\d:]*Z/,' '))); |
|||
addlinkchild(li, wgScript + '?title=Special:Contributions/' + euser, cidr[i].user); |
|||
li.appendChild(document.createTextNode(' (')); |
|||
addlinkchild(li, wgScript + '?title=User_talk:' + euser, 'talk','','mw-mightexist'); |
|||
li.appendChild(document.createTextNode(') edited (')); |
|||
addlinkchild(li, wgScript + '?title=' + etitle + '&curid=' + cidr[i].pageid + '&diff=prev&oldid=' + cidr[i].revid , 'diff'); |
|||
li.appendChild(document.createTextNode(') ')); |
|||
addlinkchild(li, wgScript + '?title=' + etitle + '&curid=' + cidr[i].pageid, cidr[i].title); |
|||
if(cidr[i].comment) li.appendChild(document.createTextNode(' (' + cidr[i].comment + ')')) |
|||
ul.appendChild(li); |
|||
} |
|||
//continue? |
|||
crMax = crMax - cidr.length; |
|||
var prog = document.getElementById('prefixcontribs-prog'); |
|||
if(!obj['query-continue'] || !obj['query-continue']['usercontribs'] || !obj['query-continue']['usercontribs']['uccontinue']) { |
|||
removeSpinner('prefixcontribs-spin'); |
|||
prog.parentNode.removeChild(prog); |
|||
prefixContribsNumerate(); |
|||
return; |
|||
} |
|||
var url = crContURI + '&uccontinue='+ obj['query-continue']['usercontribs']['uccontinue']; |
|||
if(crMax <= 0 && queryString('crshowall') != 'true') { |
|||
prog.appendChild(document.createTextNode(' Whoa! Finding a lot. To see them all click ')); |
|||
var ga = document.createElement('a'); |
|||
var gaurl = document.location.href; |
|||
if(gaurl.indexOf('#') != -1) gaurl = gaurl.substr(0,gaurl.indexOf('#')) |
|||
if(gaurl.indexOf('?') == -1) gaurl += '?' |
|||
gaurl += '&crshowall=true'; |
|||
ga.setAttribute('href',gaurl); |
|||
ga.appendChild(document.createTextNode('here')); |
|||
prog.appendChild(ga); |
|||
prog.appendChild(document.createTextNode('. (Warning: May bog down browser!)')); |
|||
removeSpinner('prefixcontribs-spin'); |
|||
prefixContribsNumerate(); |
|||
} else { |
|||
prog.appendChild(document.createTextNode('.')); |
|||
importScriptURI(url); |
|||
} |
|||
} |
|||
function prefixContribsNumerate() { |
|||
var lsts = getElementsByClassName(document,'ul','cr-list'); |
|||
for(var i=0;i<lsts.length;i++) { |
|||
var dv = document.getElementById('d-' + lsts[i].getAttribute('id')); |
|||
dv.appendChild(document.createTextNode(' ' + lsts[i].getElementsByTagName('li').length + ' found')); |
|||
} |
|||
if(lsts.length == 1) prefixContribsToggleDiv(lsts[0].id) |
|||
} |
|||
function prefixContribsToggleAll() { |
|||
var lsts = getElementsByClassName(document,'ul','cr-list'); |
|||
if(lsts.length == 0) return |
|||
var togglefrom = lsts[0].style.display; |
|||
for(var i=0;i<lsts.length;i++) { |
|||
if(lsts[i].style.display == togglefrom) prefixContribsToggleDiv(lsts[i].id) |
|||
} |
|||
} |
|||
function prefixContribsToggleDiv(id) { |
|||
var i = document.getElementById(id); |
|||
var m = document.getElementById('m-' + id); |
|||
if(!i || !m) return |
|||
if(i.style.display == 'none') { |
|||
i.style.display = 'block'; |
|||
m.className = 'cr-toggle-shown' |
|||
} else { |
|||
i.style.display = 'none'; |
|||
m.className = 'cr-toggle-hidden' |
|||
} |
|||
} |
|||
function addlinkchild(obj,href,text,id,classes) { |
|||
if(!obj || !href || !text) return false; |
|||
var a = document.createElement('a'); |
|||
a.setAttribute('href',href); |
|||
a.appendChild(document.createTextNode(text)); |
|||
if(id) a.setAttribute('id',id); |
|||
if(classes) a.setAttribute('class',classes); |
|||
obj.appendChild(a); |
|||
return a; |
|||
} |
|||
function escapeID(txt) { |
|||
var id = txt; |
|||
id = id.replace(/ /g,'_'); |
|||
id = encodeURIComponent(id); |
|||
id = id.replace(/\%3A/g,':'); |
|||
id = id.replace(/\%/g,'.'); |
|||
return id; |
|||
} |
|||
function queryString(p) { |
|||
var re = RegExp('[&?#]' + p + '=([^&#]*)'); |
|||
var matches; |
|||
if (matches = re.exec(document.location)) { |
|||
try { |
|||
return decodeURI(matches[1]); |
|||
} catch (e) { |
|||
} |
|||
} |
|||
return null; |
|||
} |