背景
Markdown 文档有一个div内联图像:
::: image-inline
![](../climate/co2_graph)
:::
Markdown 通过 Pandoc 生成 ConTeXt 文档。输出类似于:
\inlineexternalfigure[../climate/co2_graph]
Lua 代码
解析文档时调用的Lua代码如下:
local lines_to_blocks = {
Image = function( el )
return {
pandoc.RawInline( "tex", "\\inlineexternalfigure[" .. el.src .. "]" )
}
end
}
function Div( el )
local kls, _ = el.classes:find_if(
function ( c )
return string.match( c, "^image%-" )
end
)
if kls then
return pandoc.walk_block( el, lines_to_blocks )
end
end
该代码可以运行并产生预期的输出。
上下文代码
就上下文而言,ConTeXt 代码类似于:
% Force external figures to fill an entire page.
\let\oldexternalfigure\externalfigure
\def\externalfigure[#1]{%
\startTEXpage[width=\paperwidth,height=\paperheight,align=middle]
\oldexternalfigure[#1][width=\paperwidth,height=\paperheight]%
\stopTEXpage
}
\def\inlineexternalfigure[#1]{%
\startalignment[middle]
\dontleavehmode
\oldexternalfigure[#1][width=.475\textwidth]%
\stopalignment
}
这使得图形的呈现可以独立于 Markdown 代码本身。
输出
输出结果正如预期:
问题
内联图像的代码过于复杂。似乎编写不遍历树的代码会更简单(因为我知道 Markdown 文档的期望是什么):
function Div( el )
local kls, _ = el.classes:find_if(
function ( c )
return string.match( c, "^image%-" )
end
)
if kls then
return {
pandoc.RawInline( "tex", "\\inlineexternalfigure[" .. el.SOMETHING.src .. "]" )
}
end
end
我无法确定该用什么el.SOMETHING.src
。
问题
几个问题:
- 传递到函数的元素上有哪些属性的文档在哪里
Div
? - 如何避免遍历文档树?
答案1
传递到 Div 函数的元素上有哪些属性的文档在哪里?
如果我正确理解了文档,el
传递给Div
函数的元素始终是 Div。因此el
具有 Div 的所有属性,可以在 Lua 过滤器文档中查找。
http://pandoc.org/lua-filters.html#type-ref-Div
如何避免遍历文档树?
如果您总是在image-*
Div 中只有一张图片,那么您可以直接索引 Div 的内容。以下代码不会检查标签是否匹配或任何元素是否为空,因此它可能会因格式错误的 Div 而崩溃。如果图像嵌套的深度超过一个 Para,它也会崩溃。我实际上不推荐下面的解决方案。走街区要安全得多。
function Div( el )
local kls, _ = el.classes:find_if(
function ( c )
return string.match( c, "^image%-" )
end
)
if kls then
local Para = el.content[1]
local Image = Para.content[1]
local src = Image.src
return pandoc.Para{
pandoc.RawInline( "tex", "\\inlineexternalfigure[" .. src .. "]" )
}
end
end