Skip to content

Commit

Permalink
Merge branch 'package-loader'
Browse files Browse the repository at this point in the history
  • Loading branch information
ChernyakAI committed Mar 31, 2023
2 parents 5e53a3b + 86e4a9d commit 6dc9cf8
Show file tree
Hide file tree
Showing 9 changed files with 223 additions and 20 deletions.
9 changes: 9 additions & 0 deletions .bsl-language-server.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"diagnostics": {
"parameters": {
"IncorrectLineBreak": {
"listOfIncorrectFirstSymbol": ";"
}
}
}
}
File renamed without changes.
38 changes: 37 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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, производится замена параметров в соответствии в прописанным в конфигурационном файле, затем собирается обратно и кладётся в выходной каталог.
Поделка позволяет взять специально подготовленный [шаблон](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");
Приложение.Запустить();
```
Проверить, что указанные в настройках каталоги существуют.
107 changes: 107 additions & 0 deletions package-loader.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
// BSLLS-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)
1 change: 1 addition & 0 deletions packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@
.ВключитьФайл("templates")
.ВключитьФайл("LICENSE.md")
.ВключитьФайл("README.md")
.ВключитьФайл("package-loader.os")
.ЗависитОт("autumn", "2.2.0")
.ЗависитОт("asserts", "1.4.0")
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
Процедура ПриИнициализацииПоделки(Поделка) Экспорт
ДобавитьЖелудиПриложения(Поделка);
КонецПроцедуры

Процедура ДобавитьЖелудиПриложения(Поделка)
КаталогМодуля = ОбъединитьПути(ТекущийСценарий().Каталог, "../Классы");
Поделка.ПросканироватьКаталог(КаталогМодуля);
КонецПроцедуры

&Заготовка
Процедура ПриСозданииОбъекта()

КонецПроцедуры
23 changes: 14 additions & 9 deletions src/Классы/МенеджерФайлов.os
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
// BSLLS:LatinAndCyrillicSymbolInWord-off

Перем _Поделка; // само приложение
// само приложение
Перем _Поделка;
// настройки приложения
Перем _Настройки;

Перем _ФайлыDocx; // массив желудей с обрабатываемыми файлами
Перем _НастройкиПодстановки; // массив с настройками для замены в шаблонах
// массив желудей с обрабатываемыми файлами
Перем _ФайлыDocx;
// массив с настройками для замены в шаблонах
Перем _НастройкиПодстановки;

&Желудь
Процедура ПриСозданииОбъекта(
Expand All @@ -14,6 +17,7 @@
_Настройки = Настройки;
_Поделка = Поделка;
_ФайлыDocx = Новый Массив;
_НастройкиПодстановки = Новый Массив;
КонецПроцедуры

Процедура СоздатьЗаготовкиФайловИзШаблонов() Экспорт
Expand Down Expand Up @@ -97,11 +101,12 @@
Процедура ПрочитатьНастройкиПодстановки() Экспорт

ФайлНастроекПодстановки = _Настройки.ПутьКФайлуНастройкиПодстановки();

ЧтениеЖсон = Новый ЧтениеJSON();
ЧтениеЖсон.ОткрытьФайл(ФайлНастроекПодстановки);
_НастройкиПодстановки = ПрочитатьJSON(ЧтениеЖсон, Истина);
ЧтениеЖсон.Закрыть();
Если ФайлНастроекПодстановки <> Неопределено Тогда
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.ОткрытьФайл(ФайлНастроекПодстановки);
_НастройкиПодстановки = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
КонецЕсли;

КонецПроцедуры

Expand Down
36 changes: 31 additions & 5 deletions src/Классы/Настройки.os
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
Перем _КаталогШаблонов; // каталог, где храняться подготовленные шаблоны с параметрами
Перем _КаталогСохранения; // каталог сохранения итоговых файлов
Перем _КаталогВременныхФайлов; // каталог временных файлов
// каталог, где хранятся подготовленные шаблоны с параметрами
Перем _КаталогШаблонов;
// каталог сохранения итоговых файлов
Перем _КаталогСохранения;
// каталог временных файлов
Перем _КаталогВременныхФайлов;
// путь к файлу json с настройками подстановки в шаблоны
Перем _ПутьКФайлуНастройкиПодстановки;
// запуск приложения не в режиме подключения как библиотека
Перем _ЗапускКакСкрипт;

&Дуб
&Прозвище("НастройкиOfficer")
Процедура ПриСозданииОбъекта(
&Деталька КаталогШаблонов,
&Деталька КаталогСохранения,
Expand Down Expand Up @@ -33,5 +40,24 @@

&Завязь(Тип = "Строка")
Функция ПутьКФайлуНастройкиПодстановки() Экспорт
Возврат ОбъединитьПути(ТекущийКаталог(), _ПутьКФайлуНастройкиПодстановки);
КонецФункции
Если _ПутьКФайлуНастройкиПодстановки = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Возврат ОбъединитьПути(ТекущийКаталог(), _ПутьКФайлуНастройкиПодстановки);
КонецФункции

Процедура УстановитьНастройку(Настройка, Значение) Экспорт

Если Настройка = "КаталогШаблонов" Тогда
_КаталогШаблонов = Значение;
ИначеЕсли Настройка = "КаталогСохранения" Тогда
_КаталогСохранения = Значение;
ИначеЕсли Настройка = "КаталогВременныхФайлов" Тогда
_КаталогВременныхФайлов = Значение;
ИначеЕсли Настройка = "ПутьКФайлуНастройкиПодстановки" Тогда
_ПутьКФайлуНастройкиПодстановки = Значение;
Иначе
Сообщить(СтрШаблон("Неизвестная настройка %1", Настройка));
КонецЕсли;

КонецПроцедуры
16 changes: 11 additions & 5 deletions src/Классы/Приложение.os
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
Перем _Настройки; // Настройки приложения
Перем _МенеджерФайлов; // Желудь для работы с файлами
// Настройки приложения
Перем _Настройки;
// Желудь - диспетчер файлов
Перем _МенеджерФайлов;

&Рогатка
&Прозвище("ПриложениеOfficer")
Процедура ПриСозданииОбъекта(
&Пластилин Настройки,
&Пластилин МенеджерФайлов)
Expand All @@ -12,6 +15,7 @@
КонецПроцедуры

Процедура ПриЗапускеПриложения() Экспорт
Запустить();
КонецПроцедуры

Процедура Запустить() Экспорт
Expand All @@ -21,11 +25,13 @@
_МенеджерФайлов.ЗаполнитьФайлы();
_МенеджерФайлов.СохранитьВВыходнойКаталог();

ВременныйКаталог = ОбъединитьПути(ТекущийКаталог(), _Настройки.КаталогВременныхФайлов());
УдалитьФайлы(ВременныйКаталог, "*.*");
Если _Настройки.КаталогВременныхФайлов() <> Неопределено Тогда
ВременныйКаталог = ОбъединитьПути(ТекущийКаталог(), _Настройки.КаталогВременныхФайлов());
УдалитьФайлы(ВременныйКаталог, "*.*");
КонецЕсли;

КонецПроцедуры

Функция Настройки() Экспорт
Возврат _Настройки;
КонецФункции
КонецФункции

0 comments on commit 6dc9cf8

Please sign in to comment.