Используйте ReStructuredText для красивого списка исходного кода
Как спрашивают и отвечают в этом посте, можно использовать SyntaxHighlighter для красивого листинга кода.
С ReStructuredText я могу использовать директиву raw следующим образом.
.. 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!";
}
</pre>
Однако мне нужно иметь директиву кода, которую я могу использовать.
.. code::
function helloSyntaxHighlighter()
{
return "hi!";
}
Как я могу перевести директиву кода в следующий HTML-код?
<pre class="brush: js;">
function helloSyntaxHighlighter()
{
return "hi!";
}
</pre>
2 ответа
Есть способ, которым я воспользовался:
устанавливать
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)
И все, теперь у вас есть директивы блока кода.
Я мог бы заставить это работать следующим образом:
Чтобы генерировать
<pre>..</pre>
Мне нужно было изменить ParsedLiteral, поэтому я скопировал класс ParsedLiteral в Code следующим образом. Изменение строки 5self.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
Добавьте одну строку в init.py следующим образом.
_directive_registry = {'code': ('body', 'Code'),
Теперь вы можете использовать следующий код
.. code::
print "Hello world!" # *tricky* code
Чтобы получить этот HTML-код
<pre class="brush: js; literal-block">
print "Hello world!" # <em>tricky</em> code
</pre>
Возможное простое решение?
Я мог бы использовать ParsedLiteral, если найду способ передать параметр 'bruch: js;'. Тем не менее, когда я попробовал код
.. parsed-literal::
:class: "brunch: js;"
print "Hello world!" # *tricky* code
Тег становится <pre class="brunch ja">
,