User:Harryboyles/histcomb.js
From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.
//Copied from http://en.wikipedia.org/wiki/User:Alex_Smotrov/histcomb.js (thanks) var histComb = new function(){ if (!window.histCombTalk) histCombTalk = 'talk' if (!window.histCombContrib) histCombContrib = 'contribs' if (!window.histCombMyBg) histCombMyBg = '#D0DFD0' var pagehis, histRow, histSize, isCombEdits = false this.onLoad = function(){ if (!(pagehis = document.getElementById('pagehistory'))) return histRow = pagehis.getElementsByTagName('li') histSize = new Array (histRow.length) var row, spans, i, aa, author, author_p = '', size_digits var sameAuthor = 0, thisMinor, allMinor = true for (var rr=histRow.length-1; rr>=0; rr--){ //main loop: bottom to top row = histRow[rr] thisMinor = false spans = row.getElementsByTagName('span') //check all spans for (i=0; i<spans.length; i++) switch (spans[i].className){ case 'history-size': size_digits = spans[i].innerHTML.match(/\d+/g) histSize[rr] = size_digits ? size_digits.join('') : '0' if (histSize[rr+1]){ spans[i].title = spans[i].innerHTML.replace(/ /g,' ') insertDiffValue(spans[i], histSize[rr] - histSize[rr+1]) } break case 'minor': thisMinor = true break case 'history-user': // get user name and shorten talk/contribs aa = spans[i].getElementsByTagName('a') author = aa[1].title.split(':')[1] aa[1].innerHTML = histCombTalk if (aa.length >= 3 && (aa[2].title.indexOf(':Contributions/') != -1)) //for anons this could be 'block' aa[2].innerHTML = histCombContrib break case 'mw-history-undo': aa = spans[i].getElementsByTagName('a')[0] aa.title = aa.innerHTML aa.innerHTML = 'undo' break //case 'comment': histSumm = spans[i].innerHTML break }//end switch inside for if (!histSize[rr] && histSize[rr+1]) histSize[rr] = histSize[rr+1] //assume it was '(un)protect' edit if (wgUserName == author) histRow[rr].style.backgroundColor = histCombMyBg //check how many consequent edits if (author == author_p) sameAuthor++ else { if (sameAuthor > 1) createCombineEdit(rr+1, sameAuthor, allMinor) sameAuthor = 1 author_p = author allMinor = thisMinor } if (!thisMinor) allMinor = false }//main loop if (sameAuthor>1) { //collapse top editor too createCombineEdit(0, sameAuthor, allMinor) if (histRow.length > sameAuthor){ //and select next editor left radio button rr = histRow[sameAuthor] rr.className = 'selected' rr.getElementsByTagName('input')[0].checked = true } } if (isCombEdits) { //add all expand/collapse link var togAll = document.createElement('a') togAll.appendChild(document.createTextNode('[±]')) togAll.href = 'javascript:histComb.toggleAll()' //togAll.style.marginLeft = '0.2em' pagehis.parentNode.insertBefore(togAll, pagehis.previousSibling) } //bonus: link to toоlserver var lnk = document.createElement('a') lnk.style.marginLeft = '20px' lnk.href = 'http://tools.wikimedia.de/~daniel/WikiSense/Contributors.php?' +'wikilang='+wgServer.substring(wgServer.lastIndexOf('/')+1, wgServer.indexOf('.')) +'&wikifam='+wgServer.substring(wgServer.indexOf('.')) +'&grouped=on&order=-edit_count&page='+encodeURIComponent(wgPageName) lnk.appendChild(document.createTextNode('Contributors')) lnk.title = 'All authors sorted by edits (on toolserver)' if (i=document.getElementById('contentSub')) i.appendChild(lnk) } this.toggleAll = function(){ var links = getElementsByClassName(pagehis, 'a', 'collapsedEdits') for (var i=0; i<links.length; i++) if (isCombEdits != (links[i].innerHTML == '[–]')) eval(links[i].href) isCombEdits = ! isCombEdits } this.toggle = function (m, len, isMinor){ //handler for collapsing link var row = histRow[m] var spans = row.getElementsByTagName('span') var plus = row.lastChild var radios = row.getElementsByTagName('input') var topDiff = row.getElementsByTagName('a')[ m > 0 ? 1 : 0] // "diff to last" in the combined edit var i, clss, bottomDiff, oldid var isHiding = (plus.innerHTML == '[–]') if (isHiding) {//need to collapse − plus.innerHTML = '[' + len + ']' row.style.borderLeft = '1px solid transparent' //hide other rows for (i=m+1; i<m+len; i++) histRow[i].style.display = 'none' //"diff from last" link: get oldid from the lowest collapsed edit bottomDiff = histRow[m+len-1].getElementsByTagName('a')[1].href if (bottomDiff.indexOf('&diff=') == -1) topDiff.style.visibility = 'hidden' //the very 1st edit oldid = bottomDiff.match(/oldid=(\d+)/)[1] topDiff['old'] = topDiff.href topDiff.href = topDiff.href.replace(/&oldid=\d+/, '&oldid='+oldid) }else{ //need to expand plus.innerHTML = '[–]' //show other rows and visually reference the whole group row.style.borderLeft = '1px dotted gray' for (i=m+1; i<m+len; i++){ histRow[i].style.display = 'block' histRow[i].style.borderLeft = '1px dotted gray' histRow[i].style.listStyle = 'none none' } histRow[m+len-1].style.borderBottom = '1px dotted gray' topDiff.href = topDiff['old'] topDiff.style.visibility = 'visible' } //hide/show/modify spans in this row for (i=0; i<spans.length; i++) switch (spans[i].className.split(' ')[0]){ case 'minor': spans[i].style.display = (isHiding && !isMinor)?'none':'inline' break case 'history-size': //switch to combined diff size and back insertDiffValue(spans[i], histSize[m] - (isHiding ? histSize[m+len] : histSize[m+1])) break case 'comment': //hide/show spans[i].style.display = (isHiding && !window.histCombLeaveComment)?'none':'inline' break case 'mw-history-undo': var undoLnk = spans[i].getElementsByTagName('a')[0] if (isHiding) { undoLnk['old'] = undoLnk.href undoLnk.href = undoLnk.href.replace(/&undoafter=\d+/, '&undoafter='+oldid) }else undoLnk.href = undoLnk['old'] break //case 'history-user': } } function createCombineEdit(m, len, isMinor){ //creates collapsing link for row m down to row m+len var row = histRow[m] row.style.listStyle = 'none none' row.style.position = 'relative' var plus = document.createElement('a') plus.className = 'collapsedEdits' plus.appendChild(document.createTextNode('[–]')) plus.style.position = 'absolute' plus.style.left = '-22px' plus.style.top = '2px' plus.href = 'javascript:histComb.toggle('+m+','+len+','+isMinor+')' row.appendChild(plus) if (!window.histCombNoCollapse) histComb.toggle(m, len, isMinor) //and collapse isCombEdits = true } function insertDiffValue(span, value){ var html, class2 if (value>0) { html = '(+' + value + ')' class2 = ' mw-plusminus-pos' } else if (value<0) { html = '(' + value + ')' class2 = ' mw-plusminus-neg' } else { html = '(0)' class2 = ' mw-plusminus-null' } span.style.fontWeight = (value < -500) ? 'bold' : 'normal' span.innerHTML = html span.className = span.className.split(' ')[0] + class2 } }//obj if (doneOnloadHook) histComb.onLoad() else if (wgAction == 'history') addOnloadHook(histComb.onLoad) histComb.toggleAll();

