如何让Kramdown为纯文本代码块添加<div class="highlight">包裹
让Kramdown为纯文本代码块生成highlight包裹结构的方法
问题说明
我想让Kramdown处理纯文本代码块时,像处理Ruby这类语言的代码块一样,用<div class="highlight">元素包裹。例如:
输入的Markdown代码:
puts 'This is Ruby.'
This is text.
当前生成的HTML中,Ruby代码块会被嵌套在完整的高亮容器里,而纯文本代码块仅输出<pre><code>结构,需要让纯文本代码块也生成一致的外层div嵌套。
解决方案
方法一:自定义Kramdown HTML转换器
继承Kramdown的默认HTML转换器,重写代码块的转换逻辑,强制所有代码块使用统一的外层结构:
require 'kramdown' require 'kramdown/parser/github_flavored' class CustomHighlighter < Kramdown::Converter::Html def convert_codeblock(el, indent) # 提取代码块的语言标识,默认设为text lang = el.attr['class']&.sub(/^language-/, '') || 'text' # 生成和语法高亮代码块一致的嵌套结构 <<~HTML <div class="language-#{lang} highlighter-rouge"> <div class="highlight"> <pre class="highlight"><code>#{escape_html(el.value)}</code></pre> </div> </div> HTML end end # 使用自定义转换器渲染Markdown markdown_content = <<~MD ```ruby puts 'This is Ruby.'
This is text.
MD
html_output = CustomHighlighter.convert(markdown_content, input: 'GFM')
puts html_output
### 方法二:配置Kramdown强制为text语言启用高亮 如果是在Jekyll环境中使用Kramdown,可在`_config.yml`中添加以下配置,让Rouge高亮器处理text语言,生成统一结构: ```yaml kramdown: syntax_highlighter: rouge syntax_highlighter_opts: default_lang: text block: wrap: true
内容的提问来源于stack exchange,提问作者tscheingeld
相关产品推荐
相关产品推荐

