User:Splarka/templatesabused.js

/* Templates Used top edit indicator, version [0.0.1a] Originally from http://en.wikipedia.org/wiki/User:Splarka/templatesabused.js

What?: Why?:
 * It adds the last editor, timestamp, diff, and comment for the last edit to the Template Used section of an edit window.
 * Dunno, someone requested it.

Notes:
 * Works on preview, so it is necessarily dirty.
 * It gets the list from scraping the page and normalizing links.
 * It sets the li ID to escapeID(decodeURIComponent(link)).
 * On API return, it matches up by matching those IDs with escapeID(title).
 * I think this works for all unicode/characters, needs testing (might break on ampersand, quotes, crap like that)
 * Limited to first 50.
 * Skips missing/red/ugly.

if(wgAction == 'edit' || wgAction == 'submit') addOnloadHook(templateTopEdits) function templateTopEdits { var docobj = document.getElementById('bodyContent') || document.getElementById('content') || document.getElementById('mw-content') || document.body; var tu = getElementsByClassName(docobj,'div','templatesUsed'); if(tu.length == 0) return tu = tu[0]; var ul = tu.getElementsByTagName('ul'); if(ul.length == 0) return ul = ul[ul.length-1]; //always get the last one li = ul.getElementsByTagName('li'); if(li.length == 0) return

//turn wgArticlePath into a regex to extract the link var app = RegExp(wgArticlePath.replace(/([^a-zA-Z0-9])/g,'\\$1').replace(/\\\$1/g,'(.*)'),'i'); var tlinks = []; for(var i=0;i<li.length;i++) { a = li[i].getElementsByTagName('a')[0]; if(!a || !a.href) continue var link = a.getAttribute('href',2); if(!app.test(link) || link.indexOf('redlink') != -1) continue link = link.replace(app,'$1'); li[i].setAttribute('id',escapeID(decodeURIComponent(link))); link = link.replace(/_/g,'%20'); tlinks.push(link); } var url = wgScriptPath + '/api.php?action=query&format=json&callback=templateTopEditsCB&maxage=3600&smaxage=3600&prop=revisions&indexpageids&titles=' + tlinks.join('|') mw.loader.load(url); }

function templateTopEditsCB(obj) { if(!obj['query'] || !obj['query']['pages'] || !obj['query']['pageids']) return var ids = obj['query']['pageids']; for(var i=0;i<ids.length;i++) { if(parseInt([ids[i]]) < 0) continue var page = obj['query']['pages'][ids[i]]; var title = page['title']; if(!page['revisions']) continue var rev = page['revisions'][0]; var li = document.getElementById(escapeID(title)); if(!li) continue li.appendChild(document.createElement('br')); li.appendChild(document.createTextNode('Last edited: ' + rev['timestamp'].replace(/[A-Z]/g,' ') + ' by ')); addLinkChild(li, wgScript + '?title=Special:Contributions/' + encodeURIComponent(rev['user']),rev['user']); li.appendChild(document.createTextNode(' ('));   addLinkChild(li, wgScript + '?diff=' + rev['revid'],'diff',false,false,'diff=' + rev['revid']);    li.appendChild(document.createTextNode(') ')); if(rev['comment']) li.appendChild(document.createTextNode(rev['comment'])) } }

function addLinkChild(obj,href,text,id,classes,title) { 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); if(title) a.setAttribute('title',title); 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; }