//Скрипт для подсветки кода 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С, который не включает комментарии, текстовые строки, даты, символы вида >
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(/\"\;/gi, '"');
s=s.replace(/\&apos\;/gi, "'");
s=s.replace(/\>\;/g, ">");
s=s.replace(/\<\;/g, "<");
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); //последовательности наподобие < > & и т.д.
//Выявляем наименьшее неотрицательное значение, остальным присваиваем -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=='>' || el=='<'){
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);
}
}