我知道有一个Railscast和ASCIIcast用于在CodeRay中使用Textile (RedCloth),并且它的方式是由一个助手完成的:
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选项?
发布于 2011-03-14 09:03:13
有一个名为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]您可以通过使用“-”来表示您的textile/markdown中的代码,并可选择添加语言,如“-ruby”,如下所示:
---ruby
def hi
print "hi"
end
---与Markdown配合使用时,效果非常好。
https://stackoverflow.com/questions/5293361
复制相似问题