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

创建保留HTML注释的Lua过滤器失效,求排查问题原因

Pandoc Lua过滤器无法保留HTML注释的问题排查与修复

问题背景

我尝试编写一个仅保留HTML注释(不保留其他HTML元素)的Lua过滤器,代码基于Stack Overflow上的答案实现:

local function starts_with(start, str)
  return str:sub(1, #start) == start
end

function RawInline(el)
  if starts_with('<!--', el.text) then
    return el
  else
    return nil
  end
end

return {{Inline = RawInline}}

执行命令:

pandoc -f html+raw_html from.html -o to.md -t gfm --lua-filter preserve-comments.lua

但该过滤器未生效,无法保留HTML注释。

问题原因

  1. 匹配字符串错误:启用html+raw_html扩展后,Pandoc会直接将HTML注释解析为原始内联元素,存储的是原始的<!--而非转义后的&lt;!--,导致判断条件不匹配。
  2. 覆盖范围不全:原代码只处理了行内RawInline元素,未处理块级的HTML注释;同时没有明确移除其他非注释元素,可能导致其他内容残留。

修复方案

修改后的Lua过滤器代码

local function starts_with(start, str)
  return str:sub(1, #start) == start
end

-- 保留行内HTML注释,移除其他行内原始元素
function RawInline(el)
  if starts_with('<!--', el.text) then
    return el
  else
    return nil
  end
end

-- 保留块级HTML注释,移除其他块级原始元素
function RawBlock(el)
  if starts_with('<!--', el.text) then
    return el
  else
    return nil
  end
end

-- 移除所有非原始内联元素
function Inline(el)
  return nil
end

-- 移除所有非原始块级元素
function Block(el)
  return nil
end

return {
  {RawInline = RawInline},
  {RawBlock = RawBlock},
  {Inline = Inline},
  {Block = Block}
}

验证命令

保持原命令不变,确保输入文件from.html包含有效HTML注释,且过滤器路径正确:

pandoc -f html+raw_html from.html -o to.md -t gfm --lua-filter preserve-comments.lua

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:12:10