背景

背景

背景

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

相关内容