From 2191c91766f280018dccabd0edb540f42e3c80dd Mon Sep 17 00:00:00 2001 From: ChernyakAI Date: Mon, 27 Mar 2023 01:19:45 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=D0=98=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D1=80=D0=B8=D0=BB?= =?UTF-8?q?=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bsl-language-server.json | 9 ++ LICENSE => LICENSE.md | 0 package-loader.os | 111 ++++++++++++++++++ packagedef | 1 + ...20\266\320\265\320\275\320\270\321\217.os" | 13 ++ 5 files changed, 134 insertions(+) create mode 100644 .bsl-language-server.json rename LICENSE => LICENSE.md (100%) create mode 100644 package-loader.os create mode 100644 "src/\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\270/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" diff --git a/.bsl-language-server.json b/.bsl-language-server.json new file mode 100644 index 0000000..2870a4e --- /dev/null +++ b/.bsl-language-server.json @@ -0,0 +1,9 @@ +{ + "diagnostics": { + "parameters": { + "IncorrectLineBreak": { + "listOfIncorrectFirstSymbol": ";" + } + } + } +} \ No newline at end of file diff --git a/LICENSE b/LICENSE.md similarity index 100% rename from LICENSE rename to LICENSE.md diff --git a/package-loader.os b/package-loader.os new file mode 100644 index 0000000..490665a --- /dev/null +++ b/package-loader.os @@ -0,0 +1,111 @@ +// BSLLS:UnusedLocalMethod-off +// BSLLS:UnusedParameters-off + +Перем ПоказатьСообщенияЗагрузки; // сообщения о порядке загрузки пакетов +Перем ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей; // сообщения о повторной загрузке + +Процедура ПриЗагрузкеБиблиотеки(Путь, СтандартнаяОбработка, Отказ) + Вывести(" + |ПриЗагрузкеБиблиотеки " + Путь); + + Если Осень <> Неопределено Тогда + ПутьДоЗаготовки = ОбъединитьПути(Путь, "src/Заготовки/ИнициализацияПриложения.os"); + ПодключитьСценарий(ПутьДоЗаготовки, "ИнициализацияПриложения"); + Осень.ДобавитьЗаготовкуДляАвтоИнициализации("ИнициализацияПриложения"); + + мКаталог = ОбъединитьПути(Путь, "src/Классы"); + ОбработатьКаталогКлассов(мКаталог, СтандартнаяОбработка, Отказ); + Иначе + ВызватьИсключение "Некорректный порядок импорта библиотек. Сначала подключите autumn"; + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработатьКаталогКлассов(Знач Путь, СтандартнаяОбработка, Отказ) + + КаталогКлассов = Новый Файл(Путь); + + Если КаталогКлассов.Существует() Тогда + Файлы = НайтиФайлы(КаталогКлассов.ПолноеИмя, "*.os"); + Для Каждого Файл Из Файлы Цикл + Вывести(СтрШаблон(" класс (по соглашению) %1, файл %2", Файл.ИмяБезРасширения, Файл.ПолноеИмя)); + СтандартнаяОбработка = Ложь; + ДобавитьКлассЕслиРанееНеДобавляли(Файл.ПолноеИмя, Файл.ИмяБезРасширения); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьКлассЕслиРанееНеДобавляли(ПутьФайла, ИмяКласса) + Вывести("Добавляю класс, если ранее не добавляли " + ИмяКласса); + Если ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей Тогда + Вывести("Добавляю класс " + ИмяКласса); + ДобавитьКласс(ПутьФайла, ИмяКласса); + Возврат; + КонецЕсли; + + КлассУжеЕсть = Ложь; + Попытка + Объект = Новый(ИмяКласса); + КлассУжеЕсть = Истина; + Исключение + СообщениеОшибки = ОписаниеОшибки(); + ИскомаяОшибка = СтрШаблон("Конструктор не найден (%1)", ИмяКласса); + КлассУжеЕсть = СтрНайти(СообщениеОшибки, ИскомаяОшибка) = 0; + КонецПопытки; + Если Не КлассУжеЕсть Тогда + + Вывести("Добавляю класс, т.к. он не найден - " + ИмяКласса); + ДобавитьКласс(ПутьФайла, ИмяКласса); + + Иначе + Вывести("Пропускаю загрузку класса " + ИмяКласса); + + КонецЕсли; +КонецПроцедуры + +Процедура Вывести(Знач Сообщение) + Если ПоказатьСообщенияЗагрузки Тогда + Сообщить(Сообщение); + КонецЕсли; +КонецПроцедуры + +Функция ПолучитьБулевоИзПеременнойСреды(Знач ИмяПеременнойСреды, Знач ЗначениеПоУмолчанию) + Рез = ЗначениеПоУмолчанию; + РезИзСреды = ПолучитьПеременнуюСреды(ИмяПеременнойСреды); + Если ЗначениеЗаполнено(РезИзСреды) Тогда + РезИзСреды = СокрЛП(РезИзСреды); + Попытка + Рез = Число(РезИзСреды) <> 0; + Исключение + Рез = ЗначениеПоУмолчанию; + ТекстСообщения = СтрШаблон("Неверный формат переменной среды %1. Ожидали 1 или 0, а получили %2", + ИмяПеременнойСреды, + РезИзСреды); + Сообщить(ТекстСообщения); + КонецПопытки; + КонецЕсли; + + Возврат Рез; +КонецФункции + +// Если Истина, то выдаются подробные сообщения о порядке загрузке пакетов, классов, модулей, +// что помогает при анализе проблем, очень полезно при анализе ошибок загрузки +// Переменная среды может принимать значение 0 (выключено) или 1 (включено) +// Значение флага по умолчанию - Ложь +ПоказатьСообщенияЗагрузки = ПолучитьБулевоИзПеременнойСреды( + "OSLIB_LOADER_TRACE", Ложь); + +// Если Ложь, то пропускаются ошибки повторной загрузки классов/модулей, +// что важно при разработке/тестировании стандартных библиотек +// Если Истина, то выдается ошибка при повторной загрузке классов библиотек из движка +// Переменная среды может принимать значение 0 (выключено) или 1 (включено) +// Значение флага по умолчанию - Истина +ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей = ПолучитьБулевоИзПеременнойСреды( + "OSLIB_LOADER_DUPLICATES", Ложь); + +// для установки других значений переменных среды и запуска скриптов можно юзать следующую командную строку +// (set OSLIB_LOADER_TRACE=1) && (oscript .\tasks\test.os) + +// BSLLS:UnusedLocalMethod-on +// BSLLS:UnusedParameters-on \ No newline at end of file diff --git a/packagedef b/packagedef index 662f84f..5775a08 100644 --- a/packagedef +++ b/packagedef @@ -12,5 +12,6 @@ .ВключитьФайл("templates") .ВключитьФайл("LICENSE.md") .ВключитьФайл("README.md") + .ВключитьФайл("package-loader.os") .ЗависитОт("autumn", "2.2.0") .ЗависитОт("asserts", "1.4.0") \ No newline at end of file diff --git "a/src/\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\270/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\270/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" new file mode 100644 index 0000000..930a370 --- /dev/null +++ "b/src/\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\270/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" @@ -0,0 +1,13 @@ + +Процедура ПриИнициализацииПоделки(Поделка) Экспорт + ДобавитьЖелудиПриложения(Поделка); +КонецПроцедуры + +Процедура ДобавитьЖелудиПриложения(Поделка) + КаталогМодуля = ОбъединитьПути(ТекущийСценарий().Каталог, "../Классы"); + Поделка.ПросканироватьКаталог(КаталогМодуля); +КонецПроцедуры + +&Заготовка +Процедура ПриСозданииОбъекта() +КонецПроцедуры \ No newline at end of file From 86e4a9dc259f41c18a5dc0370b326e9c5a597b2a Mon Sep 17 00:00:00 2001 From: Andrei Chernyak Date: Fri, 31 Mar 2023 15:59:52 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=D0=92=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=B0=D0=BA=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D0=BE=D1=82=D0=B5=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 38 ++++++++++++++++++- package-loader.os | 6 +-- ...20\266\320\265\320\275\320\270\321\217.os" | 4 +- ...20\260\320\271\320\273\320\276\320\262.os" | 23 ++++++----- ...21\200\320\276\320\271\320\272\320\270.os" | 36 +++++++++++++++--- ...20\266\320\265\320\275\320\270\320\265.os" | 16 +++++--- 6 files changed, 96 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index fda002e..4c3610e 100644 --- a/README.md +++ b/README.md @@ -3,4 +3,40 @@ #### Обработчик офисных документов Реализация специально придуманной задачи с целью ~~упороться желудями~~ пощупать [Осень](https://github.com/autumn-library/autumn), [OneScript](https://github.com/EvilBeaver/OneScript), [библиотеки](https://github.com/oscript-library) и вот это вот всё. -Поделка позволяет взять специально подготовленный [шаблон](templates/template1.docx) и заполнить его на основании [конфигурационного файла](config/example.json). Производится распаковка контейнера Office Open XML во временный каталог, разбирается файл document.xml, производится замена параметров в соответствии в прописанным в конфигурационном файле, затем собирается обратно и кладётся в выходной каталог. \ No newline at end of file +Поделка позволяет взять специально подготовленный [шаблон](templates/template1.docx) и заполнить его на основании [конфигурационного файла](config/example.json). Производится распаковка контейнера Office Open XML во временный каталог, разбирается файл document.xml, производится замена параметров в соответствии в прописанным в конфигурационном файле, затем собирается обратно и кладётся в выходной каталог. + +#### Варианты использования + +###### 1. Запуск с помощью исходного кода +Клонируйте исходные коды на локальный компьютер. +Наполните файл настроек подстановки (config/example.json). Либо переопределите его и другие параметры в настройках приложения (autumn-properties.json). +Запустите приложение в настроенном окружении: +```code +oscript src/main.os +``` + +###### 2. Использование в качестве библиотеки + +Скачать файл *.ospx из раздела releases +Воспользоваться командой: +```code +opm install -f <ПутьКФайлу> +``` +Создать файл oscript следующего содержания: +```code +#Использовать autumn +#Использовать officer + +Поделка = Новый Поделка(); +Поделка.ЗапуститьПриложение(); + +Настройки = Поделка.НайтиЖелудь("НастройкиOfficer"); +Настройки.УстановитьНастройку("КаталогШаблонов", "templates/"); +Настройки.УстановитьНастройку("КаталогСохранения", "output/"); +Настройки.УстановитьНастройку("КаталогВременныхФайлов", "temp/"); +Настройки.УстановитьНастройку("ПутьКФайлуНастройкиПодстановки", "config/example.json"); + +Приложение = Поделка.НайтиЖелудь("ПриложениеOfficer"); +Приложение.Запустить(); +``` +Проверить, что указанные в настройках каталоги существуют. diff --git a/package-loader.os b/package-loader.os index 490665a..69b2f1d 100644 --- a/package-loader.os +++ b/package-loader.os @@ -1,5 +1,4 @@ -// BSLLS:UnusedLocalMethod-off -// BSLLS:UnusedParameters-off +// BSLLS-off Перем ПоказатьСообщенияЗагрузки; // сообщения о порядке загрузки пакетов Перем ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей; // сообщения о повторной загрузке @@ -106,6 +105,3 @@ // для установки других значений переменных среды и запуска скриптов можно юзать следующую командную строку // (set OSLIB_LOADER_TRACE=1) && (oscript .\tasks\test.os) - -// BSLLS:UnusedLocalMethod-on -// BSLLS:UnusedParameters-on \ No newline at end of file diff --git "a/src/\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\270/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\270/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" index 930a370..dfe1692 100644 --- "a/src/\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\270/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" +++ "b/src/\320\227\320\260\320\263\320\276\321\202\320\276\320\262\320\272\320\270/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" @@ -1,4 +1,3 @@ - Процедура ПриИнициализацииПоделки(Поделка) Экспорт ДобавитьЖелудиПриложения(Поделка); КонецПроцедуры @@ -9,5 +8,6 @@ КонецПроцедуры &Заготовка -Процедура ПриСозданииОбъекта() +Процедура ПриСозданииОбъекта() + КонецПроцедуры \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\244\320\260\320\271\320\273\320\276\320\262.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\244\320\260\320\271\320\273\320\276\320\262.os" index 9565775..035be05 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\244\320\260\320\271\320\273\320\276\320\262.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\244\320\260\320\271\320\273\320\276\320\262.os" @@ -1,10 +1,13 @@ // BSLLS:LatinAndCyrillicSymbolInWord-off -Перем _Поделка; // само приложение +// само приложение +Перем _Поделка; +// настройки приложения Перем _Настройки; - -Перем _ФайлыDocx; // массив желудей с обрабатываемыми файлами -Перем _НастройкиПодстановки; // массив с настройками для замены в шаблонах +// массив желудей с обрабатываемыми файлами +Перем _ФайлыDocx; +// массив с настройками для замены в шаблонах +Перем _НастройкиПодстановки; &Желудь Процедура ПриСозданииОбъекта( @@ -14,6 +17,7 @@ _Настройки = Настройки; _Поделка = Поделка; _ФайлыDocx = Новый Массив; + _НастройкиПодстановки = Новый Массив; КонецПроцедуры Процедура СоздатьЗаготовкиФайловИзШаблонов() Экспорт @@ -97,11 +101,12 @@ Процедура ПрочитатьНастройкиПодстановки() Экспорт ФайлНастроекПодстановки = _Настройки.ПутьКФайлуНастройкиПодстановки(); - - ЧтениеЖсон = Новый ЧтениеJSON(); - ЧтениеЖсон.ОткрытьФайл(ФайлНастроекПодстановки); - _НастройкиПодстановки = ПрочитатьJSON(ЧтениеЖсон, Истина); - ЧтениеЖсон.Закрыть(); + Если ФайлНастроекПодстановки <> Неопределено Тогда + ЧтениеJSON = Новый ЧтениеJSON(); + ЧтениеJSON.ОткрытьФайл(ФайлНастроекПодстановки); + _НастройкиПодстановки = ПрочитатьJSON(ЧтениеJSON, Истина); + ЧтениеJSON.Закрыть(); + КонецЕсли; КонецПроцедуры diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" index b7335ac..932b8c4 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.os" @@ -1,9 +1,16 @@ -Перем _КаталогШаблонов; // каталог, где храняться подготовленные шаблоны с параметрами -Перем _КаталогСохранения; // каталог сохранения итоговых файлов -Перем _КаталогВременныхФайлов; // каталог временных файлов +// каталог, где хранятся подготовленные шаблоны с параметрами +Перем _КаталогШаблонов; +// каталог сохранения итоговых файлов +Перем _КаталогСохранения; +// каталог временных файлов +Перем _КаталогВременныхФайлов; +// путь к файлу json с настройками подстановки в шаблоны Перем _ПутьКФайлуНастройкиПодстановки; +// запуск приложения не в режиме подключения как библиотека +Перем _ЗапускКакСкрипт; &Дуб +&Прозвище("НастройкиOfficer") Процедура ПриСозданииОбъекта( &Деталька КаталогШаблонов, &Деталька КаталогСохранения, @@ -33,5 +40,24 @@ &Завязь(Тип = "Строка") Функция ПутьКФайлуНастройкиПодстановки() Экспорт - Возврат ОбъединитьПути(ТекущийКаталог(), _ПутьКФайлуНастройкиПодстановки); -КонецФункции \ No newline at end of file + Если _ПутьКФайлуНастройкиПодстановки = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + Возврат ОбъединитьПути(ТекущийКаталог(), _ПутьКФайлуНастройкиПодстановки); +КонецФункции + +Процедура УстановитьНастройку(Настройка, Значение) Экспорт + + Если Настройка = "КаталогШаблонов" Тогда + _КаталогШаблонов = Значение; + ИначеЕсли Настройка = "КаталогСохранения" Тогда + _КаталогСохранения = Значение; + ИначеЕсли Настройка = "КаталогВременныхФайлов" Тогда + _КаталогВременныхФайлов = Значение; + ИначеЕсли Настройка = "ПутьКФайлуНастройкиПодстановки" Тогда + _ПутьКФайлуНастройкиПодстановки = Значение; + Иначе + Сообщить(СтрШаблон("Неизвестная настройка %1", Настройка)); + КонецЕсли; + +КонецПроцедуры \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" index 9177f29..d984bb9 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" @@ -1,7 +1,10 @@ -Перем _Настройки; // Настройки приложения -Перем _МенеджерФайлов; // Желудь для работы с файлами +// Настройки приложения +Перем _Настройки; +// Желудь - диспетчер файлов +Перем _МенеджерФайлов; &Рогатка +&Прозвище("ПриложениеOfficer") Процедура ПриСозданииОбъекта( &Пластилин Настройки, &Пластилин МенеджерФайлов) @@ -12,6 +15,7 @@ КонецПроцедуры Процедура ПриЗапускеПриложения() Экспорт + Запустить(); КонецПроцедуры Процедура Запустить() Экспорт @@ -21,11 +25,13 @@ _МенеджерФайлов.ЗаполнитьФайлы(); _МенеджерФайлов.СохранитьВВыходнойКаталог(); - ВременныйКаталог = ОбъединитьПути(ТекущийКаталог(), _Настройки.КаталогВременныхФайлов()); - УдалитьФайлы(ВременныйКаталог, "*.*"); + Если _Настройки.КаталогВременныхФайлов() <> Неопределено Тогда + ВременныйКаталог = ОбъединитьПути(ТекущийКаталог(), _Настройки.КаталогВременныхФайлов()); + УдалитьФайлы(ВременныйКаталог, "*.*"); + КонецЕсли; КонецПроцедуры Функция Настройки() Экспорт Возврат _Настройки; -КонецФункции \ No newline at end of file +КонецФункции