現(xiàn)在,如果你寫文章不使用Markdown格式,那真的是out了飞主。可見Markdown在當(dāng)前寫作領(lǐng)域發(fā)揮的重要作用高诺,作為一種輕量級的標(biāo)記語言碌识,它的語法簡單明了,為你省去排版煩惱虱而。
以下將介紹我博客中的Markdown的使用歷史筏餐,并高亮文章代碼。
- 階段一
去年剛搭完博客的時候牡拇,我用了一個最傻瓜最粗暴的發(fā)式胖烛,現(xiàn)在想想也是醉了。方法如下:
先在你熟悉的Markdown編輯器寫下你的文章诅迷,使用Html
導(dǎo)出功能下載到本地佩番,將Html文件的源碼復(fù)制到Django
后臺,保存即可罢杉。
這種方法不需要用到任何的Markdown模塊趟畏,雖然方法土了點(diǎn),但是完全省去了程序渲染的步驟滩租,高效至極赋秀。
關(guān)于此階段的代碼高亮,我使用的是hightlight.js
這個插件律想,它可自動識別所須高亮的代碼語言猎莲,能夠?qū)?code><pre><code></code></pre>添加樣式,只需加上以下代碼即可工作:
<link 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
中的使用葵陵。
- 在你的應(yīng)用目錄下新建一個名為
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 %}
- 階段三
后來無意中又在網(wǎng)上有發(fā)現(xiàn)了一個號稱是Python中最快的markdown解析模塊---mistune
sudo pip install mistune
放上官網(wǎng)上的一個簡單例子:
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)
經(jīng)過多次測試响迂,結(jié)果基本相同:
markdown2的作者說自己的模塊解析速度比markdown要快,也確實(shí)如此细疚。不過最令我驚訝的當(dāng)屬mistune
蔗彤,比markdown幾乎快了10倍,果斷使用之...