还是先做个广告: http://hisea.me
Markdown 是时下很流行的一种标记语言。
可以很简便的生成 html 代码,github 的 README 就是用这种形式显示再代码目录的下面。
Ruby/Rails借助繁多的Gem,可以迅速的就做好markdown的支持,顺道包含对代码高亮的支持。
Gem 太多,实现方法也太多。
下面就介绍一种比较迅速开发的办法。用了 redcarpet 和 CodeRay 两个 Gem。这也是 hisea.me 用的办法。
首先,安装 GEM
gem 'redcarpet'
gem 'coderay'
接下来,打开 app/helper/application_helper.rb,添加下列代码。
def markdown(text)
options = {
:autolink => true,
:space_after_headers => true,
:fenced_code_blocks => true,
:no_intra_emphasis => true,
:hard_wrap => true,
:strikethrough =>true
}
markdown = Redcarpet::Markdown.new(HTMLwithCodeRay,options)
markdown.render(h(text)).html_safe
end
class HTMLwithCodeRay < Redcarpet::Render::HTML
def block_code(code, language)
CodeRay.scan(code, language).div(:tab_width=>2)
end
end
解释下上面的代码。 第一步是添加了一个 markdown 方法,配置了一些显示方面的细节,比如 autolink, hard_wrap 之类的。
markdown = Redcarpet::Markdown.new(HTMLwithCodeRay,options)
markdown.render(text).html_safe
这一步用了一个我们自己定义的 HTMLwithCodeRay 的 Render 类来创建一个新的 markdown 对象, 然后用这个自定义类来解析传进来的字符串。
class HTMLwithCodeRay < Redcarpet::Render::HTML
def block_code(code, language)
CodeRay.scan(code, language).div(:tab_width=>2)
end
end
最后就是这个自定义类,里面就重写了一个方法。当我们遇到 block_code 的时候,转交给 CodeRay 来生成高亮。
然后就没了。。。 迅速吧。
html_safe 我感觉是不是误用了,如果 Text 内容是
<script type="text/javascript">alert();</script>
呢?
为什么我生成的效果不太一样呢?
从第二行开始,出现了很多空格。
<script type="text/javascript">
$(function() {
alert('hello');
});
</script>
<strong>hi</strong>
按照教程做的,在模版里调用时传递变量时,
<%= markdown(@post.content) %>
会有以下错误
uninitialized constant ApplicationHelper::HTMLwithCodeRay::CodeRay
直接传递字符串可以正常解析。
求解?谢谢
module ApplicationHelper
def markdown(text)
options = {
:autolink => true,
:space_after_headers => true,
:fenced_code_blocks => true,
:no_intra_emphasis => true,
:hard_wrap => true,
:strikethrough =>true
}
markdown = Redcarpet::Markdown.new(HTMLwithCodeRay,options)
markdown.render(h(text)).html_safe
end
class HTMLwithCodeRay < Redcarpet::Render::HTML
def block_code(code, language)
CodeRay.scan(code, language).div(:tab_width=>2)
end
end
end
#11 楼 @lidashuang 应该没问题的,你重启服务器了么。另外看上去好像找不到 CodeRay,gem 装了么,开 rails c,打 CodeRay 看看啥反应。
tanoku/redcarpet on Github 在这个项目不存在了。 现在使用 https://github.com/emiddleton/redcarpet
请问如何高亮呢? 我是这么输入的。 html def person sdf end
ruby def person sdf end
这两种情况都没有亮!
请注意三个 1 前面的那个键我是敲了的,这里没有敲,是因为敲了就变成代码了!
生成的 html 中有
def print puts "" end
可是没有 ruby 这个 css 的 class,怎么高亮嗯?请问这个 class 那里找,还是说我那里搞错了,这个 css 应该是随着 coderay 一起安装的吧。
#18 楼 @woaigithub 我还在想说怎么改名了,我明明以前 fork 过 redcarpet 还改过代码、发过 PR …结果一看连我自己的 fork 都变成 from vmg/redcarpet 了…只能猜测是他本人改 ID…
单行代码
\"credentials\"=>
{
\"token\"=>\"82a663866ad1aa18c476ac26a6cf816f\",
\"refresh_token\"=>\"940cc521237e5412d1a75e3919cb11f6\",
\"expires_at\"=>1410355745, \"expires\"=>true
},