如何在Pandoc的lua-filter函数中迭代列表项?

3
Pandoc的lua filter使得在迭代文档并在进行时修改文档变得非常容易。我的问题是我无法弄清楚如何隔离列表项元素。我可以找到列表以及每个列表项内部的块级元素,但我无法想出一种迭代列表项的方法。
例如,假设我有以下Markdown文档:
1.  One string

    Two string

2.  Three string

    Four string

假设我想要将每个列表项的第一行加粗。我可以很容易地改变有序列表中段落的处理方式,例如使用这个过滤器和 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.  **One string**

    Two string

2.  Three string

    Four string

如果我将这两个列表项分成两个单独的列表,那么第一个项目的第一段就被捕获了,但是我想要捕获每个列表项的第一段!文档中没有关于迭代列表项的内容。应该如何做?
1个回答

6
最近,pandoc Lua过滤器文档已经更新,更多关于每种类型属性的信息已经添加。例如,对于OrderedList元素,文档应该说(目前错误地写成了items而不是content):

OrderedList

有序列表。

  • content: 列表项(块列表)
  • listAttributes: 列表参数(ListAttributes)
  • start: 别名为listAttributes.start(整数)
  • style: 别名为listAttributes.style(字符串)
  • delimiter: 别名为listAttributes.delimiter(字符串)
  • tagt:字面上的OrderedList(字符串)
因此,最简单的方法是迭代内容字段并更改其中的项目。
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

1
哇,你可能不想看到我尝试的那50个代码迭代。谢谢,这个结果正常并且合理。除了那个错误之外,文档真的很混乱,特别是它的List辅助类型和不属于那些列表的列表。 - Caleb
我知道,对此表示抱歉。我们已经在当前的开发版本中修复了这个问题,所有列表都将是List类型。 - tarleb
1
第一步,谷歌搜索一些东西。第二步,找到一个看起来有希望的答案,虽然不完全是你当前的问题,但足够提供一些指引。第三步,阅读评论,看看是否有任何更正意见。第四步,好奇那个叫Caleb的家伙是谁。等等,什么?我问过这个问题吗?我完全没有记忆…… - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接