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