如何避免<pre>标签中嵌套<code>标签?基于R Markdown与Pandoc场景
解决Pandoc禁用高亮后
<pre><code>嵌套的问题 嘿,我之前也碰到过这个Pandoc转换的小麻烦!针对你说的禁用语法高亮后出现<pre>嵌套<code>标签的问题,给你几个靠谱的解决办法:
方法1:用Lua过滤器自定义代码块渲染(最灵活)
这是我最推荐的方式,能完全掌控代码块转HTML的格式。比如如果你想直接输出不带<code>嵌套的<pre>标签,先创建一个叫code-block-filter.lua的文件,写进以下内容:
-- 自定义代码块的HTML输出逻辑 function CodeBlock(block) -- 获取代码块的类名(比如R代码块的"r",输出块的"out") local block_class = block.classes[1] or "" -- 转义HTML特殊字符,避免显示异常 local escaped_content = pandoc.utils.stringify(block) escaped_content = escaped_content:gsub("&", "&"):gsub("<", "<"):gsub(">", ">") -- 返回我们想要的Raw HTML块 return pandoc.RawBlock("html", "<pre class='" .. block_class .. "'>" .. escaped_content .. "</pre>") end
然后调用Pandoc的时候带上这个过滤器参数就行:
pandoc --no-highlight --lua-filter=code-block-filter.lua 你的输入文件.md -o 输出文件.html
这样转换后的代码块就会是<pre class='r'>x <- 1 c(x = x, p = pnorm(x))</pre>这种格式,完全没有嵌套的<code>标签。
方法2:从R Markdown编织阶段调整输出
你也可以从源头入手,让knitr生成更简洁的Markdown代码块。在你的R Markdown文档开头的YAML设置里加上这些内容:
--- output: md_document: variant: markdown_strict highlight: false ---
这样编织出来的Markdown里,代码块不会带语法高亮相关的标记,再用Pandoc加--no-highlight转换时,结构会更简洁。不过要注意,这种方法还是会保留<pre><code>的嵌套结构,如果必须去掉嵌套,还是得用Lua过滤器。
方法3:微调Pandoc的默认处理参数
如果你只是不想看到代码块的class属性,或者想做些小调整,也可以试试在调用Pandoc时指定Markdown来源格式,再结合禁用高亮:
pandoc --from=gfm --to=html --no-highlight 你的输入文件.md -o 输出文件.html
不过这个方法只能微调,没法彻底去掉<code>嵌套,所以优先级不如前两种。
内容的提问来源于stack exchange,提问作者Russ Lenth
相关产品推荐
相关产品推荐

