如何使用 Nunjucks 的局部/宏/包含 metalsmith-in-place?

How to use Nunjucks' partials / macros / includes with metalsmith-in-place?

我在降价文件中重用模板代码时遇到问题。 例如,我想引入 vimeo 链接的嵌入代码,并将 vimeo id 传递给调用。

一个示例宏:

{% macro vimeoEmbed(id) %}
  <iframe src="https://player.vimeo.com/video/{{ id }}?title=0&byline=0&portrait=0" width="300" height="169" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
{% endmacro %}

这样使用:

{{ vimeoEmbed(120394634) }}

如果我直接在 markdown 文件中定义宏,这会起作用。但是我当然想要一个带有宏的 全局文件 以便于维护。

我尝试使用 Nunjucks 的 {% import "macros.njk" as macros %}macros.njk 将包含 vimeoEmbed 宏。
但不幸的是我不断收到 Error: template names must be a string: undefined.

作为替代方案,我尝试使用 {% include "vimeoEmbed.njk" %},但我得到的是相同的 Error: template names must be a string: undefined


这似乎是 metalsmith-in-place 特有的,因为 Nujucks 的 includeimportmetalsmith-layouts 一起工作得很好。

任何其他在 Markdown 文件和 Nunjucks 中重用代码的解决方案也是受欢迎的。谢谢!

我自己想出来了。

我的错误基本上是 运行 metalsmith-in-placemetalsmith-markdown 插件之后。 Markdown 插件已经将 {{ "some string" }} 中的引号转换为 {{ &quot;some string&quot; }}。 我将其切换为就地 运行ning 在 Markdown 之前。

同时我也将metalsmith-in-place更新为2.0.0-beta.1。它现在依赖于 JSTransformer 而不是 consolidate.js 了。 由于 Nunjucks 转换器似乎有一个带有 Nujucks 包含和导入的 issue,我还必须从 Nunjucks 宏切换到过滤器。 所以我不完全确定这会解决最初的问题,但很有可能。