MediaWiki:Gadget-histcomb.js

Материал из Викитеки — свободной библиотеки

Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Internet Explorer / Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
  • Opera: Нажмите Ctrl+F5.
/* Внимание! Глобальный файл-гаджет. Любые изменения станут видны незамедлительно всем участникам, использующим данный гаджет! */

var histComb = new function(){

var histCombTalk = 'о';
var histCombContrib = 'в';
var histCombMyBg = '#F0FFF0';

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(/&nbsp;/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 = '×';
      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
 if (sameAuthor>1) createCombineEdit(0, sameAuthor, allMinor);

 if (isCombEdits) { //add all expand/collapse link
   var togAll = document.createElement('a');
   togAll.appendChild(document.createTextNode('[±]'));
//   togAll.addEventListener("click", function() {
//   	 histComb.toggleAll();
//   }, false);
   togAll.onclick = function() {
   	 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 = 'https://tools.wmflabs.org/xtools-articleinfo/?'
  +'wikilang='+mw.config.get('wgServer').substring(mw.config.get('wgServer').lastIndexOf('/')+1, mw.config.get('wgServer').indexOf('.'))
  +'&wikifam='+mw.config.get('wgServer').substring(mw.config.get('wgServer').indexOf('.'))
  +'&grouped=on&order=-edit_count&page='+encodeURIComponent(mw.config.get('wgPageName'));
 lnk.appendChild(document.createTextNode((mw.config.get('wgUserLanguage')=='ru')?'Вклад по количеству правок':'Contributors'));
 lnk.title = 'Все авторы страницы по количеству правок (на тулсервере)';
 if (i=document.getElementById('contentSub')) i.appendChild(lnk);

};


this.toggleAll = function(){
/*
  var links = $(pagehis).find('a.collapsedEdits');
  for (var i=0; i<links.length; i++)
    if (isCombEdits != (links[i].innerHTML == '[–]'))
      $(links[i]).trigger( "click" );
  isCombEdits = ! isCombEdits
*/
  $(pagehis).find('a.collapsedEdits').each(function() {
    if (isCombEdits != (this.innerHTML == '[–]'))
      $(this).trigger( "click" );
  });
  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.addEventListener("click", function() {
//   histComb.toggle(m, len, isMinor);
// }, false);
 plus.onclick = function() {
   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

window.histComb = histComb;
// init
$( function () {
    // This code must not be executed before the document is loaded. 
    if (mw.config.get('wgAction') == 'history')
    	histComb.onLoad();
});