ruby-on-rails Redcarpet和Rails 7的错误Markdown渲染

vi4fp9gy  于 2024-01-09  发布在  Ruby
关注(0)|答案(1)|浏览(112)

我在Ruby on Rails 7中使用redcarpet gem将Markdown渲染为HTML。问题是没有正确渲染代码块,它渲染为:

<code class="ruby">
  def func
    puts "Hello there"
  end
</code>

字符串
正确的输出应该是上面没有代码标签的代码,如果我尝试渲染不同的语言,输出是相同的代码标签。
HTML呈现的是下一个:

<pre>
  <code data-highlighted="yes" class="hljs language-ruby">
    "<code "
    <span class="hljs-keyword">class</span>
    "="
    <span class="hljs-string">"ruby"</span>
    "> "
    <span class="hljs-keyword">def</span>
    <span class="hljs-title function_">func</span>
    " puts "
    <span class="hljs-string">"Hello there"</span>
    <span class="hljs-keyword">end</span>
    " <"
    <span class="hljs-regexp">/code></span>
  </code>
</pre>


下面是我的代码:
呈现Markdown的函数

def markdown(text)
    options = {
      no_links: false,
      hard_wrap: true,
      link_attributes: { target: "_blank" }
    }
    extensions = {
      hard_wrap: true,
      autolink: true,
      no_intra_emphasis: true,
      tables: true,
      fenced_code_blocks: true,
      strikethrough: true,
      lax_spacing: true,
      space_after_headers: true,
      quote: true,
      footnotes: true,
      highlight: true,
      underline: true
    }
    renderer = Redcarpet::Render::HTML.new(options)
    Redcarpet::Markdown.new(renderer, extensions).render(text).html_safe
end


我调用markdown函数的代码:

<p class="break-words line-clamp-3"><%= markdown(post.body) %></p>


post.body包含所有的Markdown文本,对于这个例子,发送到markdown方法的文本是:
post.body的输出为

irb(main):005> Post.find(86).body
  Post Load (0.3ms)  SELECT "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT $2  [["id", 86], ["LIMIT", 1]]
=> "```ruby\r\n\r\ndef func\r\n  puts \"Hello there\"\r\nend\r\n\r\n```"
irb(main):006>


在形式上创建一个新的职位,我有一个文本区域,我允许这个领域的参数方法,我相信这不是问题。任何人谁面对这个问题已经可以帮助我解决这个错误,请?

fd3cxomn

fd3cxomn1#

现在你正在将Markdown渲染成HTML,然后将所有这些都传递给highlight.js,这将导致你的输出。
保持语法突出显示的最简单的解决方案是覆盖RedCarpet生成代码块的方式
例如

class CustomRender < Redcarpet::Render::HTML
  def block_code(code,language)
    code
  end
end

字符串
然后将renderer = Redcarpet::Render::HTML.new(options)替换为renderer = CustomRender.new(options)
例如

相关问题