使用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解析xml中dom元素的方法
Mar 12 Python
基于Python3 逗号代码 和 字符图网格(详谈)
Jun 22 Python
python基于twisted框架编写简单聊天室
Jan 02 Python
Django重置migrations文件的方法步骤
May 01 Python
Python笔试面试题小结
Sep 07 Python
tensorflow 限制显存大小的实现
Feb 03 Python
python为QT程序添加图标的方法详解
Mar 09 Python
Python文件读写w+和r+区别解析
Mar 26 Python
Jupyter Notebook远程登录及密码设置操作
Apr 10 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
May 20 Python
python语言的优势是什么
Jun 17 Python
粗暴解决CUDA out of memory的问题
May 22 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支持页面回退的两种方法[转]
2007/02/14 PHP
基于php-fpm的配置详解
2013/06/03 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
JQuery的ajax获取数据后的处理总结(html,xml,json)
2010/07/14 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
Linux Centos7.2下安装nodejs&amp;npm配置全局路径的教程
2018/05/15 NodeJs
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
解决layer.prompt无效的问题
2019/09/24 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
[03:09]显微镜下的DOTA2第一期——带你走进华丽的DOTA2世界
2014/06/20 DOTA
Python切片知识解析
2016/03/06 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
python requests.post带head和body的实例
2019/01/02 Python
Django中reverse反转并且传递参数的方法
2019/08/06 Python
python实现银行管理系统
2019/10/25 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
智能电子应届生求职信
2013/11/10 职场文书
大学校园生活自我鉴定
2014/01/13 职场文书
森林防火工作方案
2014/02/14 职场文书
自荐信的基本格式
2014/02/22 职场文书
计算机毕业生自荐信范文
2014/03/23 职场文书
大学生工作自荐书
2014/06/16 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android