当前位置:Gxlcms > Python > 使用Python来开发Markdown脚本扩展的实例分享

使用Python来开发Markdown脚本扩展的实例分享

时间:2021-07-01 10:21:17 帮助过:91人阅读

关于Markdown

在刚才的导语里提到,Markdown 是一种用来写作的轻量级「标记语言」,它用简洁的语法代替排版,而不像一般我们用的字处理软件 Word 或 Pages 有大量的排版、字体设置。它使我们专心于码字,用「标记」语法,来代替常见的排版格式。例如此文从内容到格式,甚至插图,键盘就可以通通搞定了。目前来看,支持 Markdown 语法的编辑器有很多,包括很多网站(例如简书)也支持了 Markdown 的文字录入。Markdown 从写作到完成,导出格式随心所欲,你可以导出 HTML 格式的文件用来网站发布,也可以十分方便的导出 PDF 格式,这种格式写出的简历更能得到 HR 的好感。甚至可以利用 CloudApp 这种云服务工具直接上传至网页用来分享你的文章,全球最大的轻博客平台 Tumblr,也支持使用 Mou 这类 Markdown 工具进行编辑并直接上传。

python的markdown扩展开发
近期使用python的markdown写了一个文档小程序,由于需要用到一些额外的功能,所以就对markdown进行了一些简单的扩展,进而记录下编写的模板。直接贴代码:

  1. #encoding=utf-8
  2. ##预处理器
  3. from markdown.preprocessors import Preprocessor
  4. class CodePreprocessor(Preprocessor):
  5. def run(self, lines):
  6. new_lines = []
  7. flag_in = False
  8. block = []
  9. for line in lines:
  10. if line[:3]=='!!!':
  11. flag_in = True
  12. block.append('<pre class="brush: %s; layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li>' % line[3:].strip()) </li><li> elif flag_in: </li><li> if line.strip() and line[0]=='!': </li><li> block.append(line[1:]) </li><li> else: </li><li> flag_in = False </li><li> block.append('</li></ol></pre>')
  13. block.append(line)
  14. new_lines.extend(block)
  15. block = []
  16. else:
  17. new_lines.append(line)
  18. if not new_lines and block:
  19. new_lines = block
  20. return new_lines
  21. ##后置处理器
  22. from markdown.postprocessors import Postprocessor
  23. class CodePostprocessor(Postprocessor):
  24. def run(self, text):
  25. t_list = []
  26. for line in text.split('\n'):
  27. if line[:5]=='<p>!<':
  28. line = line.lstrip('</p><p>').replace('</p>', '')[1:]
  29. t_list.append(line)
  30. return '\n'.join(t_list)
  31. ##扩展主体类
  32. from markdown.extensions import Extension
  33. from markdown.util import etree
  34. class CodeExtension(Extension):
  35. def __init__(self, configs={}):
  36. self.config = configs
  37. def extendMarkdown(self, md, md_globals):
  38. ##注册扩展,用于markdown.reset时扩展同时reset
  39. md.registerExtension(self)
  40. ##设置Preprocessor
  41. codepreprocessor = CodePreprocessor()
  42. #print md.preprocessors.keys()
  43. md.preprocessors.add('codepreprocessor', codepreprocessor, '<normalize_whitespace') ##设置postprocessor="" codepostprocessor="CodePostprocessor()" #print="" md.postprocessors.keys()="" md.postprocessors.add('codepostprocessor',="" codepostprocessor,="" '="">unescape')
  44. ##print md_globals ##markdown全局变量
  45. </normalize_whitespace')>

关于markdown扩展的深入内容,可以查看官方文档,不过没有例子,只是手册而已。但大体能知道有哪些内容组成,在结合上面的文件结构都是可以写出来的。下面是调用的代码:

  1. #encoding=utf-8
  2. import markdown
  3. import markdowncode
  4. text = '''''
  5. !!!python
  6. !
  7. !def foo():
  8. ###title
  9. '''
  10. configs = {}
  11. myext = markdowncode.CodeExtension(configs=configs)
  12. md = markdown.markdown(text, extensions=[myext])
  13. print md

主要扩展了2个功能:
一个是把形如:

  1. !!!python
  2. !
  3. !def foo():
  4. ! return 'foo'

转换成:

  1. <pre class="brush: python; layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li> </li><li> </li><li>def foo(): </li><li> return 'foo' </li><li></li></ol></pre>

201634150936573.png (863×488)

人气教程排行