mar*_*ion 12 syntax-highlighting ruby-on-rails pygments ruby-on-rails-5 rouge
有一堆教程浮动,但它们似乎不完整或不完全是最新的或不适合我.
这就是我所做的.
的Gemfile:
gem 'rouge'
gem 'redcarpet'
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个config/initializer/rouge.rb:
require 'rouge/plugins/redcarpet'
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个名为的文件 app/assets/stylesheets/rouge.css.erb
<%= Rouge::Themes::Github.render(:scope => '.highlight') %>
Run Code Online (Sandbox Code Playgroud)
然后在我的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
Run Code Online (Sandbox Code Playgroud)
然后在我show.html.erb,我做了这个:
<%= markdown(@question.body) %>
Run Code Online (Sandbox Code Playgroud)
但这确实不起作用.它输出我的ruby代码片段,如下所示:
如何将这段代码格式化为Github?或者甚至只是第一步要格式化,那么我该如何调整格式呢?
我没有在页面的源代码中看到样式表,因此我不知道要调整哪些样式以满足我的需求.
编辑1
或者甚至当我这样做时:
<div class="highlight">
<%= @question.test_suite %>
</div>
Run Code Online (Sandbox Code Playgroud)
它呈现如下:
编辑2
我尝试了BoraMa的建议,我的输出看起来像这样:
编辑3
我对BoraMa的答案进行了如下修改.
在我的block_code方法中,我将高亮调用如下:
Rouge.highlight(code, 'ruby', 'html')
Run Code Online (Sandbox Code Playgroud)
然后在我看来我这样做:
<%= raw rouge_markdown(<<-'EOF'
def rouge_me
puts "this is a #{'test'} for rouge"
end
EOF
) %>
Run Code Online (Sandbox Code Playgroud)
然后产生这个:
注意我指的是屏幕截图底部的代码段.
但是,顶部的文本是通过以下方式生成的:
<pre class="highlight ruby">
<%= rouge_markdown(@question.body) %>
</pre>
Run Code Online (Sandbox Code Playgroud)
它的呈现方式如屏幕截图所示.
编辑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\")"
Run Code Online (Sandbox Code Playgroud)
Bor*_*aMa 11
最初的问题表明(在尝试的解决方案中)降价将用于突出显示的问题,但结果并非如此.所以这个答案分为两个截然不同的部分,一个用于突出显示没有markdown的纯代码,另一个用于带代码的markdown文本.
在这种情况下,根据README,您需要使用Rouge突出显示代码是词法分析器和格式化程序.由于突出显示的文本将显示在网页上,因此您需要HTML格式化程序.对于词法分析器,您需要事先知道代码所使用的语言(或者您可以尝试从源代码本身猜测它,但对于小代码片段它似乎不是非常可靠).
您可以为突出显示创建一个简单的帮助方法:
module RougeHelper
def rouge(text, language)
formatter = Rouge::Formatters::HTML.new(css_class: 'highlight')
lexer = Rouge::Lexer.find(language)
formatter.format(lexer.lex(text))
end
end
Run Code Online (Sandbox Code Playgroud)
然后在模板中,只需使用要突出显示的文本和语言调用此帮助程序:
<%= raw rouge("def rouge_me\n puts 'hey!'\nend", "ruby") %>
Run Code Online (Sandbox Code Playgroud)
这将呈现:

要获取Rouge支持的所有语言的列表以及应传递给rouge帮助程序的相应名称,可以使用以下代码.代码从Rouge获取所有已定义的词法分析器并显示其标记(即Rouge识别它们的名称):
Rouge::Lexer.all.map(&:tag).sort
# => ["actionscript", "apache", "apiblueprint", "applescript", ..., "xml", "yaml"]
Run Code Online (Sandbox Code Playgroud)
在向用户显示选择框中可供选择的语言时,您可以(也可能应该)使用此列表.请注意,每个词法分析器也有title和desc定义的方法,会给你一个人类可读的名字和他们每个人的简短描述.您可能也希望将此信息显示给用户.
注意:你应该摆脱初始化程序,自定义HTML类和div包裹在rouge帮助程序调用中(所有这些都是你原来的尝试).除了上面的代码之外,您唯一需要的是CSS规则,您已经正确地将其包含在网页中.
您尝试使其工作的一些变化:
不需要初始化程序,你可以删除它我想(但如果你不想require在帮助程序后面的所有文件中,我猜你可以保留它).
block_code从帮助程序类中删除方法,包括markdown插件已经完成了相同的操作.
<div class="highlight">从模板中删除包装器div并只使用其中的帮助器.Rouge使用"highlight"类添加自己的包装器,另一个div似乎混淆了它.
请尝试以下帮助程序代码.顺便说一下,我将代码从ApplicationHelper单独移动RougeHelper(但这不是必需的更改):
module RougeHelper
require 'redcarpet'
require 'rouge'
require 'rouge/plugins/redcarpet'
class HTML < Redcarpet::Render::HTML
include Rouge::Plugins::Redcarpet
end
def rouge_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
}
markdown = Redcarpet::Markdown.new(renderer, extensions)
markdown.render(text)
end
end
Run Code Online (Sandbox Code Playgroud)
然后,在模板中,我试图突出显示测试ruby代码:
<%= raw rouge_markdown(<<-'EOF'
```ruby
def rouge_me
puts "this is a #{'test'} for rouge"
end
```
EOF
) %>
Run Code Online (Sandbox Code Playgroud)
请注意,我需要手动指定语言,这使我使用3个反引号方式来分隔代码而不是空格缩进.我不知道为什么代码语言自动检测在这里不起作用,也许这是一个太短的代码.
最后,这为我呈现了很好的颜色:

| 归档时间: |
|
| 查看次数: |
1337 次 |
| 最近记录: |