诺志
软硬件开发技术笔记
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中的转义表示,比如<变成&lt;:

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流畅。

分类
2篇
c
1篇
8篇
18篇
8篇
2篇
搜索