Ruby on Rails 中使用 Markdown 语法,及代码高亮

之前写博客一直采用手写 HTML 的方法,很是繁琐,今天花点时间,给博客添加 Markdown 语法支持,并实现语法高亮。

实现 Markdown 语法和代码语法高亮分别是用的 Redcarpet 和 pygments.rb 两个 Gem:

/Gemfile中添加如下两行:

gem 'redcarpet'
gem 'pygments.rb'

需要说明的是,pygments.rb 依赖于 Python,所以确保机器已经安装了 Python 2.x。

然后在/app/controllers/comments_controller.rb中添加相应 redcarpet 和 pygments.rb 的代码:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  helper_method [:markdown]

  # Highlight code with Pygments
  class HTMLwithPygments < Redcarpet::Render::HTML
    def block_code(code, language)
      language = "text" if language.blank?
      sha = Digest::SHA1.hexdigest(code)
      Rails.cache.fetch ["code", language, sha].join("-") do
        Pygments.highlight(code, :lexer => language)
      end
    end
  end

  protected

  # Markdown with Redcarpet
  def markdown(text)
    renderer = HTMLwithPygments.new({
      :filter_html => true,
      :hard_wrap => true,
      :link_attributes => {:rel => 'external nofollow'}
    })

    options = {
      :autolink => true,
      :no_intra_emphasis => true,
      :fenced_code_blocks => true,
      :lax_html_blocks => true,
      :strikethrough => true,
      :superscript => true,
      :tables => true
    }

    Redcarpet::Markdown.new(renderer, options).render(text).html_safe
  end
end

最后在 View 中就可以直接调用 markdown 方法来处理博客正文了:

<%= markdown @post.content %>

语法规则类似 Github 上的 Markdown,码字效率大大提高。

Posted on 2014-01-08

2 Comments

  • chanshunli chanshunli over 3 years ago

    求问楼主,Rails 4.1.1 是否正常可用? 不能显现高亮语法 .

  • libuchao libuchao over 3 years ago

    @chanshunli
    这个博客目前用的就是 Rails 4.1.1,代码高亮正常啊。

Leave a Comment