#Использовать osparser Перем КаталогБиблиотеки; Перем ФайлСоставаОПИ; Перем МодульСоставаОПИ; Перем СоответствиеКомандМодулей; Перем ТекущийМодуль; Процедура ПриСозданииОбъекта() СоответствиеКомандМодулей = Новый Соответствие(); СоответствиеКомандМодулей.Вставить("OPI_Telegram" , "telegram"); СоответствиеКомандМодулей.Вставить("OPI_VK" , "vk"); СоответствиеКомандМодулей.Вставить("OPI_Viber" , "viber"); СоответствиеКомандМодулей.Вставить("OPI_Twitter" , "twitter"); СоответствиеКомандМодулей.Вставить("OPI_Notion" , "notion"); СоответствиеКомандМодулей.Вставить("OPI_YandexID" , "yandex"); СоответствиеКомандМодулей.Вставить("OPI_YandexDisk" , "yadisk"); СоответствиеКомандМодулей.Вставить("OPI_GoogleWorkspace", "google"); СоответствиеКомандМодулей.Вставить("OPI_GoogleCalendar" , "gcalendar"); СоответствиеКомандМодулей.Вставить("OPI_GoogleDrive" , "gdrive"); КаталогБиблиотеки = "./OInt/core/Modules"; ФайлСоставаОПИ = "./cli/data/Modules/СоставБиблиотеки.os"; МодульСоставаОПИ = Новый ТекстовыйДокумент(); МодульСоставаОПИ.УстановитьТекст("Функция ПолучитьСостав() Экспорт | | ТаблицаСостава = Новый ТаблицаЗначений(); | ТаблицаСостава.Колонки.Добавить(""Библиотека""); | ТаблицаСостава.Колонки.Добавить(""Модуль""); | ТаблицаСостава.Колонки.Добавить(""Метод""); | ТаблицаСостава.Колонки.Добавить(""МетодПоиска""); | ТаблицаСостава.Колонки.Добавить(""Параметр""); | ТаблицаСостава.Колонки.Добавить(""Описание""); | ТаблицаСостава.Колонки.Добавить(""ОписаниеМетода""); |"); ЗаполнитьТаблицуСостава(); МодульСоставаОПИ.ДобавитьСтроку(" Возврат ТаблицаСостава;"); МодульСоставаОПИ.ДобавитьСтроку("КонецФункции"); МодульСоставаОПИ.ДобавитьСтроку(Символы.ПС); МодульСоставаОПИ.Записать(ФайлСоставаОПИ); КонецПроцедуры Процедура ЗаполнитьТаблицуСостава() ФайлыМодулей = НайтиФайлы(КаталогБиблиотеки, "*.os"); Для Каждого Модуль Из ФайлыМодулей Цикл ТекущийМодуль = Модуль.ИмяБезРасширения; Если Не СоответствиеКомандМодулей[ТекущийМодуль] = Неопределено Тогда РазобратьМодуль(Модуль); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура РазобратьМодуль(Модуль) Парсер = Новый ПарсерВстроенногоЯзыка; ДокументМодуля = Новый ТекстовыйДокумент; ДокументМодуля.Прочитать(Модуль.ПолноеИмя); ТекстМодуля = ДокументМодуля.ПолучитьТекст(); СтруктураМодуля = Парсер.Разобрать(ТекстМодуля); Для Каждого Метод Из СтруктураМодуля.Объявления Цикл Если Метод.Тип = "ОбъявлениеМетода" И Метод.Сигнатура.Экспорт = Истина Тогда РазобратьКомментарийМетода(ДокументМодуля, Метод.Начало.НомерСтроки, Метод.Сигнатура.Имя, Модуль); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура РазобратьКомментарийМетода(ТекстовыйДокумент, НомерСтроки, ИмяМетода, Модуль) ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - 1); ТекстКомментария = ТекущаяСтрока; Счетчик = 1; ЗаписыватьПараметры = Ложь; ЗаписыватьОписание = Истина; МассивПараметров = Новый Массив; ОписаниеМетода = ""; Пока СтрНайти(ТекущаяСтрока, "//") > 0 Цикл Счетчик = Счетчик + 1; ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - Счетчик); ТекстКомментария = ТекущаяСтрока + Символы.ПС + ТекстКомментария; КонецЦикла; Если СтрНайти(ТекстКомментария, "!NOCLI") > 0 Тогда Возврат; КонецЕсли; МассивКомментария = СтрРазделить(ТекстКомментария, "//", Ложь); Если МассивКомментария.Количество() = 0 Тогда Сообщить(ТекстКомментария); Иначе МассивКомментария.Удалить(0); КонецЕсли; ДопОписание = ОпределитьДопОписаниеПоТипамПараметров(МассивКомментария, Модуль); Счетчик = 0; Для Каждого СтрокаКомментария Из МассивКомментария Цикл Счетчик = Счетчик + 1; Если Не ЗначениеЗаполнено(СокрЛП(СтрокаКомментария)) Тогда ЗаписыватьОписание = Ложь; КонецЕсли; Если ЗаписыватьОписание = Истина И Счетчик > 1 Тогда ОписаниеМетода = ?(ЗначениеЗаполнено(ОписаниеМетода), ОписаниеМетода + " | ", ОписаниеМетода) + СтрокаКомментария; КонецЕсли; Если СтрНайти(СтрокаКомментария, "Параметры:") > 0 Тогда ЗаписыватьПараметры = Истина; ЗаписыватьОписание = Ложь; ИначеЕсли СтрНайти(СтрокаКомментария, "Возвращаемое значение:") > 0 Тогда Прервать; ИначеЕсли ЗаписыватьПараметры = Истина И ЗначениеЗаполнено(СокрЛП(СтрокаКомментария)) И Не СтрНачинаетсяС(СокрЛП(СтрокаКомментария), "*") = 0 Тогда МассивПараметров.Добавить(СтрокаКомментария); Иначе Продолжить; КонецЕсли; КонецЦикла; ОписаниеМетода = СокрЛП(ОписаниеМетода) + ДопОписание; Для Каждого ПараметрМетода Из МассивПараметров Цикл ЗаписатьСозданиеПараметраСостава(ПараметрМетода, ИмяМетода, СокрЛП(ОписаниеМетода)); ОписаниеМетода = ""; КонецЦикла; КонецПроцедуры Процедура ЗаписатьСозданиеПараметраСостава(ПараметрМетода, ИмяМетода, ОписаниеМетода = "") Разделитель = "-"; МассивЭлементовПараметра = СтрРазделить(ПараметрМетода, Разделитель, Ложь); КоличествоЭлементов = МассивЭлементовПараметра.Количество(); Для Н = 0 По МассивЭлементовПараметра.ВГраница() Цикл МассивЭлементовПараметра[Н] = СокрЛП(МассивЭлементовПараметра[Н]); КонецЦикла; Если КоличествоЭлементов < 4 Тогда Возврат; КонецЕсли; Имя = "--" + МассивЭлементовПараметра[3]; Описание = ?(КоличествоЭлементов >= 5, МассивЭлементовПараметра[4], МассивЭлементовПараметра[2]); МодульСоставаОПИ.ДобавитьСтроку(Символы.ПС); МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока = ТаблицаСостава.Добавить();"); МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Библиотека = """ + СоответствиеКомандМодулей.Получить(ТекущийМодуль) + """;"); МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Модуль = """ + ТекущийМодуль + """;"); МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Метод = """ + ИмяМетода + """;"); МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.МетодПоиска = """ + вРег(ИмяМетода) + """;"); МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Параметр = """ + Имя + """;"); МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Описание = """ + Описание + """;"); Если ЗначениеЗаполнено(ОписаниеМетода) Тогда МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.ОписаниеМетода = """ + ОписаниеМетода + """;"); КонецЕсли; МодульСоставаОПИ.ДобавитьСтроку(Символы.ПС); КонецПроцедуры Функция ОпределитьДопОписаниеПоТипамПараметров(Знач МассивКомментария, Модуль) НачалоПараметров = Ложь; ЕстьМассив = Ложь; ДопОписание = ""; ДЛя Каждого СтрокаКомментария Из МассивКомментария Цикл Если СтрНайти(СтрокаКомментария, "Возвращаемое значение:") Тогда Прервать; КонецЕсли; Если СтрНайти(СтрокаКомментария, "Параметры:") > 0 Тогда НачалоПараметров = Истина; Продолжить; КонецЕсли; Если Не НачалоПараметров Тогда Продолжить; КонецЕсли; Если СтрНайти(СтрокаКомментария, " Массив") > 0 Или СтрНайти(СтрокаКомментария, ",Массив") > 0 Тогда ЕстьМассив = Истина; Прервать; КонецЕсли; КонецЦикла; ДопОписание = СформироватьДополненеОписания(Модуль); Если ЕстьМассив Тогда ДопОписание = ДопОписание + Символы.ПС + Символы.ПС; ДопОписание = ДопОписание + " Пример указания параметра типа массив: | --param """"['Val1','Val2','Val3']""""" + Символы.ПС; КонецЕсли; Возврат СтрЗаменить(ДопОписание, Символы.ПС, Символы.ПС + "|"); КонецФункции Функция СформироватьДополненеОписания(Модуль) Если Модуль.ИмяБезРасширения = "OPI_VK" Тогда ТекстДополнения = " | Структура JSON данных авторизации (параметр --auth): | { | ""access_token"": """", | ""from_group"" : ""1"", | ""owner_id"" : """", | ""v"" : ""5.131"", | ""app_id"" : """", | ""group_id"" : """" | } | |"; Иначе ТекстДополнения = ""; КонецЕсли; Возврат ТекстДополнения; КонецФункции ПриСозданииОбъекта();