2010-10-22 15 views
4

J'essaie d'ajouter de la coloration syntaxique à mon blog qui utilise actuellement RDiscount. Je convertis le Markdown en HTML avec RDiscount puis en analysant les blocs de code HTML avec CodeRay pour ajouter de la coloration syntaxique. Voilà ce que j'ai jusqu'à présent:Mise en surbrillance de la syntaxe avec CodeRay et Markdown (RDiscount) dans une application Rails 3

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 

Et à mon avis:

<%= raw @post.rendered_body %> 

L'utilisation de ce démarquage:

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

Le résultat est que les blocs de code sont enveloppés deux fois.

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

Que dois-je faire à la place?

+0

Pouvez-vous inclure le self.body dans ce cas? – rwilliams

+0

Avez-vous pu tester ma solution? – rwilliams

Répondre

2

Dans votre méthode render_body, appelez la méthode coderay() avant d'appeler la méthode markdown(). L'utilisation de la méthode markdown générait d'abord du code html supplémentaire, ce qui provoquait une mauvaise sortie de CodeRay.

Mes tests supposé que vous aviez les données brutes qui semblait quelque chose comme ça dans la source de démarquage

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

Voici la classe complète, je l'habitude de le tester. Notez que je n'ai pas utilisé l'option :css => :class car je n'avais pas le css pour le tester.

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 

Votre sortie finale en supposant l'option :css => :class doit maintenant quelque chose comme ça

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

Cela a fonctionné pour moi. Merci! – Andrew

+0

Content de l'entendre. – rwilliams