有许多关于这个主题的教程流传,但它们似乎不完整或过时或对我来说不太适用。
这就是我所做的。
Gemfile:
gem 'rouge'
gem 'redcarpet'
然后我创建了一个config/initializer/rouge.rb
文件:
require 'rouge/plugins/redcarpet'
然后我创建了一个名为app/assets/stylesheets/rouge.css.erb
的文件。
<%= Rouge::Themes::Github.render(:scope => '.highlight') %>
然后在我的app/helpers/application_helper.rb
中,我添加了以下内容:
module ApplicationHelper
class HTML < Redcarpet::Render::HTML
include Rouge::Plugins::Redcarpet
def block_code(code, language)
Rouge.highlight(code, language || 'text', 'html')
end
end
def markdown(text)
render_options = {
filter_html: true,
hard_wrap: true,
link_attributes: { rel: 'nofollow' }
}
renderer = HTML.new(render_options)
extensions = {
autolink: true,
fenced_code_blocks: true,
lax_spacing: true,
no_intra_emphasis: true,
strikethrough: true,
superscript: true
}
Redcarpet::Markdown.new(renderer, extensions).render(text).html_safe
end
end
接着在我的show.html.erb
文件中,我做了这样的修改:
<%= markdown(@question.body) %>
但实际上这样做不起作用。它会以以下方式输出我的ruby
代码片段:
如何使这段代码的格式类似于Github呢?或者至少先使代码有任何格式,然后如何调整格式?
我在页面源代码中没有看到包含样式表,所以我不知道哪些样式需要调整。
编辑1
甚至当我这样做时:
<div class="highlight">
<%= @question.test_suite %>
</div>
它的渲染结果如下:
编辑2
我尝试了BoraMa的建议,并得到了以下输出:
编辑3
我对BoraMa的答案进行了修改,具体如下。
在我的block_code
方法中,我调用highlight方法如下:
Rouge.highlight(code, 'ruby', 'html')
那么在我的看法中,我会这样做:
<%= raw rouge_markdown(<<-'EOF'
def rouge_me
puts "this is a #{'test'} for rouge"
end
EOF
) %>
然后它会生成这个:
注意,我指的是截图底部的代码片段。
但是,顶部的文本是由以下代码生成的:
<pre class="highlight ruby">
<%= rouge_markdown(@question.body) %>
</pre>
并且它的渲染效果如截图所示。
编辑 4
移除了<div class="highlight">
之后,我看到了这个:
也就是说...根本没有任何内容被渲染出来。
当我在我的视图中添加raw
,即<%= raw rouge_markdown(@question.body) %>
视图将呈现为:
编辑 5
这里是各种@question
对象的内容:
[1] pry(#<#<Class:0x007fc041b97ce8>>)> @question.body
=> "5.times do\r\n puts \"Herro Rerl!\"\r\nend"
[1] pry(#<#<Class:0x007fc041b97ce8>>)> @question.body
=> "puts \"Hello World version 9\"\r\nputs \"This comes after version 8.\"\r\nputs \"This comes after version 7.\"\r\nputs \"This comes after version 6.\"\r\nputs \"This comes after version 5.\"\r\nputs \"This comes after version 4.\"\r\nputs \"This comes after version 3.\"\r\nputs \"This comes after version 2.\"\r\nputs \"This definitely comes after version 1.\""
[1] pry(#<#<Class:0x007fc041b97ce8>>)> @question.body
=> "def convert_relation(invited_gender, relation)\r\n case invited_gender\r\n \twhen \"male\"\r\n \tcase relation\r\n when \"daughter\", \"son\" then \"dad\"\r\n when \"mom\", \"dad\" then \"son\"\r\n when \"grandfather\", \"grandmother\" then \"grandson\"\r\n when \"sister\", \"brother\" then \"brother\"\r\n when \"wife\" then \"husband\"\r\n when \"husband\" then \"husband\"\r\n end\r\n when \"female\"\r\n \tcase relation\r\n when \"daughter\", \"son\" then \"mom\"\r\n when \"mom\", \"dad\" then \"daughter\"\r\n when \"grandfather\", \"grandmother\" then \"granddaughter\"\r\n when \"sister\", \"brother\" then \"sister\"\r\n when \"wife\" then \"wife\"\r\n when \"husband\" then \"wife\"\r\n end\r\n end\r\nend\r\n\r\nputs convert_relation(\"male\", \"wife\")"
highlight
类的div
中。你不需要这样做,rouge本身会将代码包装在具有此类的pre
中,而div似乎会使它混淆。我更新了答案(请参见第3点)。 - Matouš Borák<<-EOF
测试代码时没有缩进,否则markdown将把它解释为等宽代码。如果仍然无法正常工作,请添加gem的版本,我的版本是:redcarpet(3.3.4)和rouge(1.11.0)。 - Matouš Borák