User:Splarka/templatesabused.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/* Templates Used top edit indicator, version [0.0.1a]
Originally from http://en.wikipedia.org/wiki/User:Splarka/templatesabused.js

What?:
* It adds the last editor, timestamp, diff, and comment for the last edit to the Template Used section of an edit window.
Why?:
* 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;
}