Markdown你的文章和代码高亮

现在,如果你写文章不使用Markdown格式,那真的是out了。可见Markdown在当前写作领域发挥的重要作用,作为一种轻量级的标记语言,它的语法简单明了,为你省去排版烦恼。
以下将介绍我博客中的Markdown的使用历史,并高亮文章代码。

  • 阶段一

去年刚搭完博客的时候,我用了一个最傻瓜最粗暴的发式,现在想想也是醉了。方法如下:

先在你熟悉的Markdown编辑器写下你的文章,使用Html导出功能下载到本地,将Html文件的源码复制到Django后台,保存即可。

这种方法不需要用到任何的Markdown模块,虽然方法土了点,但是完全省去了程序渲染的步骤,高效至极。

关于此阶段的代码高亮,我使用的是hightlight.js这个插件,它可自动识别所须高亮的代码语言,能够对

添加样式,只需加上以下代码即可工作:

  

  
  • 阶段二

在使用阶段一的方法一段时间后,觉得很是麻烦,便使用Python的Markdown模块。安装方法如下:

sudo pip install markdown
#或
sudo pip install markdown

markdown与markdown2功能类似,使用上稍有不同,我均是将它们自定义了一个模板过滤器,下面仅仅是介绍了markdown2在Django中的使用。

  1. 在你的应用目录下新建一个名为templatetags的文件夹,并在其之下新建两个Python文件:__init__.py(使templatetags成为一个包),和blog_tags.py。编辑blog_tags.py文件:
import markdown2

from django import template
from django.template.defaultfilters import stringfilter
from django.utils.encoding import force_text
from django.utils.safestring import mark_safe

register = template.Library()

@register.filter(is_safe=True)
@stringfilter
def custom_markdown(value):
   return mark_safe(markdown2.markdown(force_text(value),
          extras=["fenced-code-blocks", "cuddled-lists", "metadata", "tables", "spoiler"]))

2.在模板文件中:

{{article.content | custom_markdown}}

3.前往https://github.com/richleland/pygments-css获取你喜欢的样式添加至模板文件。不要忘记在头部引入{% load blog_tags %}

  • 阶段三

后来无意中又在网上有发现了一个号称是Python中最快的markdown解析模块---mistune

sudo pip install mistune

放上官网上的一个简单例子:

import mistune

markdown = mistune.Markdown()
markdown('I am using **mistune markdown parser**')

blog_tags.py添加代码:

from django import template
import mistune
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import HtmlFormatter

register = template.Library()

def block_code(text, lang, inlinestyles=False, linenos=False):
    if not lang:
        text = text.strip()
        return u'
%s
\n' % mistune.escape(text) try: lexer = get_lexer_by_name(lang, stripall=True) formatter = HtmlFormatter( noclasses=inlinestyles, linenos=linenos ) code = highlight(text, lexer, formatter) if linenos: return '
%s
\n' % code return code except: return '
%s
\n' % ( lang, mistune.escape(text) ) class HighlightMixin(object): def block_code(self, text, lang): # renderer has an options inlinestyles = self.options.get('inlinestyles') linenos = self.options.get('linenos') return block_code(text, lang, inlinestyles, linenos) class TocRenderer(HighlightMixin, mistune.Renderer): pass @register.filter def markdown_detail(value): renderer = TocRenderer(linenos=True, inlinestyles=False) mdp = mistune.Markdown(escape=True, renderer=renderer) return mdp(value)

并在模板中使用之。

  • 测试

那么,至于以上介绍的三款markdown解析工具的解析速度到底怎么样呢?我写了测试如下:

import markdown, markdown2, mistune, time


def timeit(func):
    def wrapper(value):
        start = time.clock()
        func(value)
        end = time.clock()
        print ("%s used:%f" % (func.__name__, end-start))
    return wrapper


@timeit
def markdown_test(value):
    for i in xrange(0, 10000):
        res = markdown.markdown(value)


@timeit
def markdown2_test(value):
    for i in xrange(0, 10000):
        res = markdown2.markdown(value)


@timeit
def mistune_test(value):
    for i in xrange(0, 10000):
        res = mistune.markdown(value)

if __name__ == '__main__':
    text = '''
        >Hello world
        '''
    markdown_test(text)
    markdown2_test(text)
    mistune_test(text)

经过多次测试,结果基本相同:

Markdown你的文章和代码高亮_第1张图片
测试结果

markdown2的作者说自己的模块解析速度比markdown要快,也确实如此。不过最令我惊讶的当属mistune,比markdown几乎快了10倍,果断使用之...

你可能感兴趣的:(Markdown你的文章和代码高亮)