Раскрасить код

ChOP 226 3 8 7

Раскрашивает код 1с

//Вспомогательная, используется в "РаскраситьКод1С8"
Процедура ДобавитьСлово(Код, Слово, ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло, ТипСлова=Неопределено)
    Если ПустаяСтрока(Слово) Тогда
        Код = Код + СтрЗаменить(СтрЗаменить(СтрЗаменить(Слово, " ", " "), Символы.НПП, " "), Символы.Таб, "    ");
        Возврат;
    ИначеЕсли ТипСлова=Неопределено Тогда
        нсл = НРег(СокрП(Слово));
        Если Найти(СписокКлючевыхСлов, нсл)>0 Тогда
            ТипСлова = "<keywrd>";
        ИначеЕсли Слово = "0" или мОписаниеТипаЧисло.ПривестиЗначение(Слово)<>0 Тогда
            ТипСлова = "<num>";
        Иначе
            ТипСлова = "<text>";
            ЭтоЧисло = Истина;
            Для сч=1 по СтрДлина(нсл) Цикл
                ТекСимв=Сред(нсл, сч, 1);
                Если Найти(ДопустимыеЗнаки, ТекСимв)=0 Тогда
                    ТипСлова="<unwn>";
                    Прервать;
                ИначеЕсли ТекСимв<>"0" Тогда
                    ЭтоЧисло = Ложь;
                КонецЕсли;
            КонецЦикла;
            Если ЭтоЧисло Тогда
                ТипСлова = "<num>";
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    Код = Код + ?(ТекТипСлова=ТипСлова, "", ТипСлова) + СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Слово, "<", "<"), ">", ">"), " ", " "), Символы.НПП, " "), Символы.Таб, "    ");
    ТекТипСлова = ТипСлова;
    Слово = "";
КонецПроцедуры

//Реализует функционал "Оформить фрагмент кода"
Функция РаскраситьКод1С8(ТекстКод) Экспорт
    мОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
    Таб = Символы.Таб;
    НПП = Символы.НПП;
    ДопустимыеЗнаки = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя0123456789abcdefghijklmnopqrstyvwxyz_";
    СписокКлючевыхСлов = "асинх|async|ждать|await|if|если|then|тогда|elsif|иначеесли|else|иначе|endif|конецесли|do|цикл|for|для|to|по|each|каждого|in|из|while|пока|enddo|конеццикла|procedure|процедура|endprocedure|конецпроцедуры|function|функция|endfunction|конецфункции|var|перем|export|экспорт|goto|перейти|and|и|or|или|not|не|val|знач|break|прервать|continue|продолжить|return|возврат|try|попытка|except|исключение|endtry|конецпопытки|raise|вызватьисключение|false|ложь|true|истина|undefined|неопределено|null|new|новый|execute|выполнить|";
    Ответ = "<span style=""text-align: left; font-family: courier new,courier; color: blue; font-size: 10pt; white-space: pre; display: inline-block; ""><font>";
    ТекТипСлова = "<text>";
    Для нс=1 По СтрЧислоСтрок(ТекстКод) Цикл
        ТекСтрока = СокрП(СтрПолучитьСтроку(ТекстКод, нс));
        дл = СтрДлина(ТекСтрока);
        сч = 0;
        ТекСлово = "";
        КодНеНачался = Истина;
        Пока сч<дл Цикл
            сч = сч + 1;
            ТекущийСимвол = Сред(ТекСтрока, сч, 1);
            Если КодНеНачался Тогда
                Если ТекущийСимвол=" " Или ТекущийСимвол=Таб Или ТекущийСимвол=НПП Тогда
                    //ТекущийСимвол = ?(ТекущийСимвол=" " или ТекущийСимвол=НПП, " ", "    ");
                    Ответ = Ответ + ТекущийСимвол;
                    Продолжить;
                ИначеЕсли ТекущийСимвол="#" или ТекущийСимвол="&" Тогда
                    ТекСлово = "";
                    ДобавитьСлово(Ответ, Сред(ТекСтрока, сч), ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло, "<dir>");
                    Прервать;
                КонецЕсли;
            КонецЕсли;
            КодНеНачался = Ложь;            
            Если ТекущийСимвол=" " Или ТекущийСимвол=Таб Или ТекущийСимвол=НПП Тогда
                Если КодНеНачался Тогда
                    Ответ = Ответ + ТекущийСимвол;
                    Продолжить;
                КонецЕсли;
                //ТекущийСимвол = ?(ТекущийСимвол=" " или ТекущийСимвол=НПП, " ", "    ");
                ДобавитьСлово(Ответ, ТекСлово+ТекущийСимвол, ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло);
                ТекСлово = "";
                Продолжить;
            ИначеЕсли Найти("():;.,=+-*<>?[]%/", ТекущийСимвол) > 0 Тогда
                ДобавитьСлово(Ответ, ТекСлово, ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло);
                ТекСлово = "";
                //Проверяем на комментарий
                Если ТекущийСимвол="/" и Сред(ТекСтрока, сч+1, 1)="/" Тогда
                    ТекСлово = "";
                    ДобавитьСлово(Ответ, СокрП(Сред(ТекСтрока, сч)), ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло, "<cmnt>");
                    Прервать;
                КонецЕсли;    
                ДобавитьСлово(Ответ, ТекущийСимвол, ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло, "<symb>");
                Продолжить;
            ИначеЕсли ТекущийСимвол="""" или ТекущийСимвол="|" Тогда
                ДобавитьСлово(Ответ, ТекСлово, ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло);
                // найти закрывающую кавычку
                нач = сч;
                сч = сч + 1;
                СледующийСимвол = Сред(ТекСтрока, сч, 1);
                Пока сч<дл Цикл
                    сч = сч + 1;
                    ТекущийСимвол = СледующийСимвол;
                    СледующийСимвол = Сред(ТекСтрока, сч, 1);
                    Если ТекущийСимвол="""" Тогда
                        Если СледующийСимвол="""" Тогда
                            сч = сч + 1;
                            СледующийСимвол = Сред(ТекСтрока, сч, 1);
                        Иначе
                            Прервать;
                        КонецЕсли;
                    КонецЕсли;
                КонецЦикла;
                ТекСлово = "";
                ДобавитьСлово(Ответ, Сред(ТекСтрока, нач, сч-нач), ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло, "<str>");
                сч = сч - 1;
                Продолжить;
            ИначеЕсли ТекущийСимвол="'" Тогда
                нач = сч;
                сч = сч + 1;
                СледующийСимвол = Сред(ТекСтрока, сч, 1);
                Пока сч<дл Цикл
                    сч = сч + 1;
                    ТекущийСимвол = СледующийСимвол;
                    СледующийСимвол = Сред(ТекСтрока, сч, 1);
                    Если ТекущийСимвол="'" Тогда
                        Если СледующийСимвол="'" Тогда
                            сч = сч + 1;
                            СледующийСимвол = Сред(ТекСтрока, сч, 1);
                        Иначе
                            Прервать;
                        КонецЕсли;
                    КонецЕсли;
                КонецЦикла;
                ТекСлово = "";
                ДобавитьСлово(Ответ, Сред(ТекСтрока, нач, сч-нач), ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло, "<str>");
                сч = сч - 1;
                Продолжить;
            КонецЕсли;
            ТекСлово = ТекСлово + ТекущийСимвол;
        КонецЦикла;
        Если Не ПустаяСтрока(ТекСлово) Тогда
            ДобавитьСлово(Ответ,СокрП(ТекСлово), ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло);
        КонецЕсли;
        Ответ = Ответ + "";
    КонецЦикла;    
    Ответ = Ответ + Символы.ПС+"</font></span>";
    Ответ = СтрЗаменить(Ответ, "<keywrd>", "</font><font color=red>");
    Ответ = СтрЗаменить(Ответ, "<text>", "</font><font color=blue>");
    Ответ = СтрЗаменить(Ответ, "<str>", "</font><font color=black>");
    Ответ = СтрЗаменить(Ответ, "<num>", "</font><font color=black>");
    Ответ = СтрЗаменить(Ответ, "<unwn>", "</font><font color=black>");
    Ответ = СтрЗаменить(Ответ, "<symb>", "</font><font color=red>");
    Ответ = СтрЗаменить(Ответ, "<cmnt>", "</font><font color=green>");
    Ответ = СтрЗаменить(Ответ, "<dir>", "</font><font color=brown>");    
    Ответ = СтрЗаменить(Ответ, Символы.Таб, "    ");
    Возврат Ответ;
КонецФункции
1
Орфографическая ошибка в keywrd (найдено 2): keywrd
Орфографическая ошибка в unwn (найдено 2): unwn
Орфографическая ошибка в абвгдеёжзийклмнопрстуфхцчшщъыьэюя0123456789abcdefghijklmnopqrstyvwxyz_: абвгдеёжзийклмнопрстуфхцчшщъыьэюя
Орфографическая ошибка в асинх: асинх
Орфографическая ошибка в endprocedure: endprocedure
Орфографическая ошибка в endtry: endtry
Орфографическая ошибка в конецпопытки: конецпопытки
Орфографическая ошибка в cmnt (найдено 2): cmnt
Орфографическая ошибка в symb (найдено 2): symb

Комментарии

RomanVG
#1, ред. 11 марта 2022 16:25

строку: Ответ = Ответ + "";
я бы заменил на: Ответ = Ответ + "
";
и Ответ = СтрЗаменить(Ответ, Символы.Таб, " ");
на
Ответ = СтрЗаменить(Ответ, Символы.Таб, "&nbsp;&nbsp;&nbsp;&nbsp;");


См. также

Раскрасить даты календаря

Код для очистки ранее созданной номенклатуры

КодыВозврата (БСП)

ЯзыкПоКоду (БСП)

Код для переноса данных

Оформление (раскраска) строки табличной части обычной формы по условию, при получении данных

ПолеКодВозврата (БСП)

ПроверитьТелефонПоКоду (БСП)

Модератору