|
|
|
Template engine
|
|||
|---|---|---|---|
|
#18+
UsmanТак это ж placeholder'ы. Их можно вытащить регуляркой. Они обычно обозначаются примерно таким образом: ${<parameter-name>} это сейчас вытаскиваю регуляркой, потому что шаблон примитивный. а когда добавятся вложенные шаблоны, циклы, временные переменные, ветвления, арифметика, форматирование и т.д, и .т.п, то не вытащить уже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 18:58 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVAто не вытащить ужепри желании можно вытащить все . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 19:04 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVAВсе сразу вообще нельзя получить.форс-мажор для шаблонизатора (:LVAВ общем, это отдельная задача оптимизации.которая не относится к теме Template Engine ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 19:12 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVA Зная параметры заранее, можно составить оптимальный план получения значений параметров, минимизировав количество обращений по сети. Похоже на кейс для GraphQL. Но поскольку это достаточно новая штука, можно проще: Шаблон получает Map<String, String> - это параметры. Сначала пишем свою реализацию Map, которая сохраняет ключи, переданные в get(), и всегда возвращает пустую строку. Потом вызываем шаблон, передав ему эту Map. Результат работы шаблона выкидываем, но набор ключей, которые использовались в этом шаблоне, у нас теперь есть. Получаем значения для этих ключей и вызываем шаблон еще раз - теперь с настоящими данными. Этот подход можно расширить и на модель с вложенными объектами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 19:23 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
UsmanLVAто не вытащить ужепри желании можно вытащить все . возможно, хотя и не уверен, что все. это как с рефлексией в FreeMarker. Надо снаружи описать (повторить в каком то смысле) то, что уже сделано внутри. Грамматика это, или тайное знание о названиях приватных классов и полей, которые можно достать рефлексией. При любом изменении версии это все может перестать работать. И все это надо покрывать тестами, а ведь сам шаблонизатор уже протестирован - хочется в это верить :) Поэтому, естественно, ищется шаблонизатор, который может эту простую задачу (для него, ведь он умеет парсить свои шаблоны!) решить "из коробки". Usmanкоторая не относится к теме Template Engine так я об этом и не говорю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 19:27 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
scfПохоже на кейс для GraphQL. Но поскольку это достаточно новая штука, можно проще: Шаблон получает Map<String, String> - это параметры. Сначала пишем свою реализацию Map, которая сохраняет ключи, переданные в get(), и всегда возвращает пустую строку. Потом вызываем шаблон, передав ему эту Map. Результат работы шаблона выкидываем, но набор ключей, которые использовались в этом шаблоне, у нас теперь есть. Получаем значения для этих ключей и вызываем шаблон еще раз - теперь с настоящими данными. Этот подход можно расширить и на модель с вложенными объектами. так нельзя, потому что есть ветвления. а сразу по всем веткам пройтись нельзя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 19:29 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVA, Если есть ветвление, то вы не можете заранее знать, какие данные нужны - для рендера левой ветки или для рендера правой ветки. Возможно, ваша задача не так уж формализуема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 19:38 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
scf, я в первом посте говорил, что в случае ветвления берем из всех веток. однако, холостой пробег шаблонизатора может не попасть даже в одну единственную ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 20:23 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
LVA, тогда проще всего либо отпарсить шаблоны, либо выковырять из скомпилированного шаблона фримаркера нужные переменные. Рекурсивный нисходящий парсер руками - это куда проще, чем кажется. Смотреть тут: https://en.wikipedia.org/wiki/Recursive_descent_parser ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 20:49 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
scf, Но самое основное требование - движок должен уметь определить по шаблону (включая вложенные шаблоны) список переменных, которые нужны для формирования Data Model. Есть ветвление, то надо собрать переменные по всем веткам (то есть все, что есть в шаблоне). Уже посмотрел FreeMarker, Velocity, Mustache ... но, увы, ни один из них не позволяет получить список переменных на этапе разбора шаблона. Никакой шаблонизатор так не разбирает разметку, т.к. "правильные" ветвления ненужные кейсы просто игнорируют при парсинге (видел исключение - неправильные ветвления в кривоватых ранних сборках жсф ти ли 2.0, то ли 2.1 версии через атрибут rendered). Рецепт есть, я как-то дергал список переменных из xhtml (тот же самый жсф, но это применимо к чему угодно) через самописный скрипт на ноджс. Можно и на чем-то другом написать, но смысл в том, что эта задача должна решаться извне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2017, 12:37 |
|
||
|
Template engine
|
|||
|---|---|---|---|
|
#18+
mars478, Приходится как то извращаться именно "извне". Но делать такое извне как раз неправильно, т.к. завязываемся на специфику конкретного шаблонизатора, которая весьма нетривиальна. А именно, приходится учитывать области видимости переменных в шаблоне, включая переменные, объявленные во внутренних шаблонах. Например, мы можем объявить (через директиву #set) переменную X, и в этом же шаблоне есть ее использование в виде плэйсхолдера ${X}. Является ли X переменной шаблона ? Если она в области видимости объявленной директивы set, то не является, а если за ее пределами, то является. Можем также объявить переменную цикла X, которая живет только внутри цикла. А когда все это касается еще и вложенных шаблонов, то все еще больше усложняется. Например, шаблон T1 требует переменную A и делает импорт шаблона T2 Шаблон T2 требует только переменную B. Какие переменные понадобится передать в шаблонизатор, чтобы сформировать текст на основе шаблона T1 ? Вроде просто: A и B. Но нет. Возможно, B - это переменная цикла в шаблоне T1, или такая переменная объявлена директивой #set (тут еще важно, импорт сделан ДО объявления директивы или после). Есть и другие фишки, например, в pebble есть возможность сделать импорт шаблона, передав ему на вход какие то переменные дополнительно. В Mustache вообще переменную задают не абсолютным именем, а относительным: Код: java 1. 2. 3. дает несколько вариантов: автор - name - user.name - user[i].name Тут вообще дерево вариантов имен получается. Наверняка, есть и другие грабли, на которые я еще не наступил. Ну а в общем случае задача вообще нерешаема, т.к. имя вложенного шаблона в некоторых шаблонизаторах может вычисляться динамически, через плейсхолдеры, но если отбросить такой вариант, то шаблонизатор, безусловно мог бы решить такую задачу изнутри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2017, 15:02 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39509537&tid=2122629]: |
0ms |
get settings: |
7ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
11ms |
get forum data: |
4ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 357ms |

| 0 / 0 |
