docs:
https://github.com/Olivine-Labs/lustache
http://mustache.github.io/mustache.5.html
该项目使用的是纯 Lua 代码,因此也可用于 Lua 项目中。
对 lustache 的扩展:
默认模板扩展名为 .htm 。
默认模板文件存放在项目根目录的 views 文件夹下。
可通过 NPLLustache 提供的 config(cnf)
方法去改变这些默认值。
local engine = require('lustache');
engine.config({
extension = '.mustache', -- 将模板文件的扩展名改为“.mustache”
views = 'template' -- 设置模板文件存在的目录为项目根目录下的 template 文件夹
});
lustache 以及 mustache 有个很不爽的地方,就是没有实现模板间的继承,也就导致无法实现母版页(master page)。NPLLustache 对其进行了扩展,使其支持继承。
views/layout.htm
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>NPLLustache</title>
</head>
<body>
<div>Header</div>
<div>
{{? content}}
</div>
<div>Footer</div>
</body>
</html>
views/index.htm
{{< layout}}
{{+ content}}
<div>This is Content</div>
{{/}}
以上两个文件的代码即一个模板间继承的示例。
文件 views/layout.htm
是一个母版页模板,它是一个网页的基本布局,其中标记 {{?}}
用来定义一个“填充块”。填充块的具体内容由其子模板来决定。在这个示例中,{{? content}}
就是一个填充块,且这个填充块的名字是“content”。
文件 views/index.htm
模板继承自 views/layout.htm
,继承关系是通过标记 {{<}}
来指定的,在这个文件中, {{< layout}}
指定了当前模板继承自 “layout” 模板,即项目用来存放模板文件的目录下的 layout.htm 模板文件。
{{+ content}} .... {{/}}
中包含的内容将会填充到其父模板的名为“content”的填充块中。
当应用程序去渲染 views/index.htm
模板时,其最终渲染的是这样的模块内容:
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>NPLLustache</title>
</head>
<body>
<div>Header</div>
<div>
<div>This is Content</div>
</div>
<div>Footer</div>
</body>
</html>
lustache 提供了一个 render(template, data, partials)
方法,它的第一个参数是需要进行渲染的模板内容,但更多时候我们可能希望仅仅提供一个模板文件的路径就能做相同的事情,因此我为 NPLLustache 加入了一个 renderFile(path, data, partials)
方法,它的第一个参数需要的是一个模板文件的路径:
local html = engine:renderFile('index', {...});
以上代码会去项目存放模板文件的目录(默认为项目根目录下的“views”文件夹)中查找 index.htm
模板文件(默认模板文件的扩展名为 .htm),并将其渲染,然后将渲染后的 HTML 文本返回。