1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-01-16 05:06:02 +02:00

Переработка parse cli

This commit is contained in:
Anton 2024-04-07 12:10:56 +03:00
parent 646c759183
commit f4c7265148
3 changed files with 4012 additions and 3491 deletions

View File

@ -3,29 +3,44 @@
Перем КаталогБиблиотеки;
Перем ФайлСоставаОПИ;
Перем МодульСоставаОПИ;
Перем СоответствиеКомандМодулей;
Перем СоответствиеМодулейКоманд;
Перем ТекущийМодуль;
Перем ТаблицаОписанийПараметров;
Процедура ПриСозданииОбъекта()
СоответствиеКомандМодулей = Новый Соответствие();
СоответствиеКомандМодулей.Вставить("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";
МодульСоставаОПИ = Новый ТекстовыйДокумент();
СоответствиеМодулейКоманд = Новый Соответствие();
СоответствиеМодулейКоманд.Вставить("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");
МодульСоставаОПИ.УстановитьТекст("Функция ПолучитьСостав() Экспорт
МодульСоставаОПИ.ДобавитьСтроку("Функция ПолучитьСоответствиеКомандМодулей() Экспорт");
МодульСоставаОПИ.ДобавитьСтроку("СоответствиеКомандМодулей = Новый Соответствие();");
Для Каждого КомандаМодуля Из СоответствиеМодулейКоманд Цикл
МодульСоставаОПИ.ДобавитьСтроку("СоответствиеКомандМодулей.Вставить("""
+ КомандаМодуля.Значение
+ """, """
+ КомандаМодуля.Ключ
+ """);");
КонецЦикла;
МодульСоставаОПИ.ДобавитьСтроку("Возврат СоответствиеКомандМодулей;");
МодульСоставаОПИ.ДобавитьСтроку("КонецФункции");
МодульСоставаОПИ.ДобавитьСтроку("");
МодульСоставаОПИ.ДобавитьСтроку("Функция ПолучитьСостав() Экспорт
|
| ТаблицаСостава = Новый ТаблицаЗначений();
| ТаблицаСостава.Колонки.Добавить(""Библиотека"");
@ -37,17 +52,21 @@
| ТаблицаСостава.Колонки.Добавить(""ОписаниеМетода"");
|");
ТаблицаОписанийПараметров = Новый ТаблицаЗначений;
ТаблицаОписанийПараметров.Колонки.Добавить("Имя");
ТаблицаОписанийПараметров.Колонки.Добавить("Типы");
ТаблицаОписанийПараметров.Колонки.Добавить("Описание");
ТаблицаОписанийПараметров.Колонки.Добавить("ЗначениеПоУмолчанию");
ЗаполнитьТаблицуСостава();
МодульСоставаОПИ.ДобавитьСтроку(" Возврат ТаблицаСостава;");
МодульСоставаОПИ.ДобавитьСтроку("КонецФункции");
МодульСоставаОПИ.ДобавитьСтроку(Символы.ПС);
МодульСоставаОПИ.Записать(ФайлСоставаОПИ);
КонецПроцедуры
Процедура ЗаполнитьТаблицуСостава()
ФайлыМодулей = НайтиФайлы(КаталогБиблиотеки, "*.os");
@ -55,8 +74,9 @@
Для Каждого Модуль Из ФайлыМодулей Цикл
ТекущийМодуль = Модуль.ИмяБезРасширения;
ИмяКоманды = СоответствиеМодулейКоманд[ТекущийМодуль];
Если Не СоответствиеКомандМодулей[ТекущийМодуль] = Неопределено Тогда
Если Не СоответствиеМодулейКоманд[ТекущийМодуль] = Неопределено Тогда
РазобратьМодуль(Модуль);
КонецЕсли;
@ -76,24 +96,51 @@
Для Каждого Метод Из СтруктураМодуля.Объявления Цикл
Если Метод.Тип = "ОбъявлениеМетода" И Метод.Сигнатура.Экспорт = Истина Тогда
РазобратьКомментарийМетода(ДокументМодуля, Метод.Начало.НомерСтроки, Метод.Сигнатура.Имя, Модуль);
ТаблицаОписанийПараметров.Очистить();
РазобратьКомментарийМетода(ДокументМодуля, Метод, Модуль);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура РазобратьКомментарийМетода(ТекстовыйДокумент, НомерСтроки, ИмяМетода, Модуль)
Процедура РазобратьКомментарийМетода(ТекстовыйДокумент, Метод, Модуль)
НомерСтроки = Метод.Начало.НомерСтроки;
ИмяМетода = Метод.Сигнатура.Имя;
МассивКомментария = ПарсингКомментария(ТекстовыйДокумент, НомерСтроки);
Если МассивКомментария.Количество() = 0 Тогда
Возврат;
КонецЕсли;
МассивПараметров = Новый Массив;
ОписаниеМетода = "";
СформироватьСтруктуруМетода(МассивКомментария, МассивПараметров, ОписаниеМетода);
СформироватьТаблицуОписанийПараметров(МассивПараметров, Метод);
ДопОписание = "";
ОпределитьДопОписание(ДопОписание, Модуль);
ОписаниеМетода = СокрЛП(ОписаниеМетода) + ДопОписание;
Для Каждого СтрокаПараметра Из ТаблицаОписанийПараметров Цикл
ЗаписатьСозданиеПараметраСостава(СтрокаПараметра, ИмяМетода, СокрЛП(ОписаниеМетода));
ОписаниеМетода = "";
КонецЦикла;
КонецПроцедуры
Функция ПарсингКомментария(Знач ТекстовыйДокумент, Знач НомерСтроки)
ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - 1);
ТекстКомментария = ТекущаяСтрока;
Счетчик = 1;
ЗаписыватьПараметры = Ложь;
ЗаписыватьОписание = Истина;
МассивПараметров = Новый Массив;
ОписаниеМетода = "";
ДопОписание = "";
Счетчик = 1;
Пока СтрНайти(ТекущаяСтрока, "//") > 0 Цикл
Счетчик = Счетчик + 1;
@ -104,17 +151,27 @@
КонецЦикла;
Если СтрНайти(ТекстКомментария, "!NOCLI") > 0 Тогда
Возврат;
Возврат Новый Массив;
КонецЕсли;
МассивКомментария = СтрРазделить(ТекстКомментария, "//", Ложь);
Если МассивКомментария.Количество() = 0 Тогда
Сообщить(ТекстКомментария);
Возврат Новый Массив;
Иначе
МассивКомментария.Удалить(0);
КонецЕсли;
Возврат МассивКомментария;
КонецФункции
Процедура СформироватьСтруктуруМетода(Знач МассивКомментария, МассивПараметров, ОписаниеМетода)
ЗаписыватьПараметры = Ложь;
ЗаписыватьОписание = Истина;
Счетчик = 0;
Для Каждого СтрокаКомментария Из МассивКомментария Цикл
@ -147,23 +204,14 @@
КонецЦикла;
ОпределитьДопОписаниеПоПараметрам(ДопОписание, Модуль, МассивПараметров);
ОпределитьДопОписаниеПоТипамПараметров(ДопОписание, Модуль, МассивКомментария);
КонецПроцедуры
ОписаниеМетода = СокрЛП(ОписаниеМетода) + ДопОписание;
Процедура СформироватьТаблицуОписанийПараметров(Знач МассивПараметров, Знач Метод)
Разделитель = "-";
Для Каждого ПараметрМетода Из МассивПараметров Цикл
ЗаписатьСозданиеПараметраСостава(ПараметрМетода, ИмяМетода, СокрЛП(ОписаниеМетода));
ОписаниеМетода = "";
КонецЦикла;
КонецПроцедуры
Процедура ЗаписатьСозданиеПараметраСостава(ПараметрМетода, ИмяМетода, ОписаниеМетода = "")
Разделитель = "-";
МассивЭлементовПараметра = СтрРазделить(ПараметрМетода, Разделитель, Ложь);
КоличествоЭлементов = МассивЭлементовПараметра.Количество();
@ -175,63 +223,74 @@
Возврат;
КонецЕсли;
Имя1С = МассивЭлементовПараметра[0];
Имя = "--" + МассивЭлементовПараметра[3];
Типы = МассивЭлементовПараметра[1];
Описание = ?(КоличествоЭлементов >= 5, МассивЭлементовПараметра[4], МассивЭлементовПараметра[2]);
МодульСоставаОПИ.ДобавитьСтроку(Символы.ПС);
НоваяСтрокаТаблицы = ТаблицаОписанийПараметров.Добавить();
НоваяСтрокаТаблицы.Имя = Имя;
НоваяСтрокаТаблицы.Типы = Типы;
НоваяСтрокаТаблицы.Описание = Описание;
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока = ТаблицаСостава.Добавить();");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Библиотека = """ + СоответствиеКомандМодулей.Получить(ТекущийМодуль) + """;");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Модуль = """ + ТекущийМодуль + """;");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Метод = """ + ИмяМетода + """;");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.МетодПоиска = """ + вРег(ИмяМетода) + """;");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Параметр = """ + Имя + """;");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Описание = """ + Описание + """;");
Если ЗначениеЗаполнено(ОписаниеМетода) Тогда
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.ОписаниеМетода = """ + ОписаниеМетода + """;");
КонецЕсли;
МодульСоставаОПИ.ДобавитьСтроку(Символы.ПС);
НоваяСтрокаТаблицы.ЗначениеПоУмолчанию = ПолучитьЗначениеПараметраПоУмолчанию(Имя1С, Метод);
КонецЦикла;
КонецПроцедуры
Процедура ОпределитьДопОписаниеПоТипамПараметров(ДопОписание, Модуль, МассивКомментария)
Функция ПолучитьЗначениеПараметраПоУмолчанию(Знач Имя, Знач Метод)
НачалоПараметров = Ложь;
ЕстьМассив = Ложь;
ТекстДополнения = "";
Значение = "";
ДЛя Каждого СтрокаКомментария Из МассивКомментария Цикл
Для Каждого ПараметрМетода Из Метод.Сигнатура.Параметры Цикл
Если СтрНайти(СтрокаКомментария, "Возвращаемое значение:") Тогда
Прервать;
Если ПараметрМетода.Имя = Имя Тогда
ЗначениеПараметра = ПараметрМетода.Значение;
Если ЗначениеЗаполнено(ЗначениеПараметра) Тогда
Попытка
Значение = ЗначениеПараметра["Элементы"][0]["Значение"];
Исключение
Значение = ЗначениеПараметра.Значение;
КонецПопытки;
Значение = ?(ЗначениеЗаполнено(Значение), Значение, "Пустое значение");
КонецЕсли;
Если СтрНайти(СтрокаКомментария, "Параметры:") > 0 Тогда
НачалоПараметров = Истина;
Продолжить;
КонецЕсли;
Если Не НачалоПараметров Тогда
Продолжить;
КонецЕсли;
Если СтрНайти(СтрокаКомментария, " Массив") > 0
Или СтрНайти(СтрокаКомментария, ",Массив") > 0 Тогда
ЕстьМассив = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Значение;
КонецФункции
Процедура ОпределитьДопОписание(ДопОписание, Модуль)
НачалоПараметров = Ложь;
ЕстьМассив = Ложь;
ТекстДополнения = "";
ИмяМодуля = Модуль.ИмяБезРасширения;
ДЛя Каждого СтрокаПараметра Из ТаблицаОписанийПараметров Цикл
Типы = СтрокаПараметра["Типы"];
Имя = СтрокаПараметра["Имя"];
Если СтрНайти(Типы, "Массив") > 0 Тогда
ЕстьМассив = Истина;
КонецЕсли;
ОпределитьДопОписаниеПоПараметру(ТекстДополнения, ИмяМодуля, Имя)
КонецЦикла;
Если ЕстьМассив Тогда
ТекстДополнения = ТекстДополнения
+ "
ТекстДополнения =
"
|
| Пример указания параметра типа массив:
| --param ""['Val1','Val2','Val3']""
|";
|" + ТекстДополнения;
КонецЕсли;
@ -240,29 +299,11 @@
КонецПроцедуры
Процедура ОпределитьДопОписаниеПоПараметрам(ДопОписание, Модуль, Параметры)
Процедура ОпределитьДопОписаниеПоПараметру(ТекстДополнения, ИмяМодуля, ИмяПараметра)
Разделитель = "-";
Для Каждого Параметр Из Параметры Цикл
МассивЭлементовПараметра = СтрРазделить(Параметр, Разделитель, Ложь);
КоличествоЭлементов = МассивЭлементовПараметра.Количество();
Для Н = 0 По МассивЭлементовПараметра.ВГраница() Цикл
МассивЭлементовПараметра[Н] = СокрЛП(МассивЭлементовПараметра[Н]);
КонецЦикла;
Если КоличествоЭлементов < 4 Тогда
Продолжить;
КонецЕсли;
Имя = МассивЭлементовПараметра[3];
ТекстДополнения = "";
Если Модуль.ИмяБезРасширения = "OPI_VK" Тогда
Если Имя = "auth" Тогда
ТекстДополнения = "
Если ИмяМодуля = "OPI_VK" Тогда
Если ИмяПараметра = "--auth" Тогда
ТекстДополнения = ТекстДополнения + "
|
| Структура JSON данных авторизации (параметр --auth):
| {
@ -278,10 +319,9 @@
КонецЕсли;
КонецЕсли;
Если Модуль.ИмяБезРасширения = "OPI_Telegram" Тогда
Если Имя = "media" Тогда
ТекстДополнения = "
Если ИмяМодуля = "OPI_Telegram" Тогда
Если ИмяПараметра = "--media" Тогда
ТекстДополнения = ТекстДополнения + "
|
| Структура JSON данных медиагруппы (параметр --media):
| {
@ -293,9 +333,33 @@
КонецЕсли;
КонецЕсли;
ТекстДополнения = СтрЗаменить(ТекстДополнения, Символы.ПС, Символы.ПС + " |");
ДопОписание = ДопОписание + СтрЗаменить(ТекстДополнения, """", """""");
КонецЦикла;
КонецПроцедуры
Процедура ЗаписатьСозданиеПараметраСостава(СтрокаПараметра, ИмяМетода, ОписаниеМетода = "")
Имя = СтрокаПараметра["Имя"];
Описание = СтрокаПараметра["Описание"];
Значение = СтрокаПараметра["ЗначениеПоУмолчанию"];
Если ЗначениеЗаполнено(Значение) Тогда
Описание = Описание + " (необяз. по ум. - " + Значение + ")";
КонецЕсли;
МодульСоставаОПИ.ДобавитьСтроку(Символы.ПС);
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока = ТаблицаСостава.Добавить();");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Библиотека = """ + СоответствиеМодулейКоманд.Получить(ТекущийМодуль) + """;");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Модуль = """ + ТекущийМодуль + """;");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Метод = """ + ИмяМетода + """;");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.МетодПоиска = """ + вРег(ИмяМетода) + """;");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Параметр = """ + Имя + """;");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Описание = """ + Описание + """;");
Если ЗначениеЗаполнено(ОписаниеМетода) Тогда
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.ОписаниеМетода = """ + ОписаниеМетода + """;");
КонецЕсли;
МодульСоставаОПИ.ДобавитьСтроку(Символы.ПС);
КонецПроцедуры

File diff suppressed because it is too large Load Diff

View File

@ -9,48 +9,17 @@
СоответствиеКомандМодулей = Новый Соответствие();
ТаблицаСостава = СоставБиблиотеки.ПолучитьСостав();
ТекущаяБиблиотека = "";
ТекущаяТаблица = "";
СоответствиеКомандМодулей = СоставБиблиотеки.ПолучитьСоответствиеКомандМодулей();
Для Каждого СтрокаСостава Из ТаблицаСостава Цикл
Для Каждого КомандаМодуля Из СоответствиеКомандМодулей Цикл
Если ТекущаяБиблиотека <> СтрокаСостава.Библиотека Тогда
Библиотека = КомандаМодуля.Ключ;
Отбор = Новый Структура("Библиотека", Библиотека);
СтрокиКоманды = ТаблицаСостава.Скопировать(Отбор);
Если ЗначениеЗаполнено(ТекущаяБиблиотека) Тогда
СоответствиеТаблицПараметров.Вставить(ТекущаяБиблиотека, ТекущаяТаблица);
КонецЕсли;
ТекущаяБиблиотека = СтрокаСостава.Библиотека;
ТекущаяТаблица = ПолучитьПустуюТаблицуПараметров();
СоответствиеКомандМодулей.Вставить(СтрокаСостава.Библиотека, СтрокаСостава.Модуль);
КонецЕсли;
ЗаполнитьЗначенияСвойств(ТекущаяТаблица.Добавить(), СтрокаСостава);
СоответствиеТаблицПараметров.Вставить(Библиотека, СтрокиКоманды);
КонецЦикла;
Если ЗначениеЗаполнено(ТекущаяБиблиотека) Тогда
СоответствиеТаблицПараметров.Вставить(ТекущаяБиблиотека, ТекущаяТаблица);
КонецЕсли;
КонецПроцедуры
#Область СлужебныйПрограммныйИнтерфейс
Функция ПолучитьПустуюТаблицуПараметров() Экспорт
ТПМ = Новый ТаблицаЗначений();
ТПМ.Колонки.Добавить("Модуль");
ТПМ.Колонки.Добавить("Метод");
ТПМ.Колонки.Добавить("МетодПоиска");
ТПМ.Колонки.Добавить("Параметр");
ТПМ.Колонки.Добавить("Описание");
ТПМ.Колонки.Добавить("ОписаниеМетода");
Возврат ТПМ;
КонецФункции
#КонецОбласти