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

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

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

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

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

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

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

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

нужно что-то для Java, template engine вроде для этого и предназначен. Берем параметризованный шаблон, парсим его, внедряем значения переменных. дело за малым - получить список этих самых переменных из шаблона :)
...
Рейтинг: 0 / 0
23.08.2017, 10:48
    #39509159
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Template engine
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
23.08.2017, 13:00
    #39509264
LVA
LVA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Template engine
Usman,

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

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

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

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

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

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

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

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

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

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

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

сейчас сторонний шаблонизатор не используется вообще. Логика очень простая. Просто идет усложнение логики, и не хотелось бы самому писать то, что уже умеют все другие шаблонизаторы.
Вот только одна проблема неожиданная всплыла. Никак не мог предположить заранее , что получение переменных из шаблона - это непосильная задача
...
Рейтинг: 0 / 0
23.08.2017, 17:10
    #39509473
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Template engine
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
23.08.2017, 17:26
    #39509483
LVA
LVA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Template engine
Usman,

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

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

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

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

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

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

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

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

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

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

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

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


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