User:Nardog/histcomb.js
window.histComb = new function(){
if (!window.histCombTalk) histCombTalk = 't'
if (!window.histCombContrib) histCombContrib = 'c'
if (!window.histCombUndo) histCombUndo = '×'
if (!window.histCombMyBg) histCombMyBg = '#F0FFF0'
var pagehis, histRow, histSize, isCombEdits = false
this.onLoad = function(){
pagehis = document.getElementById('pagehistory')
if (!pagehis) 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: all rows bottom to top
row = histRow[rr]
thisMinor = false
spans = row.getElementsByTagName('span')
//check all spans
for (i=0; 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') if (aa.length && aa[1]){ 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 = histCombUndo 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 (mw.config.get('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 //collapse top editor too if (sameAuthor>1) { createCombineEdit(0, sameAuthor, allMinor) if (histRow.length > sameAuthor && !window.histCombNoCollapse) //if collapsing top row - make next row selected histRow[sameAuthor].getElementsByTagName('input')[0].click() } //add "expand/collapse all" link if (isCombEdits) { var togAll = document.createElement('a') togAll.appendChild(document.createTextNode('[±]')) togAll.href = 'javascript:histComb.toggleAll()' pagehis.parentNode.insertBefore(togAll, pagehis.previousSibling) } //bonus: link to toоlserver var lnk = document.createElement('a') lnk.style.marginLeft = '10px' lnk.href = 'https://xtools.wmflabs.org/articleinfo/' +mw.config.get('wgServer').substring(mw.config.get('wgServer').lastIndexOf('/')+1, mw.config.get('wgServer').indexOf('.')) +mw.config.get('wgServer').substring(mw.config.get('wgServer').indexOf('.')) +'/'+mw.config.get('wgPageName')+'#top-editors' lnk.appendChild(document.createTextNode('Contributors')) lnk.title = 'All authors sorted by edits (on Toolforge)' if (i=document.getElementsByClassName('mw-history-subtitle')[0]) i.appendChild(lnk) } this.toggleAll = function(){ var links = $(pagehis).find('a.collapsedEdits'); var state = (links[0].innerHTML == '[–]') for (var i=0; i if (state == (links[i].innerHTML == '[–]')) eval(links[i].href) } 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 //"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(/&diff=prev&oldid=(\d+)/, '&diff=$1&oldid='+oldid+'&direction=prev') }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 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 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+&undo=\d+/, '&oldid='+oldid+'&direction=prev') }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 //unexplained IE bug: in row just under collapsed edit radios were jumping to the left, links were unclickable if (navigator.userAgent.indexOf('MSIE') != -1 && m+len < histRow.length){ //make all elements 'relative' var els = histRow[m+len].getElementsByTagName('*') for (i=0; i if (els[i].style && !els[i].style.position) els[i].style.position = 'relative' } } 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 (mw.config.get('wgAction') == 'history') $(histComb.onLoad)