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

如何用Redcarpet与Kramdown渲染代码块而非HTML标签?

解决Ruby中Redcarpet+Kramdown生成灰色代码块的问题

你的问题核心是重复解析导致HTML结构被破坏:Redcarpet已经能将围栏代码块转换成<pre><code>结构,但后续用Kramdown处理时,错误地把HTML内容当成普通文本转义,最终变成了行内<code>标签。以下是两种可行的解决方式:

方式1:单独使用Redcarpet(推荐)

直接用Redcarpet处理原始Markdown,它原生支持生成<pre><code>结构:

markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, fenced_code_blocks: true)
result = markdown.render("```hello```")
puts result
# 输出:<pre><code>hello</code></pre>

只要UI端的CSS给<pre>和<code>设置灰色背景等样式(比如background-color: #f6f8fa; padding: 1em; border-radius: 6px;),就能渲染出类似Stack Overflow的灰色代码块。

方式2:必须保留Kramdown流程时的调整

如果项目要求必须使用Kramdown,有两种子方案:

子方案A:直接用Kramdown处理原始Markdown

Kramdown支持GFM(GitHub Flavored Markdown),原生识别围栏代码块:

result = Kramdown::Document.new("```hello```", input: 'GFM').to_html
puts result
# 输出:<pre class="language-"><code>hello</code></pre>

生成的结构和Redcarpet一致,同样能配合UI的CSS实现灰色代码块效果。

子方案B:Redcarpet处理后交给Kramdown保留HTML结构

如果必须先经过Redcarpet,需指定Kramdown以HTML模式解析输入,避免转义已有结构:

markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, fenced_code_blocks: true)
redcarpet_output = markdown.render("```hello```")
kramdown_doc = Kramdown::Document.new(redcarpet_output, input: 'html')
result = kramdown_doc.to_html
puts result
# 输出:<pre><code>hello</code></pre>

注意:灰色代码块的视觉效果依赖UI端的CSS样式,只要你输出正确的<pre><code>结构,无需修改UI的HTML文件即可实现目标效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:55:17