代码之家  ›  专栏  ›  技术社区  ›  Andrew

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

  •  4
  • Andrew  · 技术社区  · 14 年前

    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 %>
    

    使用此标记:

    <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>
    

    我该怎么做呢?

    1 回复  |  直到 14 年前
        1
  •  2
  •   rwilliams    14 年前

    在你的 render_body 方法调用 coderay() 方法,然后调用 markdown() 方法。使用 markdown 方法首先生成一些额外的html CodeRay

    我的测试假设你在降价源中有这样的原始数据

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

    这是我用来测试它的全部课程。注意我没用 :css => :class

    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=>:类

    <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> 
    
    推荐文章