Pandoc Lua过滤器:如何为Span元素指定属性

时间:2017-11-14 16:32:26

标签: lua pandoc

我有一个包含原始LaTeX命令的Markdown文档。我正在尝试使用带有Pandoc(2.0.1.1)的Lua filter将LaTeX命令转换为更便携的命令。特别是,指定文本语言的命令应转换为具有lang属性的跨度。问题是我不知道如何将属性传递给pandoc.Span构造函数。这是我尝试过滤器(filter.lua):

function RawInline(elem)
  if elem.format == "tex" then
    text = string.match(elem.text, "\\textspanish{(.+)}")
    if text then
      contents = {pandoc.Str(text)}
      attrs = pandoc.Attr("",{},{lang = "es-SP"})
      return pandoc.Span(contents, attrs)
    end
  else
    return elem
  end
end

样本用法:

echo '\textspanish{hola}' | pandoc -f markdown -t native --lua-filter=filter.lua

输出为[Para [Span ("",[],[]) [Str "hola"]]],跨度没有属性。

如果我将姓名和/或课程传递给pandoc.Attr,则会通过,例如attrs = pandoc.Attr("name",{"class"},{lang = "es-SP"})生成[Para [Span ("name",["class"],[]) [Str "hola"]]]。但是我传递给构造函数的属性永远不会出现在输出中。将属性传递给pandoc.Attr的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

你在lua过滤器实现中发现了一个粗糙的边缘;这应该被解决,并使用户更友好。

当前实现使用两元素表来保存键值对:

attrs = pandoc.Attr("", {}, {{"lang", "es-SP"}})

这不是表示对的好方法。目前实施的原因有两个:

  1. 它反映了在pandoc的JSON输出中对对象(以及一般属性)的编码方式。
  2. 这些配对有固定的顺序。
  3. 当人们想要保证在通过过滤器时不会改变属性的顺序时,最后一部分很重要。 lua中没有规则确定表中键的顺序:lua表{one = 1, two = 2}可以作为属性列表{one="1" two="2}{two="2" one="1"}读回到pandoc中。现在,属性的顺序对于大多数应用程序而言并不重要,但我们无法确定。因此,不直观的表现形式。