Python Markdown - 不添加 codehilite

8 python markdown codehighlighter pygments

我正在使用 Flask 写博客,我正在使用 Markdown 的 Python 库为我生成 HTML,我愿意进行语法高亮显示,因此我正在使用 markdown.markdown(string, extensions=['codehilite']

根据他们的wiki,它应该添加一个 html 类;

<div class="codehilite"><pre><code># Code goes here ...</code></pre></div>
Run Code Online (Sandbox Code Playgroud)

但根据我的口译员的尝试,它似乎不起作用;

In [9]: markdown.version
Out[9]: '2.3.1'

In [10]: text = """:::python
   ....: import os
   ....: print "This is a text!"
   ....: """

In [11]: html = markdown.markdown(text, extensions=['codehilite'])

In [12]: html
Out[12]: u'<p>:::python\nimport os\nprint "This is a text!"</p>'

In [13]: # Even more funnier, when following the examples in the usage section "..['codehilite(linenums=True)']

In [14]: html = markdown.markdown(text, extensions=['codehilite(linenums=True)'])

In [15]: html
Out[15]: u'<p>:::python\nimport os\nprint "This is a text!"</p>'

In [16]: # No line numbers, or any class..
Run Code Online (Sandbox Code Playgroud)

我不确定这里有什么问题,我安装了 Pygments,我已经升级了 Markdown 的库,但什么也没有。此处的预期结果是 Markdown 将添加 html 类codehilite,因此我将能够使语法正常工作。这里似乎有什么问题?

Joh*_*Mee 5

我已经确定 codehilite 除了通常喜怒无常之外,在它之前有一个列表时会中断:

这种降价及其变体不起作用:

* apples
* oranges

    #!python
    import os
Run Code Online (Sandbox Code Playgroud)

但是如果我在列表和代码之间放一些东西,那么它确实有效:

* apples
* oranges

Put something between the code and the list

    #!python
    import os
Run Code Online (Sandbox Code Playgroud)

但它通常是不可预测的。我尝试了无数种组合,成功地复制了文档中的内容。不开心...

使用fenced_code替代

然后我进入了 pygments 的其他子扩展,并尝试显式添加fenced_code 扩展并重试受防护的代码示例。效果更好。

所以继续

pygmented_body = markdown.markdown(rendered_body, 
                                   extensions=['codehilite', 'fenced_code'])
Run Code Online (Sandbox Code Playgroud)

我在fenced code完全使用以下方面取得了更大的成功:

* Don't need to indent 4 spaces
* Don't need something between the list and the code

~~~~{.python hl_lines='3'}
import os

print('hello, world')
~~~~

And final comments here.
Run Code Online (Sandbox Code Playgroud)


小智 4

我找到了另一个解决方案,markdown2

这是一些例子(按照我的意愿......)

In [1]: import markdown2

In [2]: markdown2.markdown("> This is a paragraph and I am **bold**")
Out[2]: u'<blockquote>\n  <p>This is a paragraph and I am <strong>bold</strong></p>\n</blockquote>\n'

In [3]: code = """```python
if True:
    print "hi"
```"""
   ...: 

In [4]: markdown2.markdown(code, extras=['fenced-code-blocks'])
Out[4]: u'<div class="codehilite"><pre><code><span class="k">if</span> <span class="bp">True</span><span class="p">:</span>\n    <span class="k">print</span> <span class="s">&quot;hi&quot;</span>\n</code></pre></div>\n'
Run Code Online (Sandbox Code Playgroud)