Perl模板与继承

5

Perl世界中是否有任何具备模板继承功能的模板系统?

我刚在维基百科的web模板引擎比较列表上查看了一下(实际上是不完整的列表),但没有发现有这样的模板系统。

继承 = 支持从父模板继承布局,并可以单独重写父模板内容的任意部分。

类似于Python的Jinja2:

#body.html
<body>
   {% block content %}
   <!-- the content go here -->
   {% endblock %}
</body>

#hi.html
{% extends "body.html" %}
{% block content %}
<h1>Hi!</h1>
{% endblock %}

渲染hi.html会生成以下内容:

 <body>
 <h1>Hi!</h1>
 </body>

不要寻找精确的Jinja2语法,只需寻找来自perl世界的任何支持继承的模板引擎(不仅仅是像Template::Toolkit这样的纯包含)。之所以在这里提问,是因为在CPAN上搜索"template inheritance"等词语很麻烦,会显示成千上万个与此问题无关的模块。顺便说一句,它不应该像嵌入式perl那样,应该是“可编辑”的,允许用户构建自己的模板而不危及整个系统,因此不能使用Mason或HTML::Mason。

3
不确定它是否完全支持您对模板继承的确切定义,但Template Toolkit具有一些很好的功能,可以重用组件并从多个文件中合成模板。 - tauli
2
为什么Template Toolkit的include/process/wrapper不能帮助你? - Fotis_zzz
@PseftiS 这就像是:“为什么你使用 Perl 对象继承”,而不仅仅是 require '/some/file.pl' ;) ;). 大多数情况下,区别只在于 bless... - novacik
4个回答

3

我支持使用Text::Xslate进行翻译,它的语法与您的Jinja2示例非常相似:

layouts/main.tx中:

...
<div id="page">
  : block sidebar -> { }
  <div id="content">
    : block header-> { <h1>Default Title</h1> }
    : block content -> { }
  </div>
</div>
...

在另一个模板中:
: cascade layouts::main
: override header -> {
<div id="header">
...
</div>
: }

: override content -> {
<div id="content-body">
...
</div>
: }

谢谢,我去检查一下... ;) - novacik

2

Template::Jade是将Jade移植到Perl语言中的工具。

parent.jade

doctype html
html
  head
    title Jade template
  body.class
    p#id_name
      block content

child.jade

extends parent

block content
  p.
    This is a test.
    This is a test.
    This is a test.

2

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接