模板的金属匠模板
Metalsmith template of template
是否可以使用相互扩展的模板?
说,我有这些文件:
base.html:
<html><head>...<head><body>{{{ contents }}}</body></html>
threeColumns.html:
---
layout: base.html
---
<div class="three-cols-row">
<div class="first col">
{{> nav}}
</div>
<div class="second col">
{{{ contents }}}
</div>
<div class="third col">
{{> aside}}
</div>
</div>
somePost.html:
---
layout: threeColumns.html
---
My awesome blogbost
期望输出:
<html><head>...<head>
<body>
<div class="three-cols-row">
<div class="first col">
NAV CONTENT
</div>
<div class="second col">
My awesome blogbost
</div>
<div class="third col">
ASIDE CONTENT
</div>
</div>
</body>
</html>
我正在使用 metalsmith-layouts。
看起来您正在使用 Handlebars 作为您的 metalsmith 模板引擎。这意味着您需要注册您的部分。
类似于:
var contents = fs.readFileSync(__dirname + "/templates/partials/" + fileName).toString();
Handlebars.registerPartial(partialTemplateName, contents);
您可能会有多个部分,因此您可以使用 fs.readdirSync('templates/partials');
获取所有文件,然后将其包装在每个文件的循环中。
是的,但不完全是您想要的方式。
Metalsmith-layouts 旨在作为 template inheritance 的垫片,适用于本身不支持它的语言,例如车把。为了使这成为可能,它会解析您传递给它的文件,在本例中为 somePost.html
,并在前面的内容中查找 layout
键。之后,它通过将 somePost.html
作为变量 contents
.
传递给 threeColumns.html
来处理所选布局 threeColumns.html
此时文件由 consolidate 使用您选择的引擎渲染。因此 layout
键,它特定于 metalsmith-layouts
不再适用于 threeColumns.html
因为 metalsmith-layouts 不处理它。此时文件正在被合并处理。
您可以做的是使用一种本机支持模板继承的语言,例如 swig。那么你可以这样做:
build.js
/**
* Dependencies
*/
var filenames = require('metalsmith-filenames');
var layouts = require('metalsmith-layouts');
var metalsmith = require('metalsmith');
/**
* Build
*/
metalsmith(__dirname)
.use(filenames()) // Necessary for extends and includes
.use(layouts('swig'))
.build(function(err){
if (err) throw err;
});
src/somePost.swig
---
layout: threeColumns.swig
---
<p>My awesome blogpost</p>
layouts/threeColumns.swig
{% extends "base.swig" %}
{% block body %}
<div class="three-cols-row">
<div class="first col">
{% include "nav.swig" %}
</div>
<div class="second col">
{{ contents | safe }}
</div>
<div class="third col">
{% include "aside.swig" %}
</div>
</div>
{% endblock %}
layouts/base.swig
<html>
<head><head>
<body>
{% block body %}{% endblock %}
</body>
</html>
layouts/nav.swig
<nav>Navigation</nav>
layouts/aside.swig
<aside>Aside content</aside>
如果您随后从命令行 运行 node build.js
,它会将其构建到一个页面中。
是否可以使用相互扩展的模板?
说,我有这些文件:
base.html:
<html><head>...<head><body>{{{ contents }}}</body></html>
threeColumns.html:
---
layout: base.html
---
<div class="three-cols-row">
<div class="first col">
{{> nav}}
</div>
<div class="second col">
{{{ contents }}}
</div>
<div class="third col">
{{> aside}}
</div>
</div>
somePost.html:
---
layout: threeColumns.html
---
My awesome blogbost
期望输出:
<html><head>...<head>
<body>
<div class="three-cols-row">
<div class="first col">
NAV CONTENT
</div>
<div class="second col">
My awesome blogbost
</div>
<div class="third col">
ASIDE CONTENT
</div>
</div>
</body>
</html>
我正在使用 metalsmith-layouts。
看起来您正在使用 Handlebars 作为您的 metalsmith 模板引擎。这意味着您需要注册您的部分。
类似于:
var contents = fs.readFileSync(__dirname + "/templates/partials/" + fileName).toString();
Handlebars.registerPartial(partialTemplateName, contents);
您可能会有多个部分,因此您可以使用 fs.readdirSync('templates/partials');
获取所有文件,然后将其包装在每个文件的循环中。
是的,但不完全是您想要的方式。
Metalsmith-layouts 旨在作为 template inheritance 的垫片,适用于本身不支持它的语言,例如车把。为了使这成为可能,它会解析您传递给它的文件,在本例中为 somePost.html
,并在前面的内容中查找 layout
键。之后,它通过将 somePost.html
作为变量 contents
.
threeColumns.html
来处理所选布局 threeColumns.html
此时文件由 consolidate 使用您选择的引擎渲染。因此 layout
键,它特定于 metalsmith-layouts
不再适用于 threeColumns.html
因为 metalsmith-layouts 不处理它。此时文件正在被合并处理。
您可以做的是使用一种本机支持模板继承的语言,例如 swig。那么你可以这样做:
build.js
/**
* Dependencies
*/
var filenames = require('metalsmith-filenames');
var layouts = require('metalsmith-layouts');
var metalsmith = require('metalsmith');
/**
* Build
*/
metalsmith(__dirname)
.use(filenames()) // Necessary for extends and includes
.use(layouts('swig'))
.build(function(err){
if (err) throw err;
});
src/somePost.swig
---
layout: threeColumns.swig
---
<p>My awesome blogpost</p>
layouts/threeColumns.swig
{% extends "base.swig" %}
{% block body %}
<div class="three-cols-row">
<div class="first col">
{% include "nav.swig" %}
</div>
<div class="second col">
{{ contents | safe }}
</div>
<div class="third col">
{% include "aside.swig" %}
</div>
</div>
{% endblock %}
layouts/base.swig
<html>
<head><head>
<body>
{% block body %}{% endblock %}
</body>
</html>
layouts/nav.swig
<nav>Navigation</nav>
layouts/aside.swig
<aside>Aside content</aside>
如果您随后从命令行 运行 node build.js
,它会将其构建到一个页面中。