Участник:X-romix/SciRefs.js

Материал из Викиреальностя
Перейти к: навигация, поиск

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

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить, или нажмите Ctrl-F5 или Ctrl-R (⌘-R на Mac)
  • Google Chrome: Нажмите Ctrl-Shift-R (⌘-Shift-R на Mac)
  • Internet Explorer: Удерживая Ctrl нажмите Обновить, или нажмите Ctrl-F5
  • Opera: Выберите очистку кеша в меню Инструменты → Настройки
 
function xRomixReplaceBookRefs_RusEng(str){
	var str1='';
	for(i=0; i<str.length; i++){
		var c=str.charAt(i);
		if(c=='|') {break;} //по символу | прерываем обработку
		else if(c==' ') {c='_'}
		else if(c=='.') {c='_'}
		else if(c==',') {c='_'}
		else if(c=='-') {c='_'}
		else if(c>='а' && c<='я'){
			if(c=='а') {c='a'}
			else if(c=='б') {c='b'}
			else if(c=='в') {c='v'}
			else if(c=='г') {c='g'}
			else if(c=='д') {c='d'}
			else if(c=='е') {c='e'}
			else if(c=='ж') {c='zh'}
			else if(c=='з') {c='z'}
			else if(c=='и') {c='i'}
			else if(c=='й') {c='j'}
			else if(c=='к') {c='k'}
			else if(c=='л') {c='l'}
			else if(c=='м') {c='m'}
			else if(c=='н') {c='n'}
			else if(c=='о') {c='o'}
			else if(c=='п') {c='p'}
			else if(c=='р') {c='r'}
			else if(c=='с') {c='s'}
			else if(c=='т') {c='t'}
			else if(c=='у') {c='u'}
			else if(c=='ф') {c='f'}
			else if(c=='х') {c='h'}
			else if(c=='ц') {c='c'}
			else if(c=='ч') {c='ch'}
			else if(c=='ш') {c='sh'}
			else if(c=='щ') {c='sx'}
			else if(c=='ъ') {c='_'}
			else if(c=='ы') {c='y'}
			else if(c=='ь') {c='_'}
			else if(c=='э') {c='ye'}
			else if(c=='ю') {c='yu'}
			else if(c=='я') {c='ya'}
			;
		}else if(c>='А' && c<='Я'){
			if(c=='А') {c='А'}
			else if(c=='Б') {c='B'}
			else if(c=='В') {c='V'}
			else if(c=='Г') {c='G'}
			else if(c=='Д') {c='D'}
			else if(c=='Е') {c='E'}
			else if(c=='Ж') {c='ZH'}
			else if(c=='З') {c='Z'}
			else if(c=='И') {c='I'}
			else if(c=='Й') {c='J'}
			else if(c=='К') {c='K'}
			else if(c=='Л') {c='L'}
			else if(c=='М') {c='M'}
			else if(c=='Н') {c='N'}
			else if(c=='О') {c='O'}
			else if(c=='П') {c='P'}
			else if(c=='Р') {c='R'}
			else if(c=='С') {c='S'}
			else if(c=='Т') {c='T'}
			else if(c=='У') {c='U'}
			else if(c=='Ф') {c='F'}
			else if(c=='Х') {c='H'}
			else if(c=='Ц') {c='C'}
			else if(c=='Ч') {c='CH'}
			else if(c=='Ш') {c='SH'}
			else if(c=='Щ') {c='SX'}
			else if(c=='Ъ') {c='_'}
			else if(c=='Ы') {c='Y'}
			else if(c=='Ь') {c='_'}
			else if(c=='Э') {c='YE'}
			else if(c=='Ю') {c='YU'}
			else if(c=='Я') {c='YA'}
			;
		}
		;
 
		str1+=c;
	}
	return str1;
}
 
 
//Глобальные переменные
var xRomixReplaceBookRefs_BodyContent;
var xRomixReplaceBookRefs_RefCounter;
var xRomixReplaceBookRefs_LastRef; //последняя обратная ссылка
 
function xRomixReplaceBookRefs_ClickOnRef(str, id) {
//Эта функция выполнится при клике на ссылку - аналог ref
	//Окрасим ссылки 
	var s1="backlink_"+str+"_id_"+id;
	var s2="backlink_"+str+"_id_";
	var s3="backlink_";
	var s4="CITEREF_"+str;
	var s5="CITEREF_";
 
	var anchorTags = document.getElementsByTagName("a");
	for (var i = 0; i < anchorTags.length ; i++)
	{
		var ob=anchorTags[i];
		if(ob.name.indexOf(s1)==0){
			ob.style.backgroundColor="yellow";
		}else if(ob.name.indexOf(s2)==0){
			ob.style.backgroundColor="#DDEEFF";
		}else if(ob.name.indexOf(s3)==0){
			ob.style.backgroundColor="";
		}else if(ob.name.indexOf(s4)==0){
			ob.parentNode.style.backgroundColor="#DDEEFF";
		}else if(ob.name.indexOf(s5)==0){
			ob.parentNode.style.backgroundColor="";
		}
	}
 
	xRomixReplaceBookRefs_LastRef=id; //Запомним номер ссылки для обратного перехода
 
}
 
 
function xRomixBookRefs_Backlink(s){
	//Функция выполнится при клике на обратную ссылку.
	var s1="backlink_"+s+"_id_"+xRomixReplaceBookRefs_LastRef;
	var s2="backlink_"+s+"_id_";
	var s3="backlink_";
 
	var link="";
	var ok=0;
 
	//Подсветка ссылок, которые содержат строку s
	var anchorTags = document.getElementsByTagName("a");
	for (var i = 0; i < anchorTags.length ; i++)
	{
		var ob1=anchorTags[i];
		if(ob1.name.indexOf(s1)==0 && xRomixReplaceBookRefs_LastRef!=""){
			ob1.style.backgroundColor="yellow";
			link=ob1.name;
			ok=1;
		}else if(ob1.name.indexOf(s2)==0){
			ob1.style.backgroundColor="#DDEEFF";
			if(ok==0 && link==""){
				link=ob1.name;
			}
		}else if(ob1.name.indexOf(s3)==0){
			ob1.style.backgroundColor="";
		}
	}
 
	document.location.href="#"+link; //переход по найденной ссылке
	return false; //отмена стандартного действия 
 
}
 
function xRomixReplaceBookRefs($0,$1,$2) {
	//Эта функция вызывается для замены найденного текста методом replace().
	//Первый параметр функции содержит найденную подстроку, остальные - подсовпадения RegExp (выделенные круглыми скобками в запросе RegExp). 
	// http://www.citforum.ru/internet/javascript/js_new13.shtml
	var s=""+$0;
 
	if(s.charAt(1)=='*'){ //Ссылка-цель вида [*Это ссылка]
		s=s.slice(2,-1);
		var n=xRomixReplaceBookRefs_RusEng(s);
		var qn="'"+n+"'";
		var a='<a href="#backlink_'+n+'" onClick="return xRomixBookRefs_Backlink('+qn+')" name="CITEREF_'+n+'"><small>['+s+']</small></a>';
		s=a;
 
	}else{ //Ссылка-источник вида [ссылка], у которой есть цель.
		var n=$2;
 
		//n теперь содержит имя внутри квадратных скобок (без них самих)
		//Отрежем все что после символа |, если он есть.
		var p=n.indexOf("|");
		if(p>=0){
			n=n.substr(0,p);
		}
 
		//Попытаемся найти якорь с этим же именем (если ее нет, то замену не производим)
		searchStr="[*"+n+"]";
		if(xRomixReplaceBookRefs_BodyContent.indexOf(searchStr)!=-1){
			//Если такой якорь найден
			var n=xRomixReplaceBookRefs_RusEng(n);
			xRomixReplaceBookRefs_RefCounter++; //увеличиваем счетчик
 
			//Производим замену ссылки
			var cnt=xRomixReplaceBookRefs_RefCounter;
			var nn='backlink_'+n+'_id_'+cnt;
 
			s='<a href="#CITEREF_'+n+'" name="'+nn+'" onClick="xRomixReplaceBookRefs_ClickOnRef(\''+n+'\', '+cnt+');"><sup>'+$0+'</sup></a>'+
			'</a>'; 
		}
	}
	return s;
}
 
//Это главная функция, с нее начинается работа скрипта после загрузки страницы
addOnloadHook(function()
{
	if (wgAction=="view"){ //только для страниц просмотра
		xRomixReplaceBookRefs_RefCounter=0;
		xRomixReplaceBookRefs_LastRef="";
		var on=document.getElementById('X-romix_SciRefs_On');
		if(!on) return;
 
		var doc=document.getElementById('bodyContent');
		var s=doc.innerHTML;
		xRomixReplaceBookRefs_BodyContent=s;
		//Регулярное выражение для поиска ссылок в формате [Ссылка 1]
		var reg = /(\[)(.+?)(\])/g
		//Выполняем замену
		s=s.replace(reg,xRomixReplaceBookRefs);
		//xRomixReplaceBookRefs - это функция, которая будет вызвана для выполнения замены
		doc.innerHTML=s;
	}
});