首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Rails 3应用程序中使用CodeRay和Markdown (RDiscount)突出显示语法

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

Stack Overflow用户
提问于 2010-10-22 13:10:51
回答 1查看 2.1K关注 0票数 4

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

代码语言:javascript
运行
复制
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

在我看来:

代码语言:javascript
运行
复制
<%= raw @post.rendered_body %>

使用此标记:

代码语言:javascript
运行
复制
<code lang="ruby">
def function(param1, param2)
  puts param1
    param2.each do |a|
      a.hello :world
    end
end
</code>

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

代码语言:javascript
运行
复制
<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>

我应该怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-29 15:53:43

render_body方法中,先调用coderay()方法,然后再调用markdown()方法。首先使用markdown方法会生成一些额外的html和混乱的CodeRay,从而导致不好的输出。

我的测试假设您在markdown源中有类似如下所示的原始数据

代码语言:javascript
运行
复制
<code lang="ruby">
      def function(param1, param2)
        puts param1
          param2.each do |a|
            a.hello :world
          end
      end
</code>

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

代码语言:javascript
运行
复制
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选项,您的最终输出现在应该如下所示

代码语言:javascript
运行
复制
<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> 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3994063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档