如何在Ruby on Rails中关闭Redcarpet的特定标签并仅启用指定标签?
解决Redcarpet只启用指定Markdown标签的问题
我之前也踩过Redcarpet的这个坑!问题根源在于你混淆了Redcarpet的核心语法解析和扩展功能的控制逻辑:你尝试设置的codespan: false这类参数是用来控制扩展功能的,但像斜体、代码段、列表这些属于Redcarpet的核心语法,默认就会被解析,没法通过初始化选项直接关闭。要实现“只启用少数指定标签”,可以用以下两种方案:
方案1:重写自定义渲染器(最彻底,控制核心语法)
如果要严格禁用大部分核心语法,只保留你需要的少数标签,最靠谱的方式是在自定义渲染器里重写对应的方法,让不需要的语法直接返回原文本,不做渲染处理。
举个例子:假设你只想保留粗体(**文本**)和普通段落,其他所有语法都禁用,你的CustomRender可以这么写:
class CustomRender < Redcarpet::Render::HTML # 只保留粗体的渲染逻辑 def double_emphasis(text) "<strong>#{text}</strong>" end # 保留段落渲染(如果不需要段落格式化,直接返回text即可) def paragraph(text) "<p>#{text}</p>" end # 重写所有不需要的语法方法,直接返回原内容 def emphasis(text) # 禁用斜体(*文本*) text end def codespan(code) # 禁用代码段(`代码`) code end def list(contents, list_type) # 禁用列表 contents end def list_item(text, list_type) # 禁用列表项 text end def link(link, title, content) # 禁用链接 content end def image(link, title, alt_text) # 禁用图片 alt_text end # 其他你想禁用的语法,比如删除线、上标等,都可以按这个方式重写对应方法 end
然后你的markdown方法可以保持原来的结构:
def markdown(text) options = {} # 不需要扩展的话留空即可 renderer = CustomRender.new(hard_wrap: true, filter_html: true) Redcarpet::Markdown.new(renderer, options).render(text).html_safe end
方案2:控制扩展功能(仅针对非核心语法)
如果你的需求只是关闭扩展语法(比如表格、自动链接、脚注这些),而核心语法(斜体、列表等)本来就想保留部分,那可以通过初始化选项先禁用所有默认扩展,再手动开启你需要的:
def markdown(text) # 先禁用所有默认扩展,再按需开启需要的(比如只开启表格) options = { no_autolink: true, no_strikethrough: true, no_superscript: true, no_underline: true, no_highlight: true, no_footnotes: true, disable_indented_code_blocks: true, # 开启你需要的扩展,比如表格 tables: true } renderer = CustomRender.new(hard_wrap: true, filter_html: true) Redcarpet::Markdown.new(renderer, options).render(text).html_safe end
注意:这种方法只能控制扩展语法,核心语法(斜体、代码段、列表)还是会被渲染,所以要禁用核心语法,必须用方案1。
为什么你的codespan: false不生效?
因为codespan是Redcarpet的核心语法,不属于扩展选项的控制范围,所以设置这个参数根本不会起作用。要禁用代码段,必须在自定义渲染器里重写codespan方法,让它返回原代码文本而不是<code>标签。
内容的提问来源于stack exchange,提问作者blackhole
相关产品推荐
相关产品推荐

