当缩进级别很重要时如何在 jinja 和 nunjucks 中编写漂亮的模板

Sir*_*ion 5 templates jinja2 nunjucks

我向 Jinja2 和 Nunjucks 用户发布了这个问题,因为后者很大程度上受到前者的启发,并且它们的模板语法基本相同。

当缩进和空格很重要时(例如,在生成降价文件时),我在寻找编写模板文件的最佳方法时遇到了一些麻烦。

假设以下上下文传递给我的模板

{
  functions = [
    {
      name: "myFunc",
      description: "This is a jsDoc description for a function",
      params: [
        {name: "label", type: "string"},
        {name: "size", type: "number"},
      ]
      returns: "void",        // <- optional, may not be present
      since: "API level 2.0"  // <- optional, may not be present
      deprecated: true        // <- optional, may not be present
    },
    ...
  ]
}
Run Code Online (Sandbox Code Playgroud)

我想获得这个输出(使用这个精确的缩进级别):

    /**
     * This is a jsDoc description for a function
     *
     * @name myFunc
     * @param {string} label
     * @param {number} size
     * @returns {void}
     * @since API level 2.0
     * @deprecated
     */
Run Code Online (Sandbox Code Playgroud)

当我需要处理模板标签(即{% ... %})周围的空格时,我的麻烦就出现了,因为我很难同时维护一个很好缩进的模板文件和一个很好的缩进输出。到目前为止,我设法获得了前者或后者,但不能同时获得。

在编写模板文件时,我想编写代码来清楚地显示哪个块是相对于其他块的子/父块(请注意,第一个标签从正确的缩进级别开始):

    {% for function in functions %}
      /**
       * {{ function.description }}
       *
         {% for param in function.params %}
           * @param {% raw %}{{% endraw %} {{ param.type }} {% raw %}}{% endraw %} {{ param.name }}
         {% endfor %}

         {% if function.returns %}
           * @return {% raw %}{{% endraw %} {{ function.returns }} {% raw %}}{% endraw %}
         {% endif %}

         {% if function.since %}
           * @since {{ function.since }}
         {% endif %}

         {% if function.deprecated %}
           * @deprecated
         {% endif %}
       */
    {% endfor %}
Run Code Online (Sandbox Code Playgroud)

但这根本不会产生所需的输出!

另一方面,为了获得所需的输出,我必须编写这个模板:

    {% for function in functions %}/**
     * {{ function.description }}
     *
     {% for param in function.params -%}
     * @param {% raw %}{{% endraw %} {{ param.type }} {% raw %}}{% endraw %} {{ param.name }}
     {% endfor -%}

     {%- if function.returns -%}
     * @return {% raw %}{{% endraw %} {{ function.returns }} {% raw %}}{% endraw %}
     {% endif -%}

     {% if function.since -%}
     * @since {{ function.since }}
     {% endif -%}

     {%- if function.deprecated -%}
     * @deprecated
     {% endif -%}
     */
    {% endfor -%}

Run Code Online (Sandbox Code Playgroud)

这不像以前的版本那么干净,而且我没有看到一般的经验法则告诉我什么时候-在标签的开头或结尾放置或期望一个,所以每次我不得不停下来时,仔细看看是什么前事后事的行为,希望能做出正确的选择。

总而言之,我的问题是:是否有一个秘密的“组合”或模式来实现对输出中打印的空白的良好缩进和完全控制?(也许涉及trim_blocks或 的东西lstrip_blocks