Pandoc:使用 Lua 过滤器将 {{helloworld}} 替换为 <div>abc</div>

手册中,我找到了这个 pandoc lua 过滤器的例子:

return {
  {
    Str = function (elem)
      if elem.text == "{{helloworld}}" then
        return pandoc.Emph {pandoc.Str "Hello, World"}
      else
        return elem
      end
    end,
  }
}

我想用 <div>abc</div> 替换 {{helloworld}}。我的尝试:

return {
  {
    Str = function (elem)
      if elem.text == "{{helloworld}}" then
        return pandoc.RawInline('html','<div>abc</div>')
      else
        return elem
      end
    end,
  }
}

...但是这会给我输出以下内容:

<p></p>
<div>abc</div>
<p></p>

我如何摆脱空的 p 标签呢?

附加信息

我从 markdown 转换为 html,我的 markdown 文件像这样:

enter image description here

点赞
用户214446
用户214446

手册说:

该函数的输出必须与输入具有相同的类型。这意味着作用于内联元素的过滤器函数必须返回nil,内联元素或内联元素列表,而过滤块元素的函数必须返回nil,块元素或块元素列表。如果违反此条件,Pandoc会抛出错误。

你希望将输出呈现为块(<div>abc</div>),但输入(Str)是内联的。这就是为什么它不起作用的原因。将 Str(内联元素)更改为 Para(块元素),将 elem.text 更改为 element.content[1].text,将 RawInline 更改为 RawBlock 即可使其工作:

返回{
  {
    Para = function (elem)
      if elem.content[1].text == "{{helloworld}}" then
        return pandoc.RawBlock('html','<div>abc</div>')
      else
        return elem
      end
    end,
  }
}
2020-03-05 10:21:18