|
|
|
Template engine
|
|||
|---|---|---|---|
|
#18+
Добрый день. Нужен Template engine для java, не заточенный для WEB. Нужен для формирования сообщений по различным каналам (СМС, E-mail, соц. сети и т.п.) Движок должен поддерживать арифметические операции, форматирование (числа, даты), вложенные шаблоны, загрузчик шаблонов из произвольного хранилища (не только файлы). Также ветвления, работу со списками (массивами). Но, в принципе, готов рассмотреть и легковесный, типа Mustache. Но самое основное требование - движок должен уметь определить по шаблону (включая вложенные шаблоны) список переменных, которые нужны для формирования Data Model. Есть ветвление, то надо собрать переменные по всем веткам (то есть все, что есть в шаблоне). Уже посмотрел FreeMarker, Velocity, Mustache ... но, увы, ни один из них не позволяет получить список переменных на этапе разбора шаблона. Они все работают так: уже на этапе шаблонизации, когда известна DataModel, если в шаблоне встретилась переменная X - вызвали DataModel.get(X), то есть в порядке объявления переменных в шаблоне. Мне это не подходит, у меня сама DataModel должна быть подготовлена на основе переменных, содержащихся в шаблоне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 19:00 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVAНужен Template engine для javaJavaScript engine ! Или любой другой скриптовый язык имхо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 20:40 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVAОни все работают так: уже на этапе шаблонизации, когда известна DataModel, если в шаблоне встретилась переменная X - вызвали DataModel.get(X), то есть в порядке объявления переменных в шаблоне. Не понял. Но по крайней мере для FreeMarker это утверждение неправильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 21:51 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
Partisan M, Поправлю утверждение: FreeMarker, как и все остальные, парсит шаблон, стоит дерево токенов, только извлечь оттуда переменные шаблона не получится (в общем случае). Затем, на этапе заполнения шаблона он запрашивает значения переменных из map (DataModel). Вот здесь можно их отлавливать, но это будет происходить: - не на этапе парсинга - в порядке объявления переменных в шаблоне - при наличии ветвлений, запрошены будут не все переменные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 10:18 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
Usman, нужно что-то для Java, template engine вроде для этого и предназначен. Берем параметризованный шаблон, парсим его, внедряем значения переменных. дело за малым - получить список этих самых переменных из шаблона :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 10:20 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVAнужно что-то для Java The Nashorn Java API LVAБерем параметризованный шаблон, парсим его, внедряем значения переменных. дело за малым - получить список этих самых переменных из шаблона :) https://wiki.openjdk.java.net/display/Nashorn/Nashorn extensions Код: javascript 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 10:48 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
Usman, шаблон в виде кода ? не хотелось бы. и я не понял, как предлагается решить обозначенную мной проблему: получить список этих самых переменных из шаблона ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 13:00 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
Топик прозвучал как задание фрилансеру на разработку. Автор, ты хочешь чтобы тебе тут бесплатно все это разработали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 13:08 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
mayton, я вроде по-русски написал, что ищу template engine, удовлетворяющий некоторым критериям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 13:20 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVAя вроде по-русски написал, что ищу template engine, удовлетворяющий некоторым критериям. На stackoverflow есть пример как рефлексией из Freemarker-а вытягивают переменные. Если рефлексией не хочется, то не грех и дописать API в Opensource либу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 13:22 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVAно, увы, ни один из них не позволяет получить список переменных на этапе разбора шаблона . Это требование - вообще треш какой-то. Боюсь что с такой спецификой как раз готовый template engine мы не найдем. Вот по этому вопрос звучит как ТЗ на разработку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 13:27 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНа stackoverflow есть пример как рефлексией из Freemarker-а вытягивают переменные. Если рефлексией не хочется, то не грех и дописать API в Opensource либу. вчера разбирался с этим. Если вкратце - то это не вариант. По вложенным шаблонам рефлексией ничего не вытянешь, на этапе парсинга они не анализируются. Ну и там не только рефлексия, там еще знание о названиях кучи внутренних классов требуется. У разных классов разные поля, из которых нужно рефлексией тянуть инфу. В примере обошлись несколькими - а на самом деле их там десятки (все это надо в switch прописать). Даже если все это довести до ума (то есть повторить снаружи знание внутренностей FreeMarker), то с выходом каждой новой версии все это надо заново тестировать на предмет обратной совместимости и на предмет наличия чего то нового. Нет, это не рабочий вариант. Дописать в либу - ну тут во время упирается. Да и не факт, что это удастся пропихнуть. Пока надо посмотреть, что есть на рынке, смотрю потихоньку, в фоновом режиме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 14:46 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVA, А почему не кодом? Шаблон - это функция, которая получает список параметров (модель) и возвращает строку. Шаблон верхнего уровня может вызывать шаблоны нижнего уровня(просто вызывая их как функции) и передавая в них параметры. Писать лучше на языке, который поддерживает многострочные строки и интерполяцию, groovy к примеру или яваскрипт. Еще вариант - Scala, посмотрите на Twirl template engine для вдохновения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 15:23 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
scf, - шаблоны уже реализованы в упрощенном виде и работают в проме. Хотелось бы сохранить совместимость. - любой код - это возможность сделать что-то нежелательное, умышленно или нет. То есть это может быть и небезопасно, и с точки зрения производительности - неоптимально. Зачем давать пользователю такую возможность ? Пока есть возможность без этого обойтись, надо обходиться, имхо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 16:10 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVA, Так совместимость или смена шаблонизатора? И, имхо, давать юзерам самим шаблоны редактировать - утопия. Ладно, если будут вопросы, пишите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 16:19 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
scf, сейчас сторонний шаблонизатор не используется вообще. Логика очень простая. Просто идет усложнение логики, и не хотелось бы самому писать то, что уже умеют все другие шаблонизаторы. Вот только одна проблема неожиданная всплыла. Никак не мог предположить заранее , что получение переменных из шаблона - это непосильная задача ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 16:51 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVA, В простейших случаях можно воспользоваться регуляркой. Но в более сложных, например (Freemarker): Код: html 1. 2. 3. 4. 5. 6. => Код: html 1. 2. 3. 4. 5. 6. или с условиями: Код: html 1. 2. 3. 4. 5. 6. 7. Это практически невозможно. Но Вы можете помечать каждый обработанный шаблон неким ID и по нему уже получать весь список параметров/значений (properties/map), которые были переданы на вход шаблонизатора. Все параметры должны быть сохранены, например, в базе (можно даже в сериализированном виде) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 17:10 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
Usman, на вход шаблонизатора надо передать именно те значения, которые есть в шаблоне, в этом вся фишка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 17:26 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVA, Интересно, а как они попали в шаблон, если все эти значения раскидывает шаблонизатор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 17:34 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
Usman, тут, наверное, какое то недопонимание, только я не пойму, где именно. на вход шаблонизатора передается и шаблон, и значения тех переменных, которые есть в шаблоне. эти значения нужно получить (это - отдельный алгоритм, который требует оптимизации), но для этого надо сперва извлечь названия переменных из шаблона. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 18:17 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVAназвания переменныхТак это ж placeholder'ы. Их можно вытащить регуляркой. Они обычно обозначаются примерно таким образом: ${<parameter-name>} ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 18:23 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVAUsman, на вход шаблонизатора надо передать именно те значения, которые есть в шаблоне, в этом вся фишка. Ну у вас какая-то специфическая задача, нетипичная для шаблонизаторов. Не настаиваю, но возможно все-таки вы уперлись в свою реализацию и не видите как сделать иначе? В теории шаблонизатору на вход подается файл с плейсхолдерами и некий контекст или модель, из которой можно вытянуть все значения плейсхолдеров. Вам же все value нужны на момент начала парсинга.. Зачем? По идее изменить шаблон вы будете не в состоянии, раз вы уже начали вычитку шаблона и вам нужны все переменные ЭТОГО шаблона. В чем профит? Единственное что я могу предположить, что получение данных из контекста тяжелое, и вы хотите получить все значения махом а потом в шаблонизаторе пробежаться без задержек. Но так ли страшен лукап значений из контекста? Прошу прощения если нафантазировал :) Просто хотелось бы понять исток задачи, сам неоднократно оказывался в ситуации когда замыленный взгляд не позволял увидеть тривиальную альтернативу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 18:25 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
UsmanLVAназвания переменныхТак это ж placeholder'ы. Их можно вытащить регуляркой. Они обычно обозначаются примерно таким образом: ${<parameter-name>} А вложенные как вытянуть? Да а еще если они зависят от значений плейсхолдеров?(хотя тут ничего не поможет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 18:27 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVA, у вас цель какая в конечном итоге? Не вычислять все подряд? ну передавайте шаблонизатору свой java.util.Map в котором лениво вычисляются значения, делов-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 18:29 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
забыл никНу у вас какая-то специфическая задача, нетипичная для шаблонизаторов. Не настаиваю, но возможно все-таки вы уперлись в свою реализацию и не видите как сделать иначе? В теории шаблонизатору на вход подается файл с плейсхолдерами и некий контекст или модель, из которой можно вытянуть все значения плейсхолдеров. Вам же все value нужны на момент начала парсинга.. Зачем? По идее изменить шаблон вы будете не в состоянии, раз вы уже начали вычитку шаблона и вам нужны все переменные ЭТОГО шаблона. В чем профит? Единственное что я могу предположить, что получение данных из контекста тяжелое, и вы хотите получить все значения махом а потом в шаблонизаторе пробежаться без задержек. Но так ли страшен лукап значений из контекста? Прошу прощения если нафантазировал :) Просто хотелось бы понять исток задачи, сам неоднократно оказывался в ситуации когда замыленный взгляд не позволял увидеть тривиальную альтернативу В целом правильно нафантазировали -) получение значений происходит путем взаимодействия с другими сервисами. Все сразу вообще нельзя получить. Зная параметры заранее, можно составить оптимальный план получения значений параметров, минимизировав количество обращений по сети. Это важно. А сами параметры при этом зависимые. В общем, это отдельная задача оптимизации. Если делать ленивую мапу, то все вызовы будут последовательные, и общее их количество может быть чрезмерным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 18:54 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39509264&tid=2122629]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
133ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 389ms |

| 0 / 0 |
