基于tornado实现的一个markdown解析服务器

makrdown 在 mac 有个不错的图形编辑器Mou
Mou左边编辑,右边自动预览,相当巴适,可导出为html和pdf。
初学tornado,于是想到写个简单的web服务器,让浏览器来预览编写的md文件。

python有markdown,markdown2两个库,有如下区别:

  • markdown2号称比markdown快,而且更接近最初perl版本的实现。
  • 两个支持的extras不同,markdown2支持wiki-table,markdown支持的是PHP Markdown Extra的table格式。

由于Mou支持的是PHP Markdown Extra的table格式,所以选择markdown库来实现。

安装库

$sudo pip install tornado
$sudo pip install markdown

服务器根下文件组织如下:
./server.py
./css/md.css
./md/test.md
./md/test.png

需求:

  • 访问http://127.0.0.1:8080/,自动罗列服务器跟下的所有md文件。
  • 以.md结尾的文件自动转换为html
  • 需要能够访问到md引用的图片

实现要点:
1、要启动markdown的extras支持table。
2、tornado的handle正则表达式正确处理不同类型文件。
3、注意URI解码,还原为中文。

完整代码如下:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import tornado.ioloop
import tornado.web

import markdown
import codecs
import os
import urllib

webRoot = os.path.split(os.path.realpath(__file__))[0]

class mdHandler(tornado.web.RequestHandler):
    def mdToHtml(self, path):
        output = """




"""

        input_file = codecs.open(path, "r", "utf8")
        text = input_file.read()
        html = markdown.markdown(text, ['tables'])

        output += html
        output += ""
        return output

    def get(self, args):
        uriPath = urllib.unquote(self.request.path) # decode URI
        if uriPath.startswith("/"):
            uriPath = uriPath[1:]
        mdPath = os.path.join(webRoot, uriPath)
        if os.path.exists(mdPath):
            self.write(self.mdToHtml(mdPath))
        else:
            self.send_error(404)

class indexHandler(tornado.web.RequestHandler):
    def getFileList(self):
        link = ""
        for item in os.walk(webRoot):
            for filename in item[2]:
                filePath = item[0] + os.sep + filename
                if '.' != filename[0] and os.path.isfile(filePath) and filename.endswith(".md"):
                    link += "

%s

" %(filePath[len(webRoot):], filename) return link def get(self): self.write('' '' '' '' '' '

%s

' '' %(self.getFileList())) application = tornado.web.Application([ (r'/', indexHandler), (r'/(.*\.md\Z)', mdHandler),# .md file (r'/css/(.*)',tornado.web.StaticFileHandler, {'path':os.path.join(webRoot, 'css')}), (r'/(.*\.[pP][nN][gG]\Z)',tornado.web.StaticFileHandler, {'path':webRoot}), # .png file (r'/(.*\.[jJ][pP][gG]\Z)',tornado.web.StaticFileHandler, {'path':webRoot}), # .jpg file ]) if __name__ == "__main__": application.listen(8080) tornado.ioloop.IOLoop.instance().start()

这里使用到了Mou中的css配置文件,
在路径

~/Library/Application\ Support/Mou/CSS/

下面有4个css,选择一个更名为md.css放到css文件夹下面。

标签: python, tornado

添加新评论