diff --git a/packagedef b/packagedef index 4192fc5..1f11076 100644 --- a/packagedef +++ b/packagedef @@ -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") diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275.os" index e692e59..18b6b88 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275.os" @@ -1,7 +1,6 @@ Перем КодВыполнения; Перем ЧастиШаблона; -Перем РамкиБлоков; -Перем СоответствияРамокБлоков; +Перем РегулярноеВыражение; Перем ТекстШаблона; @@ -9,65 +8,58 @@ ТекстШаблона = Текст; - РамкиБлоков = Новый Структура(); - РамкиБлоков.Вставить("НачалоВыражения", МассивИзДвухСимволов("{", "{")); - РамкиБлоков.Вставить("ОкончаниеВыражения", МассивИзДвухСимволов("}", "}")); - РамкиБлоков.Вставить("НачалоОператора", МассивИзДвухСимволов("{", "%")); - РамкиБлоков.Вставить("ОкончаниеОператора", МассивИзДвухСимволов("%", "}")); + РегулярноеВыражение = Новый РегулярноеВыражение("(\{\{[^}]+\}\})|(\{%[^%]+%\})"); - СоответствияРамокБлоков = Новый Соответствие; - СоответствияРамокБлоков.Вставить(СтрСоединить(РамкиБлоков.НачалоВыражения, ""), РамкиБлоков.ОкончаниеВыражения); - СоответствияРамокБлоков.Вставить(СтрСоединить(РамкиБлоков.НачалоОператора, ""), РамкиБлоков.ОкончаниеОператора); - - -КонецПроцедуры - -Процедура ИнициализацияПеременных() - - КодВыполнения = Новый Массив(); - ЧастиШаблона = Новый Соответствие(); + ПодготовитьКодШаблона(); КонецПроцедуры -Функция СформироватьТекст(Контекст = Неопределено) Экспорт +Процедура ПодготовитьКодШаблона() ИнициализацияПеременных(); - - БлокПоиска = Новый Массив(2); - ТекущийПоток = Новый Массив; + Совпадения = РегулярноеВыражение.НайтиСовпадения(ТекстШаблона); - ИскомоеОкочание = Неопределено; + Позиция = 1; - Для Сч = 1 по СтрДлина(ТекстШаблона) Цикл - ТекущийСимвол = Сред(ТекстШаблона, Сч, 1); - ДобавитьВМассивСоСмещением(БлокПоиска, ТекущийСимвол); - - Если МассивыРавны(БлокПоиска, РамкиБлоков.НачалоВыражения) - или МассивыРавны(БлокПоиска, РамкиБлоков.НачалоОператора) Тогда - Ид = ДобавитьЧастьШаблона(ТекущийПоток); - ТекущийПоток = Новый Массив; - ИскомоеОкочание = ПолучитьЗакрывающийТег(БлокПоиска); + Для Каждого Совпадение из Совпадения Цикл + ТекущаяПозиция = Совпадение.Индекс + 1; + Если ТекущаяПозиция > Позиция Тогда + Ид = ДобавитьЧастьШаблона(Сред(ТекстШаблона, Позиция, ТекущаяПозиция - Позиция)); ЧастьКодаВставкаЧастиШаблона(Ид); + КонецЕсли; - ИначеЕсли Не ИскомоеОкочание = Неопределено - И МассивыРавны(БлокПоиска, ИскомоеОкочание) Тогда - ЧастьКода = СтрокаИзМассива(ТекущийПоток); - ТекущийПоток = Новый Массив; - ДобавитьЧастьКодаОтОкочания(ЧастьКода, ИскомоеОкочание); - ИскомоеОкочание = Неопределено; + ДобавитьЧастьКода(Сред(Совпадение.Значение, 3, Совпадение.Длина - 4), + ЭтоВыражение(Совпадение.Значение)); + + Позиция = ТекущаяПозиция + Совпадение.Длина; - Иначе - ТекущийПоток.Добавить(ТекущийСимвол); - КонецЕсли; КонецЦикла; - Если ТекущийПоток.Количество() > 0 Тогда - ТекущийПоток.Добавить(" "); - Ид = ДобавитьЧастьШаблона(ТекущийПоток); + ДлинаТекста = СтрДлина(ТекстШаблона) + 1; + + Если Позиция < ДлинаТекста Тогда + Ид = ДобавитьЧастьШаблона(Прав(ТекстШаблона, ДлинаТекста - Позиция)); ЧастьКодаВставкаЧастиШаблона(Ид); КонецЕсли; +КонецПроцедуры + +Функция ЭтоВыражение(Текст) + Возврат СтрНачинаетсяС(Текст, "{{"); +КонецФункции + +Процедура ИнициализацияПеременных() + + КодВыполнения = Новый Массив(); + ЧастиШаблона = Новый Соответствие(); + +КонецПроцедуры + + +Функция СформироватьТекст(Контекст = Неопределено) Экспорт + + Результат = Новый Массив; ЗаполнитьМассивКодом(Результат, Контекст); @@ -88,9 +80,9 @@ КонецПроцедуры -Процедура ДобавитьЧастьКодаОтОкочания(ЧастьКода, Окончание) +Процедура ДобавитьЧастьКода(ЧастьКода, ЭтоВыражение) - Если Окончание = РамкиБлоков.ОкончаниеВыражения Тогда + Если ЭтоВыражение Тогда КодКДобавлению = СтрШаблон("_Значение = Строка(%1); |Результат.Добавить(_Значение);", ЧастьКода); КодВыполнения.Добавить(КодКДобавлению + Символы.ПС); @@ -107,9 +99,8 @@ КонецПроцедуры -Функция ДобавитьЧастьШаблона(МассивСимволов) +Функция ДобавитьЧастьШаблона(Строка) - Строка = СтрокаИзМассива(МассивСимволов); Ид = ХешироватьСтроку(Строка); ЧастиШаблона.Вставить(Ид, Строка); @@ -118,12 +109,6 @@ КонецФункции -Функция СтрокаИзМассива(МассивСимволов) - МассивСимволов.Удалить(МассивСимволов.ВГраница()); - Строка = СтрСоединить(МассивСимволов, ""); - Возврат Строка; -КонецФункции - Функция ХешироватьСтроку(Строка) Хеширование = Новый ХешированиеДанных(ХешФункция.MD5); @@ -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]; - КонецЦикла; - - Массив[Массив.ВГраница()] = ДобавляемыйЭлемент; - -КонецПроцедуры - Функция ВывестиПоШаблону(ТекстШаблона, Контекст) ВложенныйШаблон = НовыйЭкземплярШаблона(ТекстШаблона); diff --git a/tests/template.os b/tests/template.os index 103941d..aed01b0 100644 --- a/tests/template.os +++ b/tests/template.os @@ -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"); + КонецПроцедуры \ No newline at end of file