使用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线程的两种编程方式
Apr 14 Python
举例讲解Linux系统下Python调用系统Shell的方法
Nov 07 Python
Python格式化输出%s和%d
May 07 Python
Python hashlib模块用法实例分析
Jun 12 Python
python 列表降维的实例讲解
Jun 28 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
Jan 17 Python
Python3.5面向对象编程图文与实例详解
Apr 24 Python
PyQt5响应回车事件的方法
Jun 25 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 Python
django 邮件发送模块smtp使用详解
Jul 22 Python
基于python实现简单C/S模式代码实例
Sep 14 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安全配置
2006/12/06 PHP
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
解析php时间戳与日期的转换
2013/06/06 PHP
领悟php接口中interface存在的意义
2013/06/27 PHP
php一些错误处理的方法与技巧总结
2013/08/10 PHP
javascript for循环从入门到偏门(效率优化+奇特用法)
2012/08/01 Javascript
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
JavaScript中数组的各种操作的总结(必看篇)
2017/02/13 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
vue动态合并单元格并添加小计合计功能示例
2020/11/26 Vue.js
vue祖孙组件之间的数据传递案例
2020/12/07 Vue.js
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
Python中new方法的详解
2019/01/15 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
简单分析python的类变量、实例变量
2019/08/23 Python
python获取array中指定元素的示例
2019/11/26 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
python归并排序算法过程实例讲解
2020/11/04 Python
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
RUIFIER官网:英国奢侈高级珠宝品牌
2020/06/12 全球购物
小学英语教师先进事迹
2014/05/28 职场文书
2014年底工作总结
2014/12/15 职场文书
七年级作文之我的梦想
2019/10/16 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
Java Spring读取和存储详细操作
2022/08/05 Java/Android