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

如何用Pandoc将Docx转MediaWiki并去除<span>标签?

解决Pandoc转Docx到MediaWiki的标签及脚注格式问题

1. 彻底移除标签

Pandoc生成这些span是因为Docx里的RTL文本格式被默认保留了,有两种解决方式:

方式一:Lua过滤器(推荐,适配复杂文档)

写一个简单的Lua脚本clean-rtl-spans.lua,直接去掉带RTL属性的span标签,保留文本内容:

function Span(span)
  if span.attributes.dir == "rtl" then
    return span.content
  end
  return span
end

转换时调用这个过滤器:

pandoc -f docx -t mediawiki --lua-filter=clean-rtl-spans.lua input.docx -o output.wiki

方式二:sed批量替换(快速临时方案)

如果文档结构简单,转换后直接用sed删掉所有目标span:

pandoc -f docx -t mediawiki input.docx | sed 's/<span dir="rtl">\(.*\)<\/span>/\1/g' > output.wiki

2. 把脚注改成MediaWiki原生格式

默认转换的脚注格式不符合需求,扩展上面的Lua过滤器,让脚注自动适配MediaWiki的引用规则:
更新后的clean-rtl-spans.lua:

-- 移除RTL span标签
function Span(span)
  if span.attributes.dir == "rtl" then
    return span.content
  end
  return span
end

-- 把脚注内容转为<ref>标签
function Note(note)
  return pandoc.RawInline("mediawiki", "<ref>" .. pandoc.utils.stringify(note.content) .. "</ref>")
end

-- 生成底部的参考列表
function Doc(doc)
  local notes = {}
  local content = {}
  for _, block in ipairs(doc.blocks) do
    if block.t == "Note" then
      table.insert(notes, block.content)
    else
      table.insert(content, block)
    end
  end
  if #notes > 0 then
    table.insert(content, pandoc.RawBlock("mediawiki", "----"))
    for i, note in ipairs(notes) do
      table.insert(content, pandoc.RawBlock("mediawiki", string.format("[%d]. %s", i, pandoc.utils.stringify(note))))
    end
  end
  return pandoc.Doc(content, doc.meta)
end

用这个过滤器转换后,脚注会变成你需要的格式:正文里的引用自动生成<ref>标记,底部生成带编号的参考列表。

3. 大文件转换提速

针对150页以上的Docx,加个--quiet参数减少控制台输出,能明显提升转换速度:

pandoc -f docx -t mediawiki --lua-filter=clean-rtl-spans.lua --quiet input.docx -o output.wiki

如果文件大到内存吃紧,就把Docx按章节拆分后分别转换,最后合并结果即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:26:03