python的markdown扩展开发

2023-01-31 05:01:09 python 开发 扩展

近期使用pythonmarkdown写了一个文档小程序,由于需要用到一些额外的功能,所以就对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

相关文章