利用mistune解析markdown

最近新学MarkdownPython,一个用于写作,一个用于编程,都十分顺手,因此想学一下怎样用Python实现对Markdown语法的解析。在Github上搜索到一个项目:mistune。该项目使用纯Python实现了Markdown语法到HTML的解析,号称很快速,项目主页上有它与其他Python解析器的性能对比,我没有尝试,有兴趣的可以做些基准测试。本篇描述的是怎样利用mistune来实现对Markdown的解析,以下正是我学习和实践的过程。

第一步:初识

mistune项目文档对mistune的 特性安装方法基本用法高级用法 等都有详细描述,在此不再赘述太多,使用前需要从主页下载mistune.py文件,基本的使用方法如下:

#test.py
import mistune
mk = mistune.Markdown()
output = mk('I am using **mistune markdown parser**')
print(output)
#这段代码将会输出:<p>I am using <strong>mistune markdown parser</strong></p>

注意,test.py文件需要和mistune.py文件在同一个目录下,否则Python不能正常import mistune

第二步:根据源文件自动生成HTML文档

在理解了第一步基本的使用方法后,我考虑自己写一个脚本调用mistune模块,并通过Python文件操作读取源文件(.md文件),并自动生成HTML文档(preview.html),于是写了第一个简短的脚本:

#md2html.py
import mistune
mk = mistune.Markdown()
with open('input.md','r') as f:
    s = f.read()
html = mk(s)
with open('preview.html','w') as f:
    f.write(html)

这样,只要md2html.pymistune.py在同一目录下,该脚本就可以根据input.md文件中Markdown语法书写的内容自动生成一个preview.html文件,当然,前提是你在同一个目录下提前写好一个符合Markdown语法要求的input.md文档。

可以看出,以上脚本尽管简单地实现了目的,但是问题多多,且使用上不灵活,总结有以下几个缺点:

  1. 只能在input.md文件里提前写好内容才能转成HTML文档,使用上不灵活;
  2. 没有异常处理机制,脚本不健壮,假如没有提前创建input.md,将报错:FileNotFoundError;
  3. 缺少提示符,用户界面不友好;
  4. 不能自动调用浏览器预览生成的HTML文档,不直观。

第三步:改进

鉴于之前的脚本存在各种缺点,我对脚本进行了改进:

#python3 code
#md2html.py
import sys
import mistune
import webbrowser

#Count the number of command line parameters to find the path of md file
lenArgv = len(sys.argv)
if lenArgv == 1:
    url = input('Please input the path of md file:>')
elif lenArgv == 2:
    url = sys.argv[1]
else:
    url = input('You can only input a single path:>')

mk = mistune.Markdown()

#Exception handling:Avoid FileNotFoundError
while True:
    try:
        with open(url,'r') as f:
            s = f.read()
        break
    except FileNotFoundError:
        url = input('Not Found,Input the path again:>')

html = mk(s)
with open('preview.html','w') as f:
    f.write(html)

#End of run,open preview.html automatically by default browser
print('preview.html is generated successfully!')
webbrowser.open('preview.html')
input()

改进版脚本说明:

  1. 通过import sys实现了对命令行参数的判断,可以用python md2html.py <可缺省的源文件路径>进行调用,也可以直接运行md2html.py文件后输入源文件路径进行调用,比之前的程序更加灵活;
  2. 通过异常处理程序判断用户输入的路径是否正确,避免了程序的崩溃,增强了健壮性;
  3. 每一步都引入了提示符,便于用户使用时的理解,界面更友好;
  4. 通过import webbrowser实现html文件生成后的自动预览,更加直观。

写在后面

本文旨在提供一种学习思路,只是个人的想法,如有不正确的地方,还希望多多留言指正!另外Python编码风格的问题和写作方法的问题也请一起斧正,谢谢!使用中发现mistune这个模块对Markdown语法的解析并不完美,具体解析以下Markdown语法的时候即可发现:

#test.md
*  unordered list
1. ordered list
1. other

评论