胡须模板可以做模板扩展吗?

我是新来的小胡子。

许多模板语言(例如, Django / Jinja )可以让你像这样扩展一个“父”模板…

base.html文件

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

frontpage.html

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

呈现frontpage.html

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

我知道胡须的部分 (例如, {{>content}} ),但这些似乎只是包括在内

模板扩展是否存在为胡须? 或者,如果失败了,是否至less有一些devise模式可以有效地转化为模板扩展等价物。

我最近发现自己在同一条船上,除了我来自mako背景。

小胡子不允许模板扩展/inheritance,但是我知道有几个选项可用。

  1. 你可以使用partials:

     {{>header}} Hello {{name}} {{>footer}} 
  2. 您可以将模板预处理函数注入到需要从其他页面inheritance的每个模板的上下文中:

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

    哈希:

     { "name": "Walden", "extendBase": function() { return function(text) { return "<html><head></head>" + render(text) + "</body></html>" } } } 
  3. 在您的控制器的相关页面上添加并追加所需的HTML。

  4. 有一个布局模板ala:

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

    并在你的控制器中渲染正文,将其作为一个名为body的variables传递给布局模板。

  5. 在加载模板的代码中实现模板inheritance,前胡子。

但是,我不会使用三重胡子,因为我不想让未经过转义的HTML出现在任何地方,在我看来这太危险了。

如果别人有更好的办法来解决这个问题的话,我也很乐意听到这个,因为我还没有在这些方向中的任何一个上下功夫。

我已经在这里提出了这个胡须规范:

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

目前mustache.java,hogan.js和phly_mustache支持模板的inheritance。

你可以使用包含HTML的variables。 像{{{variable}}}这样的“三重胡须”将会返回未转义的HTML。 它与模板扩展不完全相同,但是您可以呈现frontpage-content.html ,然后将其输出放到一个传递给base.htmlcontentvariables中。

(我添加了-contentfrontpage.html文件名,预期这种命名模式将有助于保持文件名的可pipe理性。)

胡子不做模板扩展。

如果你真的想要模板扩展,那么你可能希望使用一个库function为你的语言/框架select使用这个function。


仅供参考,我正在使用Node.js / Express,所以我可能会最终使用https://github.com/fat/stache

在胡子php中,从版本2.7.0开始支持模板inheritance。

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

您可以从Mustache / Engine.php文件中找出当前版本,并search包含以下内容的行:

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

我现在在Python中玩弄这个(注意我是Mako的创build者),在dynamic的上下文中添加了截获部分似乎正在做正确的事情,虽然我需要testing更多。

基本上我们使用的是lambdaexpression式,前缀“<”表示“从这个模板inheritance”(类似于https://github.com/mustache/spec/issues/38中讨论的语法),“$”前缀表示“这是一个inheritance的部分“。;

 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,所以整个“小胡子”的想法对我来说还不算深刻。 但是这似乎工作?

如果你对服务器端代码感到满意,那么Nun就是一个类似Mustache的模板系统,通过它的“模板覆盖”function扩展了function – 在django上build模。 然而,它的工作,它的作者不再维护。

在node.js中,你可以使用express-handlebars或者hogan-express来布局inna小胡子模板,但是他们做事情的方式是不同的,他们都没有在模板本身设置布局,布局被注册在你的应用代码中。