#Использовать osparser #Использовать cmdline Перем ТекущийМодуль; Перем Парсер; Перем Расположение; Перем СПодкаталогами; Перем КаталогДокументации; Перем СписокОбластей; Перем ТекущаяОбласть; Перем СчетчикОбласти; Процедура ПриСозданииОбъекта() Расположение = ".\OInt"; СПодкаталогами = Истина; КаталогДокументации = ".\docs"; СписокОбластей = Новый СписокЗначений(); ТекущаяОбласть = ""; СчетчикОбласти = 0; ПроверитьСоздатьКаталог(КаталогДокументации); СоздатьФайлыДокументации(); КонецПроцедуры #Область СлужебныеПроцедурыИФункции #Область ФормированиеДокументации Процедура СоздатьФайлыДокументации() ОбщийМассивМодулей = Новый Массив; ФайлыМодулей = НайтиФайлы(Расположение, "*.os", СПодкаталогами); Для Каждого Модуль Из ФайлыМодулей Цикл ОбщийМассивМодулей.Добавить(Модуль); КонецЦикла; Для Каждого Модуль Из ОбщийМассивМодулей Цикл ТекущийМодуль = Новый ТекстовыйДокумент(); ТекущийМодуль.Прочитать(Модуль.ПолноеИмя); РазобратьМодуль(ТекущийМодуль, Модуль.ИмяБезРасширения); КонецЦикла; КонецПроцедуры Процедура СоздатьСтраницуДокументации(СтруктураМетода, Счетчик = 1) Область = СтруктураМетода["Область"]; Если ТекущаяОбласть <> Область Тогда ТекущаяОбласть = Область; СчетчикОбласти = 1; КонецЕсли; ТранслитированноеИмя = ТранслитироватьСтроку(СтруктураМетода["Заголовок"]); СинонимОбласти = Синонимайзер(Область); ТранслитированнаяОбласть = ТранслитироватьСтроку(СинонимОбласти); КаталогБиблиотеки = КаталогДокументации + "\" + СтруктураМетода["Каталог"]; КаталогОбласти = КаталогБиблиотеки + "\" + ТранслитированнаяОбласть; КаталогКартинок = КаталогОбласти + "\" + "img"; ПроверитьСоздатьКаталог(КаталогБиблиотеки); ПроверитьСоздатьКаталог(КаталогОбласти); ПроверитьСоздатьКаталог(КаталогКартинок); СтруктураКатегории = Новый Структура("label,position", СинонимОбласти, ""); ФайлКатегории = КаталогОбласти + "\_category_.json"; Запись = Новый ЗаписьJSON; ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто); Запись.ОткрытьФайл(ФайлКатегории, , , ПараметрыЗаписиJSON); ЗаписатьJSON(Запись, СтруктураКатегории); Запись.Закрыть(); Макет = Новый ТекстовыйДокумент(); Макет.Прочитать(".\.github\workflows\os\template.md", "UTF-8"); Макет = Макет.ПолучитьТекст(); Макет = СтрЗаменить(Макет, "@Счетчик" , Строка(СчетчикОбласти)); Макет = СтрЗаменить(Макет, "@Заголовок" , СтруктураМетода["Заголовок"]); Макет = СтрЗаменить(Макет, "@Описание" , СтруктураМетода["Описание"]); Макет = СтрЗаменить(Макет, "@Объявление" , СтруктураМетода["Объявление"]); Макет = СтрЗаменить(Макет, "@ВозвращаемоеЗначение", СтруктураМетода["ВозвращаемоеЗначение"]); Макет = СтрЗаменить(Макет, "@ВозвращаемоеЗначение", СтруктураМетода["ВозвращаемоеЗначение"]); ТаблицаПараметров = ""; Вызов1С = СтруктураМетода["ИмяМодуля"] + "." + СтруктураМетода["ИмяМетода"] + "("; ВызовCLI = "oint " + СтруктураМетода["Команда"] + " " + СтруктураМетода["ИмяМетода"]; Для каждого ПараметрМетода Из СтруктураМетода["Параметры"] Цикл ТаблицаПараметров = ТаблицаПараметров + " | " + ПараметрМетода.Имя + " | " + ПараметрМетода.Опция + " | " + ПараметрМетода.Типы + " | " + ПараметрМетода.Описание + " |" + Символы.ПС; Вызов1С = Вызов1С + ПараметрМетода.Имя + ", "; ВызовCLI = ВызовCLI + " " + ПараметрМетода.Опция + " "; ВызовCLI = ВызовCLI + "%" + СтрЗаменить(ПараметрМетода.Опция, "-", "") + "%"; КонецЦикла; Вызов1С = Лев(Вызов1С, СтрДлина(Вызов1С) - 2); Вызов1С = Вызов1С + ");"; Макет = СтрЗаменить(Макет, "@Вызов1С" , Вызов1С); Макет = СтрЗаменить(Макет, "@ВызовCLI" , ВызовCLI); Макет = СтрЗаменить(Макет, "@ТаблицаПараметров", ТаблицаПараметров); НовыйДокумент = Новый ТекстовыйДокумент(); НовыйДокумент.УстановитьТекст(Макет); НовыйДокумент.Записать(КаталогОбласти + "\" + ТранслитированноеИмя + ".md"); СчетчикОбласти = СчетчикОбласти + 1; КонецПроцедуры #КонецОбласти #Область РазборМодуля Процедура РазобратьМодуль(ТекущийМодуль, ИмяМодуля) ТекстМодуля = ТекущийМодуль.ПолучитьТекст(); СтруктураОбщихДанных = Новый Структура(); СтруктураОбщихДанных.Вставить("ИмяМодуля", ИмяМодуля); ПолучитьДанныеМодуля(СтруктураОбщихДанных, ТекущийМодуль); Если Не ЗначениеЗаполнено(СтруктураОбщихДанных["Библиотека"]) Тогда Возврат; КонеЦесли; Парсер = Новый ПарсерВстроенногоЯзыка; СтруктураМодуля = Парсер.Разобрать(ТекстМодуля); Для Каждого Метод Из СтруктураМодуля.Объявления Цикл Если Метод.Тип = "ОбъявлениеМетода" И Метод.Сигнатура.Экспорт = Истина Тогда РазобратьМетод(ТекущийМодуль, Метод, СтруктураОбщихДанных); КонецЕсли; Если Метод.Тип = "ИнструкцияПрепроцессораОбласть" Тогда СписокОбластей.Добавить(Метод.Начало.НомерСтроки, Метод.Имя); КонецЕсли; КонецЦикла; СписокОбластей.СортироватьПоЗначению(); КонецПроцедуры Процедура ПолучитьДанныеМодуля(СтруктураОбщихДанных, ТекущийМодуль) Имя = ТекущийМодуль.ПолучитьСтроку(1); CLI = ТекущийМодуль.ПолучитьСтроку(2); Если СтрНайти(Имя, "Библиотека") = 0 Тогда Имя = ""; Иначе Имя = СтрЗаменить(Имя, "// Библиотека:", ""); Имя = СокрЛП(Имя); КонецЕсли; Если СтрНайти(CLI, "Команда CLI") = 0 Тогда CLI = "none"; Иначе CLI = СтрЗаменить(CLI, "// Команда CLI:", ""); CLI = СокрЛП(CLI); КонецЕсли; Каталог = СтрЗаменить(Имя, " ", "_"); СтруктураОбщихДанных.Вставить("Библиотека", Имя); СтруктураОбщихДанных.Вставить("Команда" , CLI); СтруктураОбщихДанных.Вставить("Каталог" , Каталог); КонецПроцедуры #КонецОбласти #Область РазборМетода Процедура РазобратьМетод(ТекстовыйДокумент, Метод, СтруктураДанных) НомерСтроки = Метод.Начало.НомерСтроки; ИмяМетода = Метод.Сигнатура.Имя; Объявление = ""; Для Н = НомерСтроки По Метод.Конец.НомерСтроки Цикл Часть = СокрЛП(ТекстовыйДокумент.ПолучитьСтроку(Н)); Объявление = Объявление + Часть; Если Не ЗначениеЗаполнено(Часть) Тогда Прервать; КонецЕсли; КонецЦикла; Для Каждого Область Из СписокОбластей Цикл Если НомерСтроки > Область.Значение Тогда СтруктураДанных.Вставить("Область", Область.Представление); КонецЕсли; КонецЦикла; МассивКомментария = ПарсингКомментария(ТекстовыйДокумент, НомерСтроки, СтруктураДанных); МассивПараметров = Новый Массив; МассивОписанийПараметров = Новый Массив; Если МассивКомментария.Количество() = 0 Тогда Возврат; КонецЕсли; СформироватьСтруктуруМетода(МассивКомментария, МассивПараметров, СтруктураДанных); СформироватьМассивОписанийПараметров(МассивПараметров, Метод, МассивОписанийПараметров); СтруктураДанных.Вставить("ИмяМетода" , ИмяМетода); СтруктураДанных.Вставить("Объявление", Объявление); СтруктураДанных.Вставить("Параметры" , МассивОписанийПараметров); СоздатьСтраницуДокументации(СтруктураДанных); КонецПроцедуры Функция ПарсингКомментария(Знач ТекстовыйДокумент, Знач НомерСтроки, СтруктураДанных) ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - 1); ТекстКомментария = ТекущаяСтрока; Счетчик = 1; Пока СтрНайти(ТекущаяСтрока, "//") > 0 Цикл Счетчик = Счетчик + 1; ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - Счетчик); ТекстКомментария = ТекущаяСтрока + Символы.ПС + ТекстКомментария; КонецЦикла; Если СтрНайти(ТекстКомментария, "!NOCLI") > 0 Тогда СтруктураДанных.Вставить("ЕстьCLI", Ложь); Иначе СтруктураДанных.Вставить("ЕстьCLI", Истина); КонецЕсли; МассивКомментария = СтрРазделить(ТекстКомментария, "//", Ложь); Если МассивКомментария.Количество() = 0 Тогда Возврат Новый Массив; Иначе МассивКомментария.Удалить(0); КонецЕсли; Возврат МассивКомментария; КонецФункции Процедура СформироватьСтруктуруМетода(Знач МассивКомментария, МассивПараметров, СтруктураДанных) ОписаниеМетода = ""; ЗаписыватьПараметры = Ложь; ЗаписыватьОписание = Истина; Счетчик = 0; Для Каждого СтрокаКомментария Из МассивКомментария Цикл Счетчик = Счетчик + 1; Если Не ЗначениеЗаполнено(СокрЛП(СтрокаКомментария)) Тогда ЗаписыватьОписание = Ложь; КонецЕсли; Если ЗаписыватьОписание = Истина И Счетчик > 1 Тогда ОписаниеМетода = СокрЛП(ОписаниеМетода) + " " + СокрЛП(СтрокаКомментария); КонецЕсли; Если СтрНайти(СтрокаКомментария, "Параметры:") > 0 Тогда ЗаписыватьПараметры = Истина; ЗаписыватьОписание = Ложь; ИначеЕсли СтрНайти(СтрокаКомментария, "Возвращаемое значение:") > 0 Тогда СтруктураДанных.Вставить("ВозвращаемоеЗначение", МассивКомментария[Счетчик]); Прервать; ИначеЕсли ЗаписыватьПараметры = Истина И ЗначениеЗаполнено(СокрЛП(СтрокаКомментария)) И Не СтрНачинаетсяС(СокрЛП(СтрокаКомментария), "*") = 0 Тогда МассивПараметров.Добавить(СтрокаКомментария); Иначе Продолжить; КонецЕсли; КонецЦикла; СтруктураДанных.Вставить("Описание" , ОписаниеМетода); СтруктураДанных.Вставить("Заголовок", СтрЗаменить(СокрЛП(МассивКомментария[0]), "!NOCLI", "")); КонецПроцедуры Процедура СформироватьМассивОписанийПараметров(Знач МассивПараметров, Знач Метод, МассивОписанийПараметров) Разделитель = "-"; Для Каждого ПараметрМетода Из МассивПараметров Цикл МассивЭлементовПараметра = СтрРазделить(ПараметрМетода, Разделитель, Ложь); КоличествоЭлементов = МассивЭлементовПараметра.Количество(); Для Н = 0 По МассивЭлементовПараметра.ВГраница() Цикл МассивЭлементовПараметра[Н] = СокрЛП(МассивЭлементовПараметра[Н]); КонецЦикла; Имя1С = МассивЭлементовПараметра[0]; Если КоличествоЭлементов >= 4 Тогда Имя = "--" + МассивЭлементовПараметра[3]; Иначе Имя = ""; Конецесли; Типы = МассивЭлементовПараметра[1]; Описание = ?(КоличествоЭлементов >= 5, МассивЭлементовПараметра[4], МассивЭлементовПараметра[2]); СтруктураПараметра = Новый Структура; СтруктураПараметра.Вставить("Имя" , Имя1С); СтруктураПараметра.Вставить("Опция" , Имя); СтруктураПараметра.Вставить("Типы" , Типы); СтруктураПараметра.Вставить("Описание" , Описание); СтруктураПараметра.Вставить("ЗначениеПоУмолчанию", ПолучитьЗначениеПараметраПоУмолчанию(Имя1С, Метод)); МассивОписанийПараметров.Добавить(СтруктураПараметра); КонецЦикла; КонецПроцедуры #КонецОбласти #Область Инструменты Процедура ПроверитьСоздатьКаталог(Путь) Каталог = Новый Файл(Путь); Если Не Каталог.Существует() Тогда СоздатьКаталог(Путь); КонецЕсли; КонецПроцедуры Функция ПолучитьЗначениеПараметраПоУмолчанию(Знач Имя, Знач Метод) Значение = ""; Для Каждого ПараметрМетода Из Метод.Сигнатура.Параметры Цикл Если ПараметрМетода.Имя = Имя Тогда ЗначениеПараметра = ПараметрМетода.Значение; Если ЗначениеЗаполнено(ЗначениеПараметра) Тогда Попытка Значение = ЗначениеПараметра["Элементы"][0]["Значение"]; Исключение Значение = ЗначениеПараметра.Значение; КонецПопытки; Значение = ?(ЗначениеЗаполнено(Значение), Значение, "Пустое значение"); КонецЕсли; КонецЕсли; КонецЦикла; Возврат Значение; КонецФункции Функция ТранслитироватьСтроку(Знач Значение) Значение = нРег(Значение); Транслитация = Новый Соответствие(); Транслитация.Вставить("а", "a"); Транслитация.Вставить("б", "b"); Транслитация.Вставить("в", "v"); Транслитация.Вставить("г", "g"); Транслитация.Вставить("д", "d"); Транслитация.Вставить("е", "e"); Транслитация.Вставить("ё", "e"); Транслитация.Вставить("ж", "zh"); Транслитация.Вставить("з", "z"); Транслитация.Вставить("и", "i"); Транслитация.Вставить("й", "y"); Транслитация.Вставить("к", "k"); Транслитация.Вставить("л", "l"); Транслитация.Вставить("м", "m"); Транслитация.Вставить("н", "n"); Транслитация.Вставить("о", "o"); Транслитация.Вставить("п", "p"); Транслитация.Вставить("р", "r"); Транслитация.Вставить("с", "s"); Транслитация.Вставить("т", "t"); Транслитация.Вставить("у", "u"); Транслитация.Вставить("ф", "f"); Транслитация.Вставить("х", "h"); Транслитация.Вставить("ц", "ts"); Транслитация.Вставить("ч", "ch"); Транслитация.Вставить("ш", "sh"); Транслитация.Вставить("щ", "sch"); Транслитация.Вставить("ъ", ""); Транслитация.Вставить("ы", "y"); Транслитация.Вставить("ь", ""); Транслитация.Вставить("э", "e"); Транслитация.Вставить("ю", "u"); Транслитация.Вставить("я", "ya"); Транслитация.Вставить(" ", "-"); Для Каждого ЗаменяемыйСимвол Из Транслитация Цикл Значение = СтрЗаменить(Значение, ЗаменяемыйСимвол.Ключ, ЗаменяемыйСимвол.Значение); КонецЦикла; Значение = ВРег(Лев(Значение,1)) + Сред(Значение,2); Возврат Значение; КонецФункции Функция Синонимайзер(ИмяРеквизита) Перем Синоним, ъ, Символ, ПредСимвол, СледСимвол, Прописная, ПредПрописная, СледПрописная, ДлинаСтроки; Синоним = ВРег(Сред(ИмяРеквизита, 1, 1)); ДлинаСтроки = СтрДлина(ИмяРеквизита); Для ъ=2 По ДлинаСтроки Цикл Символ = Сред(ИмяРеквизита, ъ, 1); ПредСимвол = Сред(ИмяРеквизита, ъ-1, 1); СледСимвол = Сред(ИмяРеквизита, ъ+1, 1); Прописная = Символ = ВРег(Символ); ПредПрописная = ПредСимвол = ВРег(ПредСимвол); СледПрописная = СледСимвол = ВРег(СледСимвол); // Варианты: Если НЕ ПредПрописная И Прописная Тогда Синоним = Синоним + " " + Символ; ИначеЕсли Прописная И НЕ СледПрописная Тогда Синоним = Синоним + " " + Символ; Иначе Синоним = Синоним + Символ; Конецесли; КонецЦикла; Синоним = ВРег(Лев(Синоним,1)) + нРег(Сред(Синоним,2)); Возврат Синоним; КонецФункции #КонецОбласти #КонецОбласти ПриСозданииОбъекта();