python-markdown和python-markdown2遇到的问题
2017-07-16
三个点语法支持
python-markdown默认不支持三个点的语法(```), 只支持三个波浪线的形式(~~~), 即将代码块放入前后三个点中,将使用code方式解析,生成pre的标签,如果想要python-markdown支持,则需要修改他的正则表达式,添加三个点的支持
# vim /usr/lib/python2.6/site-packages/markdown/extensions/fenced_code.py
class FencedBlockPreprocessor(Preprocessor):
FENCED_BLOCK_RE = re.compile(r'''
(?P<fence>^(?:~{3,}|`{3,}))[ ]* # Opening ``` or ~~~ # 此处添加|`{3,}用于支持三个点的标记方式
(\{?\.?(?P<lang>[a-zA-Z0-9_+-]*))?[ ]* # Optional {, and lang
额外补充一下,python-markdown2默认是支持三个点的标记方式的,但是他要求连续代码块之间需要空2行才可以正常标记,这个体验真的不好,而且直接导致了python-markdown和python-markdown2的兼容,因此,如果想改的同学可以修改下面的代码
# vim /usr/lib/python2.6/site-packages/markdown2.py
_fenced_code_block_re = re.compile(r'''
(?:\n\n|\A\n?) # 根据习惯删除\n
^```([\w+-]+)?[ \t]*\n # opening fence, $1 = optional lang
(.*?) # $2 = code block content
^```[ \t]*\n # closing fence
''', re.M | re.X | re.S)
python-markdown2在使用code时,出现很多mds5-xxxx的结果
不知道python-markdown2出于什么目的,如果代码块中有以下封闭的html标签,会将渲染结果变成md5-xxxxx
# vim /usr/lib/python2.6/site-packages/markdown2.py
_html5tags = '|article|aside|header|hgroup|footer|nav|section|figure|figcaption'
_block_tags_a = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del'
可以通过控制markdown2的参数关掉该功能, 增加safe_mode="escape"参数即可, 他会将'<>&'这3个符号替换成html中的转义表示,比如<变成<
:
html = markdown2.markdown(content, extras=['fenced-code-blocks'], safe_mode="escape")
但是这样会带来另一个问题,在md中直接写html代码去解决markdown无法支持的特性,就会导致也会被safe掉,html失效。比如直接使用html的a标签定义一个target=_blank的链接,或者使用<center></centera>
完成一个居中动作.
结论
python-markdown2也许是我没有细致了解,导致我在使用起来的时候,总感觉没有python-markdown流畅。