You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua Pandoc过滤器中如何获取元素父元素?用例实现问询

在Lua Pandoc过滤器中如何获取元素的父元素?

在Pandoc的Python过滤器中,元素自带parent属性,能轻松实现两类常见需求:

  • 打印元素的遍历层级(show_level)
  • 检查Str元素是否处于ListItem内部(str_in_listitem)

但Lua版本的Pandoc过滤器没有原生的parent属性,要实现相同功能,需要手动遍历文档树,为每个元素添加父节点引用和层级信息。


核心实现思路

通过递归遍历整个文档结构,给每个元素添加parent(父元素引用)和level(层级值)两个自定义属性。后续的逻辑就可以基于这两个属性,复刻Python版本的功能。


完整Lua过滤器代码

local function add_parent_and_level(elem, parent, level)
  elem.parent = parent
  elem.level = level or 0

  -- 处理常规包含content的元素
  if elem.content then
    for _, child in ipairs(elem.content) do
      add_parent_and_level(child, elem, level + 1)
    end
  end

  -- 处理列表类元素(BulletList/OrderedList)的特殊结构
  if elem.t == 'BulletList' or elem.t == 'OrderedList' then
    for _, item in ipairs(elem.content) do
      -- 给ListItem本身设置父节点和层级
      item.parent = elem
      item.level = level + 1
      -- 遍历ListItem内的块元素
      for _, block in ipairs(item) do
        add_parent_and_level(block, item, level + 2)
      end
    end
  end
end

-- 场景1:打印元素遍历层级
local function show_level(elem)
  local indent = string.rep('  ', elem.level)
  print(indent .. elem.t)
end

-- 场景2:提取位于ListItem中的Str元素文本
local function str_in_listitem(elem)
  if elem.t == 'Str' then
    local current = elem.parent
    -- 向上遍历父节点,检查是否存在ListItem
    while current do
      if current.t == 'ListItem' then
        print(elem.text)
        break
      end
      current = current.parent
    end
  end
end

-- 过滤器入口
function Pandoc(doc)
  -- 先为所有元素添加父节点和层级信息
  add_parent_and_level(doc, nil, 0)
  -- 遍历文档执行两个场景的逻辑
  doc:walk({
    Block = show_level,
    Inline = show_level,
    Str = str_in_listitem
  })
  return doc
end

return { Pandoc = Pandoc }

测试输入

[ Para [ Str "some" , Space , Str "text" ]
, BulletList
    [ [ Plain [ Str "item1" ] ]
    , [ Plain [ Str "item2" ]
      , BulletList
          [ [ Plain [ Str "subitemA" ] ]
          , [ Plain [ Str "subitemB" ] ]
          ]
      ]
    ]
]

输出结果

show_level的输出(层级结构)

Doc
  Para
    Str
    Space
    Str
  BulletList
    ListItem
      Plain
        Str
    ListItem
      Plain
        Str
      BulletList
        ListItem
          Plain
            Str
        ListItem
          Plain
            Str

str_in_listitem的输出(ListItem内的文本)

item1
item2
subitemA
subitemB

内容的提问来源于stack exchange,提问作者wolfrevo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:03:14