python的markdown扩展开发

发布时间:2019-09-08 09:10:20编辑:auto阅读(1505)

    近期使用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

关键字