现在,如果你写文章不使用Markdown格式,那真的是out了。可见Markdown在当前写作领域发挥的重要作用,作为一种轻量级的标记语言,它的语法简单明了,为你省去排版烦恼。
以下将介绍我博客中的Markdown的使用历史,并高亮文章代码。
- 阶段一
去年刚搭完博客的时候,我用了一个最傻瓜最粗暴的发式,现在想想也是醉了。方法如下:
先在你熟悉的Markdown编辑器写下你的文章,使用Html
导出功能下载到本地,将Html文件的源码复制到Django
后台,保存即可。
这种方法不需要用到任何的Markdown模块,虽然方法土了点,但是完全省去了程序渲染的步骤,高效至极。
关于此阶段的代码高亮,我使用的是hightlight.js
这个插件,它可自动识别所须高亮的代码语言,能够对<pre><code></code></pre>
添加样式,只需加上以下代码即可工作:
<link href="http://cdn.bootcss.com/highlight.js/8.0/styles/monokai_sublime.min.css" rel="stylesheet">
<script src="http://cdn.bootcss.com/highlight.js/8.0/highlight.min.js"></script>
<script >hljs.initHighlightingOnLoad();</script>
- 阶段二
在使用阶段一的方法一段时间后,觉得很是麻烦,便使用Python
的Markdown模块。安装方法如下:
sudo pip install markdown
#或
sudo pip install markdown
markdown与markdown2功能类似,使用上稍有不同,我均是将它们自定义了一个模板过滤器,下面仅仅是介绍了markdown2在Django
中的使用。
- 在你的应用目录下新建一个名为
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'<pre><code>%s</code></pre>\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 '<div class="highlight">%s</div>\n' % code
return code
except:
return '<pre class="%s"><code>%s</code></pre>\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)
经过多次测试,结果基本相同:
markdown2的作者说自己的模块解析速度比markdown要快,也确实如此。不过最令我惊讶的当属mistune
,比markdown几乎快了10倍,果断使用之...