You've already forked snippet-transform
mirror of
https://github.com/bia-technologies/snippet-transform.git
synced 2025-07-04 12:20:25 +02:00
ONECICD-19 Первая версия
This commit is contained in:
committed by
Maxmov Valery
parent
f99f0558b2
commit
e5d06afe0e
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
bdd-log.xml
|
||||||
|
*.ospx
|
||||||
|
*.orig
|
||||||
|
exec.log
|
||||||
|
ignore/**
|
||||||
|
tests.xml
|
5
LICENSE
5
LICENSE
@ -1,6 +1,7 @@
|
|||||||
MIT License
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2019 orais / tools
|
Copyright (c) 2016 Andrei Ovsiankin
|
||||||
|
Copyright (c) 2019 BIA Technologies, LLC
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
91
README.md
Normal file
91
README.md
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
# Скрипт для работы с шаблонами кода
|
||||||
|
|
||||||
|
- [Скрипт для работы с шаблонами кода](#%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0%D0%BC%D0%B8-%D0%BA%D0%BE%D0%B4%D0%B0)
|
||||||
|
- [Установить приложение, алгоритм установки стандартный](#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8-%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D1%8B%D0%B9)
|
||||||
|
- [Использование](#%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
|
||||||
|
- [Конвертация шаблонов](#%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%B0%D1%86%D0%B8%D1%8F-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2)
|
||||||
|
- [Объединение шаблонов](#%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2)
|
||||||
|
- [Разделение шаблонов](#%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2)
|
||||||
|
|
||||||
|
## Установить приложение, алгоритм установки стандартный
|
||||||
|
|
||||||
|
- склонировать репозиторий или
|
||||||
|
- распаковать в нужный каталог архив репозитория
|
||||||
|
- для Windows запустить [installlocalhost.bat](/installlocalhost.bat)
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
|
||||||
|
### Конвертация шаблонов
|
||||||
|
|
||||||
|
1. Шаблоны конфигуратора в шаблоны VS Code
|
||||||
|
2. Шаблоны конфигуратора в шаблоны EDT
|
||||||
|
3. Шаблоны EDT в шаблоны конфигуратора
|
||||||
|
|
||||||
|
Поддерживаемые расширения файлов
|
||||||
|
|
||||||
|
- ".st" - шаблон конфигуратора
|
||||||
|
- ".json" - шаблон языка VSCode
|
||||||
|
- ".code-snippets" - глобальный шаблон VSCode
|
||||||
|
- ".xml" - шаблон EDT
|
||||||
|
|
||||||
|
Определение типа преобразования происходит на основании расширения файла.
|
||||||
|
|
||||||
|
Для запуска преобразования используется команда:
|
||||||
|
|
||||||
|
`snippet-transform convert Исходный-шаблон Новый-шаблон`
|
||||||
|
|
||||||
|
Примеры:
|
||||||
|
|
||||||
|
- `snippet-transform convert "Мой любимый шаблон.st" "bsl.code-snippets"`
|
||||||
|
Команда выполнить преобразование шаблона конфигуратор в глобальный шаблон VSCode
|
||||||
|
|
||||||
|
- `snippet-transform convert "Мой любимый шаблон.xml" "bsl.st"`
|
||||||
|
Команда выполнить преобразование шаблона EDT в шаблон конфигуратора
|
||||||
|
|
||||||
|
### Объединение шаблонов
|
||||||
|
|
||||||
|
`snippet-transform join-files Изменяемый-шаблон Добавляемый-шаблон`
|
||||||
|
|
||||||
|
- `Изменяемый-шаблон` - Имя файла шаблона, в который будут добавлены записи из второго файла
|
||||||
|
- `Добавляемый-шаблон` - Имя файла, в котором содержатся добавляемые записи
|
||||||
|
|
||||||
|
`snippet-transform join-path Каталог-шаблонов Результирующий-шаблон`
|
||||||
|
|
||||||
|
- `Каталог-шаблонов` - Имя каталога, в котором лежат шаблоны, которые нужно соединить.
|
||||||
|
- `Результирующий-шаблон` - Имя файла, в который будет сохранен результат
|
||||||
|
|
||||||
|
Примеры:
|
||||||
|
|
||||||
|
- `snippet-transform join-files "Мой любимый шаблон.xml" "Мой второй любимый шаблон.st"`
|
||||||
|
Команда выполнить объединение шаблонов EDT и конфигуратора и запишет результат в шаблон EDT c именем "Мой любимый шаблон.xml"
|
||||||
|
|
||||||
|
- `snippet-transform join-path "Каталог любимый шаблонов" "Супер шаблон.code-snippets"`
|
||||||
|
Команда выполнить объединение всех поддерживаемых шаблонов каталога и запишет результат в новый шаблон
|
||||||
|
|
||||||
|
### Разделение шаблонов
|
||||||
|
|
||||||
|
`snippet-transform apportion Изменяемый-шаблон Выражение-поиска [Новый-шаблон] [-r]`
|
||||||
|
|
||||||
|
Удаляет (переносит в новый файл) элементы шаблона, полное наименование которых совпадает с `Выражение-поиска`
|
||||||
|
|
||||||
|
- `Изменяемый-шаблон` - Имя файла шаблона, из которого будет вырезана часть
|
||||||
|
- `Выражение-поиска` - Регулярное выражение для проверки наименования элемента шаблона. Если выражение совпадает с наименованием, то такой элемент переносится в новый файл.
|
||||||
|
- `Новый-шаблон` - Имя файла шаблона, в который будут помещены исключенные записи
|
||||||
|
- `-r` Переносить элементы, у которых наименование не совпадает с шаблоном
|
||||||
|
|
||||||
|
Примеры:
|
||||||
|
|
||||||
|
- `snippet-transform apportion "Мой любимый шаблон.st" "алгоритм"`
|
||||||
|
Удалит из шаблона элементы, в наименовании которых есть слово "алгоритм"
|
||||||
|
|
||||||
|
- `snippet-transform apportion "Мой любимый шаблон.st" "алгоритм" Алгоритмы.st`
|
||||||
|
Перенесет из шаблона "Мой любимый шаблон.st" в шаблон "Алгоритмы.st" элементы, в наименовании которых есть слово "алгоритм"
|
||||||
|
|
||||||
|
- `snippet-transform apportion "Мой любимый шаблон.st" "оставить" -r`
|
||||||
|
Удалит из шаблона все элементы, в наименовании которых нет слова "оставить"
|
||||||
|
|
||||||
|
- `snippet-transform apportion "Мой любимый шаблон.st" "^Супер группа\." -r`
|
||||||
|
Удалит из шаблона все элементы, кроме группы первого уровня "Супер группа"
|
||||||
|
|
||||||
|
- `snippet-transform apportion "Мой любимый шаблон.st" "Плохая группа\."`
|
||||||
|
Удалит из шаблона группы "Плохая группа" и "очень плохая группа"
|
97
features/step_definitions/АнализШаблонов.os
Normal file
97
features/step_definitions/АнализШаблонов.os
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd
|
||||||
|
|
||||||
|
Перем БДД; //контекст фреймворка 1bdd
|
||||||
|
|
||||||
|
// Метод выдает список шагов, реализованных в данном файле-шагов
|
||||||
|
Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт
|
||||||
|
БДД = КонтекстФреймворкаBDD;
|
||||||
|
|
||||||
|
ВсеШаги = Новый Массив;
|
||||||
|
|
||||||
|
ВсеШаги.Добавить("ФайлВРабочемКаталогеСодержитСтроки");
|
||||||
|
ВсеШаги.Добавить("ФайлВРабочемКаталогеНеСодержитСтроки");
|
||||||
|
|
||||||
|
Возврат ВсеШаги;
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Реализация шагов
|
||||||
|
|
||||||
|
// Процедура выполняется перед запуском каждого сценария
|
||||||
|
Процедура ПередЗапускомСценария(Знач Узел) Экспорт
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
// Процедура выполняется после завершения каждого сценария
|
||||||
|
Процедура ПослеЗапускаСценария(Знач Узел) Экспорт
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
//Файл "result/vscode1.code-snippets" в рабочем каталоге содержит строки
|
||||||
|
//| "scope": "bsl" |
|
||||||
|
//| "prefix": "Общий модуль" |
|
||||||
|
//| "prefix": "DEPRECATED" |
|
||||||
|
//| "prefix": "Инкремент" |
|
||||||
|
Процедура ФайлВРабочемКаталогеСодержитСтроки(Знач ФайлРабочегоКаталога, Знач ТаблицаСтрок) Экспорт
|
||||||
|
|
||||||
|
ФайлРабочегоКаталога = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ФайлРабочегоКаталога);
|
||||||
|
|
||||||
|
Чтение = Новый ЧтениеТекста(ОбъединитьПути(БДД.ПолучитьИзКонтекста("РабочийКаталог"), ФайлРабочегоКаталога), КодировкаТекста.UTF8);
|
||||||
|
СтрокаГдеИщем = Чтение.Прочитать();
|
||||||
|
Чтение.Закрыть();
|
||||||
|
|
||||||
|
СтрокаРасхождений = "";
|
||||||
|
Для Каждого СтрТаблицы Из ТаблицаСтрок Цикл
|
||||||
|
|
||||||
|
СтрокаЧтоИщем = СтрТаблицы[0];
|
||||||
|
Если Найти(СтрокаГдеИщем, СтрокаЧтоИщем) = 0 Тогда
|
||||||
|
СтрокаРасхождений = СтрШаблон(
|
||||||
|
"%1
|
||||||
|
| Не найдена подстрока <%2>", СтрокаРасхождений, СтрокаЧтоИщем);
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
Если Не ПустаяСтрока(СтрокаРасхождений) Тогда
|
||||||
|
СтрокаРасхождений = СтрШаблон(
|
||||||
|
"Не нашли одну из подстрок таблицы:
|
||||||
|
|%2
|
||||||
|
|в строке:
|
||||||
|
|%1", СтрокаГдеИщем, СтрокаРасхождений);
|
||||||
|
Ожидаем.Что(Истина, СтрокаРасхождений).ЭтоЛожь();
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
//Файл "result/vscode1.code-snippets" в рабочем каталоге не содержит строки
|
||||||
|
//| "scope": "bsl" |
|
||||||
|
//| "prefix": "Общий модуль" |
|
||||||
|
//| "prefix": "DEPRECATED" |
|
||||||
|
//| "prefix": "Инкремент" |
|
||||||
|
Процедура ФайлВРабочемКаталогеНеСодержитСтроки(Знач ФайлРабочегоКаталога, Знач ТаблицаСтрок) Экспорт
|
||||||
|
|
||||||
|
ФайлРабочегоКаталога = БДД.ПолучитьПутьФайлаСУчетомПеременныхКонтекста(ФайлРабочегоКаталога);
|
||||||
|
|
||||||
|
Чтение = Новый ЧтениеТекста(ОбъединитьПути(БДД.ПолучитьИзКонтекста("РабочийКаталог"), ФайлРабочегоКаталога), КодировкаТекста.UTF8);
|
||||||
|
СтрокаГдеИщем = Чтение.Прочитать();
|
||||||
|
Чтение.Закрыть();
|
||||||
|
|
||||||
|
СтрокаРасхождений = "";
|
||||||
|
Для Каждого СтрТаблицы Из ТаблицаСтрок Цикл
|
||||||
|
|
||||||
|
СтрокаЧтоИщем = СтрТаблицы[0];
|
||||||
|
Если Найти(СтрокаГдеИщем, СтрокаЧтоИщем) <> 0 Тогда
|
||||||
|
СтрокаРасхождений = СтрШаблон(
|
||||||
|
"%1
|
||||||
|
| Найдена подстрока <%2>", СтрокаРасхождений, СтрокаЧтоИщем);
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
Если Не ПустаяСтрока(СтрокаРасхождений) Тогда
|
||||||
|
СтрокаРасхождений = СтрШаблон(
|
||||||
|
"Нашли одну из подстрок таблицы:
|
||||||
|
|%2
|
||||||
|
|в строке:
|
||||||
|
|%1", СтрокаГдеИщем, СтрокаРасхождений);
|
||||||
|
Ожидаем.Что(Истина, СтрокаРасхождений).ЭтоЛожь();
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
29
features/Объединить-два-шаблона.feature
Normal file
29
features/Объединить-два-шаблона.feature
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#language: ru
|
||||||
|
|
||||||
|
Функциональность: Объединение шаблонов кода
|
||||||
|
|
||||||
|
Как разработчик
|
||||||
|
Я хочу получить единый файл шаблона кода
|
||||||
|
Чтоб проще распространять и подключать его
|
||||||
|
|
||||||
|
Контекст:
|
||||||
|
Допустим Я очищаю параметры команды "oscript" в контексте
|
||||||
|
И я включаю отладку лога с именем "oscript.app.snippet-transform"
|
||||||
|
И я создаю временный каталог и сохраняю его в контекст
|
||||||
|
И я устанавливаю временный каталог как рабочий каталог
|
||||||
|
И я установил рабочий каталог как текущий каталог
|
||||||
|
И я создаю каталог "snippets" в рабочем каталоге
|
||||||
|
И я копирую файл "ШаблонКонфигуратора.st" из каталога "tests/fixtures//snippets" проекта в подкаталог "snippets" рабочего каталога
|
||||||
|
И я копирую файл "ШаблонEDT.xml" из каталога "tests/fixtures//snippets" проекта в подкаталог "snippets" рабочего каталога
|
||||||
|
|
||||||
|
Сценарий: Объединение двух шаблонов
|
||||||
|
Когда я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os join-files snippets/ШаблонКонфигуратора.st snippets/ШаблонEDT.xml"
|
||||||
|
Тогда Код возврата равен 0
|
||||||
|
И Файл "snippets/ШаблонКонфигуратора.st" в рабочем каталоге содержит
|
||||||
|
"""
|
||||||
|
{"Общий модуль",0,0,"Модуль[Общий]","//©///////////////////////////////////////////////////////////////////////////©//
|
||||||
|
"""
|
||||||
|
И Файл "snippets/ШаблонКонфигуратора.st" в рабочем каталоге содержит
|
||||||
|
"""
|
||||||
|
ТекущаяДата = '<?"n1", ДатаВремя, ""ДФ=dd.MM.yyyy"">'
|
||||||
|
"""
|
29
features/Объединить-шаблоны-каталога.feature
Normal file
29
features/Объединить-шаблоны-каталога.feature
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#language: ru
|
||||||
|
|
||||||
|
Функциональность: Объединение шаблонов кода
|
||||||
|
|
||||||
|
Как разработчик
|
||||||
|
Я хочу получить единый файл шаблона кода
|
||||||
|
Чтоб проще распространять и подключать его
|
||||||
|
|
||||||
|
Контекст:
|
||||||
|
Допустим Я очищаю параметры команды "oscript" в контексте
|
||||||
|
И я включаю отладку лога с именем "oscript.app.snippet-transform"
|
||||||
|
И я создаю временный каталог и сохраняю его в контекст
|
||||||
|
И я устанавливаю временный каталог как рабочий каталог
|
||||||
|
И я установил рабочий каталог как текущий каталог
|
||||||
|
И я создаю каталог "snippets" в рабочем каталоге
|
||||||
|
И я копирую файл "ШаблонКонфигуратора.st" из каталога "tests/fixtures/snippets" проекта в подкаталог "snippets" рабочего каталога
|
||||||
|
И я копирую файл "ШаблонEDT.xml" из каталога "tests/fixtures/snippets" проекта в подкаталог "snippets" рабочего каталога
|
||||||
|
|
||||||
|
Сценарий: Объединение шаблонов каталога
|
||||||
|
Когда я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os join-path snippets result.st"
|
||||||
|
Тогда Код возврата равен 0
|
||||||
|
И Файл "result.st" в рабочем каталоге содержит
|
||||||
|
"""
|
||||||
|
{"Общий модуль",0,0,"Модуль[Общий]","//©///////////////////////////////////////////////////////////////////////////©//
|
||||||
|
"""
|
||||||
|
И Файл "result.st" в рабочем каталоге содержит
|
||||||
|
"""
|
||||||
|
ТекущаяДата = '<?"n1", ДатаВремя, ""ДФ=dd.MM.yyyy"">'
|
||||||
|
"""
|
52
features/Преобразование-шаблонов.feature
Normal file
52
features/Преобразование-шаблонов.feature
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#language: ru
|
||||||
|
|
||||||
|
Функциональность: Преобразование шаблонов
|
||||||
|
|
||||||
|
Как разработчик я хочу иметь возможность конвертировать шаблоны в различные форматы
|
||||||
|
Чтобы подключать их к различным IDE
|
||||||
|
|
||||||
|
Контекст:
|
||||||
|
Допустим Я очищаю параметры команды "oscript" в контексте
|
||||||
|
И я включаю отладку лога с именем "oscript.app.snippet-transform"
|
||||||
|
И я создаю временный каталог и сохраняю его в контекст
|
||||||
|
И я устанавливаю временный каталог как рабочий каталог
|
||||||
|
И я установил рабочий каталог как текущий каталог
|
||||||
|
И Я копирую каталог "snippets" из каталога "tests/fixtures" проекта в рабочий каталог
|
||||||
|
И я создаю каталог "result" в рабочем каталоге
|
||||||
|
|
||||||
|
Сценарий: Преобразование шаблона конфигуратора в шаблон VSCode
|
||||||
|
Когда я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os convert snippets/ШаблонКонфигуратора.st result/vscode.code-snippets"
|
||||||
|
Тогда Код возврата равен 0
|
||||||
|
И Файл "result/vscode.code-snippets" в рабочем каталоге содержит строки
|
||||||
|
| "scope": "bsl" |
|
||||||
|
| "prefix": "МодульОбщий" |
|
||||||
|
| "prefix": "ЗапретитьИспользование" |
|
||||||
|
| "prefix": "++" |
|
||||||
|
Сценарий: Преобразование шаблона конфигуратора в шаблон EDT
|
||||||
|
Когда я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os convert snippets/ШаблонКонфигуратора.st result/edt.xml"
|
||||||
|
Тогда Код возврата равен 0
|
||||||
|
И Файл "result/edt.xml" в рабочем каталоге содержит строки
|
||||||
|
| name="МодульОбщий" |
|
||||||
|
| name="ЗапретитьИспользование" |
|
||||||
|
| name="++" |
|
||||||
|
Сценарий: Преобразование шаблона конфигуратора с неподдерживаемыми типами в шаблон VSCode
|
||||||
|
Когда я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os convert snippets/ШаблонКонфигуратораСНеподдерживаемымиТипами.st result/vscode.code-snippets"
|
||||||
|
Тогда Код возврата равен 0
|
||||||
|
И Файл "result/vscode.code-snippets" в рабочем каталоге содержит строки
|
||||||
|
| "scope": "bsl" |
|
||||||
|
| "prefix": "№Если" |
|
||||||
|
И Файл "result/vscode.code-snippets" в рабочем каталоге не содержит строки
|
||||||
|
| "prefix": "УстановитьЗначениеКонстанты" |
|
||||||
|
| "prefix": "Формат" |
|
||||||
|
Сценарий: Преобразование шаблона конфигуратора с неподдерживаемыми в шаблон EDT
|
||||||
|
Когда я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os convert snippets/ШаблонКонфигуратораСНеподдерживаемымиТипами.st result/edt.xml"
|
||||||
|
Тогда Код возврата равен 0
|
||||||
|
И Файл "result/edt.xml" в рабочем каталоге не содержит строки
|
||||||
|
| name="Формат" |
|
||||||
|
| name="УстановитьЗначениеКонстанты" |
|
||||||
|
| name="№Если" |
|
||||||
|
И Файл "result/edt.xml" в рабочем каталоге содержит
|
||||||
|
"""
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<templates/>
|
||||||
|
"""
|
33
features/Резделить-шаблон.feature
Normal file
33
features/Резделить-шаблон.feature
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#language: ru
|
||||||
|
|
||||||
|
Функциональность: Разделение шаблона кода
|
||||||
|
|
||||||
|
Как разработчик
|
||||||
|
Я хочу получить разделить файл шаблона
|
||||||
|
|
||||||
|
Контекст:
|
||||||
|
Допустим Я очищаю параметры команды "oscript" в контексте
|
||||||
|
И я включаю отладку лога с именем "oscript.app.snippet-transform"
|
||||||
|
И я создаю временный каталог и сохраняю его в контекст
|
||||||
|
И я устанавливаю временный каталог как рабочий каталог
|
||||||
|
И я установил рабочий каталог как текущий каталог
|
||||||
|
И я копирую файл "snippets/ШаблонКонфигуратора.st" из каталога "tests\fixtures" проекта в рабочий каталог
|
||||||
|
|
||||||
|
Сценарий: Объединение двух шаблонов
|
||||||
|
Когда я выполняю команду "oscript" с параметрами
|
||||||
|
"""
|
||||||
|
<КаталогПроекта>/src/main.os apportion ШаблонКонфигуратора.st "^Группа.*" result.st -r
|
||||||
|
"""
|
||||||
|
Тогда Код возврата равен 0
|
||||||
|
И Файл "ШаблонКонфигуратора.st" в рабочем каталоге не содержит
|
||||||
|
"""
|
||||||
|
{"Общий модуль",0,0,"Модуль[Общий]","//©///////////////////////////////////////////////////////////////////////////©//
|
||||||
|
"""
|
||||||
|
И Файл "ШаблонКонфигуратора.st" в рабочем каталоге содержит
|
||||||
|
"""
|
||||||
|
<?""Операнд""> = <?""Операнд""> + 1;
|
||||||
|
"""
|
||||||
|
И Файл "result.st" в рабочем каталоге содержит
|
||||||
|
"""
|
||||||
|
{"Общий модуль",0,0,"Модуль[Общий]","//©///////////////////////////////////////////////////////////////////////////©//
|
||||||
|
"""
|
13
installlocalhost.bat
Normal file
13
installlocalhost.bat
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
@echo off
|
||||||
|
call del "*.ospx"
|
||||||
|
|
||||||
|
for /f %%i in ('"oscript -version"') do set result=%%i
|
||||||
|
|
||||||
|
if %result%==1.0.19.105 (
|
||||||
|
call opm build . -mf ./packagedef -out .
|
||||||
|
) else (
|
||||||
|
call opm build -m ./packagedef -o .
|
||||||
|
)
|
||||||
|
|
||||||
|
rem // TODO: наименование приложения и версия
|
||||||
|
call opm install -f *.ospx
|
14
packagedef
Normal file
14
packagedef
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
ПутьКСценариюПараметров = ОбъединитьПути(ТекущийСценарий().Каталог, "src", "Модули", "ПараметрыПриложения.os");
|
||||||
|
ПараметрыСистемы_ЛокальнаяВерсия = ЗагрузитьСценарий(ПутьКСценариюПараметров);
|
||||||
|
|
||||||
|
ИмяПродукта = НРег(ПараметрыСистемы_ЛокальнаяВерсия.ИмяПродукта());
|
||||||
|
|
||||||
|
Описание.Имя(ИмяПродукта)
|
||||||
|
.ВерсияСреды("1.0.21")
|
||||||
|
.Версия(ПараметрыСистемы_ЛокальнаяВерсия.ВерсияПродукта())
|
||||||
|
.ЗависитОт("logos", "1.2")
|
||||||
|
.ЗависитОт("cmdline", "1.0")
|
||||||
|
.ВключитьФайл("src")
|
||||||
|
.ВключитьФайл("README.md")
|
||||||
|
.ВключитьФайл("LICENSE")
|
||||||
|
.ИсполняемыйФайл("src/main.os", ИмяПродукта);
|
49
src/main.os
Normal file
49
src/main.os
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// CLI-интерфейс для oscript-app
|
||||||
|
//
|
||||||
|
//The MIT License (MIT)
|
||||||
|
//
|
||||||
|
// Copyright (c) 2016 Andrei Ovsiankin
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Рекомендованная структура модуля точки входа приложения
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#Использовать "."
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Приложение = МенеджерПриложения.Инициализировать(ПараметрыПриложения);
|
||||||
|
|
||||||
|
Попытка
|
||||||
|
|
||||||
|
Приложение.ЗавершитьРаботуПриложения(Приложение.ЗапуститьВыполнение());
|
||||||
|
|
||||||
|
Исключение
|
||||||
|
|
||||||
|
Приложение.ЗавершитьРаботуПриложенияСОшибкой(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
|
||||||
|
|
||||||
|
КонецПопытки;
|
37
src/Классы/КомандаApportion.os
Normal file
37
src/Классы/КомандаApportion.os
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Модуль команды разделения шаблона
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт
|
||||||
|
|
||||||
|
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ИзменяемыйШаблон", "Имя файла шаблона, который хотим разделить");
|
||||||
|
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ШаблонНаименования", "Регулярное выражение для проверки полного наименования шаблона (Группа.Шаблон)");
|
||||||
|
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "НовыйШаблон", "Имя файла шаблона, в который будут записаны отделенные элементы");
|
||||||
|
Парсер.ДобавитьПараметрФлагКоманды(Команда, "-r", "Переносить элементы, у которых наименование не совпадает с шаблоном");
|
||||||
|
|
||||||
|
КонецПроцедуры // НастроитьКоманду
|
||||||
|
|
||||||
|
// Выполняет логику команды
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений
|
||||||
|
// Приложение - Модуль - Модуль менеджера приложения
|
||||||
|
//
|
||||||
|
Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт
|
||||||
|
|
||||||
|
Лог = Приложение.ПолучитьЛог();
|
||||||
|
|
||||||
|
ИзменяемыйШаблон = ПараметрыКоманды["ИзменяемыйШаблон"];
|
||||||
|
НовыйШаблон = ПараметрыКоманды["НовыйШаблон"];
|
||||||
|
ШаблонНаименования = ПараметрыКоманды["ШаблонНаименования"];
|
||||||
|
ПереноситьНесовпадения = ПараметрыКоманды["-r"] = Истина;
|
||||||
|
|
||||||
|
Конвертер.РазделитьШаблон(ИзменяемыйШаблон, ШаблонНаименования, ПереноситьНесовпадения, НовыйШаблон);
|
||||||
|
|
||||||
|
Лог.Отладка("Выполнено разделение шаблонов");
|
||||||
|
|
||||||
|
Возврат Приложение.РезультатыКоманд().Успех;
|
||||||
|
|
||||||
|
КонецФункции // ВыполнитьКоманду
|
33
src/Классы/КомандаConvert.os
Normal file
33
src/Классы/КомандаConvert.os
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Служебный модуль с реализацией работы команды help
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт
|
||||||
|
|
||||||
|
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ВходнойФайл", "Имя конвертируемого шаблона");
|
||||||
|
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ВыходнойФайл", "Имя файла нового шаблона, в который будут перенесены элементы из первого файла");
|
||||||
|
|
||||||
|
КонецПроцедуры // НастроитьКоманду
|
||||||
|
|
||||||
|
// Выполняет логику команды
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений
|
||||||
|
// Приложение - Модуль - Модуль менеджера приложения
|
||||||
|
//
|
||||||
|
Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт
|
||||||
|
|
||||||
|
Лог = Приложение.ПолучитьЛог();
|
||||||
|
|
||||||
|
ВходнойФайл = ПараметрыКоманды["ВходнойФайл"];
|
||||||
|
ВыходнойФайл = ПараметрыКоманды["ВыходнойФайл"];
|
||||||
|
|
||||||
|
Конвертер.ПреобразоватьШаблон(ВходнойФайл, ВыходнойФайл);
|
||||||
|
|
||||||
|
Лог.Информация("Преобразование выполнено. %1 ==> %2", ВходнойФайл, ВыходнойФайл);
|
||||||
|
|
||||||
|
Возврат Приложение.РезультатыКоманд().Успех;
|
||||||
|
|
||||||
|
КонецФункции // ВыполнитьКоманду
|
37
src/Классы/КомандаJoinFiles.os
Normal file
37
src/Классы/КомандаJoinFiles.os
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Модуль команды соединения двух файлов
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт
|
||||||
|
|
||||||
|
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ИзменяемыйШаблон", "Имя файла шаблона, в который будут добавлены элементы из второго файла");
|
||||||
|
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ДобавляемыйШаблон", "Имя файла шаблона, из которого будут добавлены элементы в первый файл");
|
||||||
|
|
||||||
|
КонецПроцедуры // НастроитьКоманду
|
||||||
|
|
||||||
|
// Выполняет логику команды
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений
|
||||||
|
// Приложение - Модуль - Модуль менеджера приложения
|
||||||
|
//
|
||||||
|
Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт
|
||||||
|
|
||||||
|
Лог = Приложение.ПолучитьЛог();
|
||||||
|
|
||||||
|
ИзменяемыйШаблон = ПараметрыКоманды["ИзменяемыйШаблон"];
|
||||||
|
ДобавляемыйШаблон = ПараметрыКоманды["ДобавляемыйШаблон"];
|
||||||
|
|
||||||
|
ВходныеФайлы = Новый Массив();
|
||||||
|
ВходныеФайлы.Добавить(Новый Файл(ИзменяемыйШаблон));
|
||||||
|
ВходныеФайлы.Добавить(Новый Файл(ДобавляемыйШаблон));
|
||||||
|
|
||||||
|
Конвертер.СоединитьШаблоны(ВходныеФайлы, ИзменяемыйШаблон);
|
||||||
|
|
||||||
|
Лог.Отладка("Файлы объединены");
|
||||||
|
|
||||||
|
Возврат Приложение.РезультатыКоманд().Успех;
|
||||||
|
|
||||||
|
КонецФункции // ВыполнитьКоманду
|
33
src/Классы/КомандаJoinPath.os
Normal file
33
src/Классы/КомандаJoinPath.os
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Модуль команды соединения каталога шаблонов
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт
|
||||||
|
|
||||||
|
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогШаблонов", "Каталог содержащий шаблоны кода, которые необходимо объединить");
|
||||||
|
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "РезультирующийШаблон", "Имя файла итогового шаблона");
|
||||||
|
|
||||||
|
КонецПроцедуры // НастроитьКоманду
|
||||||
|
|
||||||
|
// Выполняет логику команды
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений
|
||||||
|
// Приложение - Модуль - Модуль менеджера приложения
|
||||||
|
//
|
||||||
|
Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт
|
||||||
|
|
||||||
|
Лог = Приложение.ПолучитьЛог();
|
||||||
|
|
||||||
|
КаталогШаблонов = ПараметрыКоманды["КаталогШаблонов"];
|
||||||
|
РезультирующийШаблон = ПараметрыКоманды["РезультирующийШаблон"];
|
||||||
|
|
||||||
|
Конвертер.СоединитьШаблоны(НайтиФайлы(КаталогШаблонов, "*", Истина), РезультирующийШаблон);
|
||||||
|
|
||||||
|
Лог.Отладка("Шаблоны каталога объединены");
|
||||||
|
|
||||||
|
Возврат Приложение.РезультатыКоманд().Успех;
|
||||||
|
|
||||||
|
КонецФункции // ВыполнитьКоманду
|
27
src/Классы/КомандаVersion.os
Normal file
27
src/Классы/КомандаVersion.os
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Служебный модуль с реализацией работы команды version
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт
|
||||||
|
|
||||||
|
КонецПроцедуры // НастроитьКоманду
|
||||||
|
|
||||||
|
// Выполняет логику команды
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений
|
||||||
|
// Приложение - Модуль - Модуль менеджера приложения
|
||||||
|
//
|
||||||
|
Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт
|
||||||
|
|
||||||
|
Лог = Приложение.ПолучитьЛог();
|
||||||
|
|
||||||
|
Сообщить(Приложение.ВерсияПродукта());
|
||||||
|
|
||||||
|
Лог.Отладка("Вывод версии приложения");
|
||||||
|
|
||||||
|
Возврат Приложение.РезультатыКоманд().Успех;
|
||||||
|
|
||||||
|
КонецФункции // ВыполнитьКоманду
|
41
src/Классы/КомандаСправкаПоПараметрам.os
Normal file
41
src/Классы/КомандаСправкаПоПараметрам.os
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Служебный модуль с реализацией работы команды help
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт
|
||||||
|
|
||||||
|
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "Команда");
|
||||||
|
|
||||||
|
КонецПроцедуры // НастроитьКоманду
|
||||||
|
|
||||||
|
// Выполняет логику команды
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений
|
||||||
|
// Приложение - Модуль - Модуль менеджера приложения
|
||||||
|
//
|
||||||
|
Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт
|
||||||
|
|
||||||
|
Лог = Приложение.ПолучитьЛог();
|
||||||
|
|
||||||
|
КомандаДляСправки = ПараметрыКоманды["Команда"];
|
||||||
|
|
||||||
|
Если КомандаДляСправки = Неопределено Тогда
|
||||||
|
|
||||||
|
Приложение.ВывестиСправкуПоКомандам();
|
||||||
|
|
||||||
|
Лог.Отладка("Вывод справки по командам");
|
||||||
|
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
Приложение.ВывестиСправкуПоКоманде(КомандаДляСправки);
|
||||||
|
|
||||||
|
Лог.Отладка(СтрШаблон("Вывод справки по команде %1", КомандаДляСправки));
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат Приложение.РезультатыКоманд().Успех;
|
||||||
|
|
||||||
|
КонецФункции // ВыполнитьКоманду
|
297
src/Классы/ЧтениеВнутреннийФормат1С.os
Normal file
297
src/Классы/ЧтениеВнутреннийФормат1С.os
Normal file
@ -0,0 +1,297 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Чтение файлов во внутреннем формате 1с
|
||||||
|
// За основу взята разработка https://github.com/arkuznetsov/yabr
|
||||||
|
// (с) BIA Technologies, LLC
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Программный интерфейс
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Выполняет чтение файла во внутреннем формате 1с(скобочном)
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ПутьКФайлу - Строка - путь к файлу для чтения
|
||||||
|
// НачальнаяСтрока - Число - номер начальной строки файла для чтения
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Структура - Новый элемент
|
||||||
|
// *Родитель - Структура - ссылка на элемент-родитель
|
||||||
|
// *Уровень - Число - уровень иерархии элемента
|
||||||
|
// *Индекс - Число - индекс элемента в массиве значений родителя
|
||||||
|
// *НачСтрока - Число - номер первой строки из которой был прочитан элемент и его дочерние элементы
|
||||||
|
// *КонСтрока - Число - номер последней строки из которой был прочитан элемент и его дочерние элементы
|
||||||
|
// *Значения - Массив(Структура) - массив дочерних элементов
|
||||||
|
//
|
||||||
|
Функция ПрочитатьФайл(ПутьКФайлу, НачальнаяСтрока = 1) Экспорт
|
||||||
|
|
||||||
|
СтруктураЧтения = ИнициализироватьЭлемент(Неопределено);
|
||||||
|
|
||||||
|
Текст = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8NoBOM);
|
||||||
|
|
||||||
|
ДанныеСтроки = Текст.ПрочитатьСтроку();
|
||||||
|
|
||||||
|
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
|
||||||
|
ТекНачало = Начало;
|
||||||
|
НачКоличество = 0;
|
||||||
|
|
||||||
|
НомерСтроки = 1;
|
||||||
|
|
||||||
|
Пока НЕ ДанныеСтроки = Неопределено Цикл
|
||||||
|
|
||||||
|
Если НомерСтроки < НачальнаяСтрока И НЕ НачальнаяСтрока < 1 Тогда
|
||||||
|
ДанныеСтроки = Текст.ПрочитатьСтроку();
|
||||||
|
НомерСтроки = НомерСтроки + 1;
|
||||||
|
Продолжить;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
СтрокаДляОбработки = "";
|
||||||
|
СтрокаДляОбработкиПрочитана = Ложь;
|
||||||
|
КавычкиОткрыты = Ложь;
|
||||||
|
|
||||||
|
// сборка "завершенной" строки, где кавычки закрыты и последний символ = "," или "}"
|
||||||
|
Пока НЕ (СтрокаДляОбработкиПрочитана ИЛИ ДанныеСтроки = Неопределено) Цикл
|
||||||
|
|
||||||
|
СтрокаДляОбработкиПрочитана = ДополнитьСтрокуДляОбработки(СтрокаДляОбработки, ДанныеСтроки, КавычкиОткрыты);
|
||||||
|
|
||||||
|
Если НЕ СтрокаДляОбработкиПрочитана Тогда
|
||||||
|
|
||||||
|
Если КавычкиОткрыты Тогда
|
||||||
|
СтрокаДляОбработки = СтрокаДляОбработки + Символы.ПС;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ДанныеСтроки = Текст.ПрочитатьСтроку();
|
||||||
|
НомерСтроки = НомерСтроки + 1;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
СчетчикСимволов = 1;
|
||||||
|
|
||||||
|
ПрочитатьДанныеСтроки(СтруктураЧтения, СтрокаДляОбработки, СчетчикСимволов);
|
||||||
|
|
||||||
|
ДанныеСтроки = Текст.ПрочитатьСтроку();
|
||||||
|
|
||||||
|
НомерСтроки = НомерСтроки + 1;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Текст.Закрыть();
|
||||||
|
|
||||||
|
Если НЕ ПустаяСтрока(СтрокаДляОбработки) Тогда
|
||||||
|
ПрочитатьДанныеСтроки(СтруктураЧтения, СтрокаДляОбработки, СчетчикСимволов);
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
НачальнаяСтрока = НомерСтроки;
|
||||||
|
|
||||||
|
// переход к корневому элементу структуры чтения
|
||||||
|
Пока НЕ СтруктураЧтения.Родитель = Неопределено Цикл
|
||||||
|
СтруктураЧтения = СтруктураЧтения.Родитель;
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Результат = СтруктураЧтения;
|
||||||
|
|
||||||
|
Возврат Результат;
|
||||||
|
|
||||||
|
КонецФункции // ПрочитатьФайл()
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Служебный функционал
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Функция - добавляет строку к исходной и возвращает признак завершенности строки
|
||||||
|
// исходя из закрытия кавычек и окончания строки на "," или "}"
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ДополняемаяСтрока - Строка - исходная строка
|
||||||
|
// Дополнение - Строка - добавляемая строка
|
||||||
|
// КавычкиОткрыты - Булево - Истина - кавычки открыты; Ложь - кавычки закрыты
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Булево - Истина - строка завершена; Ложь - строка не завершена
|
||||||
|
//
|
||||||
|
Функция ДополнитьСтрокуДляОбработки(ДополняемаяСтрока, Дополнение, КавычкиОткрыты)
|
||||||
|
|
||||||
|
КоличествоКавычек = СтрЧислоВхождений(Дополнение, """");
|
||||||
|
|
||||||
|
Если КавычкиОткрыты Тогда
|
||||||
|
КавычкиОткрыты = (КоличествоКавычек % 2 = 0);
|
||||||
|
Иначе
|
||||||
|
КавычкиОткрыты = (КоличествоКавычек % 2 = 1);
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ДополняемаяСтрока = ДополняемаяСтрока + Дополнение;
|
||||||
|
|
||||||
|
ПоследнийСимвол = Сред(Дополнение, СтрДлина(Дополнение), 1);
|
||||||
|
|
||||||
|
// строка завершена если кавычки закрыты и последний символ = "," или "}"
|
||||||
|
Возврат (НЕ КавычкиОткрыты) И (ПоследнийСимвол = "}" ИЛИ ПоследнийСимвол = ",");
|
||||||
|
|
||||||
|
КонецФункции // ДополнитьСтрокуДляОбработки()
|
||||||
|
|
||||||
|
// Функция - создает структуру нового элемента
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Родитель - Структура - ссылка на элемент-родитель (для корневого элемента "Неопределено")
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Структура - Новый элемент
|
||||||
|
// *Родитель - Структура - ссылка на элемент-родитель
|
||||||
|
// *Уровень - Число - уровень иерархии элемента
|
||||||
|
// *Индекс - Число - индекс элемента в массиве значений родителя
|
||||||
|
// *НачСтрока - Число - номер первой строки из которой был прочитан элемент и его дочерние элементы
|
||||||
|
// *КонСтрока - Число - номер последней строки из которой был прочитан элемент и его дочерние элементы
|
||||||
|
// *Значения - Массив(Структура) - массив дочерних элементов
|
||||||
|
//
|
||||||
|
Функция ИнициализироватьЭлемент(Знач Родитель)
|
||||||
|
|
||||||
|
Уровень = 0;
|
||||||
|
Если ТипЗнч(Родитель) = Тип("Структура") Тогда
|
||||||
|
Если Родитель.Свойство("Уровень") Тогда
|
||||||
|
Уровень = Родитель.Уровень + 1;
|
||||||
|
КонецЕсли;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Индекс = 0;
|
||||||
|
Если ТипЗнч(Родитель) = Тип("Структура") Тогда
|
||||||
|
Если Родитель.Свойство("Значения") Тогда
|
||||||
|
Индекс = Родитель.Значения.ВГраница() + 1;
|
||||||
|
КонецЕсли;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Результат = Новый Структура("Родитель,
|
||||||
|
|Уровень,
|
||||||
|
|Индекс,
|
||||||
|
|НачСтрока,
|
||||||
|
|КонСтрока,
|
||||||
|
|Значения",
|
||||||
|
Родитель,
|
||||||
|
Уровень,
|
||||||
|
Индекс,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
Новый Массив());
|
||||||
|
|
||||||
|
|
||||||
|
Возврат Результат;
|
||||||
|
|
||||||
|
КонецФункции // ИнициализироватьЭлемент()
|
||||||
|
|
||||||
|
// Процедура - Читает, разбирает данные из переданной строки и добавляет результат в иерархию массива структур
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ЭлементДляЗаполнения - Структура - структура элемента
|
||||||
|
// *Родитель - Структура - ссылка на элемент-родитель
|
||||||
|
// *Уровень - Число - уровень иерархии элемента
|
||||||
|
// *Индекс - Число - индекс элемента в массиве значений родителя
|
||||||
|
// *НачСтрока - Число - номер первой строки из которой был прочитан элемент и его дочерние элементы
|
||||||
|
// *КонСтрока - Число - номер последней строки из которой был прочитан элемент и его дочерние элементы
|
||||||
|
// *Значения - Массив(Структура) - массив дочерних элементов
|
||||||
|
// ДанныеСтроки - Строка - строка для разбора
|
||||||
|
// СчетчикСимволов - Число - счетчик прочитанных символов переданной строки
|
||||||
|
//
|
||||||
|
Процедура ПрочитатьДанныеСтроки(ЭлементДляЗаполнения, ДанныеСтроки, СчетчикСимволов)
|
||||||
|
|
||||||
|
ТекСтрока = "";
|
||||||
|
КавычкиОткрыты = Ложь;
|
||||||
|
ПредСимвол = "";
|
||||||
|
|
||||||
|
ДлинаСтроки = СтрДлина(ДанныеСтроки);
|
||||||
|
|
||||||
|
// посимвольное чтение строки
|
||||||
|
Для НомерСимвола = СчетчикСимволов По ДлинаСтроки Цикл
|
||||||
|
|
||||||
|
ТекСимвол = Сред(ДанныеСтроки, НомерСимвола, 1);
|
||||||
|
|
||||||
|
Если КавычкиОткрыты Тогда // обработка строки внутри кавычек
|
||||||
|
|
||||||
|
Если ТекСимвол = """" Тогда
|
||||||
|
|
||||||
|
Если Сред(ДанныеСтроки, НомерСимвола, 2) = """""" Тогда // это экранированные кавычки внутри строки
|
||||||
|
|
||||||
|
ТекСтрока = ТекСтрока + Сред(ДанныеСтроки, НомерСимвола, 2);
|
||||||
|
НомерСимвола = НомерСимвола + 1;
|
||||||
|
|
||||||
|
Иначе // закрытие кавычек
|
||||||
|
|
||||||
|
ТекСтрока = ТекСтрока + ТекСимвол;
|
||||||
|
КавычкиОткрыты = Ложь;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Иначе // любой символ добавляется к строке
|
||||||
|
|
||||||
|
ТекСтрока = ТекСтрока + ТекСимвол;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ИначеЕсли ТекСимвол = """" Тогда // открытие кавычек
|
||||||
|
|
||||||
|
ТекСтрока = ТекСтрока + ТекСимвол;
|
||||||
|
КавычкиОткрыты = Истина;
|
||||||
|
|
||||||
|
ИначеЕсли ТекСимвол = "{" Тогда // открытие вложенного списка
|
||||||
|
|
||||||
|
Если ЭлементДляЗаполнения = Неопределено Тогда
|
||||||
|
|
||||||
|
ВремЭлементДляЗаполнения = ИнициализироватьЭлемент(Неопределено);
|
||||||
|
ЭлементДляЗаполнения = ВремЭлементДляЗаполнения;
|
||||||
|
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
ВремЭлементДляЗаполнения = ИнициализироватьЭлемент(ЭлементДляЗаполнения);
|
||||||
|
ЭлементДляЗаполнения.Значения.Добавить(ВремЭлементДляЗаполнения);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
НомерСимвола = НомерСимвола + 1;
|
||||||
|
|
||||||
|
ПрочитатьДанныеСтроки(ВремЭлементДляЗаполнения, ДанныеСтроки, НомерСимвола);
|
||||||
|
|
||||||
|
Если НомерСимвола > СтрДлина(ДанныеСтроки) Тогда
|
||||||
|
|
||||||
|
ЭлементДляЗаполнения = ВремЭлементДляЗаполнения; // если строка закончилась, то "наверх" поднимается элемент текущего уровня
|
||||||
|
Возврат;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ИначеЕсли ТекСимвол = "}" Тогда // закрытие вложенного списка
|
||||||
|
|
||||||
|
Если НЕ (ПредСимвол = "{" ИЛИ ПредСимвол = "}" ИЛИ ПредСимвол = "") Тогда
|
||||||
|
|
||||||
|
ЭлементДляЗаполнения.Значения.Добавить(ТекСтрока);
|
||||||
|
ТекСтрока = "";
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ЭлементДляЗаполнения = ЭлементДляЗаполнения.Родитель;
|
||||||
|
|
||||||
|
СчетчикСимволов = НомерСимвола + 1;
|
||||||
|
Возврат;
|
||||||
|
|
||||||
|
ИначеЕсли ТекСимвол = "," Тогда // добавление элемента текущего списка
|
||||||
|
|
||||||
|
Если НЕ (ПредСимвол = "}" ИЛИ ПредСимвол = "") Тогда
|
||||||
|
|
||||||
|
ЭлементДляЗаполнения.Значения.Добавить(ТекСтрока);
|
||||||
|
ТекСтрока = "";
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
ТекСтрока = ТекСтрока + ТекСимвол;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ПредСимвол = ТекСимвол;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
СчетчикСимволов = НомерСимвола;
|
||||||
|
|
||||||
|
КонецПроцедуры // ПрочитатьДанныеСтроки()
|
236
src/Модули/Конвертер.os
Normal file
236
src/Модули/Конвертер.os
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Методы конвертации шаблонов кода
|
||||||
|
//
|
||||||
|
// (с) BIA Technologies, LLC
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Программный интерфейс
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Метод преобразования формата шаблона
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ИмяВходногоФайла - Строка - Имя файла базового шаблона
|
||||||
|
// ИмяВыходногоФайла - Строка - Имя файла нового шаблона
|
||||||
|
//
|
||||||
|
Процедура ПреобразоватьШаблон(ИмяВходногоФайла, ИмяВыходногоФайла) Экспорт
|
||||||
|
|
||||||
|
МодульЧтение = ПолучитьМодульРаботыСШаблоном(ИмяВходногоФайла);
|
||||||
|
|
||||||
|
ДанныеШаблона = МодульЧтение.ПрочитатьШаблон(ИмяВходногоФайла);
|
||||||
|
|
||||||
|
ЗаписатьСПроверкойДоступныхТипов(ДанныеШаблона, ИмяВыходногоФайла);
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
// Метода объединения нескольких шаблонов в один
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// МассивВходныхФайлов - Массив - Массив файлов (тип:Файл) шаблонов, которые необходимо объединить
|
||||||
|
// ИмяВыходногоФайла - Строка - Имя файла нового шаблона
|
||||||
|
//
|
||||||
|
Процедура СоединитьШаблоны(МассивВходныхФайлов, ИмяВыходногоФайла) Экспорт
|
||||||
|
|
||||||
|
Лог = МенеджерПриложения.ПолучитьЛог();
|
||||||
|
|
||||||
|
Читатели = Новый Соответствие();
|
||||||
|
|
||||||
|
Шаблон = Неопределено;
|
||||||
|
|
||||||
|
Для Каждого Файл Из МассивВходныхФайлов Цикл
|
||||||
|
|
||||||
|
Если НЕ Файл.ЭтоФайл() Тогда
|
||||||
|
|
||||||
|
Продолжить;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Если Читатели[Файл.Расширение] = Неопределено Тогда
|
||||||
|
|
||||||
|
Читатель = ПолучитьМодульРаботыСШаблоном(Файл.ПолноеИмя);
|
||||||
|
|
||||||
|
Если Читатель = Неопределено Тогда
|
||||||
|
|
||||||
|
Лог.Предупреждение("Формат шаблона не поддерживается. Файл пропущен %1", Файл.Имя);
|
||||||
|
Продолжить;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Читатели.Вставить(Файл.Расширение, Читатель);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ШаблонФайла = Читатели[Файл.Расширение].ПрочитатьШаблон(Файл.ПолноеИмя);
|
||||||
|
|
||||||
|
Если Шаблон = Неопределено Тогда // Первый шаблон будет основным, необходимо для сохранения имени шаблона конфигуратора, при объединении двух шаблонов
|
||||||
|
|
||||||
|
Шаблон = ШаблонФайла;
|
||||||
|
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
Для Каждого Элемент Из ШаблонФайла.Элементы Цикл // Последующие шаблоны будут закидываться в основной
|
||||||
|
|
||||||
|
Шаблон.Элементы.Добавить(Элемент);
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
ЗаписатьСПроверкойДоступныхТипов(Шаблон, ИмяВыходногоФайла);
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
// Метод для переноса части элементов шаблона в отдельный файл
|
||||||
|
// Анализ необходимости переноса выполняется по полному наименованию(включая иерархию)
|
||||||
|
// на соответствие регулярному выражению
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ИзменяемыйШаблон - Строку - Имя файла анализируемого шаблона
|
||||||
|
// ШаблонНаименования - Строка - Шаблон регулярного для проверки наименования элемента
|
||||||
|
// РежимОбработкиНаименования - Строка - Способ обработки элементов
|
||||||
|
// * equal - совпадающий элемент переносится в новый файл
|
||||||
|
// * notequal - не совпадающий элемент переносится в новый файл
|
||||||
|
// УдаляемыеДанныеПоложитьВ - Строка - Имя файла, в который происходит перенос
|
||||||
|
//
|
||||||
|
Процедура РазделитьШаблон(ИзменяемыйШаблон, ШаблонНаименования, ПереносПриНеСовпадении, УдаляемыеДанныеПоложитьВ = Неопределено) Экспорт
|
||||||
|
|
||||||
|
Модуль = ПолучитьМодульРаботыСШаблоном(ИзменяемыйШаблон);
|
||||||
|
Шаблон = Модуль.ПрочитатьШаблон(ИзменяемыйШаблон);
|
||||||
|
|
||||||
|
НовыйШаблон = ШаблоныБазовый.КорневойЭлемент();
|
||||||
|
РегулярноеВыражение = Новый РегулярноеВыражение(ШаблонНаименования);
|
||||||
|
|
||||||
|
РазделитьШаблонПоРегулярномуВыражению(Шаблон, РегулярноеВыражение, НовыйШаблон, НЕ ПереносПриНеСовпадении, "");
|
||||||
|
|
||||||
|
Модуль.ЗаписатьШаблон(Шаблон, ИзменяемыйШаблон);
|
||||||
|
|
||||||
|
Если УдаляемыеДанныеПоложитьВ <> Неопределено Тогда
|
||||||
|
|
||||||
|
ЗаписатьСПроверкойДоступныхТипов(НовыйШаблон, УдаляемыеДанныеПоложитьВ);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Программный интерфейс
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Процедура ЗаписатьСПроверкойДоступныхТипов(Шаблон, ИмяФайла, МодульЗаписи = Неопределено)
|
||||||
|
|
||||||
|
Если МодульЗаписи = Неопределено Тогда
|
||||||
|
|
||||||
|
МодульЗаписи = ПолучитьМодульРаботыСШаблоном(ИмяФайла);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ДоступныеТипыПодстановок = МодульЗаписи.ДоступныеТипыПодстановок();
|
||||||
|
ФлагиТипов = Утилиты.СоответствиеФлагов(ДоступныеТипыПодстановок);
|
||||||
|
УдалитьНедоступныеШаблоны(Шаблон, ФлагиТипов);
|
||||||
|
|
||||||
|
МодульЗаписи.ЗаписатьШаблон(Шаблон, ИмяФайла);
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Процедура УдалитьНедоступныеШаблоны(ДанныеШаблона, ДоступныеТипыПодстановок)
|
||||||
|
|
||||||
|
Лог = МенеджерПриложения.ПолучитьЛог();
|
||||||
|
|
||||||
|
Количество = ДанныеШаблона.Элементы.Количество();
|
||||||
|
|
||||||
|
Для Инд = 1 По Количество Цикл
|
||||||
|
|
||||||
|
Элемент = ДанныеШаблона.Элементы[Количество - Инд];
|
||||||
|
|
||||||
|
Если Элемент.Тип = "Элемент" Тогда
|
||||||
|
|
||||||
|
Для Каждого ЭлементШаблона Из Элемент.Шаблон Цикл
|
||||||
|
|
||||||
|
Если ТипЗнч(ЭлементШаблона) = Тип("Структура") И ДоступныеТипыПодстановок[ЭлементШаблона.Тип] = Неопределено Тогда
|
||||||
|
|
||||||
|
Лог.Предупреждение("Шаблон замены ""%1"" пропущен, так имеет неподдерживаемый тип ""%2""", Элемент.Наименование, ЭлементШаблона.Тип);
|
||||||
|
ДанныеШаблона.Элементы.Удалить(Количество - Инд);
|
||||||
|
Прервать;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
ИначеЕсли Элемент.Тип = "Группа" Тогда
|
||||||
|
|
||||||
|
УдалитьНедоступныеШаблоны(Элемент, ДоступныеТипыПодстановок);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Функция ПолучитьМодульРаботыСШаблоном(ИмяФайла)
|
||||||
|
|
||||||
|
РасширениеФайла = (Новый Файл(ИмяФайла)).Расширение;
|
||||||
|
|
||||||
|
Если РасширениеФайла = ".st" Тогда
|
||||||
|
|
||||||
|
Возврат ШаблоныКонфигуратора;
|
||||||
|
|
||||||
|
ИначеЕсли РасширениеФайла = ".json" ИЛИ РасширениеФайла = ".code-snippets" Тогда
|
||||||
|
|
||||||
|
Возврат ШаблоныVSCode;
|
||||||
|
|
||||||
|
ИначеЕсли РасширениеФайла = ".xml" Тогда
|
||||||
|
|
||||||
|
Возврат ШаблоныEDT;
|
||||||
|
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
МенеджерПриложения.ПолучитьЛог().Ошибка("Не поддерживаемый формат файла: %1" + РасширениеФайла);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция РазделитьШаблонПоРегулярномуВыражению(Шаблон, РегулярноеВыражение, НовыйШаблон, ПереносПриСовпадении, ПрефиксИмени)
|
||||||
|
|
||||||
|
КУдалению = Новый Массив();
|
||||||
|
Лог = МенеджерПриложения.ПолучитьЛог();
|
||||||
|
|
||||||
|
Для Каждого Элемент Из Шаблон.Элементы Цикл
|
||||||
|
|
||||||
|
Наименование = ПрефиксИмени + ?(Элемент.Тип = "Группа", Элемент.Наименование + ".", Элемент.Наименование);
|
||||||
|
НаименованиеСовпадаетСШаблоном = РегулярноеВыражение.Совпадает(Наименование);
|
||||||
|
|
||||||
|
Если (ПереносПриСовпадении И НаименованиеСовпадаетСШаблоном) ИЛИ (НЕ ПереносПриСовпадении И НЕ НаименованиеСовпадаетСШаблоном) Тогда
|
||||||
|
|
||||||
|
НовыйШаблон.Элементы.Добавить(Элемент);
|
||||||
|
КУдалению.Добавить(Элемент);
|
||||||
|
Лог.Информация("Элемент шаблона ""%1%2"" перенесен в другой файл", ПрефиксИмени, Элемент.Наименование)
|
||||||
|
|
||||||
|
ИначеЕсли Элемент.Тип = "Группа" Тогда
|
||||||
|
|
||||||
|
НоваяГруппа = ШаблоныБазовый.Группа();
|
||||||
|
|
||||||
|
Если РазделитьШаблонПоРегулярномуВыражению(Элемент, РегулярноеВыражение, НоваяГруппа, ПереносПриСовпадении, Наименование) Тогда
|
||||||
|
|
||||||
|
НовыйШаблон.Элементы.Добавить(НоваяГруппа);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Для Каждого Элемент Из КУдалению Цикл
|
||||||
|
|
||||||
|
Шаблон.Элементы.Удалить(Шаблон.Элементы.Найти(Элемент));
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Возврат КУдалению.Количество();
|
||||||
|
|
||||||
|
КонецФункции
|
296
src/Модули/МенеджерПриложения.os
Normal file
296
src/Модули/МенеджерПриложения.os
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Служебный модуль с набором методов работы с командами приложения
|
||||||
|
//
|
||||||
|
// В большинстве проектов изменять данный модуль не требуется
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#Использовать logos
|
||||||
|
#Использовать cmdline
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Перем Лог;
|
||||||
|
|
||||||
|
Перем ПарсерКоманд;
|
||||||
|
Перем ИсполнителиКоманд;
|
||||||
|
Перем ОбъектНастроек;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// СЛУЖЕБНЫЙ ОТКРЫТЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Инициализирует и настраивает приложение
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Настройка - Модуль - Модуль, в котором определены настройки приложения
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Модуль - Модуль менеджера приложения
|
||||||
|
//
|
||||||
|
Функция Инициализировать(Знач МенеджерНастроек) Экспорт
|
||||||
|
|
||||||
|
// Служебные переменные
|
||||||
|
ПарсерКоманд = Новый ПарсерАргументовКоманднойСтроки();
|
||||||
|
ИсполнителиКоманд = Новый Соответствие;
|
||||||
|
ОбъектНастроек = МенеджерНастроек;
|
||||||
|
|
||||||
|
// Логирование
|
||||||
|
Лог = Логирование.ПолучитьЛог(ОбъектНастроек.ИмяЛогаСистемы());
|
||||||
|
Лог.УстановитьРаскладку(ОбъектНастроек);
|
||||||
|
|
||||||
|
// Инициализация команд
|
||||||
|
ОбъектНастроек.НастроитьКомандыПриложения(ЭтотОбъект);
|
||||||
|
|
||||||
|
Возврат ЭтотОбъект;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Добавляет команду в приложение
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ИмяКоманды - Строка - Имя команды
|
||||||
|
// КлассРеализации - Строка - Имя файла класса, в котором реализована команда
|
||||||
|
// ОписаниеКоманды - Строка - краткое описание назначения команды
|
||||||
|
//
|
||||||
|
Процедура ДобавитьКоманду(Знач ИмяКоманды, Знач КлассРеализации, Знач ОписаниеКоманды) Экспорт
|
||||||
|
|
||||||
|
Попытка
|
||||||
|
РеализацияКоманды = Новый(КлассРеализации);
|
||||||
|
|
||||||
|
Команда = ПарсерКоманд.ОписаниеКоманды(ИмяКоманды, ОписаниеКоманды);
|
||||||
|
ПарсерКоманд.ДобавитьКоманду(Команда);
|
||||||
|
|
||||||
|
РеализацияКоманды.НастроитьКоманду(Команда, ПарсерКоманд);
|
||||||
|
|
||||||
|
ИсполнителиКоманд.Вставить(ИмяКоманды, РеализацияКоманды);
|
||||||
|
Исключение
|
||||||
|
ЗавершитьРаботуПриложенияСОшибкой(СтрШаблон("Не удалось инициализировать команду '%1' для класса '%2' по причине:
|
||||||
|
|%3", ИмяКоманды, КлассРеализации, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
|
||||||
|
КонецПопытки;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
// Аварийно завершает работу приложения с ошибкой
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Сообщение - Строка - Сообщение, которое будет выведено пользователю перед завершением
|
||||||
|
// КодВозврата (не обязательный) - Число - Код возврата с которым будет закрыто приложение
|
||||||
|
// Значение по умолчанию: "ОшибкаВремениВыполнения" -- 1
|
||||||
|
//
|
||||||
|
Процедура ЗавершитьРаботуПриложенияСОшибкой(Знач Сообщение, Знач КодВозврата = Неопределено) Экспорт
|
||||||
|
|
||||||
|
Если КодВозврата = Неопределено Тогда
|
||||||
|
КодВозврата = РезультатыКоманд().ОшибкаВремениВыполнения;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Лог.КритичнаяОшибка(Сообщение);
|
||||||
|
|
||||||
|
ЗавершитьРаботу(КодВозврата);
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
// Завершает работу приложения
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// КодВозврата (не обязательный) - Число - Код возврата с которым будет закрыто приложение
|
||||||
|
// Значение по умолчанию: "Успех" -- 0
|
||||||
|
//
|
||||||
|
Процедура ЗавершитьРаботуПриложения(Знач КодВозврата = Неопределено) Экспорт
|
||||||
|
|
||||||
|
Если КодВозврата = Неопределено Тогда
|
||||||
|
КодВозврата = РезультатыКоманд().Успех;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ЗавершитьРаботу(КодВозврата);
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
// Осуществляет запуск приложения на выполнение
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Число - Код возврата выполнения команды приложения
|
||||||
|
//
|
||||||
|
Функция ЗапуститьВыполнение() Экспорт
|
||||||
|
|
||||||
|
Попытка
|
||||||
|
ПараметрыЗапуска = ПарсерКоманд.Разобрать(АргументыКоманднойСтроки);
|
||||||
|
Исключение
|
||||||
|
Лог.Отладка(ОписаниеОшибки());
|
||||||
|
|
||||||
|
Лог.Ошибка("Не удалось определить требуемое действие.");
|
||||||
|
ВывестиСправкуПоКомандам();
|
||||||
|
|
||||||
|
Возврат РезультатыКоманд().НеверныеПараметры;
|
||||||
|
КонецПопытки;
|
||||||
|
|
||||||
|
Команда = "";
|
||||||
|
ЗначенияПараметров = Неопределено;
|
||||||
|
|
||||||
|
Если ПараметрыЗапуска = Неопределено ИЛИ ПараметрыЗапуска.Количество() = 0 Тогда
|
||||||
|
|
||||||
|
ВывестиВерсию();
|
||||||
|
ВывестиСправкуПоКомандам();
|
||||||
|
|
||||||
|
Возврат РезультатыКоманд().НеверныеПараметры;
|
||||||
|
|
||||||
|
ИначеЕсли ТипЗнч(ПараметрыЗапуска) = Тип("Структура") Тогда
|
||||||
|
|
||||||
|
// это команда
|
||||||
|
Команда = ПараметрыЗапуска.Команда;
|
||||||
|
ЗначенияПараметров = ПараметрыЗапуска.ЗначенияПараметров;
|
||||||
|
Лог.Отладка("Выполняю команду продукта %1", Команда);
|
||||||
|
|
||||||
|
ИначеЕсли ЗначениеЗаполнено(ОбъектНастроек.ИмяКомандыПоУмолчанию()) Тогда
|
||||||
|
|
||||||
|
// это команда по-умолчанию
|
||||||
|
Команда = ОбъектНастроек.ИмяКомандыПоУмолчанию();
|
||||||
|
ЗначенияПараметров = ПараметрыЗапуска;
|
||||||
|
Лог.Отладка("Выполняю команду продукта по умолчанию %1", Команда);
|
||||||
|
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
Возврат НекорректныеПараметры();
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Если Команда <> ОбъектНастроек.ИмяКомандыВерсия() Тогда
|
||||||
|
|
||||||
|
ВывестиВерсию();
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат ВыполнитьКоманду(Команда, ЗначенияПараметров);
|
||||||
|
|
||||||
|
КонецФункции // ЗапуститьВыполнение()
|
||||||
|
|
||||||
|
// Осуществляет запуск на выполнение указанной команды приложения
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ИмяКоманды - Строка - Имя команды, которую необходимо запустить
|
||||||
|
// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений
|
||||||
|
//
|
||||||
|
Функция ВыполнитьКоманду(Знач ИмяКоманды, Знач ПараметрыКоманды) Экспорт
|
||||||
|
|
||||||
|
Команда = ПолучитьКоманду(ИмяКоманды);
|
||||||
|
КодВозврата = Команда.ВыполнитьКоманду(ПараметрыКоманды, ЭтотОбъект);
|
||||||
|
|
||||||
|
Если КодВозврата = Неопределено Тогда
|
||||||
|
КодВозврата = РезультатыКоманд().Успех;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат КодВозврата;
|
||||||
|
|
||||||
|
КонецФункции // ВыполнитьКоманду
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ПРОГРАММНЫЙ ИНТЕРФЕЙС
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Возвращает лог приложения
|
||||||
|
Функция ПолучитьЛог() Экспорт
|
||||||
|
|
||||||
|
Возврат Лог;
|
||||||
|
|
||||||
|
КонецФункции // ПолучитьЛог
|
||||||
|
|
||||||
|
// Возвращает версию продукта
|
||||||
|
Функция ВерсияПродукта() Экспорт
|
||||||
|
|
||||||
|
Возврат ОбъектНастроек.ВерсияПродукта();
|
||||||
|
|
||||||
|
КонецФункции // ВерсияПродукта
|
||||||
|
|
||||||
|
// Возвращает имя продукта
|
||||||
|
Функция ИмяПродукта() Экспорт
|
||||||
|
|
||||||
|
Возврат ОбъектНастроек.ИмяПродукта();
|
||||||
|
|
||||||
|
КонецФункции // ИмяПродукта
|
||||||
|
|
||||||
|
// Возвращает путь к исполняемому файлу
|
||||||
|
Функция ПутьКИсполняемомуФайлу() Экспорт
|
||||||
|
|
||||||
|
Возврат ОбъектНастроек.ПутьКИсполняемомуФайлу();
|
||||||
|
|
||||||
|
КонецФункции // ПутьКИсполняемомуФайлу
|
||||||
|
|
||||||
|
// Возвращает путь к каталогу основного скрипта
|
||||||
|
Функция ПутьКРодительскомуКаталогу() Экспорт
|
||||||
|
|
||||||
|
Возврат ОбъектНастроек.ПутьКРодительскомуКаталогу();
|
||||||
|
|
||||||
|
КонецФункции // ПутьКРодительскомуКаталогу
|
||||||
|
|
||||||
|
// Возвращает путь к каталогу сценариев
|
||||||
|
Функция КаталогСценариев() Экспорт
|
||||||
|
|
||||||
|
Возврат ОбъектНастроек.КаталогСценариев();
|
||||||
|
|
||||||
|
КонецФункции // КаталогСценариев
|
||||||
|
|
||||||
|
// Выводит справку по всем командам приложения
|
||||||
|
Процедура ВывестиСправкуПоКомандам() Экспорт
|
||||||
|
|
||||||
|
ПарсерКоманд.ВывестиСправкуПоКомандам();
|
||||||
|
|
||||||
|
КонецПроцедуры // ВывестиСправкуПоКомандам
|
||||||
|
|
||||||
|
// Выводит справку по указанной команде приложения.
|
||||||
|
Процедура ВывестиСправкуПоКоманде(Знач ИмяКоманды) Экспорт
|
||||||
|
|
||||||
|
ПарсерКоманд.ВывестиСправкуПоКоманде(ИмяКоманды);
|
||||||
|
|
||||||
|
КонецПроцедуры // ВывестиСправкуПоКоманде
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ПЕРЕЧИСЛЕНИЯ
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Возвращает стандартные коды возврата приложения
|
||||||
|
Функция РезультатыКоманд() Экспорт
|
||||||
|
|
||||||
|
РезультатыКоманд = Новый Структура;
|
||||||
|
РезультатыКоманд.Вставить("Успех", 0);
|
||||||
|
РезультатыКоманд.Вставить("НеверныеПараметры", 5);
|
||||||
|
РезультатыКоманд.Вставить("ОшибкаВремениВыполнения", 1);
|
||||||
|
|
||||||
|
Возврат РезультатыКоманд;
|
||||||
|
|
||||||
|
КонецФункции // РезультатыКоманд
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Получает объект класса с реализацией указанной команды
|
||||||
|
Функция ПолучитьКоманду(Знач ИмяКоманды)
|
||||||
|
|
||||||
|
КлассРеализации = ИсполнителиКоманд[ИмяКоманды];
|
||||||
|
Если КлассРеализации = Неопределено Тогда
|
||||||
|
|
||||||
|
ВызватьИсключение СтрШаблон("Неверная операция. Команда '%1' не предусмотрена.", ИмяКоманды);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат КлассРеализации;
|
||||||
|
|
||||||
|
КонецФункции // ПолучитьКоманду
|
||||||
|
|
||||||
|
// Осуществляет вывод полной версии продукта
|
||||||
|
Процедура ВывестиВерсию()
|
||||||
|
|
||||||
|
Сообщить(СтрШаблон("%1 v%2", ИмяПродукта(), ВерсияПродукта()));
|
||||||
|
|
||||||
|
КонецПроцедуры // ВывестиВерсию
|
||||||
|
|
||||||
|
// Вывод ошибки и справки по параметрам
|
||||||
|
Функция НекорректныеПараметры()
|
||||||
|
|
||||||
|
Лог.Ошибка("Некорректные аргументы командной строки");
|
||||||
|
ВывестиСправкуПоКомандам();
|
||||||
|
|
||||||
|
Возврат РезультатыКоманд().НеверныеПараметры;
|
||||||
|
|
||||||
|
КонецФункции // НекорректныеПараметры()
|
156
src/Модули/ПараметрыПриложения.os
Normal file
156
src/Модули/ПараметрыПриложения.os
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Служебный модуль с набором служебных параметров приложения
|
||||||
|
//
|
||||||
|
// При создании нового приложения обязательно внести изменение
|
||||||
|
// в ф-ии ИмяПродукта, указав имя вашего приложения.
|
||||||
|
//
|
||||||
|
// При выпуске новой версии обязательно изменить ее значение
|
||||||
|
// в ф-ии ВерсияПродукта
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// СВОЙСТВА ПРОДУКТА
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ВерсияПродукта
|
||||||
|
// Возвращает текущую версию продукта
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Строка - Значение текущей версии продукта
|
||||||
|
//
|
||||||
|
Функция ВерсияПродукта() Экспорт
|
||||||
|
|
||||||
|
Возврат "1.0.1";
|
||||||
|
|
||||||
|
КонецФункции // ВерсияПродукта
|
||||||
|
|
||||||
|
// ИмяПродукта
|
||||||
|
// Возвращает имя продукта
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Строка - Значение имени продукта
|
||||||
|
//
|
||||||
|
Функция ИмяПродукта() Экспорт
|
||||||
|
|
||||||
|
Возврат "snippet-transform";
|
||||||
|
|
||||||
|
КонецФункции // ИмяПродукта
|
||||||
|
|
||||||
|
// ПутьКИсполняемомуФайлу
|
||||||
|
// Возвращает путь к исполняемому файлу
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Строка - Путь к исполняемому файлу скрипта
|
||||||
|
//
|
||||||
|
Функция ПутьКИсполняемомуФайлу() Экспорт
|
||||||
|
|
||||||
|
Возврат ОбъединитьПути(ПутьКРодительскомуКаталогу(), "src", "main.os");
|
||||||
|
|
||||||
|
КонецФункции // ПутьКИсполняемомуФайлу
|
||||||
|
|
||||||
|
// ПутьКРодительскомуКаталогу
|
||||||
|
// Возвращает путь к каталогу основного скрипта
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Строка - Путь к каталогу основного скрипта
|
||||||
|
//
|
||||||
|
Функция ПутьКРодительскомуКаталогу() Экспорт
|
||||||
|
|
||||||
|
Файл = Новый Файл(ОбъединитьПути(ТекущийСценарий().Каталог, "..", ".."));
|
||||||
|
Возврат Файл.ПолноеИмя;
|
||||||
|
|
||||||
|
КонецФункции // ПутьКРодительскомуКаталогу
|
||||||
|
|
||||||
|
// КаталогСценариев
|
||||||
|
// Возвращает путь к каталогу сценариев
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Строка - Путь к каталогу сценариев
|
||||||
|
//
|
||||||
|
Функция КаталогСценариев() Экспорт
|
||||||
|
|
||||||
|
Возврат ОбъединитьПути(ПутьКРодительскомуКаталогу(), "src", "СценарииОбработки");
|
||||||
|
|
||||||
|
КонецФункции // КаталогСценариев
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ЛОГИРОВАНИЕ
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Форматирование логов
|
||||||
|
// См. описание метода "УстановитьРаскладку" библиотеки logos
|
||||||
|
//
|
||||||
|
Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт
|
||||||
|
|
||||||
|
Возврат СтрШаблон("%1: %2 - %3", ТекущаяДата(), УровниЛога.НаименованиеУровня(Уровень), Сообщение);
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// ИмяЛогаСистемы
|
||||||
|
// Возвращает идентификатор лога приложения
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Строка - Значение идентификатора лога приложения
|
||||||
|
//
|
||||||
|
Функция ИмяЛогаСистемы() Экспорт
|
||||||
|
|
||||||
|
Возврат "oscript.app." + ИмяПродукта();
|
||||||
|
|
||||||
|
КонецФункции // ИмяЛогаСистемы
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// НАСТРОЙКА КОМАНД
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Возвращает имя команды "version" (ключ командной строки)
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Строка - имя команды
|
||||||
|
//
|
||||||
|
Функция ИмяКомандыВерсия() Экспорт
|
||||||
|
|
||||||
|
Возврат "version";
|
||||||
|
|
||||||
|
КонецФункции // ИмяКомандыВерсия
|
||||||
|
|
||||||
|
// Возвращает имя команды "help" (ключ командной строки)
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Строка - имя команды
|
||||||
|
//
|
||||||
|
Функция ИмяКомандыПомощь() Экспорт
|
||||||
|
|
||||||
|
Возврат "help";
|
||||||
|
|
||||||
|
КонецФункции // ИмяКомандыПомощь()
|
||||||
|
|
||||||
|
// ИмяКомандыПоУмолчанию
|
||||||
|
// Одна из команд может вызываться неявно, без указания команды.
|
||||||
|
// Иными словами, здесь указывается какой обработчик надо вызывать, если приложение запущено без какой-либо команды
|
||||||
|
// myapp /home/user/somefile.txt будет аналогично myapp default-action /home/user/somefile.txt
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Строка - имя команды по умолчанию
|
||||||
|
Функция ИмяКомандыПоУмолчанию() Экспорт
|
||||||
|
|
||||||
|
Возврат "convert";
|
||||||
|
|
||||||
|
КонецФункции // ИмяКомандыПоУмолчанию
|
||||||
|
|
||||||
|
// НастроитьКомандыПриложения
|
||||||
|
// Регистрирует классы обрабатывающие команды приложения
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Приложение - Модуль - Модуль менеджера приложения
|
||||||
|
Процедура НастроитьКомандыПриложения(Знач Приложение) Экспорт
|
||||||
|
|
||||||
|
Приложение.ДобавитьКоманду(ИмяКомандыПомощь(), "КомандаСправкаПоПараметрам", "Выводит справку по командам");
|
||||||
|
Приложение.ДобавитьКоманду(ИмяКомандыВерсия(), "КомандаVersion", "Выводит версию приложения");
|
||||||
|
Приложение.ДобавитьКоманду("convert", "КомандаConvert", "Преобразование шаблона кода, с автоматическим определением форматов на основании расширения");
|
||||||
|
Приложение.ДобавитьКоманду("join-files", "КомандаJoinFiles", "Выполняет объединение двух файлов шаблонов");
|
||||||
|
Приложение.ДобавитьКоманду("join-path", "КомандаJoinPath", "Выполняет объединение каталога файлов шаблонов");
|
||||||
|
Приложение.ДобавитьКоманду("apportion", "КомандаApportion", "Выполняет разделение шаблона, на основании регулярного выражения");
|
||||||
|
|
||||||
|
КонецПроцедуры // ПриРегистрацииКомандПриложения
|
41
src/Модули/ТипПодстановки.os
Normal file
41
src/Модули/ТипПодстановки.os
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Модуль-перечисления, типы блоков подставновки шаблонов
|
||||||
|
//
|
||||||
|
// (с) BIA Technologies, LLC
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Перем Неизвестный Экспорт;
|
||||||
|
Перем УстановкаКурсора Экспорт;
|
||||||
|
Перем ВыборВарианта Экспорт;
|
||||||
|
Перем ДатаВремя Экспорт;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Программный интерфейс
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Возвращает список всех доступных типов, тип "Неизвестный" не включен
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Массив - Коллекция строк-идентификаторов доступных типов
|
||||||
|
//
|
||||||
|
Функция ВсеТипы() Экспорт
|
||||||
|
|
||||||
|
ТипыШаблонов = Новый Массив();
|
||||||
|
|
||||||
|
ТипыШаблонов.Добавить(УстановкаКурсора);
|
||||||
|
ТипыШаблонов.Добавить(ВыборВарианта);
|
||||||
|
ТипыШаблонов.Добавить(ДатаВремя);
|
||||||
|
|
||||||
|
Возврат ТипыШаблонов;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Неизвестный = "Неизвестный";
|
||||||
|
УстановкаКурсора = "Установка курсора";
|
||||||
|
ВыборВарианта = "Выбор варианта";
|
||||||
|
ДатаВремя = "Дата время";
|
||||||
|
|
185
src/Модули/Утилиты.os
Normal file
185
src/Модули/Утилиты.os
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Модуль-перечисления, типы блоков подставновки шаблонов
|
||||||
|
//
|
||||||
|
// (с) BIA Technologies, LLC
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Перем Кэш;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Программный интерфейс
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Проверяет, является ли строка числом
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Строка - Строка - Проверяемая строка
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Булево - Истина - число, Ложь - нет
|
||||||
|
//
|
||||||
|
Функция ЭтоЧисло(Строка) Экспорт
|
||||||
|
|
||||||
|
Возврат Кэш["ПроверкаЧисло"].Совпадает(Строка);
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Удаляет последовательности символов в начале и конце строки
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Текст - Строка - Анализируемый текст
|
||||||
|
// Символы - Строка - Строка удаляемых символов
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Строка - Строка с удаленными символами
|
||||||
|
//
|
||||||
|
Функция УдалитьСимволыВНачалеИКонце(Знач Текст, Символы) Экспорт
|
||||||
|
|
||||||
|
Ключ = "УдалитьСимволыВНачалеИКонце-" + Символы;
|
||||||
|
|
||||||
|
Если Кэш[Ключ] = Неопределено Тогда
|
||||||
|
|
||||||
|
Шаблон = СтрШаблон("^[%1]*(.*?)[%1]*$", ЭкранироватьСлужебныеСимволыRegExp(Символы));
|
||||||
|
|
||||||
|
Кэш.Вставить(Ключ, Новый РегулярноеВыражение(Шаблон));
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат Кэш[Ключ].Заменить(Текст, "$1");
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Удаляет из строки символы
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Текст - Строка - Анализируемый текст
|
||||||
|
// Символы - Строка - Строка удаляемых символов
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Строка - Строка с удаленными символами
|
||||||
|
//
|
||||||
|
Функция УдалитьСимволы(Знач Текст, УдаляемыеСимволы) Экспорт
|
||||||
|
|
||||||
|
// Не корректно работает СтрРазделить https://github.com/EvilBeaver/OneScript/pull/851/commits
|
||||||
|
// Должно заработать на следующем релизе oscript 1.0.22
|
||||||
|
// Части = СтрРазделить(Текст, УдаляемыеСимволы);
|
||||||
|
|
||||||
|
// Возврат СтрСоединить(Части, "");
|
||||||
|
|
||||||
|
Ключ = "УдалитьСимволы" + УдаляемыеСимволы;
|
||||||
|
Если Кэш[Ключ] = Неопределено Тогда
|
||||||
|
|
||||||
|
Шаблон = СтрШаблон("[%1]", ЭкранироватьСлужебныеСимволыRegExp(УдаляемыеСимволы));
|
||||||
|
|
||||||
|
Кэш.Вставить(Ключ, Новый РегулярноеВыражение(Шаблон));
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат Кэш[Ключ].Заменить(Текст, "");
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// На основании массива значений формирует соответствие, в качестве значения используется "ЗначениеФлага"
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Массив - Массив - Коллекция произвольных значений
|
||||||
|
// ЗначениеФлага - Произвольный - Значение соответствия
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Соответствие - Соответствие флагов
|
||||||
|
//
|
||||||
|
Функция СоответствиеФлагов(Массив, ЗначениеФлага = Истина) Экспорт
|
||||||
|
|
||||||
|
Результат = Новый Соответствие();
|
||||||
|
|
||||||
|
Для Каждого Элемент Из Массив Цикл
|
||||||
|
|
||||||
|
Результат.Вставить(Элемент, ЗначениеФлага);
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Возврат Результат;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Формирует имя переменной в формате CamelCase
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Текст - Строка - Текст на основании, которого будет сформировано имя переменной
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Строка - Имя переменной
|
||||||
|
//
|
||||||
|
Функция СформироватьИдентификатор(Текст) Экспорт
|
||||||
|
|
||||||
|
Строка = "";
|
||||||
|
|
||||||
|
Для Каждого Совпадение Из Кэш["Слова"].НайтиСовпадения(Текст) Цикл
|
||||||
|
|
||||||
|
Строка = Строка + ВРег(Лев(Совпадение.Значение, 1)) + Сред(Совпадение.Значение, 2);
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Возврат Строка;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Выделяет из текста слова
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Строка - Строка - Анализируемый тест
|
||||||
|
// ВернутьТакжеПозицию - Булево - Истина - формирует массив структур, содержащих инф о положении слова в тексте
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Массив - Массив слов
|
||||||
|
//
|
||||||
|
Функция ПолучитьСлова(Строка, ВернутьТакжеПозицию = Ложь) Экспорт
|
||||||
|
|
||||||
|
Слова = Новый Массив();
|
||||||
|
|
||||||
|
Для Каждого Совпадение Из Кэш["Слова"].НайтиСовпадения(Строка) Цикл
|
||||||
|
|
||||||
|
Если ВернутьТакжеПозицию Тогда
|
||||||
|
Слова.Добавить(Новый Структура("Слово, Начало, Окончание", Совпадение.Значение, Совпадение.Индекс, Совпадение.Индекс + Совпадение.Длина));
|
||||||
|
Иначе
|
||||||
|
Слова.Добавить(Совпадение.Значение);
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Возврат Слова;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ЭкранироватьСлужебныеСимволыRegExp(Символы)
|
||||||
|
|
||||||
|
СлужебныеСимволыРегулярногоВыражения = "^$.[]\";
|
||||||
|
|
||||||
|
Результат = "";
|
||||||
|
|
||||||
|
Для Инд = 1 По СтрДлина(Символы) Цикл
|
||||||
|
|
||||||
|
Символ = Сред(Символы, Инд, 1);
|
||||||
|
|
||||||
|
Если СтрНайти(СлужебныеСимволыРегулярногоВыражения, Символ) Тогда
|
||||||
|
|
||||||
|
Результат = СтрШаблон("%1\%2", Результат, Символ);
|
||||||
|
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
Результат = Результат + Символ;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Возврат Результат;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Кэш = Новый Соответствие();
|
||||||
|
Кэш.Вставить("ПроверкаЧисло", Новый РегулярноеВыражение("\d+"));
|
||||||
|
Кэш.Вставить("ФиксТекстЗамены", Новый РегулярноеВыражение("[\[\]]"));
|
||||||
|
Кэш.Вставить("Слова", Новый РегулярноеВыражение("[\w\dА-Яа-я]+"));
|
324
src/Модули/ШаблоныEDT.os
Normal file
324
src/Модули/ШаблоныEDT.os
Normal file
@ -0,0 +1,324 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Методы работы с шаблонами EDT
|
||||||
|
//
|
||||||
|
// (с) BIA Technologies, LLC
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Программный интерфейс
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Считывает шаблон кода в структуру
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ИмяФайлаШаблона - Строка - Имя файла шаблона
|
||||||
|
// РазбиратьБлокиПодстановки - Булево - Выполнять ли разбор текста шаблона
|
||||||
|
// Если выполняется объединение/разделение без изменения типа шаблона, то рекомендуется не выполнять анализ текста шаблона
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Структура - Данные шаблона
|
||||||
|
// Тип - ТИп узла шаблона
|
||||||
|
// Наименование - имя узла
|
||||||
|
// Значения - подчиненные узлы
|
||||||
|
//
|
||||||
|
Функция ПрочитатьШаблон(ИмяФайлаШаблона, РазбиратьБлокиПодстановки = Истина) Экспорт
|
||||||
|
|
||||||
|
Чтение = Новый ЧтениеXML;
|
||||||
|
Чтение.ОткрытьФайл(ИмяФайлаШаблона);
|
||||||
|
|
||||||
|
ДанныеШаблона = ШаблоныБазовый.КорневойЭлемент();
|
||||||
|
|
||||||
|
Пока Чтение.Прочитать() Цикл
|
||||||
|
|
||||||
|
Если Чтение.Имя = "template" И Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
|
||||||
|
|
||||||
|
Если Чтение.ЗначениеАтрибута("deleted") <> "false" ИЛИ Чтение.ЗначениеАтрибута("enabled") <> "true" Тогда
|
||||||
|
|
||||||
|
Продолжить;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Элемент = ШаблоныБазовый.Элемент();
|
||||||
|
Элемент.Наименование = Чтение.ЗначениеАтрибута("description");
|
||||||
|
Элемент.ТекстЗамены = Чтение.ЗначениеАтрибута("name");
|
||||||
|
Элемент.Наименование = Чтение.ЗначениеАтрибута("description");
|
||||||
|
|
||||||
|
Чтение.Прочитать();
|
||||||
|
|
||||||
|
Если РазбиратьБлокиПодстановки Тогда
|
||||||
|
Элемент.Шаблон = ПрочитатьСтруктуруТекстаШаблона(Чтение.Значение, 1, Ложь);
|
||||||
|
Иначе
|
||||||
|
Элемент.Шаблон = Чтение.Значение;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ДанныеШаблона.Элементы.Добавить(Элемент);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Чтение.Закрыть();
|
||||||
|
|
||||||
|
Возврат ДанныеШаблона;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Сохраняет шаблон в файл
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Шаблон - Структура - Данные шаблона
|
||||||
|
// ИмяФайла - Строка - Имя файла шаблона
|
||||||
|
//
|
||||||
|
Процедура ЗаписатьШаблон(Шаблон, ИмяФайла) Экспорт
|
||||||
|
|
||||||
|
Запись = Новый ЗаписьXML();
|
||||||
|
Запись.ОткрытьФайл(ИмяФайла);
|
||||||
|
|
||||||
|
Запись.ЗаписатьОбъявлениеXML();
|
||||||
|
Запись.ЗаписатьНачалоЭлемента("templates");
|
||||||
|
|
||||||
|
РекурсивнаяЗаписьДереваШаблонов(Шаблон, Запись);
|
||||||
|
Запись.ЗаписатьКонецЭлемента();
|
||||||
|
Запись.Закрыть();
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
// Возвращает список поддерживаемых типов блоков подстановки
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Массив - Массив строка, элементов перечисления ТипПодстановки
|
||||||
|
//
|
||||||
|
Функция ДоступныеТипыПодстановок() Экспорт
|
||||||
|
|
||||||
|
ДоступныеТипыПодстановок = Новый Массив();
|
||||||
|
|
||||||
|
ДоступныеТипыПодстановок.Добавить(ТипПодстановки.УстановкаКурсора);
|
||||||
|
ДоступныеТипыПодстановок.Добавить(ТипПодстановки.ДатаВремя);
|
||||||
|
|
||||||
|
Возврат ДоступныеТипыПодстановок;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Служебный функционал
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Чтение
|
||||||
|
|
||||||
|
Функция ПрочитатьСтруктуруТекстаШаблона(Текст, Позиция, ЧитаемВложенныйЭлемент = Ложь)
|
||||||
|
|
||||||
|
ПараметрыЧтения = Новый Структура();
|
||||||
|
ПараметрыЧтения.Вставить("КавычкаОткрыта", Ложь);
|
||||||
|
ПараметрыЧтения.Вставить("БлокЗамены", ЧитаемВложенныйЭлемент);
|
||||||
|
ПредыдущийСимвол = "";
|
||||||
|
|
||||||
|
ТекущаяСтрока = "";
|
||||||
|
|
||||||
|
Данные = Новый Массив();
|
||||||
|
|
||||||
|
ДлиннаСтроки = СтрДлина(Текст);
|
||||||
|
|
||||||
|
Пока Позиция <= ДлиннаСтроки Цикл
|
||||||
|
|
||||||
|
Символ = Сред(Текст, Позиция, 1);
|
||||||
|
Позиция = Позиция + 1;
|
||||||
|
|
||||||
|
Если Символ = Неопределено Тогда
|
||||||
|
Прервать;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
СимволОбработан = Ложь;
|
||||||
|
|
||||||
|
Если Символ = "{" И ПредыдущийСимвол = "$" Тогда
|
||||||
|
|
||||||
|
ТекущаяСтрока = Лев(ТекущаяСтрока, СтрДлина(ТекущаяСтрока) - 1);
|
||||||
|
Данные.Добавить(?(ПараметрыЧтения.БлокЗамены, СокрЛП(ТекущаяСтрока), ТекущаяСтрока));
|
||||||
|
ТекущаяСтрока = "";
|
||||||
|
|
||||||
|
СимволОбработан = Истина;
|
||||||
|
ВложенныйЭлемент = ПрочитатьСтруктуруТекстаШаблона(Текст, Позиция, Истина);
|
||||||
|
Данные.Добавить(ВложенныйЭлемент);
|
||||||
|
|
||||||
|
ИначеЕсли Символ = "}" И ПараметрыЧтения.БлокЗамены Тогда
|
||||||
|
|
||||||
|
Если ЗначениеЗаполнено(ТекущаяСтрока) Тогда
|
||||||
|
Данные.Добавить(?(ПараметрыЧтения.БлокЗамены, СокрЛП(ТекущаяСтрока), ТекущаяСтрока));
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
СимволОбработан = Истина;
|
||||||
|
ПараметрыУправляющейКонструкции1с = ПрочитатьПараметрыПодстановки(Данные);
|
||||||
|
Возврат ПараметрыУправляющейКонструкции1с;
|
||||||
|
|
||||||
|
ИначеЕсли Символ = "," И ПараметрыЧтения.БлокЗамены И НЕ ПараметрыЧтения.КавычкаОткрыта Тогда
|
||||||
|
|
||||||
|
Данные.Добавить(?(ПараметрыЧтения.БлокЗамены, СокрЛП(ТекущаяСтрока), ТекущаяСтрока));
|
||||||
|
ТекущаяСтрока = "";
|
||||||
|
СимволОбработан = Истина;
|
||||||
|
|
||||||
|
ИначеЕсли Символ = """" И ПредыдущийСимвол <> "\" Тогда
|
||||||
|
|
||||||
|
ПараметрыЧтения.КавычкаОткрыта = НЕ ПараметрыЧтения.КавычкаОткрыта;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Если Не СимволОбработан Тогда
|
||||||
|
|
||||||
|
ТекущаяСтрока = ТекущаяСтрока + Символ;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ПредыдущийСимвол = Символ;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Если ЗначениеЗаполнено(ТекущаяСтрока) Тогда
|
||||||
|
Данные.Добавить(?(ПараметрыЧтения.БлокЗамены, СокрЛП(ТекущаяСтрока), ТекущаяСтрока));
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат Данные;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ПрочитатьПараметрыПодстановки(Данные)
|
||||||
|
|
||||||
|
Параметры = Новый Структура("Тип", ТипПодстановки.Неизвестный);
|
||||||
|
|
||||||
|
Если Данные.Количество() = 0 Тогда
|
||||||
|
|
||||||
|
Возврат Параметры;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ИмяТип = Данные[0];
|
||||||
|
|
||||||
|
СоответствиеТипов = Новый Соответствие();
|
||||||
|
СоответствиеТипов.Вставить("date", ТипПодстановки.ДатаВремя);
|
||||||
|
|
||||||
|
Если СтрНайти(ИмяТип, ":") Тогда
|
||||||
|
|
||||||
|
Слова = Утилиты.ПолучитьСлова(ИмяТип, Истина);
|
||||||
|
|
||||||
|
Имя = Слова[0].Слово;
|
||||||
|
Тип = Слова[1].Слово;
|
||||||
|
|
||||||
|
Если СоответствиеТипов[Тип] <> Неопределено Тогда
|
||||||
|
Тип = СоответствиеТипов[Тип];
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Параметры.Тип = Тип;
|
||||||
|
Параметры.Вставить("Подсказка", Имя);
|
||||||
|
|
||||||
|
Аргументы = Сред(ИмяТип, Слова[1].Окончание + 1);
|
||||||
|
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
Тип = СоответствиеТипов[ИмяТип];
|
||||||
|
|
||||||
|
Если Тип = Неопределено Тогда
|
||||||
|
|
||||||
|
Параметры.Тип = ТипПодстановки.УстановкаКурсора;
|
||||||
|
Параметры.Вставить("Подсказка", ИмяТип);
|
||||||
|
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
Параметры.Тип = Тип;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Аргументы = "";
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Если Параметры.Тип = ТипПодстановки.ДатаВремя Тогда
|
||||||
|
|
||||||
|
Параметры.Вставить("Формат", Утилиты.УдалитьСимволыВНачалеИКонце(Аргументы, "()"));
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат Параметры;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Запись
|
||||||
|
|
||||||
|
Процедура РекурсивнаяЗаписьДереваШаблонов(Шаблон, Запись)
|
||||||
|
|
||||||
|
Для Каждого Элемент Из Шаблон.Элементы Цикл
|
||||||
|
|
||||||
|
Если Элемент.Тип = "Группа" Тогда
|
||||||
|
|
||||||
|
РекурсивнаяЗаписьДереваШаблонов(Элемент, Запись);
|
||||||
|
Продолжить;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Запись.ЗаписатьНачалоЭлемента("template");
|
||||||
|
Запись.ЗаписатьАтрибут("autoinsert", "true");
|
||||||
|
Запись.ЗаписатьАтрибут("context", "com._1c.g5.v8.dt.bsl.Bsl.AddHandlerStatement");
|
||||||
|
Запись.ЗаписатьАтрибут("deleted", "false");
|
||||||
|
Запись.ЗаписатьАтрибут("description", Элемент.Наименование);
|
||||||
|
Запись.ЗаписатьАтрибут("enabled", "true");
|
||||||
|
Запись.ЗаписатьАтрибут("name", Элемент.ТекстЗамены);
|
||||||
|
Запись.ЗаписатьТекст(СобратьТекстШаблона(Элемент.Шаблон));
|
||||||
|
|
||||||
|
Запись.ЗаписатьКонецЭлемента();
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Функция СобратьТекстШаблона(ДанныеШаблона)
|
||||||
|
|
||||||
|
Если ТипЗнч(ДанныеШаблона) = Тип("Строка") Тогда
|
||||||
|
|
||||||
|
Возврат ДанныеШаблона;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Вывод = Новый ЗаписьJSON();
|
||||||
|
Вывод.УстановитьСтроку();
|
||||||
|
НомерЭлемента = 1;
|
||||||
|
|
||||||
|
Для Каждого Элемент Из ДанныеШаблона Цикл
|
||||||
|
|
||||||
|
Если ТипЗнч(Элемент) = Тип("Строка") Тогда
|
||||||
|
|
||||||
|
Вывод.ЗаписатьБезОбработки(Элемент);
|
||||||
|
Продолжить;
|
||||||
|
|
||||||
|
ИначеЕсли Элемент.Тип = ТипПодстановки.УстановкаКурсора Тогда
|
||||||
|
|
||||||
|
Если Элемент.Свойство("Подсказка") Тогда
|
||||||
|
|
||||||
|
Вывод.ЗаписатьБезОбработки(СтрШаблон("${%1}", Утилиты.СформироватьИдентификатор(Элемент.Подсказка)));
|
||||||
|
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
Вывод.ЗаписатьБезОбработки("${cursor}");
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ИначеЕсли Элемент.Тип = ТипПодстановки.ДатаВремя Тогда
|
||||||
|
|
||||||
|
Если Элемент.Свойство("Подсказка") Тогда
|
||||||
|
|
||||||
|
Вывод.ЗаписатьБезОбработки(СтрШаблон("${%1:date(%2)}", Утилиты.СформироватьИдентификатор(Элемент.Подсказка), Элемент.Формат));
|
||||||
|
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
Вывод.ЗаписатьБезОбработки(СтрШаблон("${n%1:date(%2)}", НомерЭлемента, Элемент.Формат));
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
НомерЭлемента = НомерЭлемента + 1;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Возврат Вывод.Закрыть();
|
||||||
|
|
||||||
|
КонецФункции
|
208
src/Модули/ШаблоныVSCode.os
Normal file
208
src/Модули/ШаблоныVSCode.os
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Методы работы с шаблонами VS Code
|
||||||
|
//
|
||||||
|
// (с) BIA Technologies, LLC
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Некоторые описание шаблонов VS code https://github.com/1c-syntax/vsc-language-1c-bsl/wiki/Динамические-шаблоны
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Программный интерфейс
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Считывает шаблон кода в структуру
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ИмяФайлаШаблона - Строка - Имя файла шаблона
|
||||||
|
// РазбиратьБлокиПодстановки - Булево - Выполнять ли разбор текста шаблона
|
||||||
|
// Если выполняется объединение/разделение без изменения типа шаблона, то рекомендуется не выполнять анализ текста шаблона
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Структура - Данные шаблона
|
||||||
|
// Тип - ТИп узла шаблона
|
||||||
|
// Наименование - имя узла
|
||||||
|
// Значения - подчиненные узлы
|
||||||
|
//
|
||||||
|
Функция ПрочитатьШаблон(ИмяФайла, РазбиратьБлокиПодстановки = Истина) Экспорт
|
||||||
|
|
||||||
|
ВызватьИсключение "Метод не поддерживается";
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Сохраняет шаблон в файл
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Шаблон - Структура - Данные шаблона
|
||||||
|
// ИмяФайла - Строка - Имя файла шаблона
|
||||||
|
//
|
||||||
|
Процедура ЗаписатьШаблон(Шаблон, ИмяФайла) Экспорт
|
||||||
|
|
||||||
|
ВставлятьИдентификаторЯзыка = (Новый Файл(ИмяФайла)).Расширение = ".code-snippets";
|
||||||
|
|
||||||
|
ДанныеДляЗаписи = СформироватьОбъектШаблона(Шаблон, ВставлятьИдентификаторЯзыка);
|
||||||
|
|
||||||
|
Запись = Новый ЗаписьJSON();
|
||||||
|
Запись.ОткрытьФайл(ИмяФайла);
|
||||||
|
|
||||||
|
ЗаписатьJSON(Запись, ДанныеДляЗаписи);
|
||||||
|
|
||||||
|
Запись.Закрыть();
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
// Возвращает список поддерживаемых типов блоков подстановки
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Массив - Массив строка, элементов перечисления ТипПодстановки
|
||||||
|
//
|
||||||
|
Функция ДоступныеТипыПодстановок() Экспорт
|
||||||
|
|
||||||
|
ДоступныеТипыПодстановок = Новый Массив();
|
||||||
|
|
||||||
|
ДоступныеТипыПодстановок.Добавить(ТипПодстановки.УстановкаКурсора);
|
||||||
|
ДоступныеТипыПодстановок.Добавить(ТипПодстановки.ВыборВарианта);
|
||||||
|
ДоступныеТипыПодстановок.Добавить(ТипПодстановки.ДатаВремя);
|
||||||
|
|
||||||
|
Возврат ДоступныеТипыПодстановок;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Служебный функционал
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Функция СформироватьОбъектШаблона(Шаблон, ВставлятьИдентификаторЯзыка, ШаблонVSCode = Неопределено)
|
||||||
|
|
||||||
|
Если ШаблонVSCode = Неопределено Тогда
|
||||||
|
|
||||||
|
ШаблонVSCode = Новый Соответствие();
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Для Каждого Элемент Из Шаблон.Элементы Цикл
|
||||||
|
|
||||||
|
Если Элемент.Тип = "Группа" Тогда
|
||||||
|
|
||||||
|
СформироватьОбъектШаблона(Элемент, ВставлятьИдентификаторЯзыка, ШаблонVSCode);
|
||||||
|
Продолжить;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ЭлементШаблона = Новый Структура();
|
||||||
|
ЭлементШаблона.Вставить("prefix", Элемент.ТекстЗамены);
|
||||||
|
ЭлементШаблона.Вставить("body", СобратьТекстШаблона(Элемент.Шаблон));
|
||||||
|
ЭлементШаблона.Вставить("description", Элемент.Наименование);
|
||||||
|
|
||||||
|
Если ВставлятьИдентификаторЯзыка Тогда
|
||||||
|
|
||||||
|
ЭлементШаблона.Вставить("scope", "bsl");
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ШаблонVSCode.Вставить(Элемент.Наименование, ЭлементШаблона);
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Возврат ШаблонVSCode;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция СобратьТекстШаблона(ДанныеШаблона)
|
||||||
|
|
||||||
|
Параметры = Новый Структура("Номер", 1);
|
||||||
|
|
||||||
|
Вывод = Новый ЗаписьJSON();
|
||||||
|
Вывод.УстановитьСтроку();
|
||||||
|
|
||||||
|
Для Каждого Элемент Из ДанныеШаблона Цикл
|
||||||
|
|
||||||
|
Если ТипЗнч(Элемент) = Тип("Строка") Тогда
|
||||||
|
|
||||||
|
Вывод.ЗаписатьБезОбработки(Элемент);
|
||||||
|
Продолжить;
|
||||||
|
|
||||||
|
ИначеЕсли Элемент.Тип = ТипПодстановки.УстановкаКурсора Тогда
|
||||||
|
|
||||||
|
Если Элемент.Свойство("Подсказка") Тогда
|
||||||
|
|
||||||
|
Вывод.ЗаписатьБезОбработки(СтрШаблон("${%1:%2}", Параметры.Номер, ОбработатьКавычки(Элемент.Подсказка)));
|
||||||
|
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
Вывод.ЗаписатьБезОбработки(СтрШаблон("$%1", Параметры.Номер));
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ИначеЕсли Элемент.Тип = ТипПодстановки.ВыборВарианта Тогда
|
||||||
|
|
||||||
|
Вывод.ЗаписатьБезОбработки(СтрШаблон("${%1|", Параметры.Номер));
|
||||||
|
|
||||||
|
Первый = Истина;
|
||||||
|
Для Каждого ЭлементВыбора Из Элемент.СписокВыбора Цикл
|
||||||
|
|
||||||
|
Если Первый Тогда
|
||||||
|
Вывод.ЗаписатьБезОбработки(ОбработатьКавычки(ЭлементВыбора.Значение));
|
||||||
|
Первый = Ложь;
|
||||||
|
Иначе
|
||||||
|
Вывод.ЗаписатьБезОбработки("," + ОбработатьКавычки(ЭлементВыбора.Значение));
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Вывод.ЗаписатьБезОбработки("|}");
|
||||||
|
|
||||||
|
ИначеЕсли Элемент.Тип = ТипПодстановки.ДатаВремя Тогда
|
||||||
|
|
||||||
|
Вывод.ЗаписатьБезОбработки(ВыводТекущейДаты(Элемент.Формат));
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Параметры.Номер = Параметры.Номер + 1;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Возврат Вывод.Закрыть();
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ОбработатьКавычки(Знач Текст)
|
||||||
|
|
||||||
|
Текст = СтрЗаменить(Текст, "\""", """");
|
||||||
|
|
||||||
|
Если Лев(Текст, 1) = """" Тогда
|
||||||
|
|
||||||
|
Текст = Сред(Текст, 2, СтрДлина(Текст) - 1);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Если Прав(Текст, 1) = """" Тогда
|
||||||
|
|
||||||
|
Текст = Сред(Текст, 1, СтрДлина(Текст) - 1);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат Текст;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ВыводТекущейДаты(Формат)
|
||||||
|
|
||||||
|
Результат = Формат;
|
||||||
|
Замены = Новый СписокЗначений();
|
||||||
|
Замены.Добавить("dd", "CURRENT_DATE");
|
||||||
|
Замены.Добавить("MM", "CURRENT_MONTH");
|
||||||
|
Замены.Добавить("yyyy", "CURRENT_YEAR");
|
||||||
|
Замены.Добавить("yyy", "CURRENT_YEAR");
|
||||||
|
Замены.Добавить("yy", "CURRENT_YEAR_SHORT");
|
||||||
|
|
||||||
|
Для Каждого Элемент Из Замены Цикл
|
||||||
|
|
||||||
|
Результат = СтрЗаменить(Результат, Элемент.Значение, "$" + Элемент.Представление);
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Возврат Результат;
|
||||||
|
|
||||||
|
КонецФункции
|
49
src/Модули/ШаблоныБазовый.os
Normal file
49
src/Модули/ШаблоныБазовый.os
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Базовые методы для работы с шаблонами
|
||||||
|
//
|
||||||
|
// (с) BIA Technologies, LLC
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Программный интерфейс
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Инициализирует структуру корневого элемента шаблона
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Структура - Описание корневого элемента
|
||||||
|
//
|
||||||
|
Функция КорневойЭлемент() Экспорт
|
||||||
|
|
||||||
|
Возврат Новый Структура("Тип, Наименование, Элементы", "Корень", "Корень", Новый Массив());
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Инициализирует структуру группы шаблона
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Структура - Описание группы шаблона
|
||||||
|
//
|
||||||
|
Функция Группа() Экспорт
|
||||||
|
|
||||||
|
Возврат Новый Структура("Тип, Наименование, Элементы", "Группа", "", Новый Массив());
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Инициализирует структуру элемента шаблона
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Структура - Описание элемента шаблона
|
||||||
|
//
|
||||||
|
Функция Элемент() Экспорт
|
||||||
|
|
||||||
|
Возврат Новый Структура("Тип, Наименование, ТекстЗамены, Шаблон", "Элемент");
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Служебный функционал
|
||||||
|
///////////////////////////////////////////////////////////////////
|
469
src/Модули/ШаблоныКонфигуратора.os
Normal file
469
src/Модули/ШаблоныКонфигуратора.os
Normal file
@ -0,0 +1,469 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Методы работы с шаблонами конфигуратора
|
||||||
|
//
|
||||||
|
// (с) BIA Technologies, LLC
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#Использовать strings
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Программный интерфейс
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Считывает шаблон кода в структуру
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// ИмяФайлаШаблона - Строка - Имя файла шаблона
|
||||||
|
// РазбиратьБлокиПодстановки - Булево - Выполнять ли разбор текста шаблона
|
||||||
|
// Если выполняется объединение/разделение без изменения типа шаблона, то рекомендуется не выполнять анализ текста шаблона
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Структура - Данные шаблона
|
||||||
|
// Тип - ТИп узла шаблона
|
||||||
|
// Наименование - имя узла
|
||||||
|
// Значения - подчиненные узлы
|
||||||
|
//
|
||||||
|
Функция ПрочитатьШаблон(ИмяФайлаШаблона, РазбиратьБлокиПодстановки = Истина) Экспорт
|
||||||
|
|
||||||
|
Читатель = Новый ЧтениеВнутреннийФормат1С();
|
||||||
|
Дерево = Читатель.ПрочитатьФайл(ИмяФайлаШаблона);
|
||||||
|
|
||||||
|
КорневойЭлемент = ШаблоныБазовый.КорневойЭлемент();
|
||||||
|
ПрочитатьУзелШаблона(Дерево.Значения[0], КорневойЭлемент, РазбиратьБлокиПодстановки);
|
||||||
|
|
||||||
|
Возврат КорневойЭлемент.Элементы[0];
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Сохраняет шаблон в файл
|
||||||
|
//
|
||||||
|
// Параметры:
|
||||||
|
// Шаблон - Структура - Данные шаблона
|
||||||
|
// ИмяФайла - Строка - Имя файла шаблона
|
||||||
|
//
|
||||||
|
Процедура ЗаписатьШаблон(Шаблон, ИмяФайла) Экспорт
|
||||||
|
|
||||||
|
Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
|
||||||
|
Запись.ЗаписатьСтроку("{1,");
|
||||||
|
|
||||||
|
ЗаписатьГруппуШаблона(Шаблон, Запись);
|
||||||
|
|
||||||
|
Запись.Записать(Символы.ПС + "}");
|
||||||
|
|
||||||
|
Запись.Закрыть();
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
// Возвращает список поддерживаемых типов блоков подстановки
|
||||||
|
//
|
||||||
|
// Возвращаемое значение:
|
||||||
|
// Массив - Массив строка, элементов перечисления ТипПодстановки
|
||||||
|
//
|
||||||
|
Функция ДоступныеТипыПодстановок() Экспорт
|
||||||
|
|
||||||
|
ДоступныеТипыПодстановок = ТипПодстановки.ВсеТипы();
|
||||||
|
|
||||||
|
Возврат ДоступныеТипыПодстановок;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Служебный функционал
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Чтение
|
||||||
|
|
||||||
|
Функция ПрочитатьУзелШаблона(Знач Элемент, Знач Родитель, РазбиратьБлокиПодстановки)
|
||||||
|
|
||||||
|
КоллекцияЭлементов = Элемент.Значения;
|
||||||
|
|
||||||
|
ЭтоКоллекция = Утилиты.ЭтоЧисло(КоллекцияЭлементов[0]);
|
||||||
|
ЭтоГруппа = НЕ ЭтоКоллекция И КоллекцияЭлементов[1] = "1";
|
||||||
|
ЭтоЭлемент = НЕ ЭтоКоллекция И КоллекцияЭлементов[1] = "0";
|
||||||
|
|
||||||
|
Если ЭтоГруппа Тогда
|
||||||
|
|
||||||
|
ОписаниеЭлемента = ШаблоныБазовый.Группа();
|
||||||
|
ОписаниеЭлемента.Вставить("Наименование", ОбработатьКавычкиПриЧтении(КоллекцияЭлементов[0]));
|
||||||
|
Родитель.Элементы.Добавить(ОписаниеЭлемента);
|
||||||
|
|
||||||
|
Возврат ОписаниеЭлемента;
|
||||||
|
|
||||||
|
ИначеЕсли ЭтоЭлемент Тогда
|
||||||
|
|
||||||
|
ОписаниеЭлемента = ШаблоныБазовый.Элемент();
|
||||||
|
ОписаниеЭлемента.Наименование = ОбработатьКавычкиПриЧтении(КоллекцияЭлементов[0]);
|
||||||
|
ОписаниеЭлемента.ТекстЗамены = Утилиты.УдалитьСимволы(ОбработатьКавычкиПриЧтении(КоллекцияЭлементов[3]), "[]");
|
||||||
|
ОписаниеЭлемента.Вставить("ТекстЗаменыБазовый", ОбработатьКавычкиПриЧтении(КоллекцияЭлементов[3]));
|
||||||
|
|
||||||
|
Если РазбиратьБлокиПодстановки Тогда
|
||||||
|
ОписаниеЭлемента.Шаблон = ПрочитатьСтруктуруТекстаШаблона(ОбработатьКавычкиПриЧтении(КоллекцияЭлементов[4]), 1);
|
||||||
|
Иначе
|
||||||
|
ОписаниеЭлемента.Шаблон = ОбработатьКавычкиПриЧтении(КоллекцияЭлементов[4]);
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Родитель.Элементы.Добавить(ОписаниеЭлемента);
|
||||||
|
|
||||||
|
Возврат ОписаниеЭлемента;
|
||||||
|
|
||||||
|
ИначеЕсли ЭтоКоллекция Тогда
|
||||||
|
|
||||||
|
Для Инд = 1 По КоллекцияЭлементов.ВГраница() Цикл
|
||||||
|
|
||||||
|
Элемент = ПрочитатьУзелШаблона(КоллекцияЭлементов[Инд], Родитель, РазбиратьБлокиПодстановки);
|
||||||
|
|
||||||
|
Если Элемент <> Неопределено И Элемент.Тип = "Группа" Тогда
|
||||||
|
|
||||||
|
Родитель = Элемент;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ПрочитатьСтруктуруТекстаШаблона(Текст, Позиция, ЧитаемВложенныйЭлемент = Ложь)
|
||||||
|
|
||||||
|
ПараметрыЧтения = Новый Структура();
|
||||||
|
ПараметрыЧтения.Вставить("КавычкаОткрыта", Ложь);
|
||||||
|
ПараметрыЧтения.Вставить("БлокЗамены", ЧитаемВложенныйЭлемент);
|
||||||
|
ПараметрыЧтения.Вставить("ПредыдущийСимвол", "");
|
||||||
|
|
||||||
|
ТекущаяСтрока = "";
|
||||||
|
|
||||||
|
ДанныеТекстаШаблона = Новый Массив();
|
||||||
|
ДлиннаСтроки = СтрДлина(Текст);
|
||||||
|
|
||||||
|
Пока Позиция <= ДлиннаСтроки Цикл
|
||||||
|
|
||||||
|
Символ = Сред(Текст, Позиция, 1);
|
||||||
|
|
||||||
|
Позиция = Позиция + 1;
|
||||||
|
|
||||||
|
ПараметрыСимвола = ПолучитьПараметрыСимвола(Символ, ПараметрыЧтения);
|
||||||
|
|
||||||
|
Если ПараметрыСимвола.ФиксацияТекущейСтроки.Фиксировать Тогда
|
||||||
|
|
||||||
|
Если ПараметрыСимвола.ФиксацияТекущейСтроки.УдалитьПрошлыйСимвол Тогда
|
||||||
|
|
||||||
|
СтроковыеФункции.УдалитьПоследнийСимволВСтроке(ТекущаяСтрока);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Если НЕ ПараметрыСимвола.ФиксацияТекущейСтроки.ПроверятьЗаполненность ИЛИ ЗначениеЗаполнено(ТекущаяСтрока) Тогда
|
||||||
|
|
||||||
|
ДобавитьЭлементТекстаШаблон(ДанныеТекстаШаблона, ТекущаяСтрока, ПараметрыЧтения); // Фиксируем то, что было до блока
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ТекущаяСтрока = "";
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Если ПараметрыСимвола.Тип = "НачалоБлокаПодстановки" Тогда
|
||||||
|
|
||||||
|
ВложенныйЭлемент = ПрочитатьСтруктуруТекстаШаблона(Текст, Позиция, Истина);
|
||||||
|
ДобавитьЭлементТекстаШаблон(ДанныеТекстаШаблона, ВложенныйЭлемент, ПараметрыЧтения);
|
||||||
|
|
||||||
|
ИначеЕсли ПараметрыСимвола.Тип = "ОкончаниеБлокаПодстановки" Тогда
|
||||||
|
|
||||||
|
ПараметрыПодстановки = РазобратьПараметрыПодстановки(ДанныеТекстаШаблона);
|
||||||
|
Возврат ПараметрыПодстановки;
|
||||||
|
|
||||||
|
ИначеЕсли ПараметрыСимвола.Тип = "РазделительПараметровБлока" Тогда
|
||||||
|
|
||||||
|
ИначеЕсли ПараметрыСимвола.Тип = "Кавычка" Тогда
|
||||||
|
|
||||||
|
ПараметрыЧтения.КавычкаОткрыта = НЕ ПараметрыЧтения.КавычкаОткрыта;
|
||||||
|
|
||||||
|
ИначеЕсли НЕ ПараметрыСимвола.Тип = "Неизвестный" Тогда
|
||||||
|
|
||||||
|
ВызватьИсключение "Неизвестный тип символа";
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Если ПараметрыСимвола.ЗаписатьВПоток Тогда
|
||||||
|
|
||||||
|
ТекущаяСтрока = ТекущаяСтрока + Символ;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ПараметрыЧтения.ПредыдущийСимвол = Символ;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Если ЗначениеЗаполнено(ТекущаяСтрока) Тогда // Фиксируем последний блок текста
|
||||||
|
|
||||||
|
ДобавитьЭлементТекстаШаблон(ДанныеТекстаШаблона, ТекущаяСтрока, ПараметрыЧтения);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат ДанныеТекстаШаблона;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ПолучитьПараметрыСимвола(Символ, ПараметрыЧтения)
|
||||||
|
|
||||||
|
Параметры = Новый Структура("Тип, ЗаписатьВПоток", "Неизвестный", Истина);
|
||||||
|
Параметры.Вставить("ФиксацияТекущейСтроки", Новый Структура("Фиксировать, ПроверятьЗаполненность, УдалитьПрошлыйСимвол", Ложь, Истина, Ложь));
|
||||||
|
|
||||||
|
Если Символ = "?" И ПараметрыЧтения.ПредыдущийСимвол = "<" Тогда
|
||||||
|
|
||||||
|
Параметры.Тип = "НачалоБлокаПодстановки";
|
||||||
|
Параметры.ЗаписатьВПоток = Ложь;
|
||||||
|
Параметры.ФиксацияТекущейСтроки.Фиксировать = Истина;
|
||||||
|
Параметры.ФиксацияТекущейСтроки.УдалитьПрошлыйСимвол = Истина;
|
||||||
|
|
||||||
|
ИначеЕсли Символ = """" И ПараметрыЧтения.ПредыдущийСимвол <> "\" Тогда
|
||||||
|
|
||||||
|
Параметры.Тип = "Кавычка";
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Если ПараметрыЧтения.КавычкаОткрыта Тогда
|
||||||
|
Возврат Параметры;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Если Символ = ">" И ПараметрыЧтения.БлокЗамены Тогда // Завершение блока замены
|
||||||
|
|
||||||
|
Параметры.Тип = "ОкончаниеБлокаПодстановки";
|
||||||
|
Параметры.ЗаписатьВПоток = Ложь;
|
||||||
|
Параметры.ФиксацияТекущейСтроки.Фиксировать = Истина;
|
||||||
|
|
||||||
|
ИначеЕсли Символ = "," И ПараметрыЧтения.БлокЗамены Тогда
|
||||||
|
|
||||||
|
Параметры.Тип = "РазделительПараметровБлока";
|
||||||
|
Параметры.ЗаписатьВПоток = Ложь;
|
||||||
|
Параметры.ФиксацияТекущейСтроки.Фиксировать = Истина;
|
||||||
|
Параметры.ФиксацияТекущейСтроки.ПроверятьЗаполненность = Ложь;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат Параметры;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Процедура ДобавитьЭлементТекстаШаблон(ДанныеТекстаШаблона, Элемент, ПараметрыЧтения)
|
||||||
|
|
||||||
|
Если ТипЗнч(Элемент) = Тип("Структура") Тогда
|
||||||
|
|
||||||
|
ДанныеТекстаШаблона.Добавить(Элемент);
|
||||||
|
|
||||||
|
ИначеЕсли НЕ ПараметрыЧтения.БлокЗамены Тогда
|
||||||
|
|
||||||
|
ДанныеТекстаШаблона.Добавить(Элемент);
|
||||||
|
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
ДанныеТекстаШаблона.Добавить(СокрЛП(Элемент));
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Функция РазобратьПараметрыПодстановки(Данные)
|
||||||
|
|
||||||
|
Параметры = Новый Структура("Тип", ТипПодстановки.Неизвестный);
|
||||||
|
КоличествоЭлементов = Данные.Количество();
|
||||||
|
|
||||||
|
Если КоличествоЭлементов = 0 Тогда // Пустой блок подстановки - установка курсора
|
||||||
|
|
||||||
|
Параметры.Тип = ТипПодстановки.УстановкаКурсора;
|
||||||
|
Возврат Параметры;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Параметры.Вставить("Подсказка", Данные[0]);
|
||||||
|
|
||||||
|
Если КоличествоЭлементов = 1 Тогда
|
||||||
|
|
||||||
|
Параметры.Тип = ТипПодстановки.УстановкаКурсора;
|
||||||
|
Возврат Параметры;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Тип = Данные[1];
|
||||||
|
|
||||||
|
Если Тип = "ВыборВарианта" Тогда
|
||||||
|
|
||||||
|
Параметры.Тип = ТипПодстановки.ВыборВарианта;
|
||||||
|
|
||||||
|
Параметры.Вставить("СписокВыбора", Новый СписокЗначений());
|
||||||
|
Для Инд = 2 По КоличествоЭлементов - 1 Цикл
|
||||||
|
|
||||||
|
Параметры.СписокВыбора.Добавить(Данные[Инд + 1], Данные[Инд]);
|
||||||
|
Инд = Инд + 1;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
ИначеЕсли Тип = "ДатаВремя" Тогда
|
||||||
|
|
||||||
|
Параметры.Тип = ТипПодстановки.ДатаВремя;
|
||||||
|
Формат = Данные[2];
|
||||||
|
ПозРавно = СтрНайти(Формат, "=");
|
||||||
|
|
||||||
|
Если ПозРавно Тогда
|
||||||
|
ПозТчкЗпт = СтрНайти(Формат, ";", , ПозРавно);
|
||||||
|
ПозТчкЗпт = ?(ПозТчкЗпт = 0, СтрДлина(Формат), ПозТчкЗпт);
|
||||||
|
Формат = Сред(Формат, ПозРавно + 1, ПозТчкЗпт - ПозРавно - 1);
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Параметры.Вставить("Формат", Формат);
|
||||||
|
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
Параметры.Тип = Тип;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат Параметры;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ОбработатьКавычкиПриЧтении(Знач Текст)
|
||||||
|
|
||||||
|
Текст = СтрЗаменить(Текст, """""", """");
|
||||||
|
|
||||||
|
Если Лев(Текст, 1) = """" Тогда
|
||||||
|
|
||||||
|
Текст = Сред(Текст, 2, СтрДлина(Текст) - 1);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Если Прав(Текст, 1) = """" Тогда
|
||||||
|
|
||||||
|
Текст = Сред(Текст, 1, СтрДлина(Текст) - 1);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Возврат Текст;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
// Запись
|
||||||
|
|
||||||
|
Процедура ЗаписатьГруппуШаблона(Данные, Запись)
|
||||||
|
|
||||||
|
// запишем начало блока + количество дочерних элементов
|
||||||
|
Запись.ЗаписатьСтроку(СтрШаблон(
|
||||||
|
"{%1,", Данные.Элементы.Количество()));
|
||||||
|
|
||||||
|
ЗаписатьЗаголовокГруппы(Данные, Запись); // Заголовок блока
|
||||||
|
|
||||||
|
Для Индекс = 0 По Данные.Элементы.ВГраница() Цикл
|
||||||
|
|
||||||
|
Элемент = Данные.Элементы[Индекс];
|
||||||
|
|
||||||
|
Запись.ЗаписатьСтроку(",");
|
||||||
|
|
||||||
|
Если Элемент.Тип = "Группа" Тогда
|
||||||
|
|
||||||
|
ЗаписатьГруппуШаблона(Элемент, Запись);
|
||||||
|
|
||||||
|
Иначе // Элемент
|
||||||
|
|
||||||
|
ЗаписатьЭлементШаблона(Элемент, Запись);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Запись.ЗаписатьСтроку("");
|
||||||
|
Запись.Записать("}"); // Конец блока
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Процедура ЗаписатьЗаголовокГруппы(ОписаниеГруппы, Запись)
|
||||||
|
|
||||||
|
Запись.Записать(СтрШаблон("{""%1"",1,0,"""",""""}", ОписаниеГруппы.Наименование));
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Процедура ЗаписатьЭлементШаблона(ОписаниеЭлемента, Запись)
|
||||||
|
|
||||||
|
Запись.ЗаписатьСтроку("{0,");
|
||||||
|
|
||||||
|
Если ОписаниеЭлемента.Свойство("ТекстЗаменыБазовый") И ЗначениеЗаполнено(ОписаниеЭлемента.ТекстЗаменыБазовый) Тогда
|
||||||
|
ТекстЗамены = ОписаниеЭлемента.ТекстЗаменыБазовый;
|
||||||
|
ИначеЕсли СтрНайти(ОписаниеЭлемента.ТекстЗамены, "[") Тогда
|
||||||
|
ТекстЗамены = ОписаниеЭлемента.ТекстЗамены;
|
||||||
|
Иначе
|
||||||
|
ТекстЗамены = СтрШаблон("%1[%2]", Лев(ОписаниеЭлемента.ТекстЗамены, 1), Сред(ОписаниеЭлемента.ТекстЗамены, 2));
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ТелоШаблон = СобратьТекстШаблона(ОписаниеЭлемента.Шаблон);
|
||||||
|
|
||||||
|
Запись.Записать(СтрШаблон("{""%1"",0,0,""%2"",""%3""}", ОписаниеЭлемента.Наименование, ТекстЗамены, ТелоШаблон));
|
||||||
|
|
||||||
|
Запись.ЗаписатьСтроку("");
|
||||||
|
Запись.Записать("}");
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Функция СобратьТекстШаблона(ДанныеШаблона)
|
||||||
|
|
||||||
|
Если ТипЗнч(ДанныеШаблона) = Тип("Строка") Тогда
|
||||||
|
|
||||||
|
Возврат ОбработатьКавычкиПриЗаписи(ДанныеШаблона);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Вывод = Новый ЗаписьJSON();
|
||||||
|
Вывод.УстановитьСтроку();
|
||||||
|
|
||||||
|
Для Каждого Элемент Из ДанныеШаблона Цикл
|
||||||
|
|
||||||
|
Если ТипЗнч(Элемент) = Тип("Строка") Тогда
|
||||||
|
Вывод.ЗаписатьБезОбработки(ОбработатьКавычкиПриЗаписи(Элемент));
|
||||||
|
Продолжить;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Вывод.ЗаписатьБезОбработки("<?");
|
||||||
|
Если Элемент.Свойство("Подсказка") Тогда
|
||||||
|
Вывод.ЗаписатьБезОбработки(СтрШаблон("""%1""", Элемент.Подсказка));
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Если Элемент.Тип = ТипПодстановки.ВыборВарианта Тогда
|
||||||
|
|
||||||
|
Вывод.ЗаписатьБезОбработки(", ВыборВарианта");
|
||||||
|
|
||||||
|
Для Каждого ЭлементВыбора Из Элемент.СписокВыбора Цикл
|
||||||
|
|
||||||
|
Если ЗначениеЗаполнено(ЭлементВыбора.Представление) Тогда
|
||||||
|
Вывод.ЗаписатьБезОбработки(", " + ЭлементВыбора.Представление);
|
||||||
|
Иначе
|
||||||
|
Вывод.ЗаписатьБезОбработки(", " + ЭлементВыбора.Значение);
|
||||||
|
КонецЕсли;
|
||||||
|
Вывод.ЗаписатьБезОбработки(", " + ЭлементВыбора.Значение);
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
ИначеЕсли Элемент.Тип = ТипПодстановки.ДатаВремя Тогда
|
||||||
|
|
||||||
|
Если Элемент.Свойство("Формат") Тогда
|
||||||
|
Вывод.ЗаписатьБезОбработки(СтрШаблон(", ДатаВремя, """"ДФ=%1""""", Элемент.Формат));
|
||||||
|
Иначе
|
||||||
|
Вывод.ЗаписатьБезОбработки(", ДатаВремя");
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Вывод.ЗаписатьБезОбработки(">");
|
||||||
|
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
Возврат Вывод.Закрыть();
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ОбработатьКавычкиПриЗаписи(Текст)
|
||||||
|
|
||||||
|
Текст = СтрЗаменить(Текст, """", """""");
|
||||||
|
|
||||||
|
Возврат Текст;
|
||||||
|
|
||||||
|
КонецФункции
|
18
tasks/test-feature.os
Normal file
18
tasks/test-feature.os
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#Использовать ".."
|
||||||
|
#Использовать 1bdd
|
||||||
|
|
||||||
|
КаталогФич = ОбъединитьПути(".", "features");
|
||||||
|
ПутьФичи = ОбъединитьПути(".", "features", АргументыКоманднойСтроки[0]);
|
||||||
|
Файл_КаталогФич = Новый Файл(КаталогФич);
|
||||||
|
ФайлФичи = Новый Файл(ПутьФичи);
|
||||||
|
|
||||||
|
ИсполнительБДД = Новый ИсполнительБДД;
|
||||||
|
РезультатВыполнения = ИсполнительБДД.ВыполнитьФичу(ФайлФичи, Файл_КаталогФич);
|
||||||
|
ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатВыполнения);
|
||||||
|
|
||||||
|
Сообщить(ИтоговыйРезультатВыполнения);
|
||||||
|
Если ИтоговыйРезультатВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался Тогда
|
||||||
|
|
||||||
|
ВызватьИсключение 1;
|
||||||
|
|
||||||
|
КонецЕсли;
|
82
tasks/test.os
Normal file
82
tasks/test.os
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#Использовать "../src"
|
||||||
|
#Использовать 1bdd
|
||||||
|
#Использовать 1testrunner
|
||||||
|
|
||||||
|
Функция ПрогнатьТесты()
|
||||||
|
|
||||||
|
Тестер = Новый Тестер;
|
||||||
|
|
||||||
|
ПутьКТестам = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "tests");
|
||||||
|
ПутьКОтчетуJUnit = ОбъединитьПути(ТекущийСценарий().Каталог, "..");
|
||||||
|
|
||||||
|
КаталогТестов = Новый Файл(ПутьКТестам);
|
||||||
|
Если Не КаталогТестов.Существует() Тогда
|
||||||
|
Сообщить(СтрШаблон("Не найден каталог тестов %1", ПутьКТестам));
|
||||||
|
Возврат Истина;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
РезультатТестирования = Тестер.ТестироватьКаталог(
|
||||||
|
КаталогТестов,
|
||||||
|
Новый Файл(ПутьКОтчетуJUnit)
|
||||||
|
);
|
||||||
|
|
||||||
|
Успешно = РезультатТестирования = 0;
|
||||||
|
|
||||||
|
Возврат Успешно;
|
||||||
|
КонецФункции // ПрогнатьТесты()
|
||||||
|
|
||||||
|
Функция ПрогнатьФичи()
|
||||||
|
|
||||||
|
ПутьОтчетаJUnit = "./bdd-log.xml";
|
||||||
|
|
||||||
|
КаталогФич = ОбъединитьПути(".", "features");
|
||||||
|
|
||||||
|
Файл_КаталогФич = Новый Файл(КаталогФич);
|
||||||
|
Если Не Файл_КаталогФич.Существует() Тогда
|
||||||
|
Сообщить(СтрШаблон("Не найден каталог фич %1", КаталогФич));
|
||||||
|
Возврат Истина;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ИсполнительБДД = Новый ИсполнительБДД;
|
||||||
|
РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(Файл_КаталогФич, Файл_КаталогФич);
|
||||||
|
ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения);
|
||||||
|
|
||||||
|
СтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().НеВыполнялся;
|
||||||
|
Если РезультатыВыполнения.Строки.Количество() > 0 Тогда
|
||||||
|
|
||||||
|
СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения);
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit;
|
||||||
|
ГенераторОтчетаJUnit.Сформировать(РезультатыВыполнения, СтатусВыполнения, ПутьОтчетаJUnit);
|
||||||
|
|
||||||
|
Сообщить(СтрШаблон("Результат прогона фич <%1>
|
||||||
|
|", ИтоговыйРезультатВыполнения));
|
||||||
|
|
||||||
|
Возврат ИтоговыйРезультатВыполнения <> ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался;
|
||||||
|
КонецФункции // ПрогнатьФичи()
|
||||||
|
|
||||||
|
Попытка
|
||||||
|
ТестыПрошли = ПрогнатьТесты();
|
||||||
|
|
||||||
|
Исключение
|
||||||
|
ТестыПрошли = Ложь;
|
||||||
|
Сообщить(СтрШаблон("Тесты через 1testrunner выполнены неудачно
|
||||||
|
|%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
|
||||||
|
КонецПопытки;
|
||||||
|
|
||||||
|
Попытка
|
||||||
|
ФичиПрошли = ПрогнатьФичи();
|
||||||
|
Исключение
|
||||||
|
ФичиПрошли = Ложь;
|
||||||
|
Сообщить(СтрШаблон("Тесты поведения через 1bdd выполнены неудачно
|
||||||
|
|%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
|
||||||
|
КонецПопытки;
|
||||||
|
|
||||||
|
Если Не ТестыПрошли Или Не ФичиПрошли Тогда
|
||||||
|
ВызватьИсключение "Тестирование завершилось неудачно!";
|
||||||
|
Иначе
|
||||||
|
Сообщить(СтрШаблон("Результат прогона тестов <%1>
|
||||||
|
|", ТестыПрошли));
|
||||||
|
КонецЕсли;
|
14
tests/fixtures/snippets/ШаблонEDT.xml
vendored
Normal file
14
tests/fixtures/snippets/ШаблонEDT.xml
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<templates>
|
||||||
|
<template autoinsert="true" context="com._1c.g5.v8.dt.bsl.Bsl.AddHandlerStatement" deleted="false" description="DEPRECATED" enabled="true" name="ЗапретитьИспользование">#Если НЕ ВебКлиент Тогда
|
||||||
|
Выполнить(СервисныйОбщегоНазначенияПовтИсп.ЗапретитьИспользованиеФункционала(
|
||||||
|
"${ЗапрещенныйФункционалМетод}", // Запрещенный функционал, метод
|
||||||
|
"${ФункционалДляЗаменыНеобязательно}", // Функционал для замены
|
||||||
|
"${КомментарийПояснениеНеобязательно}", // Комментарий / пояснение
|
||||||
|
${ДатаЗапретаВТестовойНеобязательноВидДатаГГГГММДД}, // Дата запрета в тестовой
|
||||||
|
${ДатаЗапретаВРабочейНеобязательноВидДатаГГГГММДД}) // Дата запрета в рабочей
|
||||||
|
);
|
||||||
|
#КонецЕсли </template>
|
||||||
|
<template autoinsert="true" context="com._1c.g5.v8.dt.bsl.Bsl.AddHandlerStatement" deleted="false" description="Инкремент" enabled="true" name="++">${Операнд} = ${Операнд} + 1;</template>
|
||||||
|
<template autoinsert="true" context="com._1c.g5.v8.dt.bsl.Bsl.AddHandlerStatement" deleted="false" description="ТекущаяДата" enabled="true" name="ТекущаяДата">ТекущаяДата = '${n1:date(dd.MM.yyyy)}';</template>
|
||||||
|
</templates>
|
85
tests/fixtures/snippets/ШаблонКонфигуратора.st
vendored
Normal file
85
tests/fixtures/snippets/ШаблонКонфигуратора.st
vendored
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
{1,
|
||||||
|
{3,
|
||||||
|
{"Тест",1,0,"",""},
|
||||||
|
{0,
|
||||||
|
{"Общий модуль",0,0,"Модуль[Общий]","//⇗ ⇘ ⇙ ⇚ ⇛ ⇜ ⇝ ⇞ ⇟ ⇠ ⇡ ⇢ ⇣ ⇤ ⇥ ⇦ ⇧ ⇨ ⇩ ⇪ ⇫ ⇬ ⇭ ⇮ ⇯ ⇰ ⇱ ⇲ ⇳ ⇴ ⇵ ⇶ ⇷ ⇸ ⇹ ⇺ //
|
||||||
|
//
|
||||||
|
// © ООО ""Моя компания"" (My company). 1234-5678.
|
||||||
|
// Все права защищены.
|
||||||
|
//
|
||||||
|
// Все торговые марки являются собственностью их правообладателей.
|
||||||
|
//
|
||||||
|
// Настоящий результат интеллектуальной деятельности является собственностью
|
||||||
|
// ООО ""Моя компания"" (UID 337c95d2-d846-4822-8cb4-79abc804dd95), и только
|
||||||
|
// ее, а не кого-то иного.
|
||||||
|
//
|
||||||
|
// Любые действия (бездействие, наплевательского отношение, порча имущества),
|
||||||
|
// направленные на использование (неиспользование, отрицание) настоящего
|
||||||
|
// результата интеллектуальной (и не очень) деятельности, включая
|
||||||
|
// (но не ограничиваясь) изучение, исследование, курение, медитацию, поиск кошек
|
||||||
|
// в темной комнате, испытание его функционирования; воспроизводство
|
||||||
|
// и преобразование объектного кода в исходный текст (это так юридически
|
||||||
|
// зовется декомпилирование); смотрение и использование; еще какой-то бред;
|
||||||
|
// результата интеллектуальной деятельности с иным программным обеспечением,
|
||||||
|
// возможны только с предварительного согласия правообладателя (побожиться).
|
||||||
|
//
|
||||||
|
// Нарушение прав ООО ""Моя компания"" на данный результат интеллектуальной
|
||||||
|
// деятельности будет преследоваться и пресекаться правообладателем
|
||||||
|
// в соответствии с законом, а если не получится, то караться в соответствии с
|
||||||
|
// моральными принципами и устоями конкретного безумца.
|
||||||
|
//
|
||||||
|
//ℋ ℌ ℍ ℎ ℏ ℐ ℑ ℒ ℓ ℔ ℕ № ℗ ℘ ℙ ℚ ℛ ℜ ℝ ℞ ℟ ℠ ℡ ™ ℣ ℤ ℥ Ω ℧ ℨ ℩ K Å ℬ ℭ ℮ ℯ ℰ ℱ//
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// <?""Заголовок модуля: краткое описание и условия применения модуля.>"">
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Экспортные процедуры и функции, предназначенные для использования другими
|
||||||
|
// объектами конфигурации или другими программами
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#Область ПрограммныйИнтерфейс
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Экспортные процедуры и функции для служебного использования внутри подсистемы
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#Область СлужебныйПрограммныйИнтерфейс
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Процедуры и функции, составляющие внутреннюю реализацию модуля
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#Область СлужебныеПроцедурыИФункции
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
"}
|
||||||
|
},
|
||||||
|
{2,
|
||||||
|
{"Группа",1,0,"",""},
|
||||||
|
{0,
|
||||||
|
{"DEPRECATED",0,0,"Запре[титьИспользование]","#Если НЕ ВебКлиент Тогда
|
||||||
|
Выполнить(СервисныйОбщегоНазначенияПовтИсп.ЗапретитьИспользованиеФункционала(
|
||||||
|
""<?""Запрещенный функционал, метод"">"", // Запрещенный функционал, метод
|
||||||
|
""<?""Функционал для замены (необязательно)"">"", // Функционал для замены
|
||||||
|
""<?""Комментарий / пояснение (необязательно)"">"", // Комментарий / пояснение
|
||||||
|
<?""Дата запрета в тестовой (необязательно, вид Дата(ГГГГ, ММ, ДД))"">, // Дата запрета в тестовой
|
||||||
|
<?""Дата запрета в рабочей (необязательно, вид Дата(ГГГГ, ММ, ДД))"">) // Дата запрета в рабочей
|
||||||
|
);
|
||||||
|
#КонецЕсли "}
|
||||||
|
},
|
||||||
|
{0,
|
||||||
|
{"Инкремент",0,0,"++","<?""Операнд""> = <?""Операнд""> + 1;"}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{0,
|
||||||
|
{"Пустая группа",1,0,"",""}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
tests/fixtures/snippets/ШаблонКонфигуратораСНеподдерживаемымиТипами.st
vendored
Normal file
18
tests/fixtures/snippets/ШаблонКонфигуратораСНеподдерживаемымиТипами.st
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{1,
|
||||||
|
{3,
|
||||||
|
{"ЧастичноПоддерживаемыйФункционал",1,0,"",""},
|
||||||
|
{0,
|
||||||
|
{"#Если",0,0,"№Ес[ли]","#Если <?"""", ВыборВарианта, ""Клиент"", ""Клиент"", ""Сервер"", ""Сервер"", ""ВнешнееСоединение"", ""ВнешнееСоединение"" ,""ТолстыйКлиентОбычноеПриложение"", ""ТолстыйКлиентОбычноеПриложение"", ""ТолстыйКлиентУправляемоеПриложение"",""ТолстыйКлиентУправляемоеПриложение"", ""ТонкийКлиент"", ""ТонкийКлиент"", ""ВебКлиент"", ""ВебКлиент""> Тогда
|
||||||
|
|
||||||
|
<?>
|
||||||
|
|
||||||
|
#КонецЕсли"}
|
||||||
|
},
|
||||||
|
{0,
|
||||||
|
{"Формат",0,0,"Формат","Формат(<?>, ""<?, ФорматнаяСтрока>"")"}
|
||||||
|
},
|
||||||
|
{0,
|
||||||
|
{"УстановитьЗначениеКонстанты",0,0,"УстановитьЗнач[ениеКонстанты]","ОбщегоНазначенияСервер.УстановитьЗначениеКонстанты(""<?""Выберите константу"", Константа>"", <?>);"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
133
tests/ТестированиеОбработкаШаблоновКонфигуратора.os
Normal file
133
tests/ТестированиеОбработкаШаблоновКонфигуратора.os
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Тестирование основной функциональности пакета
|
||||||
|
// Проверка на соответствие выгрузки эталону
|
||||||
|
//
|
||||||
|
// (с) BIA Technologies, LLC
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#Использовать asserts
|
||||||
|
#Использовать tempfiles
|
||||||
|
#Использовать ".."
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Перем МенеджерВременныхФайлов;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Программный интерфейс
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Функция ПолучитьСписокТестов(Знач ЮнитТестирование) Экспорт
|
||||||
|
|
||||||
|
МассивТестов = Новый Массив;
|
||||||
|
МассивТестов.Добавить("ТестПрочитатьШаблон");
|
||||||
|
МассивТестов.Добавить("ТестЗаписатьШаблон");
|
||||||
|
МассивТестов.Добавить("ТестПрочитатьИЗаписатьШаблон");
|
||||||
|
|
||||||
|
Возврат МассивТестов;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Процедура ПередЗапускомТеста() Экспорт
|
||||||
|
|
||||||
|
МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Процедура ПослеЗапускаТеста() Экспорт
|
||||||
|
|
||||||
|
МенеджерВременныхФайлов.Удалить();
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Шаги
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Процедура ТестПрочитатьШаблон() Экспорт
|
||||||
|
|
||||||
|
Шаблон = ШаблоныКонфигуратора.ПрочитатьШаблон(ОбъединитьПути(КаталогФикстур(), "snippets", "ШаблонКонфигуратора.st"));
|
||||||
|
|
||||||
|
Утверждения.ПроверитьРавенство(Шаблон.Элементы.Количество(), 3, "Количество элементов шаблона равно 3");
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Процедура ТестЗаписатьШаблон() Экспорт
|
||||||
|
|
||||||
|
Шаблон = ШаблоныБазовый.КорневойЭлемент();
|
||||||
|
|
||||||
|
Группа = ШаблоныБазовый.Группа();
|
||||||
|
Группа.Наименование = "Группа";
|
||||||
|
Шаблон.Элементы.Добавить(Группа);
|
||||||
|
|
||||||
|
Элемент = ШаблоныБазовый.Элемент();
|
||||||
|
Элемент.Наименование = "Сообщить";
|
||||||
|
Элемент.ТекстЗамены = "Соо[бщить]";
|
||||||
|
Элемент.Шаблон = "Сообщить();";
|
||||||
|
Шаблон.Элементы.Добавить(Элемент);
|
||||||
|
|
||||||
|
Элемент = ШаблоныБазовый.Элемент();
|
||||||
|
Элемент.Наименование = "Сообщить2";
|
||||||
|
Элемент.ТекстЗамены = "Соо[бщить2]";
|
||||||
|
Элемент.Шаблон = "Сообщить(2);";
|
||||||
|
Группа.Элементы.Добавить(Элемент);
|
||||||
|
|
||||||
|
ИмяФайла = МенеджерВременныхФайлов.НовоеИмяФайла("st");
|
||||||
|
ШаблоныКонфигуратора.ЗаписатьШаблон(Шаблон, ИмяФайла);
|
||||||
|
|
||||||
|
ТекстФайла = ПрочитатьФайл(ИмяФайла);
|
||||||
|
|
||||||
|
Эталон =
|
||||||
|
"{1,
|
||||||
|
|{2,
|
||||||
|
|{""Корень"",1,0,"""",""""},
|
||||||
|
|{1,
|
||||||
|
|{""Группа"",1,0,"""",""""},
|
||||||
|
|{0,
|
||||||
|
|{""Сообщить2"",0,0,""Соо[бщить2]"",""Сообщить(2);""}
|
||||||
|
|}
|
||||||
|
|},
|
||||||
|
|{0,
|
||||||
|
|{""Сообщить"",0,0,""Соо[бщить]"",""Сообщить();""}
|
||||||
|
|}
|
||||||
|
|}
|
||||||
|
|}";
|
||||||
|
Утверждения.ПроверитьРавенство(ТекстФайла, Эталон, "Текст шаблона не соответствует ожидаемому");
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
Процедура ТестПрочитатьИЗаписатьШаблон() Экспорт
|
||||||
|
|
||||||
|
ИмяБазовогоШаблона = ОбъединитьПути(КаталогФикстур(), "snippets", "ШаблонКонфигуратора.st");
|
||||||
|
ИмяНовогоШаблона = МенеджерВременныхФайлов.НовоеИмяФайла("st");
|
||||||
|
|
||||||
|
Шаблон = ШаблоныКонфигуратора.ПрочитатьШаблон(ИмяБазовогоШаблона);
|
||||||
|
|
||||||
|
ШаблоныКонфигуратора.ЗаписатьШаблон(Шаблон, ИмяНовогоШаблона);
|
||||||
|
|
||||||
|
Утверждения.ПроверитьРавенство(ПрочитатьФайл(ИмяБазовогоШаблона), ПрочитатьФайл(ИмяНовогоШаблона), "Текст шаблона не должен измениться");
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
// Служебный функционал
|
||||||
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Функция КаталогФикстур()
|
||||||
|
|
||||||
|
Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", "tests", "fixtures");
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ПрочитатьФайл(Файл)
|
||||||
|
|
||||||
|
Чтение = Новый ЧтениеТекста(Файл, КодировкаТекста.UTF8NoBOM);
|
||||||
|
Текст = Чтение.Прочитать();
|
||||||
|
Чтение.Закрыть();
|
||||||
|
|
||||||
|
Возврат Текст;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
76
ПодключениеШаблонов.md
Normal file
76
ПодключениеШаблонов.md
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
# Инструкция по подключению шаблонов кода
|
||||||
|
|
||||||
|
## Подключение к VS Code
|
||||||
|
|
||||||
|
Есть несколько вариантов подключения шаблонов(фрагментов) кода к VS Code
|
||||||
|
|
||||||
|
1. Редактирования файла шаблонов конкретного языка, для 1c это файл bsl.json
|
||||||
|
Для этого необходимо выполнить команду (нажав Ctrl+P) "Настроить пользовательские фрагменты кода" и выбрав в списке языков "BSL"
|
||||||
|
|
||||||
|
2. Создание глобальных файлов шаблонов, которые могут в себя включать различные языки.
|
||||||
|
Для этого необходимо выполнить команду (нажав Ctrl+P) "Настроить пользовательские фрагменты кода" и выбрать "Новый файл с глобальным фрагментом кода"
|
||||||
|
|
||||||
|
3. Можно руками создавать файлы с расширением "code-snippets" в каталоге "%appdata%\Code\User\snippets", это эквивалентно второму варианту.
|
||||||
|
|
||||||
|
Основное отличие первого и второго вариантов в том, что по первому варианту может быть только один файл. Для второго - множество, но в нем придется указывать язык для каждого шаблона замены для какого он языка.
|
||||||
|
Третий - тоже самое, что и второй, но руками.
|
||||||
|
|
||||||
|
### Как писать шаблоны VSCode
|
||||||
|
|
||||||
|
Шаблон - это JSON файл.
|
||||||
|
Он не поддерживает иерархии и групп.
|
||||||
|
Все шаблоны - это свойства корневого элемента.
|
||||||
|
|
||||||
|
* Имя свойства - имя шаблона, должно быть уникальным.
|
||||||
|
* prefix - заменяемая строка
|
||||||
|
* body - тело шаблона
|
||||||
|
* description - описание шаблона, отображается если заполнено и не равно имени
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"DEPRECATED": {
|
||||||
|
"prefix": "ЗапретитьИспользование",
|
||||||
|
"body": "#Если НЕ ВебКлиент Тогда\n\tВыполнить(СервисныйОбщегоНазначенияПовтИсп.ЗапретитьИспользованиеФункционала(\n\t\t\"${1:Запрещенный функционал, метод}\", \/\/ Запрещенный функционал, метод\n\t\t\"${2:Функционал для замены (необязательно)}\", \/\/ Функционал для замены\n\t\t\"${3:Комментарий \/ пояснение (необязательно)}\", \/\/ Комментарий \/ пояснение\n\t\t${4:Дата запрета в тестовой (необязательно, вид Дата(ГГГГ, ММ, ДД))}, \/\/ Дата запрета в тестовой\n\t\t${5:Дата запрета в рабочей (необязательно, вид Дата(ГГГГ, ММ, ДД))}) \/\/ Дата запрета в рабочей\n\t\t);\n#КонецЕсли ",
|
||||||
|
"description": "DEPRECATED"
|
||||||
|
},
|
||||||
|
"Инкремент": {
|
||||||
|
"prefix": "++",
|
||||||
|
"body": "${1:Операнд} = ${2:Операнд} + 1;",
|
||||||
|
"description": "Инкремент"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
В поле `body` (тело шаблона) можно использовать подстановочные символы
|
||||||
|
|
||||||
|
* $1, $2... - места остановки для ввода текста
|
||||||
|
* $0 - установка курсора по окончании ввода шаблона
|
||||||
|
* ${1:Операнд} - места остановки для ввода текста со значением по умолчанию
|
||||||
|
|
||||||
|
Например `Сообщить("${1:Тест сообщения}");`
|
||||||
|
Для ввода многострочного шаблона необходимо использовать спецсимволы `\n`, либо оформлять тело как массив строк.
|
||||||
|
|
||||||
|
Также можно использовать шаблон выбора и различные переменные, подробнее [здесь](https://code.visualstudio.com/docs/editor/userdefinedsnippets)
|
||||||
|
|
||||||
|
## Подключение шаблонов EDT
|
||||||
|
|
||||||
|
Заходим в настройки шаблонов:
|
||||||
|
|
||||||
|
1. Меню → Окно → Параметры → V8 → Встроенный язык → Макеты
|
||||||
|
2. Быстрый доступ (Ctrl+3), набираем "параметры макеты"
|
||||||
|
|
||||||
|
Откроется окно работы с шаблонами. В нем есть возможность создавать новые, редактировать существующие и импортировать шаблоны
|
||||||
|
|
||||||
|
### Создание
|
||||||
|
|
||||||
|
1. Нажимаем создать
|
||||||
|
2. Не меняем поле контекст!
|
||||||
|
3. Указываем имя, оно будет использоваться для поиска шаблона
|
||||||
|
4. Заполняем описание
|
||||||
|
5. Заполняем поле шаблон
|
||||||
|
|
||||||
|
В тексте шаблона можно использовать подстановочные символы
|
||||||
|
|
||||||
|
* ${} - места остановки для ввода текста
|
||||||
|
* ${имя_переменной} - места остановки для ввода текста, имя переменной является значение по-умолчанию, также если в шаблоне переменная используется несколько раз, то значение будет установлено для всех мест
|
||||||
|
* ${cursor} - установка курсора по окончании ввода шаблона
|
Reference in New Issue
Block a user