Python Markdown — без добавления кода

Я использую Flask для написания блога, при этом я использую библиотеку Markdown Python для создания HTML для меня, я хочу иметь подсветку синтаксиса, поэтому я использую markdown.markdown(string, extensions=['codehilite']

Согласно их вики, он должен добавить класс html;

<div class="codehilite"><pre><code># Code goes here ...</code></pre></div>

Но, похоже, это не работает после проб моего переводчика;

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

Я не уверен, в чем здесь проблема, у меня установлены Pygments, я уже обновил библиотеку Markdown, но ничего. Ожидаемые результаты здесь заключаются в том, что Markdown добавит html-класс codehilite, чтобы я мог заставить работать синтаксис. В чем здесь проблема?


person Community    schedule 15.05.2013    source источник
comment
Связано: stackoverflow.com/questions/35318762/   -  person Michael Ma    schedule 08.02.2018


Ответы (3)


Я установил, что codehilite, помимо того, что он в целом темпераментный, ломается, когда непосредственно перед ним находится список:

Эта уценка и ее варианты просто не работают:

* apples
* oranges

    #!python
    import os

Но если я поставлю что-то между списком и кодом, то это сработает:

* apples
* oranges

Put something between the code and the list

    #!python
    import os

Но вообще непредсказуемо. Я пробовал миллионы комбинаций с очень переменным успехом, повторяя то, что читал в документации. Не счастлив...

Вместо этого используйте fenced_code

Затем я перешел к другим подрасширениям pygments и попытался явно добавить расширениеged_code и повторение изолированных примеров кода. Работает лучше.

Итак, продолжая

pygmented_body = markdown.markdown(rendered_body, 
                                   extensions=['codehilite', 'fenced_code'])

Я добился гораздо большего успеха, используя исключительно 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.
person John Mee    schedule 29.09.2015

Я нашел другое решение, 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'
person Community    schedule 30.05.2013

Извините, я вижу ваш вопрос только сейчас.

в python-markdown вам нужно 4 пробела в каждой строке кода.

In [13]: text = """
   ....:        :::python
   ....:        import os
   ....:        """

In [14]: markdown.markdown(text, extensions = ['codehilite'])
Out[14]: u'<div class="codehilite"><pre><span class="kn">import</span> 
<span class="nn">os</span>\n</pre></div>'
person fayewu    schedule 13.01.2014