如何在Pandoc的lua过滤器中迭代列表项?

Pandoc的lua过滤器让迭代文档并在处理文档时进行修改变得非常容易。我的问题是我不知道如何隔离列表项元素。我可以找到_列表_以及列表项内的块级元素,但我找不到迭代列表项的方法。

例如,假设我有以下Markdown文档:

1. 一个字符串

    两个字符串

2. 三个字符串

    四个字符串

假设我想要使每个列表项的第一行变粗。我可以轻松地更改有序列表中的段落处理方式,例如使用这个过滤器和pandoc --lua-filter=myfilter.lua --to=markdown input.md

local i
OrderedList = function (element)
  i = 0
  return pandoc.walk_block(element, {
      Para = function (element)
          i = i + 1
          if i == 1 then return pandoc.Para { pandoc.Strong(element.c) }
          else return element end
        end
    })
end

这确实会将第一个段落元素变成粗体,但它只会更改第一个列表项的第一段落,因为它在遍历列表中的所有列表项中的所有段落,而不是在每个列表项上遍历,然后在每个段落上进行迭代。

1.  **一个字符串**

    两个字符串

2.  三个字符串

    四个字符串

如果我将这两个列表项分开成两个独立的列表,则可以捕获第一个项目的第一个段落,但我想要捕获每个列表项的第一个段落!我在文档中找不到有关迭代列表项的任何信息。应该如何进行迭代?

点赞
用户2425163
用户2425163

最近,pandoc Lua 过滤器文档中的每种类型的属性都更新了更多信息。例如,对于 OrderedList 元素,[docs] 应该说明(现在写成 items 而不是 content,这是一个错误):

OrderedList

一个有序列表。

  • content:列表项(块列表)
  • listAttributes:列表参数(ListAttributes)
  • start:列表起始位置的别名(整数)
  • style:列表风格的别名(字符串)
  • delimiter:列表分隔符的别名(字符串)
  • tagt:字面量 OrderedList(字符串)

因此,最简单的方法是迭代 content 字段并更改其中的项:

OrderedList = function (element)
  for i, item in ipairs(element.content) do
    local first = item[1]
    if first and first.t == 'Para' then
      element.content[i][1] = pandoc.Para{pandoc.Strong(first.content)}
    end
  end
  return element
end
2019-01-29 10:29:37