MediaWiki:Gadget-shiftrefs.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.
/*
 * Сдвиг всех примечаний на знаки препинания.
 * Автор: [[wikipedia:ru:User:Ignatus]]
 * Источник: https://ru.wikipedia.org/?oldid=43014528
 */
function lebedevrefs(){
var diglasttext;var getsimpletext;
diglasttext = function(n){
    return n.lastChild ? diglasttext(n.lastChild) : n
};
getsimpletext = function(n){
    return n.innerHTML.replace(/<(?:"(?:\\\\|\\"|\\[^"]|[^\\"])*"|'(?:\\\\|\\'|\\[^']|[^\\'])*'|[^"'>])+>/ig,''); //'
};//innerText работает не везде
var zone = document.getElementById('wikiPreview')      || document.getElementById('bodyContent')
        || document.getElementById('mw_contentholder') || document.getElementById('article');
 
var alles=Array();
{var j=zone.getElementsByTagName('*');
  for(var i=0;i<j.length;i++){alles[i]=j[i]};
};
var getdots = /^([\s\S]*?)([.,…]*)$/;
var i=0;
var f=function(){
	if(i<alles.length){
		var ch=alles[i].childNodes;
	// Ищем последовательности элементов класса reference
	// а также рассматриваем ноды до и после них
	    for(var j=0;j<ch.length;j++){
	        var l=0;
	        while( j+l < ch.length // &&
	          && (ch[j+l].nodeType == 1) // && // элемент
	          && /(^|\s)reference(\s|$)/i.test(ch[j+l].className)
	        ){l++};
	        if(l){//есть группа
	            var grp=document.createElement('span');
	            for(var k=0;k<l;k++){
	                grp.appendChild(ch[j]);
	                //alles[i].removeChild(ch[j]);//автоматом
	            };
	            if(j<ch.length){alles[i].insertBefore(grp,ch[j])}else{alles[i].appendChild(grp)};
	            grp.style.whiteSpace='nowrap';
	            var ppw = 0.;
	            if( j ){
	                if( ch[j-1].nodeType == 3 ){ // текст
	                   var a=/^([\S\s]*\s)?(\S*?)([.,…]*)?$/.exec(ch[j-1].nodeValue);
	                   ch[j-1].nodeValue = a[1]||'';
	                   var b = document.createElement('span');
	                   var t = document.createTextNode(a[3]||a[2]);
	                   b.appendChild(t);
	                   grp.insertBefore(b,grp.firstChild);
	                   if(a[3]){
	                      b.style.marginRight = '-'+b.offsetWidth+'px';
	                      t.nodeValue = a[2]+t.nodeValue;
	                   };
		               ppw = b.offsetWidth;
	                }else{// если предыдущий узел - элемент
	                   var lt = diglasttext(ch[j-1]);
	                   var a = getdots.exec(lt.nodeValue);
	                   if(a[2]){//финишные точки выделяем
	                      lt.nodeValue=a[1];
	                      var b = document.createElement('span');
	                      b.appendChild(document.createTextNode(a[2]));
	                      lt.parentNode.appendChild(b);
	                      ppw = b.offsetWidth;
	                      b.style.marginRight = '-'+ppw+'px';
	                   };
	                   if(/nowrap|pre$/.test(ch[j-1].style.whiteSpace) || ! /\s/.test(getsimpletext(ch[j-1]))){
	                      //если его можно втащить в неразрывный текст, делаем это
	                      grp.insertBefore(ch[j-1],grp.firstChild);
	                      ppw += grp.firstChild.offsetWidth;
	                   }
	                };//else  
	            };//if ( j )
	            if(grp.nextSibling){//Смотрим дальше, если текст, отрезаем начальную точку
	                if( grp.nextSibling.nodeType==3 ){
	                    var a = /^([.,…]*)([\s\S]*?)$/.exec(grp.nextSibling.nodeValue);
	                    if(a[1]){
		                  grp.nextSibling.nodeValue = a[2];
		                  var b = document.createElement('span');
	                      b.appendChild( document.createTextNode(a[1]) );
	                      grpw = grp.offsetWidth;
	                      grp.appendChild(b);
	                      b.previousSibling.style.marginRight = (ppw-grpw)+'px';
	                      b.style.marginRight = (grpw-ppw-b.offsetWidth)+'px';
	                	}//if(a[1])
	                }//if( grp.nextSibling.nodeType==3 )
	            }//if(grp.nextSibling)
	        }//if(l)
	    };//for(ch)
	    i++;
	    window.setTimeout(f,0);//обрабатываем действия пользователя, затем идём дальше
	}else{//(i>=alles.length)
		f = null;//помогаем мусорнице
	};//if(i<alles.length)
};//f
if(alles.length){f()};//запускаем выполнение
};
if ( wgNamespaceNumber >= 0 && wgUserName ) addOnloadHook( lebedevrefs );