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

