在 Assemble 的 yaml front matter 中创建复杂的数据模型

Creating complex data models in yaml front matter in Assemble

Assemble 前端 YAML 支持使用此语法在 Handlebar 页面顶部创建动态数据模型

 ---
 myModel : { aFile : <%= fileName %>}
 ---

<div>
 {{myModel.aFile.someProperty}}
</div>

其中 fileName 是某个 json 文件。是否可以在 YAML 中操作 myModel,在创建之后,在传递给渲染之前。此代码不起作用,但我想做类似的事情:

 ---
 myModel : { aFile : <%= fileName %>}
 myModel
    aFile
      someProperty : I was set in header 
 ---

如果做不到这一点,还可以如何在 header 中动态生成数据?我可以调用一个自定义助手并将其输出传递给一个变量吗,这再次不起作用但假设:

 ---
 myModel : { data: <%= someHelper('fileName') %> }
 ---

您当然可以使用定制的 Handlebars 助手来完成此操作,该助手可以根据需要格式化数据。

Gruntfile.js

assemble: {
    mySite: {
        options: {
            helpers: ['source/helpers/**/*.js']

source/helpers/importJSON.js

(function() {
    "use strict";

    var _ = require("lodash");
    var fs = require("fs");

    module.exports.register = function(Handlebars, options) {
        Handlebars.registerHelper("importJSON", function(fileSpec, options) {
            var customData = JSON.parse(fs.readFileSync(fileSpec, "utf8"));

            // Do anything to your data here
            if (customData.color === "blue") {
                customData.color = "yellow";
            }

            _.extend(this, customData);
            return "";
        });
    };

}).call(this);

source/templates/somePage.hbs

---
{{importJSON "./source/data/favorite.json"}}
{{log color}}
<html>
<body>
    <h1>Some Page</h1>
</body>
</html>