在Ruby on Rails上,如何使用CodeRay使用Markdown(RDiscount / BlueCloth)突出显示语法?

我知道有一个Railscast和ASCIIcast用于使用Textile(RedCloth)和CodeRay,它的工作方式是帮助:
module ApplicationHelper    
  def coderay(text)  
    text.gsub(/<code( lang="(.+?)")?>(.+?)</code>/m) do  
      CodeRay.scan($3, $2).div(:css => :class)  
    end  
  end  
end  
<%= textilize(coderay(@article.content)) %>
所以假设
@article.content
已经有
<code>
</code>
缠绕(这样CodeRay可以工作)...... 但是如果它是Markdown,那么“4空间缩进”就像在StackOverflow上一样,首先需要首先转换为
<code>
</code>
格式。 所以在这种情况下,似乎我们可以使用
<%= coderay(Markdown.new(@article.content).to_html).html_safe  #html_safe for Rails 3 %>  
所以它首先得到CodeRay使用的
<code>
</code>
格式,然后基本上用CodeRay结果替换
/<code>.*?</code>/m
。 这是一个正确的方法吗?但是如果我们实际上在“4空间缩进”代码中有
<code>
</code>
,那么它实际上会阻止这个处理,因为现在有嵌套的
<code>
,所以第一个
<code>
将匹配,跳过第二个
<code>
作为CodeRay的内容,然后匹配第一个
</code>
并留下第二个
</code>
悬挂在那里未经处理。如何做到这一点 - 也许CodeRay有一些Markdown选项?     
已邀请:
有一种叫做“少量”的小宝石可以帮助解决这个问题。我不喜欢使用gem,所以我提取了核心功能,归结为:
options = {
    :code_formatter => lambda {|code, lang|
        CodeRay.scan(CGI::unescapeHTML(code), lang).html.div
    }
}

text += "n" unless (text.rindex("n") == text.size - 1)
text.gsub!(/rn/, "n")
output = ""

while match = text.match(/---s*?([ws._+()-]*?)s*?n(.*?)---n/m)
    captures = match.captures
    code = captures[1]
    lang = captures[0].blank? ? nil : captures[0].downcase.strip.intern

    output += 
    options[:text_formatter][match.pre_match] +
    options[:code_formatter][code, lang]

    text = match.post_match
end

output += options[:text_formatter][text.chomp]
您可以使用“---”来表示您的纺织品/降价中的代码,并可选择添加语言,例如“--- ruby​​”,如下所示:
---ruby
def hi
  print "hi"
end
---
与Markdown完美搭配。     

要回复问题请先登录注册