gpt4 book ai didi

ruby - 在 Rails 3 应用程序中使用 CodeRay 和 Markdown (RDiscount) 突出显示语法

转载 作者:数据小太阳 更新时间:2023-10-29 07:37:07 24 4
gpt4 key购买 nike

我正在尝试向我目前使用 RDiscount 的博客添加一些语法突出显示。我正在使用 RDiscount 将 Markdown 转换为 HTML,然后使用 CodeRay 解析 HTML 代码块以添加语法突出显示。这是我目前所拥有的:

class Post < ActiveRecord::Base
before_save :render_body

def render_body
self.rendered_body = coderay(markdown(self.body))
end

def markdown(text)
RDiscount.new(text).to_html
end

def coderay(text)
text.gsub(/\<code( lang="(.+?)")?\>(.+?)\<\/code\>/m) do
CodeRay.scan($3, $2).div(:css => :class)
end
end
end

在我看来:

<%= raw @post.rendered_body %>

使用这个 Markdown :

<code lang="ruby">
def function(param1, param2)
puts param1
param2.each do |a|
a.hello :world
end
end
</code>

结果是代码块被包裹了两次。

<pre>
<div class="CodeRay">
<div class="code">
<pre>
def function(param1, param2)
puts param1
param2.each do |a|
a.hello :world
end
end
</pre>
</div>
</div>
</pre>

我应该怎么做?

最佳答案

在您的render_body 方法中,在调用markdown() 方法之前调用coderay() 方法。使用 markdown 方法首先会生成一些额外的 html,这会混淆 CodeRay 导致错误的输出。

我的测试假定您在 markdown 源中拥有看起来像这样的原始数据

<code lang="ruby">
def function(param1, param2)
puts param1
param2.each do |a|
a.hello :world
end
end
</code>

这是我用来测试它的完整类(class)。注意我没有使用 :css => :class 选项,因为我没有 css 来测试它。

class Post < ActiveRecord::Base
before_save :render_body

def render_body
self.rendered_body = markdown(coderay(self.body))
end

def markdown(text)
RDiscount.new(text).to_html
end

def coderay(text)
text.gsub(/\<code( lang="(.+?)")?\>(.+?)\<\/code\>/m) do
CodeRay.scan($3, $2).div
end
end
end

假设 :css => :class 选项,你的最终输出现在应该看起来像这样

<div class="CodeRay"> 
<div class="code"><pre>
<span class="r">def</span> <span class="fu">function</span>(param1, param2)
puts param1
param2.each <span class="r">do</span> |a|
a.hello <span class="sy">:world</span>
<span class="r">end</span>
<span class="r">end</span>
</pre></div>
</div>

关于ruby - 在 Rails 3 应用程序中使用 CodeRay 和 Markdown (RDiscount) 突出显示语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3994063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com