Могут ли шаблоны Mustache делать расширение шаблона?

Я новичок в Усы.

Многие языки шаблонов (например, Django / Jinja ) позволят вам расширить «родительский» шаблон, например …

base.html

<html><head></head> <body> {% block content %}{% endblock %} </body> </html> 

frontpage.html

 {% extends "base.html" %} {% block content %}<h1>Foobar!</h1>{% endblock %} 

render frontpage.html

 <html><head></head> <body> <h1>Foobar!</h1> </body> </html> 

Я знаю частичные части Усы (например, {{>content}} ), но они, похоже, просто включаются .

Существует ли расширение шаблона для Усы? Или, в противном случае, существует, по крайней мере, некоторый шаблон проектирования, который эффективно включается, включает в эквиваленты расширения шаблона.

8 Solutions collect form web for “Могут ли шаблоны Mustache делать расширение шаблона?”

Недавно я оказался в одной лодке, за исключением того, что я пришел с фона мако.

Усы не допускают расширения шаблона / наследования, но есть несколько доступных вам вариантов, о которых я знаю.

  1. Вы можете использовать частичные:

     {{>header}} Hello {{name}} {{>footer}} 
  2. Вы можете внедрить шаблонные функции предварительной обработки в контекст для каждого шаблона, который должен наследовать от какой-либо другой страницы:

     {{#extendBase}} Hello {{name}} {{/extendBase}} 

    Hash:

     { "name": "Walden", "extendBase": function() { return function(text) { return "<html><head></head>" + render(text) + "</body></html>" } } } 
  3. Подготовьте и добавьте желаемый HTML на соответствующие страницы вашего контроллера.

  4. Имейте шаблон макета:

     {{>header}} {{{body}}} {{>footer}} 

    И визуализируйте тело в контроллере, передав его в шаблон макета как переменную с именем body .

  5. Внесите наследование шаблона, pre-усы, в свой код, который загружает шаблоны.

Тем не менее, я бы не использовал тройные усы, потому что я не хочу, чтобы unescaped HTML появлялся в любом месте, это слишком рискованно, на мой взгляд.

Если у кого-то есть лучшее решение этой проблемы, я бы тоже хотел это услышать, так как я еще не сделал ни малейшего поворота в любом из этих направлений.

Я предложил это для спецификации Усы:

https://github.com/mustache/spec/issues/38

В настоящее время mustache.java, hogan.js и phly_mustache поддерживают наследование шаблонов.

Вы можете использовать переменные, содержащие HTML. «Тройные усы», такие как {{{variable}}} , возвращают неэкранированный HTML. Это не совсем то же самое, что и расширение шаблонов, но вы можете отобразить frontpage-content.html, а затем поместить свой вывод в переменную content которая будет передана в base.html .

(Я добавил -content в frontpage.html имя файла с ожиданием, что такой шаблон именования поможет сохранить имена файлов управляемыми.)

Усы не поддерживают расширение шаблона.

Если вам действительно требуется расширение шаблона, вы можете захотеть использовать библиотеку, созданную с этой функциональностью, для вашего языка / рамки выбора.


FYI, я использую Node.js / Express, поэтому я, вероятно, в конечном итоге воспользуюсь https://github.com/fat/stache

Я играю с этим прямо сейчас в Python (заметьте, что я создатель Mako), добавив в динамический контекст, который захватывает разделы, кажется, делает правильные вещи, хотя мне нужно будет проверить это намного больше.

В основном мы используем lambdas, где префикс «<» указывает «наследовать от этого шаблона» (аналогично синтаксису, обсуждаемому на https://github.com/mustache/spec/issues/38 ), а префикс «$» указывает на " это унаследованный раздел ».

 import pystache class NameSpace(object): def __init__(self, renderer, vars_={}): self.renderer = renderer self._content = {} self.vars = vars_ def add_content(self, name, value): self._content[name] = value def __getattr__(self, key): if key in self.vars: # regular symbol in the vars dictionary return self.vars[key] elif key.startswith("<"): # an "inherit from this template" directive name = key[1:] return inheritor(self, name) elif key.startswith("$"): # a "here's a replaceable section" directive name = key[1:] if name in self._content: # if we have this section collected, return the rendered # version return sub_renderer(self, name) else: # else render it here and collect it return collector(self, name) else: # unknown key. raise AttributeError(key) def sub_renderer(namespace, key): def go(): def render(nested): return namespace._content[key] return render return go def collector(namespace, key): def go(): def render(nested): content = namespace.renderer.render(nested, namespace) namespace.add_content(key, content) return content return render return go def inheritor(namespace, name): def go(): def render(nested): namespace.renderer.render(nested, namespace) return namespace.renderer.render_name(name, namespace) return render return go 

Итак, вот некоторые шаблоны. base.mustache:

 <html> {{#$header}} default header {{/$header}} {{#$body}} default body {{/$body}} {{#$footer}} default footer, using {{local key}} {{/$footer}} </html> 

hello.mustache:

 {{#<base}} {{#$header}} new header {{/$header}} {{#$body}} new body, with {{local key}} {{/$body}} {{/<base}} 

а затем играть с тремя уровнями глубины, subhello.mustache:

 {{#<hello}} {{#$footer}} im some new footer {{/$footer}} {{/<hello}} 

Отображение hello.mustache следующим образом:

 renderer = pystache.Renderer(search_dirs=["./templates/"]) print renderer.render_name("hello", NameSpace(renderer, {"local key": "some local key"})) 

вывод:

 <html> new header new body, with some local key default footer, using some local key </html> 

Рендеринг subhello.mustache:

 print renderer.render_name("subhello", NameSpace(renderer, {"local key": "some local key"})) 

вывод:

 <html> new header new body, with some local key im some new footer </html> 

Я только что написал это через двадцать минут, и я только немного использовал handlebars.js в прошлом и pystache в первый раз, так что вся идея «усов» еще не для меня. Но это работает?

В усах php поддерживается наследование шаблонов со версии 2.7.0.

https://github.com/bobthecow/mustache.php/wiki/BLOCKS-pragma

Вы можете узнать свою текущую версию из файла Mustache / Engine.php и найти строку, содержащую:

 class Mustache_Engine { const VERSION = '2.8.0'; ... 

Если вы довольны только кодом на стороне сервера, Nun – это система с шаблонами, подобная Усы, с расширением функциональности с помощью функции «переопределения шаблона» – моделируется на django. Хотя он работает, однако, его автор больше не поддерживает.

В node.js вы можете использовать express-handlebars или hogan-express, чтобы иметь макеты inna-усов, но способ, которым они делают что-то другое, ни в одном из них вы не устанавливаете макет в самом шаблоне, макеты регистрируются в вашем коде приложения ,

  • Практический инструментарий GUI?
  • Как я могу развернуть скрипт Perl / Python / Ruby без установки интерпретатора?
  • Случай использования Ruby для nil, эквивалентный Python Нет или JavaScript не определен
  • Язык сценариев для разработки торговой стратегии
  • Что у Ruby у Python нет, и наоборот?
  • Разбор даты, которая может быть в нескольких форматах в python
  • Какова была бы альтернатива python для такой системы, как nanoc?
  • Сохранение стека?
  • Python - лучший язык программирования в мире.