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

//Скрипт для подсветки кода 1С:Предприятие
//Автор: X-romix

if (mw.config.get('wgAction') == 'view' || mw.config.get('wgAction') == 'submit')
$(function(){
	XRomix_Highlight1c("");
});	


///////////////////////////////////////////////////////////////////////
function XRomix_Highlight1c(prm_id){


var reg_words_1C_77=/^(Если|If|Тогда|Then|ИначеЕсли|ElsIf|Иначе|Else|КонецЕсли|EndIf|Цикл|Do|Для|For|По|To|Пока|While|КонецЦикла|EndDo|Процедура|Procedure|КонецПроцедуры|EndProcedure|Функция|Function|КонецФункции|EndFunction|Перем|Var|Экспорт|Export|Перейти|Goto|И|And|Или|Or|Не|Not|Знач|Val|Прервать|Break|Продолжить|Continue|Возврат|Return|Контекст|Context|Далее|Forward|Попытка|Try|Исключение|Except|КонецПопытки|EndTry|ВызватьИсключение|Raise|ОписаниеОшибки|GetErrorDescription|ТекущаяИБКод|CurrentIBCode|ТекущаяИБНаименование|CurrentIBDescr|ТекущаяИБСтатус|CurrentIBStatus|ТекущаяИБЦентральная|IsCurrentIBCenter|ИБСозданияОбъекта|BirthIBOfObject|ЦентральнаяИБКод|CentralIBCode|ТекущаяИБТолькоПолучатель|IsCurrentIBRecepientOnly|ФС|FS|ЗагрузитьВнешнююКомпоненту|LoadAddIn|ПодключитьВнешнююКомпоненту|AttachAddIn|СоздатьОбъект|CreateObject|СтатусВозврата|ReturnStatus|РазделительСтраниц|PageBreak|РазделительСтрок|LineBreak|СимволТабуляции|TabSymbol|Перечисление|Enum|Константа|Const|ПланыСчетов|ChartsOfAccounts|ВидыСубконто|SubcontoKinds|ВидРасчета|CalculationKind|ГруппаРасчетов|CalculationGroup|Регистр|Register|Окр|Round|Цел|Int|Мин|Min|Макс|Max|Лог10|Log10|Лог|Ln|СтрДлина|StrLen|ПустаяСтрока|IsBlankString|СокрЛ|TrimL|СокрП|TrimR|СокрЛП|TrimAll|Лев|Left|Прав|Right|Сред|Mid|Найти|Find|СтрЗаменить|StrReplace|СтрЧислоВхождений|StrCountOccur|СтрКоличествоСтрок|StrLineCount|СтрПолучитьСтроку|StrGetLine|Врег|Upper|Нрег|Lower|OemToAnsi|AnsiToOem|Симв|Chr|КодСимв|Asc|РабочаяДата|WorkingDate|ТекущаяДата|CurDate|ДобавитьМесяц|AddMonth|НачМесяца|BegOfMonth|КонМесяца|EndOfMonth|НачКвартала|BegOfQuart|КонКвартала|EndOfQuart|НачГода|BegOfYear|КонГода|EndOfYear|НачНедели|BegOfWeek|КонНедели|EndOfWeek|ДатаГод|GetYear|ДатаМесяц|GetMonth|ДатаЧисло|GetDay|НомерНеделиГода|GetWeekOfYear|НомерДняГода|GetDayOfYear|НомерДняНедели|GetDayOfWeek|ПериодСтр|PeriodStr|НачалоСтандартногоИнтервала|BegOfStandardRange|КонецСтандартногоИнтервала|EndOfStandardRange|ТекущееВремя|CurrentTime|СформироватьПозициюДокумента|MakeDocPosition|РазобратьПозициюДокумента|SplitDocPosition|Дата|Date|Строка|String|Число|Number|Пропись|Spelling|Формат|Format|Шаблон|Template|ФиксШаблон|FixTemplate|ВвестиЗначение|InputValue|ВвестиЧисло|InputNumeric|ВвестиСтроку|InputString|ВвестиДату|InputDate|ВвестиПериод|InputPeriod|ВвестиПеречисление|InputEnum|Вопрос|DoQueryBox|Предупреждение|DoMessageBox|Сообщить|Message|ОчиститьОкноСообщений|ClearMessageWindow|Состояние|Status|Сигнал|Beep|Разм|Dim|ЗаголовокСистемы|SystemCaption|ИмяКомпьютера|ComputerName|ИмяПользователя|UserName|ПолноеИмяПользователя|UserFullName|НазваниеНабораПрав|RightName|ПравоДоступа|AccessRight|НазваниеИнтерфейса|UserInterfaceName|КаталогПользователя|UserDir|КаталогИБ|IBDir|КаталогПрограммы|BinDir|КаталогВременныхФайлов|TempFilesDir|КаталогБазыДанных|DBDir|МонопольныйРежим|ExclusiveMode|ОсновнойЯзык|GeneralLanguage|НачатьТранзакцию|BeginTransaction|ЗафиксироватьТранзакцию|CommitTransaсtion|ОтменитьТранзакцию|RollBackTransaction|ЗначениеВСтрокуВнутр|ValueToStringInternal|ЗначениеИзСтрокиВнутр|ValueFromStringInternal|ЗначениеВСтроку|ValueToString|ЗначениеИзСтроки|ValueFromString|ЗначениеВФайл|ValueToFile|ЗначениеИзФайла|ValueFromFile|СохранитьЗначение|SaveValue|ВосстановитьЗначение|RestoreValue|ПолучитьТА|GetAP|ПолучитьДатуТА|GetDateOfAP|ПолучитьВремяТА|GetTimeOfAP|ПолучитьДокументТА|GetDocOfAP|ПолучитьПозициюТА|GetAPPosition|УстановитьТАна|SetAPToBeg|УстановитьТАпо|SetAPToEnd|РассчитатьРегистрыНа|CalcRegsOnBeg|РассчитатьРегистрыПо|CalcRegsOnEnd|ВыбранныйПланСчетов|DefaultChartOfAccounts|ОсновнойПланСчетов|MainChartOfAccounts|СчетПоКоду|AccountByCode|НачалоПериодаБИ|BeginOfPeriodBT|КонецПериодаБИ|EndOfPeriodBT|КонецРассчитанногоПериодаБИ|EndOfCalculatedPeriodBT|МаксимальноеКоличествоСубконто|MaxSubcontoCount|НазначитьСчет|SetAccount|ВвестиПланСчетов|InputChartOfAccounts|ВвестиВидСубконто|InputSubcontoKind|ОсновнойЖурналРасчетов|BasicCalcJournal|ТипЗначения|ValueType|ТипЗначенияСтр|ValueTypeStr|ПустоеЗначение|EmptyValue|ПолучитьПустоеЗначение|GetEmptyValue|НазначитьВид|SetKind|ПрефиксАвтоНумерации|AutoNumPrefix|ПолучитьЗначенияОтбора|GetSelectionValues|ЗаписьЖурналаРегистрации|LogMessageWrite|КомандаСистемы|System|ЗапуститьПриложение|RunApp|ЗавершитьРаботуСистемы|ExitSystem|НайтиПомеченныеНаУдаление|FindMarkedForDelete|НайтиСсылки|FindReferences|УдалитьОбъекты|DeleteObjects|ОбработкаОжидания|IdleProcessing|ОткрытьФорму|OpenForm|ОткрытьФормуМодально|OpenFormModal|_IdToStr|_StrToID|_GetPerformanceCounter|Календари|Calendars|Метаданные|Metadata|Последовательность|Sequence|ПравилоПерерасчета|RecalculationRule)$/i


var reg_words_1C_v8=/^(Если|If|Тогда|Then|ИначеЕсли|ElsIf|Иначе|Else|КонецЕсли|EndIf|Цикл|Do|Для|For|По|To|Пока|While|КонецЦикла|EndDo|Процедура|Procedure|КонецПроцедуры|EndProcedure|Функция|Function|КонецФункции|EndFunction|Перем|Var|Экспорт|Export|Перейти|Goto|И|And|Или|Or|Не|Not|Знач|Val|Прервать|Break|Продолжить|Continue|Возврат|Return|Попытка|Try|Исключение|Except|КонецПопытки|EndTry|ВызватьИсключение|Raise|Из|In|Каждого|Each|Истина|True|Ложь|False|Null|Неопределено|Undefined|Новый|New)$/i


///////////////////////////////////////////////////////////////////////
//Окрашивает слово 1С
function colorWord(s, version){
	var kw=0;
    if(version==7){
		kw=reg_words_1C_77.test(s);
	}else if(version==8){	
		kw=reg_words_1C_v8.test(s);
	}
	
	if(kw){
		//alert('colorWords1: '+s);
		return '<font color=red>'+s+'</font>';
	}else{   
		//alert('colorWords2: '+s);
		return '<font color=blue>'+s+'</font>';
	}
}

///////////////////////////////////////////////////////////////////////
//Окрашивает код 1С, который не является словами
function colorNoWords(s){
	//alert('colorNoWords: '+s);
	s=''+s;
   	s=s.replace( /([\.\;\/\+\-\*\/\%\=\(\)\?\[\]\,]+)/g, "<font color=red>$1</font>");
	
	//alert('colorNoWords_: '+s);
	return s;
}

///////////////////////////////////////////////////////////////////////
//Окрашивает код 1С, который не включает комментарии, текстовые строки, даты, символы вида &gt; 
function colorCode1C(s, version){
	//alert('colorCode1C: '+s);
	if(s.search(/[А-Яа-яA-Za-z_][А-Яа-яA-Za-z_0-9]*/)==-1){
		return colorNoWords(s);
	}
	
	var reg=/[А-Яа-яA-Za-z_][А-Яа-яA-Za-z_0-9]*/g
	var res='';
	s=' '+s+' ';
	var arr_w=s.match(reg);//Все слова 1С
	var arr_n=s.split(reg); //Все последовательности, отличные от слов
		
	for(var i=0; i<arr_w.length; i++){
		var n=arr_n[i];
		var w=arr_w[i];
		if(i==0) n=n.substr(1, n.length-1);//Убираем левый пробел
		res+=colorNoWords(n)+colorWord(w, version);
	}
	n=arr_n[arr_w.length];
	//alert('lastn='+n);
	n=n.substr(0, n.length-1);//Убираем правый пробел
	//alert('lastn_='+n);
	res+=colorNoWords(n);
	
	//alert('colorCode1C_: '+res);
	return res;
}

///////////////////////////////////////////////////////////////////////
//Окрашивает строку кода 1С
function colorString1C(s, version){
	var res='';
	var el='';
	var c='';
	var ok=0;
	
	if(s==''){
	//Вырожденный случай - пустая строка
		return '';
	}
	
	//window.status=s;
	//if(s.search(/Процедура/)!=-1){
	//   alert(s);
	//}
	
	s=s.replace(/\t/g, "    ");
	
	for(var i=0; i<s.length; i++){
		c=s.charAt(i);
		if(c>" "){
			ok=1;
			break;
		}else{
			el=el+c;	
		}
	}
	res+=el;
	if(ok==0){
	//Вырожденный случай - в строке только пробелы
		return res;
	}
	
	s=s.replace(/\&quot\;/gi, '"');
	s=s.replace(/\&apos\;/gi, "'");
	s=s.replace(/\>\;/g, "&gt;");
	s=s.replace(/\<\;/g, "&lt;");
	
	if(c=="|"){
		//Строковый литерал, который начинается символом | ("труба") в начале строки
		p=s.indexOf('"', i+1);
		if(p==-1){
			//Строковый литерал, который начинается символом "труба" и не заканчивается в этой строке
			res+=s.substr(i);
			return res;
		} else {
			//Нашли закрывающую кавычку - теперь найденный строковый литерал надо поместить в массив
			res+=s.substr(i, p-i+1);
			i=p+1;
		}
	}else if(c=="#"){
		//Директива препроцессора
		res+=s.substr(i);
		return res;
	}
	
	while(i<s.length){
		
	//Теперь i указывает на позицию, которая заведомо не является строковым литералом или директивой
		var pstr=s.indexOf('"', i);
		var pcom=s.indexOf('//', i);
		var pdat=s.indexOf("'", i);
		var pspec=s.indexOf("&", i); //последовательности наподобие &lt; &gt; &amp; и т.д.
		
		//Выявляем наименьшее неотрицательное значение, остальным присваиваем -1
		
		if(pcom!=-1 && pdat!=-1){
			if(pcom<pdat){pdat=-1} else {pcom=-1};
		}
		if(pcom!=-1 && pstr!=-1){
			if(pcom<pstr){pstr=-1} else {pcom=-1};
		}
		if(pcom!=-1 && pspec!=-1){
			if(pcom<pspec){pspec=-1} else {pcom=-1};
		}
		
		if(pdat!=-1 && pstr!=-1){
			if(pdat<pstr){pstr=-1} else {pdat=-1};
		}
		if(pdat!=-1 && pspec!=-1){
			if(pdat<pspec){pspec=-1} else {pdat=-1};
		}

		if(pstr!=-1 && pspec!=-1){
			if(pstr<pspec){pspec=-1} else {pstr=-1};
		}
		
		if(pcom!=-1){
			//Обнаружен комментарий
			//строка, предш. комментарию
			res+=colorCode1C(s.substr(i, pcom-i), version);
			//сам комментарий
			res+='<font color=green>'+s.substr(pcom)+'</font>';
			return res;
		} else if(pstr!=-1){
			//Найден строковый литерал
			//строка, предш. литералу
			res+=colorCode1C(s.substr(i, pstr-i), version);
			var p=s.indexOf('"', pstr+1);
			if(p==-1){
				//Строковый литерал, который не заканчивается в этой строке
				res+=s.substr(pstr);
				return res;
			} else {
				//Нашли закрывающую кавычку 
				el=s.substr(pstr, p-pstr+1);
				//alert(el);
				res+=el;
				i=p+1;
			}
		} else if(pdat!=-1){
			//Найден литерал даты, например, '01.01.2008'
			res+=colorCode1C(s.substr(i, pdat-i), version);//строка, предш. литералу
			var p=s.indexOf("'", pdat+1);
			if(p==-1){
				//Ошибочный литерал даты, который не завершается на этой строке
				res+=s.substr(pdat);
				return res;
			} else {
				//Нашли закрывающую кавычку 
				res+=s.substr(pdat, p-pdat+1);
				i=p+1;
			}
		} else if(pspec!=-1){
			res+=colorCode1C(s.substr(i, pspec-i), version);//строка, предш. литералу

			var p=s.indexOf(";", pspec+1);
			
			//Отследим ошибочные случаи
			var p1=s.indexOf(" ", pspec+1);
			if(p1!=-1){
				if(p1<p) p=p1;
			}
			var p1=s.indexOf("\t", pspec+1);
			if(p1!=-1){
				if(p1<p) p=p1;
			}
			
			if(p==-1){
				//Ошибочный литерал 
				el=s.substr(i);
				arr.push(el);
				return arr;
			} else {
				//Нашли закрывающий ; или (при ошибке) пробел
				el=s.substr(pspec, p-pspec+1);
				if(el=='&gt;' || el=='&lt;'){
					res+='<font color=red>'+el+'</font>';
				}else{
					res+=el;
				}
				i=p+1;
			}
		} else {
			//Не найден ни строковый литерал, ни комментарий, ни дата, ни спецсимвол
			res+=colorCode1C(s.substr(i), version);
			return res;
		}
  
    }
	return res;
}

///////////////////////////////////////////////////////////////////////
function colorAllCode1C(s, version){


	var arr1=s.split("\n");
	var res='';
	for (var i=0; i<arr1.length; i++){
		var s1=arr1[i];
		//alert(s1);
		res+=colorString1C(s1, version)+"\n";
	}
	return res;
}

///////////////////////////////////////////////////////////////////////
function colorObj(obj){
	if(!obj) return;
	var attr=obj.getAttribute("LANG");
	if(attr=="1Cv77"){ 
	
		var s=obj.innerHTML;
		obj.innerHTML=""+colorAllCode1C(s,7)+"";
		
	}else if(attr=="1Cv8"){ 
		var s=obj.innerHTML;
		obj.innerHTML=""+colorAllCode1C(s,8)+"";
	}

}


///////////////////////////////////////////////////////////////////////
//Основной код функции окраски кода 1С

	if(prm_id==""){
		var arr = document.getElementsByTagName('PRE');
		for(var i=0; i<arr.length; i++){
			var obj=arr[i];
			colorObj(obj);
		}
	} else {
		var obj=document.getElementById(prm_id);
		colorObj(obj);
	}	
		
}

 

Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Portal di Ensiklopedia Dunia