使用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常见格式化字符串方法小结【百分号与format方法】
Sep 18 Python
python自动发送邮件脚本
Jun 20 Python
pycharm的console输入实现换行的方法
Jan 16 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 Python
20行python代码实现人脸识别
May 05 Python
Django 在iframe里跳转顶层url的例子
Aug 21 Python
Python pandas自定义函数的使用方法示例
Nov 20 Python
python下载的库包存放路径
Jul 27 Python
python/golang实现循环链表的示例代码
Sep 14 Python
python中判断数字是否为质数的实例讲解
Dec 06 Python
pytorch锁死在dataloader(训练时卡死)
May 28 Python
详解python的异常捕获
Mar 03 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
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
一篇有意思的技术文章php介绍篇
2010/10/26 PHP
PHP include_path设置技巧分享
2011/07/03 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
微信自定义菜单的处理开发示例
2015/04/16 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
js编写当天简单日历效果【实现代码】
2016/05/03 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
[47:20]DAC2018 4.4 淘汰赛 Optic vs Mineski 第一场
2018/04/05 DOTA
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
python进阶教程之模块(module)介绍
2014/08/30 Python
详解Python Socket网络编程
2016/01/05 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
2018/05/24 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
Python 监测文件是否更新的方法
2019/06/10 Python
python数字类型math库原理解析
2020/03/02 Python
python解包用法详解
2021/02/17 Python
Html5 页面适配iPhoneX(就是那么简单)
2019/09/05 HTML / CSS
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
卫校护理专业毕业生求职信
2013/11/26 职场文书
《老王》教学反思
2014/02/23 职场文书
2014年教务处工作总结
2014/12/03 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android