Markdown 的 Ansi 显示

随着 Jekyll、Octopres、Docpad 等一批静态博客生成器的兴起,Markdown 已经成为写博客的利器。不过,有时候想把博客上的文章直接贴到 BBS 上还是需要去做一些转换,把格式转换为 ANSI 颜色控制符。

原因主要有二:

  1. 直接复制网页有些链接就只有文字没有 URL,同时代码高亮之类的就没了。
  2. 直接粘贴 Markdown 会引入一些不必要的字符(比如代码块的标记等)。

Redcarpet 的介绍发现它支持自定义 Render,于是就写了个 Markdown 到 Ansi 的工具。原理很简单:首先,Redcarpet 把 Markdown 解析为一系列的元素;然后,定义 Redcarpet::Render::Base 的子类对这些元素进行处理。这里用 ansi 来对文字进行着色,用 Pygments.rb 来对代码进行高亮。代码如下:

class Ansi < Redcarpet::Render::Base
  def normal_text(text)
    text.strip
  end

  def block_code(code, language)
    Pygments.highlight(code,
                       :lexer => language,
                       :formatter => 'terminal') + "\n\n"
  end

  def double_emphasis(text)
    " #{ansi(text, :yellow, :on_red)} "
  end

  # Other elements goes here
end

md = Redcarpet::Markdown.new(Ansi, :fenced_code_blocks => true)
md.render('Hello **markdown**\n')

写了一个简单的 Gem,安装方法如下:

$ gem install md2ansi

欢迎 fork