Python markdown edge case:/ * * /

时间:2015-07-02 17:55:16

标签: python markdown

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

  

这是C评论:/ * * / tada!

并在github上? https://gist.github.com/jason-s/fc81280dc6108f9ec3a8

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

>>> 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.看起来对降价语法有不同的解释。)

2 个答案:

答案 0 :(得分:2)

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

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

事实上,忽略它的Markdown解析器是偶然的。为了避免匹配一些不应被解释为强调的边缘情况,它们在打开星号之前需要一个单词边界(但不能在它之后),并且在关闭星号之后需要一个单词边界(但不是在它之前)要考虑的是作为重点。因为C注释在打开星号(以及后面的空格)之前有一个斜杠,而在关闭星号之后有一个斜杠(以及它之前的空格),因此一些解析器不会将其视为强调。我怀疑你会发现那些相同的解析器无法识别一些边缘情况应该是重点。由于语法规则对这些边缘情况保持沉默,因此每个实现都会使它们略有不同。我甚至会说,没有看到强调的实现在这里可能是错误的。但这不是辩论的地方。

那就是说,你使用的是Python-Markdown,它有一个全面的Extension API。如果现有third party extension尚不存在(见下文),您可以create your own。您可以添加自己的模式以专门匹配C注释,并随意处理它。或者你可以覆盖解析器对重点的默认处理,并使其与你想要的行为匹配。

实际上,BetterEm扩展程序(由于某种原因不在第三方扩展程序列表中)可能会在稍后执行,并为您提供所需的行为。不幸的是,它不是单独发布,而是作为包含多个扩展的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扩展程序。它可能会也可能不会给你你想要的行为。根据文档,“行为将与GFM粗体和斜体(但不一定完全)的感觉非常相似。”

答案 1 :(得分:0)

嗯,这很难看,但这个Markdown处理后补丁看起来像我想做的那样。

>>> 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>'