Python的Markdown库添加escape限制

(作者:陈玓玏)
想要把markdown格式的文件转换成html格式,使用python的第三方库markdown是一个非常不错的选择,但存在一个很恶心的问题,那就是它会把&符号翻译成&,并且把<翻译成<。但很多时候,我们并不希望其翻译,比如说网址中有&符号时,又比如说公式中有&符号时,这样网址和公式就不能被正常识别了。这个问题在开发者的官方文档中提到了,想看文档的:https://daringfireball.net/projects/markdown/basics

下面来看一下怎么解决,这个问题整了很久,因为一直没查到可靠的资料,最后看源码连蒙带猜搞定的,所以特意把过程分享出来。

因为找不到配置markdown的方法,所以只能采取改源码的方法了,以管理员身份打开Pycharm(或者你的python编译器,不然是无法改源码的),找到core.py和inlinepatterns.py这两个文件,具体可以这么找:

markdown.markdown(content,extensions = ['markdown.extensions.extra',
                                                  # 'markdown.extensions.fenced_co',
                                                  'markdown.extensions.codehilite',
                                                  'markdown.extensions.toc'],safe_mode = 'escape')

调用markdown进行转换时,用法如上,因此在编译器中按住ctrl,点击markdown函数,跳转到函数定义,看到代码如下:

def markdown(text, **kwargs):
    """Convert a markdown string to HTML and return HTML as a unicode string.

    This is a shortcut function for `Markdown` class to cover the most
    basic use case.  It initializes an instance of Markdown, loads the
    necessary extensions and runs the parser on the given text.

    Keyword arguments:

    * text: Markdown formatted text as Unicode or ASCII string.
    * Any arguments accepted by the Markdown class.

    Returns: An HTML document as a string.

    """
    md = Markdown(**kwargs)
    return md.convert(text)

一共就两行代码,第一行是设置参数,第二行就已经是在转换格式了。因此点击Markdown,看看参数怎么设置。发现有初始化函数中有一个参数self.ESCAPED_CHARS,其定义了一系列不需要转换为html的字符,这个在官方文档的语法(Syntax)部分的最后有讲,于是我们把&字符和<字符加上,希望能跳过这两个字符不进行翻译。这还不算完,因为build_parser函数中还进行了另外的处理。转换的过程是一行一行,一个字符一个字符地检查地,有很多个处理器,找到inlinePatterns,点击生成它的函数build_inlinepatterns,就进入到了inlinepatterns.py文件,文件中定义了很多正则项,寻找图片链接、换行等等,我们找到ESCAPE_RE,这个是我们希望跳过的部分。既然我们希望跳过公式,而公式都是由美元符号框起来的,因此设置ESCAPE_RE如下:

ESCAPE_RE = r'((\\(.))|(\$.*\$))'

($.*$)表示寻找由美元符号圈起来的内容,不去翻译它们,记得美元符号要打转义字符,不然会被认为是寻找句子结尾,会匹配到无穷多项,(\(.))是源码中定义的,不能去掉,但是两个之间有或者的关系,因此需要用|符号连接,并用括号括起来,至此,配置结束。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值