为使用YAML元数据块的pandoc转换声明任意变量

时间:2018-11-17 21:11:40

标签: yaml pandoc odt

我最近才发现Pandoc,所以我仍然习惯它的许多功能。它看起来像是一个非常有用的工具,我很高兴为它找到一些应用程序。我一直在查阅《用户指南》,尽管有a section on what I'd like to know,但似乎无法获得所需的输出。我不确定我是否正确阅读了条目。

简单地说,我在.markdown中有一个文档作为模板。从这个模板,我想生成其他几个文档(可能是.odt.docx)。除了一些我想更改的信息外,这些文档将基本相同。我想知道的是,是否有可能通过在文档顶部的YAML元数据中声明一个变量来更改这些信息。

例如,假设我的.markdown模板中包含以下内容:

---
key-one: "value-one"
key-two: "value-two"
key-three: "value-three"
---
# DocumentTitle
## DocumentSubtitle

This line contains the first value, called $key-one$

This line contains the second value, called $key-two$

This line contains the third value, called $key-three$

是否有一种方法可以使Pandoc替换为YAML元数据中声明的信息,例如key-onekey-two等“占位符”?这将导致:

This line contains the first value, called value-one
This line contains the second value, called value-two
This line contains the third value, called value-three

在《用户指南》上显示:

  

如果未设置变量,则pandoc将在文档的元数据中寻找密钥-可以使用YAML元数据块或--metadata选项进行设置。

根据我在《用户指南》上可以找到的内容,似乎我无法在元数据中任意声明值。我已经找到了有关Pandoc templates的一些信息,但是我不确定如何才能编辑这些(或创建自定义的)以获得所需的输出。

如果有任何不清楚的地方,请告诉我,我将尝试更加具体。预先感谢。

1 个答案:

答案 0 :(得分:2)

Pandoc模板仅在文档正文文本周围包含页眉/页脚等,该标题/页脚等被放置在模板中您看到$body$的位置。因此,模板不能用于替换文档正文中的变量。

为此,您可以使用this pandoc filter,将其保存为meta-vars.lua

local vars = {}

function get_vars (meta)
  for k, v in pairs(meta) do
    if v.t == 'MetaInlines' then
      vars["$" .. k .. "$"] = {table.unpack(v)}
    end
  end
end

function replace (el)
  if vars[el.text] then
    return pandoc.Span(vars[el.text])
  else
    return el
  end
end

return {{Meta = get_vars}, {Str = replace}}

并用pandoc input.md --lua-filter meta-vars.lua

调用