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
相关产品推荐
相关产品推荐

