2

CodeRayで Textile (RedCloth) を使用するためのRailscastASCIIcastがあることは承知しており、その方法はヘルパーによるものです。

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

そのため、 (CodeRay が機能するように) が@article.content既にラップされている<code>ことが前提です...</code>

しかし、それがMarkdownの場合は、StackOverflowのように「4スペースのインデント」を最初に変換して最初<code></code>フォーマットする必要があります。

したがって、この場合、使用できるようです

<%= coderay(Markdown.new(@article.content).to_html).html_safe  #html_safe for Rails 3 %>  

そのため、最初 に CodeRay が使用するフォーマットを取得し、基本的<code>にCodeRay の結果に置き換えます。</code>/<code>.*?</code>/m

これは適切な方法ですか?しかし、実際に<code></code>4スペースでインデントされた」コードがある場合、ネストされた があるため、実際にはこの処理がチョークされ<code>、最初のもの<code>が一致し、2番目<code>がCodeRayの単なるコンテンツとしてスキップされ、次に最初</code>に 2 番目の</code>ぶら下がりを未処理のままにします。これはどのように行うことができますか? CodeRay にはいくつかの Markdown オプションがありますか?

4

1 に答える 1

1

これを助けるlesstileと呼ばれる小さな宝石があります。しかし、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!(/\r\n/, "\n")
output = ""

while match = text.match(/---\s*?([\w\s\._+()-]*?)\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で完全に正常に動作します。

于 2011-03-14T01:03:12.880 に答える