Markdown 的 Ansi 显示
随着 Jekyll、Octopres、Docpad 等一批静态博客生成器的兴起,Markdown 已经成为写博客的利器。不过,有时候想把博客上的文章直接贴到 BBS 上还是需要去做一些转换,把格式转换为 ANSI 颜色控制符。
原因主要有二:
- 直接复制网页有些链接就只有文字没有 URL,同时代码高亮之类的就没了。
- 直接粘贴 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。