使用Python来开发Markdown脚本扩展的实例分享


Posted in Python onMarch 04, 2016

关于Markdown

在刚才的导语里提到,Markdown 是一种用来写作的轻量级「标记语言」,它用简洁的语法代替排版,而不像一般我们用的字处理软件 Word 或 Pages 有大量的排版、字体设置。它使我们专心于码字,用「标记」语法,来代替常见的排版格式。例如此文从内容到格式,甚至插图,键盘就可以通通搞定了。目前来看,支持 Markdown 语法的编辑器有很多,包括很多网站(例如简书)也支持了 Markdown 的文字录入。Markdown 从写作到完成,导出格式随心所欲,你可以导出 HTML 格式的文件用来网站发布,也可以十分方便的导出 PDF 格式,这种格式写出的简历更能得到 HR 的好感。甚至可以利用 CloudApp 这种云服务工具直接上传至网页用来分享你的文章,全球最大的轻博客平台 Tumblr,也支持使用 Mou 这类 Markdown 工具进行编辑并直接上传。

python的markdown扩展开发
近期使用python的markdown写了一个文档小程序,由于需要用到一些额外的功能,所以就对markdown进行了一些简单的扩展,进而记录下编写的模板。直接贴代码:

#encoding=utf-8 
##预处理器 
from markdown.preprocessors import Preprocessor 
class CodePreprocessor(Preprocessor): 
  def run(self, lines): 
    new_lines = [] 
    flag_in = False 
    block = [] 
    for line in lines: 
      if line[:3]=='!!!':         
        flag_in = True 
        block.append('<pre class="brush: %s;">' % line[3:].strip()) 
      elif flag_in: 
        if line.strip() and line[0]=='!': 
          block.append(line[1:]) 
        else: 
          flag_in = False 
          block.append('</pre>') 
          block.append(line) 
          new_lines.extend(block) 
          block = [] 
      else: 
        new_lines.append(line) 
    if not new_lines and block: 
      new_lines = block 
    return new_lines 
 
##后置处理器 
from markdown.postprocessors import Postprocessor 
class CodePostprocessor(Postprocessor): 
  def run(self, text): 
    t_list = [] 
    for line in text.split('\n'): 
      if line[:5]=='<p>!<': 
        line = line.lstrip('<p>').replace('</p>', '')[1:] 
      t_list.append(line)  
    return '\n'.join(t_list)   
   
##扩展主体类     
from markdown.extensions import Extension 
from markdown.util import etree 
class CodeExtension(Extension): 
  def __init__(self, configs={}): 
    self.config = configs 
 
  def extendMarkdown(self, md, md_globals): 
    ##注册扩展,用于markdown.reset时扩展同时reset 
    md.registerExtension(self)   
         
    ##设置Preprocessor 
    codepreprocessor = CodePreprocessor() 
    #print md.preprocessors.keys() 
    md.preprocessors.add('codepreprocessor', codepreprocessor, '<normalize_whitespace') 
     
    ##设置Postprocessor 
    codepostprocessor = CodePostprocessor() 
    #print md.postprocessors.keys() 
    md.postprocessors.add('codepostprocessor', codepostprocessor, '>unescape') 
     
    ##print md_globals  ##markdown全局变量

         

关于markdown扩展的深入内容,可以查看官方文档,不过没有例子,只是手册而已。但大体能知道有哪些内容组成,在结合上面的文件结构都是可以写出来的。下面是调用的代码:

#encoding=utf-8 
import markdown 
import markdowncode 
 
text = ''''' 
!!!python 
! 
!def foo(): 
 
###title 
''' 
 
configs = {} 
 
myext = markdowncode.CodeExtension(configs=configs) 
md = markdown.markdown(text, extensions=[myext]) 
print md

主要扩展了2个功能:
一个是把形如:

!!!python 
! 
!def foo(): 
! return 'foo'

转换成:

<pre class="brush: python;"> 
 
def foo(): 
 return 'foo' 
</pre>

使用Python来开发Markdown脚本扩展的实例分享

Python 相关文章推荐
python基础教程之类class定义使用方法
Feb 20 Python
python中的代码编码格式转换问题
Jun 10 Python
Python 正则表达式的高级用法
Dec 04 Python
Python文件操作,open读写文件,追加文本内容实例
Dec 14 Python
mysql 之通过配置文件链接数据库
Aug 12 Python
Python 中 Virtualenv 和 pip 的简单用法详解
Aug 18 Python
python3中zip()函数使用详解
Jun 29 Python
Python干货:分享Python绘制六种可视化图表
Aug 27 Python
python查看模块安装位置的方法
Oct 16 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
Jan 12 Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 Python
利用python下载scihub成文献为PDF操作
Jul 09 Python
使用py2exe在Windows下将Python程序转为exe文件
Mar 04 #Python
用Python编写简单的微博爬虫
Mar 04 #Python
python相似模块用例
Mar 04 #Python
Python程序中用csv模块来操作csv文件的基本使用教程
Mar 03 #Python
举例简单讲解Python中的数据存储模块shelve的用法
Mar 03 #Python
Python中的数据对象持久化存储模块pickle的使用示例
Mar 03 #Python
Python和Perl绘制中国北京跑步地图的方法
Mar 03 #Python
You might like
php 从数据库提取二进制图片的处理代码
2009/09/09 PHP
php简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
非常实用的php验证码类
2016/05/15 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
JQuery优缺点分析说明
2011/04/10 Javascript
javascript之典型高阶函数应用介绍
2013/01/10 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
微信小程序仿美团城市选择
2018/06/06 Javascript
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
小程序实现投票进度条
2019/11/20 Javascript
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
使用python实现接口的方法
2017/07/07 Python
Django视图和URL配置详解
2018/01/31 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
python保存数据到本地文件的方法
2018/06/23 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
详解django中使用定时任务的方法
2018/09/27 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
2018/11/20 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
python爬虫请求头的使用
2020/12/01 Python
canvas实现有递增动画的环形进度条的实现方法
2019/07/10 HTML / CSS
2014年班组工作总结
2014/11/20 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
一般纳税人申请报告
2015/05/18 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书