Раскрасить код
Теги: 1С,Текст,синтаксис,раскрасить,код

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

# Код реализации

```1c
//Вспомогательная, используется в "РаскраситьКод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>");
    Ответ = СтрЗаменить(Ответ, Символы.Таб, "    ");
    Возврат Ответ;
КонецФункции
```

# Примечания

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