在 Lua 中编写的 Pandoc 过滤器,用于更改非标题文本

我正在为 pandoc 编写一个 Lua 过滤器,将词汇表功能添加到 markdown 文件的 HTML 输出中。目标是为文档中缩写词或关键定义的每个出现添加鼠标悬停文本。

但是,我不想在标题中出现这种情况。

我的 MWE 可以在文档中的大多数*文本上工作:

-- 解析词汇表文件(此处为简明起见进行了概括)
local glossary = {CO = "心输出量", DBP = "舒张压", SBP = "收缩压"}

-- 用带有鼠标悬停链接的词汇表术语代替 span
function Str(elem)
  for key, value in next, glossary do
    if elem.text == key then
      return pandoc.Span (key, {title = value, class = "glossary"})
    end
  end
end

我从文档和对 AST 的探究中了解到,我需要先使用块级函数,然后使用 walk_block 来更改内联元素。

function Pandoc(doc)
  for i, el in pairs(doc.blocks) do
    if (el.t ~= "Header") then
      return pandoc.walk_block(el, {
        Str = function (el)
          for key, value in next, glossary do
            if el.text == key then
              return pandoc.Span (key, {title = value, class = "glossary"})
            end
          end
        end })
    end
  end
end

然而,这个尝试是不起作用的,返回错误:"在尝试从 Lua 栈获取过滤器的返回值时发生错误。 PandocLuaError "无法获取 Pandoc 值:期望表格,得到 'nil'(nil)"。我认为我的返回结构是错的,但我没有能够调试它。


我的测试 markdown 文件包含:

#缩写词:SBP、DBP 和 CO

带空格的缩写词:CO 和 SBP 和 DBP。

在逗号分隔的列表中:CO、SBP、DBP;带反斜杠;CO/DBP/SBP,以及在项目符号中:

* CO
* SBP
* DBP

*它无法处理与非空格相邻字符的术语,例如标点符号。

原文链接 https://stackoverflow.com/questions/69054611

点赞
stackoverflow用户2975986
stackoverflow用户2975986

几天后,我发现了一个部分解决方案,可以帮助其他遇到类似问题的人。

我认为(但不确定)Pandoc(doc)需要返回一个块元素列表和doc.meta,而我之前没有实现它。

我的解决方案是将术语表函数分离出来,然后分别对每个所需的块元素进行调用。虽然有点笨拙,但它可以工作。

function glos_sub(el)
  return pandoc.walk_block(el,{
    Str = function(el)
      for key,value in next,glossary do
        if el.text == key then
          return pandoc.Span(key,{title = value,class =“glossary”})
        end
      end
    end
  })
end

-- 在所需元素上运行
返回{
  {BulletList = glos_sub},
  {Para = glos_sub},
  {Table = glos_sub}
}
2021-09-06 15:24:51