Lua 中的 Pandoc 过滤器可更改非标题的文本
Pandoc filter in Lua to alter text that are not headings
我正在为 pandoc 编写一个 Lua 过滤器,它向 markdown 文件的 HTML 输出添加词汇表功能。目标是将鼠标悬停文本添加到文档中每次出现的首字母缩略词或键定义。
但是,我不希望标题中的文本发生这种情况。
我的 MWE 适用于文档中的大多数*文本:
-- Parse glossary file (summarised here for brevity)
local glossary = {CO = "Cardiac Output", DBP = "Diastolic Blood Pressure", SBP = "Systolic Blood Pressure"}
-- Substitute glossary term for span with a mouseover link
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 的研究表明我需要先使用 block-level 函数然后 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
但是,此尝试无效并且 return 出现错误:“尝试从 Lua 堆栈获取过滤器的 return 值时出错。
PandocLua错误“无法获取 Pandoc 值:预期 table,得到 'nil'(无)”。我认为我的 return 结构是错误的,但我一直无法调试它。
我的测试降价文件包含:
# Acronyms: SBP, DBP & CO
Spaced acronyms: CO and SBP and DBP.
In a comma-separated list: CO, SBP, DBP; with backslashes; CO/DBP/SBP, and in bullet points:
* CO
* SBP
* DBP
*它在包含 non-space 个相邻字符的条件下失败,例如标点符号。
几天后,我找到了一个部分解决方案,可以帮助其他遇到类似问题的人。
我认为(但不确定)Pandoc(doc)
需要块元素列表和 doc.meta
的 return,我在上面没有这样做。
我的解决方案是将词汇表函数分离出来,然后为每个所需的块元素单独调用它。这有效,尽管它有点笨拙。
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
-- Run on desired elements
return {
{BulletList = glos_sub},
{Para = glos_sub},
{Table = glos_sub}
}
我正在为 pandoc 编写一个 Lua 过滤器,它向 markdown 文件的 HTML 输出添加词汇表功能。目标是将鼠标悬停文本添加到文档中每次出现的首字母缩略词或键定义。
但是,我不希望标题中的文本发生这种情况。
我的 MWE 适用于文档中的大多数*文本:
-- Parse glossary file (summarised here for brevity)
local glossary = {CO = "Cardiac Output", DBP = "Diastolic Blood Pressure", SBP = "Systolic Blood Pressure"}
-- Substitute glossary term for span with a mouseover link
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 的研究表明我需要先使用 block-level 函数然后 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
但是,此尝试无效并且 return 出现错误:“尝试从 Lua 堆栈获取过滤器的 return 值时出错。 PandocLua错误“无法获取 Pandoc 值:预期 table,得到 'nil'(无)”。我认为我的 return 结构是错误的,但我一直无法调试它。
我的测试降价文件包含:
# Acronyms: SBP, DBP & CO
Spaced acronyms: CO and SBP and DBP.
In a comma-separated list: CO, SBP, DBP; with backslashes; CO/DBP/SBP, and in bullet points:
* CO
* SBP
* DBP
*它在包含 non-space 个相邻字符的条件下失败,例如标点符号。
几天后,我找到了一个部分解决方案,可以帮助其他遇到类似问题的人。
我认为(但不确定)Pandoc(doc)
需要块元素列表和 doc.meta
的 return,我在上面没有这样做。
我的解决方案是将词汇表函数分离出来,然后为每个所需的块元素单独调用它。这有效,尽管它有点笨拙。
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
-- Run on desired elements
return {
{BulletList = glos_sub},
{Para = glos_sub},
{Table = glos_sub}
}