Используйте ReStructuredText для красивого списка исходного кода - PullRequest
4 голосов
/ 17 января 2011

Как спрашивают и отвечают в этом посте , можно использовать SyntaxHighlighter для красивого списка кода.

С ReStructuredText я могу использовать необработанную директиву следующим образом.

<code>.. raw:: html

    <script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js"></script>
    <script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js"></script>
    <link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/current/styles/shCoreDefault.css"/>
    <script type="text/javascript">SyntaxHighlighter.all();</script>

I could use `SyntaxHighlighter <http://alexgorbatchev.com/SyntaxHighlighter/>`_ for highlighting source code. 

.. raw:: html

    <pre class="brush: js;">
    function helloSyntaxHighlighter()
    {
        return "hi!";
    }
    

Однако мне нужна директива кода, которую я могу использовать.

.. code:: 

    function helloSyntaxHighlighter()
    {
        return "hi!";
    }

Как я могу перевести директиву кода в следующий HTML-код?

<code><pre class="brush: js;">
function helloSyntaxHighlighter()
{
    return "hi!";
}

Ответы [ 2 ]

3 голосов
/ 21 февраля 2011

Я использовал один способ:

  • Установка rst2pdf и pygments.

  • Затем сделайте копию rst2html, назовите его myrst2html или как хотите.

  • В копии добавьте это после импорта:

    from docutils.parsers.rst import directives 
    import rst2pdf.pygments_code_block_directive 
    directives.register_directive('code-block',
        rst2pdf.pygments_code_block_directive.code_block_directive) 
    

И все, теперь у вас есть директивы блока кода.

0 голосов
/ 18 января 2011

Я мог бы заставить его работать следующим образом:

  1. Чтобы сгенерировать .., мне нужно было изменить ParsedLiteral, поэтому я скопировал класс ParsedLiteral в Code следующим образом. Смена строки 5 self.options['class'] = ['brush: js;'] # <-- - основная идея.

    Код класса (Директива):

    option_spec = {'class': directives.class_option}
    has_content = True
    
    def run(self):
        self.options['class'] = ['brush: js;'] # <--
        set_classes(self.options)
        self.assert_has_content()
        text = '\n'.join(self.content)
        text_nodes, messages = self.state.inline_text(text, self.lineno)
        node = nodes.literal_block(text, '', *text_nodes, **self.options)
        node.line = self.content_offset + 1
        return [node] + messages
    
  2. Добавьте одну строку в init .py следующим образом.

    _directive_registry = { 'code': ('body', 'Code'),

Теперь вы можете использовать следующий код

.. code::

   print "Hello world!"  # *tricky* code

Чтобы получить этот HTML-код

<code><pre class="brush: js; literal-block">
print &quot;Hello world!&quot;  # <em>tricky</em> code

Возможное простое решение?

Я мог бы использовать ParsedLiteral, если найду способ передать параметр 'bruch: js;'. Однако, когда я попробовал код

.. parsed-literal::
   :class: "brunch: js;"

   print "Hello world!"  # *tricky* code

Тег становится <pre class="brunch ja">.

...