专栏首页python3python的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>

一个是把形如:

!<div>
#h1
!</div>

转换成:

<div>
<h1>h1</h1>
</div>

为什么要有第二个扩展呢?因为

参考文档:

http://pythonhosted.org/Markdown/extensions/index.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python爬虫之正则表达式(1)

    A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。

    py3study
  • python 打印表单格式

    Some places still have legacy environments that are slowly migrating to newer v...

    py3study
  • dockerfile-python

    py3study
  • Auto-Encoding Variational Bayes 两个ppt下载

    用户1908973
  • WordPress自定义查询WP_Query使用方法大全

      自定义调用文章在网站建设中很常用,wordpress也很人性化,用新建查询new WP_Query就能实现相关功能。WP_Query怎么用呢?随ytkah一...

    ytkah
  • Dart语法详解(三)——进阶篇

    在上一篇文章,我们详细的介绍了Dart语法的一些基本语法,这一这篇文章,我们继续介绍Dart的语法的相关知识。

    Demo_Yang
  • Dart语法详解(三)——进阶篇

    在上一篇文章,我们详细的介绍了Dart语法的一些基本语法,这一这篇文章,我们继续介绍Dart的语法的相关知识。

    Demo_Yang
  • 涅槃团队:Xcode幽灵病毒存在恶意下发木马行为

    我们还原了恶意iOS应用与C2服务器的通信协议,从而可以实际测试受感染的iOS应用有哪些恶意行为。 最后,我们分析了攻击的发起点:Xcode,分析了其存在的弱点...

    FB客服
  • MySQL分区表最佳实践

    分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表。但是对于应用程序来讲,分区的表和没有分区的表是一样的。换句话来讲,分区对于应用是透明...

    MySQL技术
  • Canalys:未来几年3D打印市场将飞速发展

    技术进步和费用逐渐降低将促使3D打印市场从2013年的25亿美元发展至2018年的162亿美元。 Canalys发布对飞速发展的3D打印市场的预测,2013年其...

    机器人网

扫码关注云+社区

领取腾讯云代金券