Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@


Описание.Имя("JinjOS")
.Версия("1.0.0")
.Версия("1.1.0")
.Автор("nikita ivanchenko")
.АдресАвтора("https://github.com/Nivanchenko")
.Описание("JinjOS - шаблонизатор, вдохновленный Jinja2")
.ВерсияСреды("1.9.0")
.ВерсияСреды("1.9.2")
.ВключитьФайл("src")
.РазработкаЗависитОт("1testrunner")
.РазработкаЗависитОт("asserts")
Expand Down
142 changes: 39 additions & 103 deletions src/Классы/Шаблон.os
Original file line number Diff line number Diff line change
@@ -1,73 +1,65 @@
Перем КодВыполнения;
Перем ЧастиШаблона;
Перем РамкиБлоков;
Перем СоответствияРамокБлоков;
Перем РегулярноеВыражение;

Перем ТекстШаблона;

Процедура ПриСозданииОбъекта(Текст)

ТекстШаблона = Текст;

РамкиБлоков = Новый Структура();
РамкиБлоков.Вставить("НачалоВыражения", МассивИзДвухСимволов("{", "{"));
РамкиБлоков.Вставить("ОкончаниеВыражения", МассивИзДвухСимволов("}", "}"));
РамкиБлоков.Вставить("НачалоОператора", МассивИзДвухСимволов("{", "%"));
РамкиБлоков.Вставить("ОкончаниеОператора", МассивИзДвухСимволов("%", "}"));
РегулярноеВыражение = Новый РегулярноеВыражение("(\{\{[^}]+\}\})|(\{%[^%]+%\})");

СоответствияРамокБлоков = Новый Соответствие;
СоответствияРамокБлоков.Вставить(СтрСоединить(РамкиБлоков.НачалоВыражения, ""), РамкиБлоков.ОкончаниеВыражения);
СоответствияРамокБлоков.Вставить(СтрСоединить(РамкиБлоков.НачалоОператора, ""), РамкиБлоков.ОкончаниеОператора);


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

Процедура ИнициализацияПеременных()

КодВыполнения = Новый Массив();
ЧастиШаблона = Новый Соответствие();
ПодготовитьКодШаблона();

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

Функция СформироватьТекст(Контекст = Неопределено) Экспорт
Процедура ПодготовитьКодШаблона()

ИнициализацияПеременных();

БлокПоиска = Новый Массив(2);
ТекущийПоток = Новый Массив;

Совпадения = РегулярноеВыражение.НайтиСовпадения(ТекстШаблона);

ИскомоеОкочание = Неопределено;
Позиция = 1;

Для Сч = 1 по СтрДлина(ТекстШаблона) Цикл
ТекущийСимвол = Сред(ТекстШаблона, Сч, 1);
ДобавитьВМассивСоСмещением(БлокПоиска, ТекущийСимвол);

Если МассивыРавны(БлокПоиска, РамкиБлоков.НачалоВыражения)
или МассивыРавны(БлокПоиска, РамкиБлоков.НачалоОператора) Тогда
Ид = ДобавитьЧастьШаблона(ТекущийПоток);
ТекущийПоток = Новый Массив;
ИскомоеОкочание = ПолучитьЗакрывающийТег(БлокПоиска);
Для Каждого Совпадение из Совпадения Цикл
ТекущаяПозиция = Совпадение.Индекс + 1;
Если ТекущаяПозиция > Позиция Тогда
Ид = ДобавитьЧастьШаблона(Сред(ТекстШаблона, Позиция, ТекущаяПозиция - Позиция));
ЧастьКодаВставкаЧастиШаблона(Ид);
КонецЕсли;

ИначеЕсли Не ИскомоеОкочание = Неопределено
И МассивыРавны(БлокПоиска, ИскомоеОкочание) Тогда
ЧастьКода = СтрокаИзМассива(ТекущийПоток);
ТекущийПоток = Новый Массив;
ДобавитьЧастьКодаОтОкочания(ЧастьКода, ИскомоеОкочание);
ИскомоеОкочание = Неопределено;
ДобавитьЧастьКода(Сред(Совпадение.Значение, 3, Совпадение.Длина - 4),
ЭтоВыражение(Совпадение.Значение));

Позиция = ТекущаяПозиция + Совпадение.Длина;

Иначе
ТекущийПоток.Добавить(ТекущийСимвол);
КонецЕсли;
КонецЦикла;

Если ТекущийПоток.Количество() > 0 Тогда
ТекущийПоток.Добавить(" ");
Ид = ДобавитьЧастьШаблона(ТекущийПоток);
ДлинаТекста = СтрДлина(ТекстШаблона) + 1;

Если Позиция < ДлинаТекста Тогда
Ид = ДобавитьЧастьШаблона(Прав(ТекстШаблона, ДлинаТекста - Позиция));
ЧастьКодаВставкаЧастиШаблона(Ид);
КонецЕсли;

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

Функция ЭтоВыражение(Текст)
Возврат СтрНачинаетсяС(Текст, "{{");
КонецФункции

Процедура ИнициализацияПеременных()

КодВыполнения = Новый Массив();
ЧастиШаблона = Новый Соответствие();

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


Функция СформироватьТекст(Контекст = Неопределено) Экспорт


Результат = Новый Массив;

ЗаполнитьМассивКодом(Результат, Контекст);
Expand All @@ -88,9 +80,9 @@

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

Процедура ДобавитьЧастьКодаОтОкочания(ЧастьКода, Окончание)
Процедура ДобавитьЧастьКода(ЧастьКода, ЭтоВыражение)

Если Окончание = РамкиБлоков.ОкончаниеВыражения Тогда
Если ЭтоВыражение Тогда
КодКДобавлению = СтрШаблон("_Значение = Строка(%1);
|Результат.Добавить(_Значение);", ЧастьКода);
КодВыполнения.Добавить(КодКДобавлению + Символы.ПС);
Expand All @@ -107,9 +99,8 @@

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

Функция ДобавитьЧастьШаблона(МассивСимволов)
Функция ДобавитьЧастьШаблона(Строка)

Строка = СтрокаИзМассива(МассивСимволов);
Ид = ХешироватьСтроку(Строка);

ЧастиШаблона.Вставить(Ид, Строка);
Expand All @@ -118,12 +109,6 @@

КонецФункции

Функция СтрокаИзМассива(МассивСимволов)
МассивСимволов.Удалить(МассивСимволов.ВГраница());
Строка = СтрСоединить(МассивСимволов, "");
Возврат Строка;
КонецФункции

Функция ХешироватьСтроку(Строка)

Хеширование = Новый ХешированиеДанных(ХешФункция.MD5);
Expand All @@ -134,55 +119,6 @@

КонецФункции

Функция МассивИзДвухСимволов(Символ1, Символ2)

Массив = Новый Массив(2);
Массив[0] = Символ1;
Массив[1] = Символ2;

Возврат Массив;

КонецФункции

Функция ПолучитьЗакрывающийТег(ОткрывающийТег)

Возврат СоответствияРамокБлоков.Получить(СтрСоединить(ОткрывающийТег,""));

КонецФункции

Функция МассивыРавны(Массив1, Массив2)

Если не Массив1.Количество() = Массив2.Количество() Тогда
Возврат Ложь;
Иначе
Для сч = 0 По Массив1.ВГраница() Цикл
Если Не Массив1[сч] = Массив2[сч] Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
КонецЕсли;

Возврат Истина;

КонецФункции

Процедура ДобавитьВМассивСоСмещением(Массив, ДобавляемыйЭлемент)

Если Массив.Количество() = 1 Тогда
Массив[0] = ДобавляемыйЭлемент;
Возврат;
ИначеЕсли Массив.Количество() = 0 Тогда
ВызватьИсключение "Пустой массив для смещения";
КонецЕсли;

Для сч = 0 по Массив.ВГраница() - 1 Цикл
Массив[сч] = Массив[сч + 1];
КонецЦикла;

Массив[Массив.ВГраница()] = ДобавляемыйЭлемент;

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

Функция ВывестиПоШаблону(ТекстШаблона, Контекст)

ВложенныйШаблон = НовыйЭкземплярШаблона(ТекстШаблона);
Expand Down
45 changes: 45 additions & 0 deletions tests/template.os
Original file line number Diff line number Diff line change
Expand Up @@ -120,4 +120,49 @@
// Тогда
Ожидаем.Что(Результат).Равно("123");

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

&Тест
Процедура ШаблонНачинаетсяСШаблона() Экспорт
// Дано
Шаблон = Новый Шаблон("{{1}}2{{3}}4");

// Когда
Результат = Шаблон.СформироватьТекст();

// Тогда
Ожидаем.Что(Результат).Равно("1234");

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

&Тест
Процедура ШаблонНачинаетсяСТекста() Экспорт
// Дано
Шаблон = Новый Шаблон("1{{2}}3{{4}}");

// Когда
Результат = Шаблон.СформироватьТекст();

// Тогда
Ожидаем.Что(Результат).Равно("1234");

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

&Тест
Процедура ПереиспользованиеШаблона() Экспорт
// Дано
Шаблон = Новый Шаблон("1{{Контекст.Переменная}}3");

Контекст = Новый Структура("Переменная", 2);
Контекст2 = Новый Структура("Переменная", 5);

// Когда
Результат1 = Шаблон.СформироватьТекст(Контекст);
Результат2 = Шаблон.СформироватьТекст(Контекст2);

// Тогда
Ожидаем.Что(Результат1).Равно("123");

Ожидаем.Что(Результат2).Равно("153");

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