4

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

このマークダウンの使用:

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

その結果、コード ブロックが 2 回ラップされます。

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

代わりに何をすべきですか?

4

1 に答える 1

2

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オプションをテストするための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> 
于 2010-10-29T07:53:42.847 に答える