Python 降价边缘案例:/* */

Python markdown edge case: /* */

有没有办法让 Python 以与 Whosebug 上的解释相同的方式解释 Markdown:

This is a C comment: /* */ tada!

和 github? https://gist.github.com/jason-s/fc81280dc6108f9ec3a8

Python 的降价模块将 * * 解释为斜体:

>>> import markdown
>>> markdown.markdown('This is a C comment: /* */ tada!')
u'<p>This is a C comment: /<em> </em>/ tada!</p>'

(Babelmark 2 shows some of the differences. 貌似对 markdown 语法有不同的解释。)

好吧,它很难看,但是这个 post-Markdown-processing 补丁似乎可以满足我的要求。

>>> import markdown
>>> mdtext = 'This is a C comment: /* */ tada!'
>>> mdhtml = markdown.markdown(mdtext)
>>> mdhtml
u'<p>This is a C comment: /<em> </em>/ tada!</p>'
>>> import re
>>> mdccommentre = re.compile('/<em>( | .* )</em>/')
>>> mdccommentre.sub('/*\1*/',mdhtml)
u'<p>This is a C comment: /* */ tada!</p>'

/* */ 语法不是标准的 Markdown。事实上,syntax rules 中根本没有提到它。因此,它不太可能在不同的 Markdown 实现之间得到一致的处理。

如果它是 C 注释,那么它就是 "code" 并且可能应该这样标记。在代码块中或使用内联代码反引号 (`/* */`)。正如在对 OP 的评论中提到的,如果您真的不想将其标记为代码,也可以使用反斜杠对其进行转义。就个人而言,我会指示作者修复他们的文档(无论解析器行为如何)。

事实上,忽略它的 Markdown 解析器是无意中这样做的。为了避免匹配一些不应被解释为强调的边缘情况,他们需要在开始星号之前(但不是之后)和结束星号之后(但不是之前)的单词边界来考虑是作为强调。因为 C 注释在开始星号之前有一个斜线(在它之后有一个 space)并且在结束星号之后有一个斜线(在它之前有一个 space),一些解析器不认为它是强调。我怀疑您会发现那些相同的解析器无法将一些边缘情况识别为应该强调的。由于语法规则对这些边缘情况保持沉默,因此每个实现都会使它们略有不同。我什至会说,没有将其视为重点的实现在这里可能是错误的。但这里不是讨论这个的地方。

也就是说,您正在使用 Python-Markdown,它具有全面的 Extension API. If an existing third party extension does not already exist (see below), you can create your own。您可以添加自己的模式来专门匹配 C 注释并按您喜欢的方式处理它。或者您可以覆盖解析器的默认强调处理,并使其与您想要的其他实现相匹配。

实际上,BetterEm Extension (which, for some reason is not on the list of third party extensions) might do the later and give you the behavior you want. Unfortunately, it does not ship by itself, but as part of a larger package 包含多个扩展名。当然,你只需要使用一个。要使其正常工作,您需要安装它。不幸的是,它似乎没有托管在 PyPI 上,因此您必须直接从 GitHub 下载它。以下命令应该一次性下载并安装它:

pip install https://github.com/facelessuser/pymdown-extensions/archive/master.zip

成功安装后,只需在 Python 中执行以下操作:

>>> import markdown
>>> html = markdown.markdown(yourtext, extensions=['pymdownx.betterem'])

或从命令行:

python -m markdown -x 'pymdownx.betterem' yourinputfile.md > output.html

注意:我还没有测试 BetterEm 扩展。它可能会或可能不会给你你想要的行为。根据文档,"the behavior will be very similar in feel to GFM bold and italic (but not necessarily exact)."