powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Template engine
25 сообщений из 36, страница 1 из 2
Template engine
    #39508959
LVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LVA
Гость
Добрый день.
Нужен Template engine для java, не заточенный для WEB.
Нужен для формирования сообщений по различным каналам (СМС, E-mail, соц. сети и т.п.)

Движок должен поддерживать арифметические операции, форматирование (числа, даты), вложенные шаблоны, загрузчик шаблонов из произвольного хранилища (не только файлы). Также ветвления, работу со списками (массивами). Но, в принципе, готов рассмотреть и легковесный, типа Mustache.

Но самое основное требование - движок должен уметь определить по шаблону (включая вложенные шаблоны) список переменных, которые нужны для формирования Data Model. Есть ветвление, то надо собрать переменные по всем веткам (то есть все, что есть в шаблоне).

Уже посмотрел FreeMarker, Velocity, Mustache ... но, увы, ни один из них не позволяет получить список переменных на этапе разбора шаблона. Они все работают так: уже на этапе шаблонизации, когда известна DataModel, если в шаблоне встретилась переменная X - вызвали DataModel.get(X), то есть в порядке объявления переменных в шаблоне.
Мне это не подходит, у меня сама DataModel должна быть подготовлена на основе переменных, содержащихся в шаблоне.
...
Рейтинг: 0 / 0
Template engine
    #39509011
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LVAНужен Template engine для javaJavaScript engine ! Или любой другой скриптовый язык
имхо
...
Рейтинг: 0 / 0
Template engine
    #39509046
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LVAОни все работают так: уже на этапе шаблонизации, когда известна DataModel, если в шаблоне встретилась переменная X - вызвали DataModel.get(X), то есть в порядке объявления переменных в шаблоне.

Не понял. Но по крайней мере для FreeMarker это утверждение неправильно.
...
Рейтинг: 0 / 0
Template engine
    #39509142
LVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LVA
Гость
Partisan M,

Поправлю утверждение:

FreeMarker, как и все остальные, парсит шаблон, стоит дерево токенов, только извлечь оттуда переменные шаблона не получится (в общем случае).

Затем, на этапе заполнения шаблона он запрашивает значения переменных из map (DataModel). Вот здесь можно их отлавливать, но это будет происходить:
- не на этапе парсинга
- в порядке объявления переменных в шаблоне
- при наличии ветвлений, запрошены будут не все переменные
...
Рейтинг: 0 / 0
Template engine
    #39509144
LVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LVA
Гость
Usman,

нужно что-то для Java, template engine вроде для этого и предназначен. Берем параметризованный шаблон, парсим его, внедряем значения переменных. дело за малым - получить список этих самых переменных из шаблона :)
...
Рейтинг: 0 / 0
Template engine
    #39509159
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LVAнужно что-то для Java The Nashorn Java API LVAБерем параметризованный шаблон, парсим его, внедряем значения переменных. дело за малым - получить список этих самых переменных из шаблона :) https://wiki.openjdk.java.net/display/Nashorn/Nashorn extensions
Код: javascript
1.
2.
3.
4.
var x = "World"
var str = "Hello, ${x}"
 
print(str) // prints "Hello, World" because ${x} is substituted with value of variable "x"
...
Рейтинг: 0 / 0
Template engine
    #39509264
LVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LVA
Гость
Usman,

шаблон в виде кода ? не хотелось бы.

и я не понял, как предлагается решить обозначенную мной проблему: получить список этих самых переменных из шаблона ?
...
Рейтинг: 0 / 0
Template engine
    #39509270
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Топик прозвучал как задание фрилансеру на разработку. Автор, ты хочешь
чтобы тебе тут бесплатно все это разработали?
...
Рейтинг: 0 / 0
Template engine
    #39509279
LVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LVA
Гость
mayton,

я вроде по-русски написал, что ищу template engine, удовлетворяющий некоторым критериям.
...
Рейтинг: 0 / 0
Template engine
    #39509282
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LVAя вроде по-русски написал, что ищу template engine, удовлетворяющий некоторым критериям.
На stackoverflow есть пример как рефлексией из Freemarker-а вытягивают переменные. Если рефлексией не хочется, то не грех и дописать API в Opensource либу.
...
Рейтинг: 0 / 0
Template engine
    #39509285
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LVAно, увы, ни один из них не позволяет получить список переменных на этапе разбора шаблона .
Это требование - вообще треш какой-то.

Боюсь что с такой спецификой как раз готовый template engine мы не найдем. Вот по этому
вопрос звучит как ТЗ на разработку.
...
Рейтинг: 0 / 0
Template engine
    #39509384
LVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LVA
Гость
BlazkowiczНа stackoverflow есть пример как рефлексией из Freemarker-а вытягивают переменные. Если рефлексией не хочется, то не грех и дописать API в Opensource либу.

вчера разбирался с этим. Если вкратце - то это не вариант.
По вложенным шаблонам рефлексией ничего не вытянешь, на этапе парсинга они не анализируются.
Ну и там не только рефлексия, там еще знание о названиях кучи внутренних классов требуется. У разных классов разные поля, из которых нужно рефлексией тянуть инфу. В примере обошлись несколькими - а на самом деле их там десятки (все это надо в switch прописать).

Даже если все это довести до ума (то есть повторить снаружи знание внутренностей FreeMarker), то с выходом каждой новой версии все это надо заново тестировать на предмет обратной совместимости и на предмет наличия чего то нового. Нет, это не рабочий вариант.

Дописать в либу - ну тут во время упирается. Да и не факт, что это удастся пропихнуть. Пока надо посмотреть, что есть на рынке, смотрю потихоньку, в фоновом режиме.
...
Рейтинг: 0 / 0
Template engine
    #39509410
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LVA,

А почему не кодом? Шаблон - это функция, которая получает список параметров (модель) и возвращает строку. Шаблон верхнего уровня может вызывать шаблоны нижнего уровня(просто вызывая их как функции) и передавая в них параметры.

Писать лучше на языке, который поддерживает многострочные строки и интерполяцию, groovy к примеру или яваскрипт. Еще вариант - Scala, посмотрите на Twirl template engine для вдохновения.
...
Рейтинг: 0 / 0
Template engine
    #39509435
LVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LVA
Гость
scf,

- шаблоны уже реализованы в упрощенном виде и работают в проме. Хотелось бы сохранить совместимость.
- любой код - это возможность сделать что-то нежелательное, умышленно или нет. То есть это может быть и небезопасно, и с точки зрения производительности - неоптимально. Зачем давать пользователю такую возможность ? Пока есть возможность без этого обойтись, надо обходиться, имхо
...
Рейтинг: 0 / 0
Template engine
    #39509437
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LVA,

Так совместимость или смена шаблонизатора? И, имхо, давать юзерам самим шаблоны редактировать - утопия. Ладно, если будут вопросы, пишите.
...
Рейтинг: 0 / 0
Template engine
    #39509452
LVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LVA
Гость
scf,

сейчас сторонний шаблонизатор не используется вообще. Логика очень простая. Просто идет усложнение логики, и не хотелось бы самому писать то, что уже умеют все другие шаблонизаторы.
Вот только одна проблема неожиданная всплыла. Никак не мог предположить заранее , что получение переменных из шаблона - это непосильная задача
...
Рейтинг: 0 / 0
Template engine
    #39509473
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LVA,

В простейших случаях можно воспользоваться регуляркой. Но в более сложных, например (Freemarker):
Код: html
1.
2.
3.
4.
5.
6.
<p>We have these animals:
<table border=1>
  <#list animals as animal>
    <tr><td>${animal.name}<td>${animal.price} Euros
  </#list>
</table>

=>
Код: html
1.
2.
3.
4.
5.
6.
<p>We have these animals:
<table border=1>
    <tr><td>mouse<td>50 Euros
    <tr><td>elephant<td>5000 Euros
    <tr><td>python<td>4999 Euros
</table>

или с условиями:
Код: html
1.
2.
3.
4.
5.
6.
7.
<#if animals.python.price < animals.elephant.price>
  Pythons are cheaper than elephants today.
<#elseif animals.elephant.price < animals.python.price>
  Elephants are cheaper than pythons today.
<#else>
  Elephants and pythons cost the same today.
</#if>

Это практически невозможно.

Но Вы можете помечать каждый обработанный шаблон неким ID и по нему уже получать весь
список параметров/значений (properties/map), которые были переданы на вход шаблонизатора.
Все параметры должны быть сохранены, например, в базе (можно даже в сериализированном виде)
...
Рейтинг: 0 / 0
Template engine
    #39509483
LVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LVA
Гость
Usman,

на вход шаблонизатора надо передать именно те значения, которые есть в шаблоне, в этом вся фишка.
...
Рейтинг: 0 / 0
Template engine
    #39509489
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LVA,

Интересно, а как они попали в шаблон, если все эти значения раскидывает шаблонизатор?
...
Рейтинг: 0 / 0
Template engine
    #39509510
LVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LVA
Гость
Usman,

тут, наверное, какое то недопонимание, только я не пойму, где именно.

на вход шаблонизатора передается и шаблон, и значения тех переменных, которые есть в шаблоне. эти значения нужно получить (это - отдельный алгоритм, который требует оптимизации), но для этого надо сперва извлечь названия переменных из шаблона.
...
Рейтинг: 0 / 0
Template engine
    #39509514
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LVAназвания переменныхТак это ж placeholder'ы. Их можно вытащить регуляркой.
Они обычно обозначаются примерно таким образом: ${<parameter-name>}
...
Рейтинг: 0 / 0
Template engine
    #39509516
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LVAUsman,

на вход шаблонизатора надо передать именно те значения, которые есть в шаблоне, в этом вся фишка.

Ну у вас какая-то специфическая задача, нетипичная для шаблонизаторов. Не настаиваю, но возможно все-таки вы уперлись в свою реализацию и не видите как сделать иначе?
В теории шаблонизатору на вход подается файл с плейсхолдерами и некий контекст или модель, из которой можно вытянуть все значения плейсхолдеров. Вам же все value нужны на момент начала парсинга.. Зачем? По идее изменить шаблон вы будете не в состоянии, раз вы уже начали вычитку шаблона и вам нужны все переменные ЭТОГО шаблона. В чем профит? Единственное что я могу предположить, что получение данных из контекста тяжелое, и вы хотите получить все значения махом а потом в шаблонизаторе пробежаться без задержек. Но так ли страшен лукап значений из контекста?

Прошу прощения если нафантазировал :) Просто хотелось бы понять исток задачи, сам неоднократно оказывался в ситуации когда замыленный взгляд не позволял увидеть тривиальную альтернативу
...
Рейтинг: 0 / 0
Template engine
    #39509518
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanLVAназвания переменныхТак это ж placeholder'ы. Их можно вытащить регуляркой.
Они обычно обозначаются примерно таким образом: ${<parameter-name>}

А вложенные как вытянуть? Да а еще если они зависят от значений плейсхолдеров?(хотя тут ничего не поможет
...
Рейтинг: 0 / 0
Template engine
    #39509519
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LVA,

у вас цель какая в конечном итоге? Не вычислять все подряд? ну передавайте шаблонизатору свой java.util.Map в котором лениво вычисляются значения, делов-то.
...
Рейтинг: 0 / 0
Template engine
    #39509530
LVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LVA
Гость
забыл никНу у вас какая-то специфическая задача, нетипичная для шаблонизаторов. Не настаиваю, но возможно все-таки вы уперлись в свою реализацию и не видите как сделать иначе?
В теории шаблонизатору на вход подается файл с плейсхолдерами и некий контекст или модель, из которой можно вытянуть все значения плейсхолдеров. Вам же все value нужны на момент начала парсинга.. Зачем? По идее изменить шаблон вы будете не в состоянии, раз вы уже начали вычитку шаблона и вам нужны все переменные ЭТОГО шаблона. В чем профит? Единственное что я могу предположить, что получение данных из контекста тяжелое, и вы хотите получить все значения махом а потом в шаблонизаторе пробежаться без задержек. Но так ли страшен лукап значений из контекста?

Прошу прощения если нафантазировал :) Просто хотелось бы понять исток задачи, сам неоднократно оказывался в ситуации когда замыленный взгляд не позволял увидеть тривиальную альтернативу

В целом правильно нафантазировали -)
получение значений происходит путем взаимодействия с другими сервисами. Все сразу вообще нельзя получить. Зная параметры заранее, можно составить оптимальный план получения значений параметров, минимизировав количество обращений по сети. Это важно. А сами параметры при этом зависимые. В общем, это отдельная задача оптимизации.

Если делать ленивую мапу, то все вызовы будут последовательные, и общее их количество может быть чрезмерным.
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Template engine
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]