使用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 相关文章推荐
pydev使用wxpython找不到路径的解决方法
Feb 10 Python
Python操作MySQL简单实现方法
Jan 26 Python
python 中的divmod数字处理函数浅析
Oct 17 Python
python利用标准库如何获取本地IP示例详解
Nov 01 Python
python使用itchat实现手机控制电脑
Feb 22 Python
详解python单元测试框架unittest
Jul 02 Python
python高阶爬虫实战分析
Jul 29 Python
Python 类的私有属性和私有方法实例分析
Sep 29 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
Apr 08 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
May 11 Python
Python requests上传文件实现步骤
Sep 15 Python
python数字图像处理之图像的批量处理
Jun 28 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/05/27 PHP
php处理斐波那契数列非递归方法
2012/02/04 PHP
CodeIgniter控制器之业务逻辑实例分析
2016/01/20 PHP
PHP常用的三种设计模式
2017/02/17 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
phpstudy的php版本自由修改的方法
2017/10/18 PHP
tp5框架使用cookie加密算法实现登录功能示例
2020/02/10 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
js获取form的方法
2015/05/06 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
jQuery与vue实现拖动验证码功能
2018/01/30 jQuery
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
2019/09/04 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
[03:11]完美世界DOTA2联赛PWL DAY8集锦
2020/11/09 DOTA
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
一款纯css3实现的漂亮的404页面的实例教程
2014/11/27 HTML / CSS
HTML5中的新元素介绍
2008/10/17 HTML / CSS
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
雪山饭庄的创业计划书范文
2014/01/18 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
学生会招新策划书
2014/02/14 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
2014国庆节商场促销活动策划方案
2014/09/16 职场文书
个人查摆问题及整改措施
2014/10/16 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
工资证明格式模板
2015/06/12 职场文书
超级实用的公文标题大全!
2019/07/19 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js
mysql函数之截取字符串的实现
2022/08/14 MySQL