5

Я использую Sphinx для создания веб-сайта, содержащего образцы кода. Мне удалось использовать директиву .. code-block, чтобы получить подсветку синтаксиса. Но я не могу получить встроенную подсветку синтаксиса, используя этот код:Sphinx inline code highlight

.. role:: bash(code) 
    :language: bash 

Test inline: :bash:`export FOO="bar"`. 

.. code-block:: bash 

    export FOO="bar" 

, который производит этот выход, т.е. кода инлайн не выделен, блок кода:

result

Проблема для меня является то, что генерируемый HTML для встроенного кода содержит длинные имена классов, а не для кодовых блоков. Вот вывод HTML (отступы для удобства чтения):

<p>Test inline: 
    <tt class="code bash docutils literal"> 
     <span class="name builtin"> 
      <span class="pre">export</span> 
     </span> 
     <span class="name variable"> 
      <span class="pre">FOO</span> 
     </span> 
     <span class="operator"> 
      <span class="pre">=</span> 
     </span> 
     <span class="literal string double"> 
      <span class="pre">&quot;bar&quot;</span> 
     </span> 
    </tt>. 
</p> 


<p>Test code-block:</p> 
<div class="highlight-bash"> 
    <div class="highlight"> 
     <pre> 
      <span class="nb">export </span> 
      <span class="nv">FOO</span> 
      <span class="o">=</span> 
      <span class="s2">&quot;bar&quot;</span> 
     </pre> 
    </div> 
</div> 

Любая помощь будет очень высоко ценится.

+1

Я бы также добавил тег [tag: pygments], если бы я был вами. – Adobe

ответ

3

OK Я использовал это обходное решение: создаю файл css, содержащий как короткие, так и длинные имена. Меня все еще интересует «хороший» ответ.

#!/usr/bin/env python 

"""Generate a css file thanks to pygments that will contain both short 
and long class names.""" 


import subprocess 
import sys 


PYGMENTIZE = 'pygmentize' 


def parse_command_line(): 
    import argparse 
    parser = argparse.ArgumentParser(description=__doc__) 
    parser.add_argument('-s', '--style', default='colorful') 
    parser.add_argument('-p', '--prefix', default='.highlight') 
    return parser.parse_args() 


def pygmentize(style, prefix='.highlight'): 
    cmd = '{0} -f html -S {1} -a {2}'.format(PYGMENTIZE, style, prefix) 
    # This will fail if pygmentize does not exist. 
    try: 
     p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) 
    except OSError: 
     print >> sys.stderr, '{0}: command not found'.format(PYGMENTIZE) 
     exit(1) 

    out, err = p.communicate() 
    if p.returncode != 0: 
     exit(p.returncode) 
    return out 


def main(): 
    args = parse_command_line() 
    style = args.style 
    prefix = args.prefix 

    # Print new css header. 
    header = """\ 
/* 
* This is pygment css style {0} generated with 
*  {1} 
*/""".format(style, ' '.join(sys.argv)) 
    print header 

    # Parse pygmentize output. 
    # Find long names based on comments. 
    content = pygmentize(style, prefix) 
    s = content.splitlines() 
    out = '' 
    for line in s: 
     start = line.find("/* ") + 3 
     end = line.find(" */") 
     # if line has a comment 
     if start != 2: 
      comment = line[start:end] 
      name = '.' + comment.lower() 
      arg = line[line.find('{ '): start - 4] 
      out += '%(prefix)s %(name)s %(arg)s\n' % vars() 

    print content 
    print out 


if __name__ == '__main__': 
    main() 
2

Когда сфинкс тема имеет static/pygments.css - то файл не перезаписывается. Так что я просто сохранить файл, который содержит как короткие, так и длинные имена (которые я получил с помощью регулярных выражений в Emacs):

.highlight .hll { background-color: #ffffcc } 
/* .highlight { background: #eeffcc; } */ 
.highlight .c { color: #408090; font-style: italic } /* comment */ 
.highlight .comment { color: #408090; font-style: italic } 
.highlight .err { border: 1px solid #ff0000 } /* error */ 
.highlight .error { border: 1px solid #ff0000 } 
.highlight .k { color: #007020; font-weight: bold } /* keyword */ 
.highlight .keyword { color: #007020; font-weight: bold } 
.highlight .o { color: #666666 } /* operator */ 
.highlight .operator { color: #666666 } 
.highlight .cm { color: #408090; font-style: italic } /* comment.multiline */ 
.highlight .comment.multiline { color: #408090; font-style: italic } 
.highlight .cp { color: #007020 } /* comment.preproc */ 
.highlight .comment.preproc { color: #007020 } 
.highlight .c1 { color: #408090; font-style: italic } /* comment.single */ 
.highlight .comment.single { color: #408090; font-style: italic } 
.highlight .cs { color: #408090; background-color: #fff0f0 } /* comment.special */ 
.highlight .comment.special { color: #408090; background-color: #fff0f0 } 
.highlight .gd { color: #a00000 } /* generic.deleted */ 
.highlight .generic.deleted { color: #a00000 } 
.highlight .ge { font-style: italic } /* generic.emph */ 
.highlight .generic.emph { font-style: italic } 
.highlight .gr { color: #ff0000 } /* generic.error */ 
.highlight .generic.error { color: #ff0000 } 
.highlight .gh { color: #000080; font-weight: bold } /* generic.heading */ 
.highlight .generic.heading { color: #000080; font-weight: bold } 
.highlight .gi { color: #00a000 } /* generic.inserted */ 
.highlight .generic.inserted { color: #00a000 } 
.highlight .go { color: #333333 } /* generic.output */ 
.highlight .generic.output { color: #333333 } 
.highlight .gp { color: #c65d09; font-weight: bold } /* generic.prompt */ 
.highlight .generic.prompt { color: #c65d09; font-weight: bold } 
.highlight .gs { font-weight: bold } /* generic.strong */ 
.highlight .generic.strong { font-weight: bold } 
.highlight .gu { color: #800080; font-weight: bold } /* generic.subheading */ 
.highlight .generic.subheading { color: #800080; font-weight: bold } 
.highlight .gt { color: #0044dd } /* generic.traceback */ 
.highlight .generic.traceback { color: #0044dd } 
.highlight .kc { color: #007020; font-weight: bold } /* keyword.constant */ 
.highlight .keyword.constant { color: #007020; font-weight: bold } 
.highlight .kd { color: #007020; font-weight: bold } /* keyword.declaration */ 
.highlight .keyword.declaration { color: #007020; font-weight: bold } 
.highlight .kn { color: #007020; font-weight: bold } /* keyword.namespace */ 
.highlight .keyword.namespace { color: #007020; font-weight: bold } 
.highlight .kp { color: #007020 } /* keyword.pseudo */ 
.highlight .keyword.pseudo { color: #007020 } 
.highlight .kr { color: #007020; font-weight: bold } /* keyword.reserved */ 
.highlight .keyword.reserved { color: #007020; font-weight: bold } 
.highlight .kt { color: #902000 } /* keyword.type */ 
.highlight .keyword.type { color: #902000 } 
.highlight .m { color: #208050 } /* literal.number */ 
.highlight .literal.number { color: #208050 } 
.highlight .s { color: #4070a0 } /* literal.string */ 
.highlight .literal.string { color: #4070a0 } 
.highlight .na { color: #4070a0 } /* name.attribute */ 
.highlight .name.attribute { color: #4070a0 } 
.highlight .nb { color: #007020 } /* name.builtin */ 
.highlight .name.builtin { color: #007020 } 
.highlight .nc { color: #0e84b5; font-weight: bold } /* name.class */ 
.highlight .name.class { color: #0e84b5; font-weight: bold } 
.highlight .no { color: #60add5 } /* name.constant */ 
.highlight .name.constant { color: #60add5 } 
.highlight .nd { color: #555555; font-weight: bold } /* name.decorator */ 
.highlight .name.decorator { color: #555555; font-weight: bold } 
.highlight .ni { color: #d55537; font-weight: bold } /* name.entity */ 
.highlight .name.entity { color: #d55537; font-weight: bold } 
.highlight .ne { color: #007020 } /* name.exception */ 
.highlight .name.exception { color: #007020 } 
.highlight .nf { color: #06287e } /* name.function */ 
.highlight .name.function { color: #06287e } 
.highlight .nl { color: #002070; font-weight: bold } /* name.label */ 
.highlight .name.label { color: #002070; font-weight: bold } 
.highlight .nn { color: #0e84b5; font-weight: bold } /* name.namespace */ 
.highlight .name.namespace { color: #0e84b5; font-weight: bold } 
.highlight .nt { color: #062873; font-weight: bold } /* name.tag */ 
.highlight .name.tag { color: #062873; font-weight: bold } 
.highlight .nv { color: #bb60d5 } /* name.variable */ 
.highlight .name.variable { color: #bb60d5 } 
.highlight .ow { color: #007020; font-weight: bold } /* operator.word */ 
.highlight .operator.word { color: #007020; font-weight: bold } 
.highlight .w { color: #bbbbbb } /* text.whitespace */ 
.highlight .text.whitespace { color: #bbbbbb } 
.highlight .mf { color: #208050 } /* literal.number.float */ 
.highlight .literal.number.float { color: #208050 } 
.highlight .mh { color: #208050 } /* literal.number.hex */ 
.highlight .literal.number.hex { color: #208050 } 
.highlight .mi { color: #208050 } /* literal.number.integer */ 
.highlight .literal.number.integer { color: #208050 } 
.highlight .mo { color: #208050 } /* literal.number.oct */ 
.highlight .literal.number.oct { color: #208050 } 
.highlight .sb { color: #4070a0 } /* literal.string.backtick */ 
.highlight .literal.string.backtick { color: #4070a0 } 
.highlight .sc { color: #4070a0 } /* literal.string.char */ 
.highlight .literal.string.char { color: #4070a0 } 
.highlight .sd { color: #4070a0; font-style: italic } /* literal.string.doc */ 
.highlight .literal.string.doc { color: #4070a0; font-style: italic } 
.highlight .s2 { color: #4070a0 } /* literal.string.double */ 
.highlight .literal.string.double { color: #4070a0 } 
.highlight .se { color: #4070a0; font-weight: bold } /* literal.string.escape */ 
.highlight .literal.string.escape { color: #4070a0; font-weight: bold } 
.highlight .sh { color: #4070a0 } /* literal.string.heredoc */ 
.highlight .literal.string.heredoc { color: #4070a0 } 
.highlight .si { color: #70a0d0; font-style: italic } /* literal.string.interpol */ 
.highlight .literal.string.interpol { color: #70a0d0; font-style: italic } 
.highlight .sx { color: #c65d09 } /* literal.string.other */ 
.highlight .literal.string.other { color: #c65d09 } 
.highlight .sr { color: #235388 } /* literal.string.regex */ 
.highlight .literal.string.regex { color: #235388 } 
.highlight .s1 { color: #4070a0 } /* literal.string.single */ 
.highlight .literal.string.single { color: #4070a0 } 
.highlight .ss { color: #517918 } /* literal.string.symbol */ 
.highlight .literal.string.symbol { color: #517918 } 
.highlight .bp { color: #007020 } /* name.builtin.pseudo */ 
.highlight .name.builtin.pseudo { color: #007020 } 
.highlight .vc { color: #bb60d5 } /* name.variable.class */ 
.highlight .name.variable.class { color: #bb60d5 } 
.highlight .vg { color: #bb60d5 } /* name.variable.global */ 
.highlight .name.variable.global { color: #bb60d5 } 
.highlight .vi { color: #bb60d5 } /* name.variable.instance */ 
.highlight .name.variable.instance { color: #bb60d5 } 
.highlight .il { color: #208050 } /* literal.number.integer.long */ 
.highlight .literal.number.integer.long { color: #208050 } 

Я бегу в другой вопрос - я использую самозагрузки тему, и она определяет label тоже. ..

1

Вот лучше, чем previous обходной путь:

Изменить --syntax-highlight вариант docuitls по умолчанию. В

docutils/parsers/rst/__init__.py 

Найти

  ('Token name set for parsing code with Pygments: one of ' 
      '"long", "short", or "none (no parsing)". Default is "short".', 
      ['--syntax-highlight'], 
      {'choices': ['long', 'short', 'none'], 
      'default': 'long', 'metavar': '<format>'}), 

и Ставить по умолчанию для short:

  'default': 'short', 'metavar': '<format>'}), 

Метод для выделения встроенного кода в sphnix является зарегистрировать новую роль:

.. role:: py(code) 
    :language: py 
    :class: highlight 

Это сотрудничество nstruct - от докутиков, а не от сфинкса. Затем можно изменить значение docutils по умолчанию, чтобы получить желаемый результат (короткие классы). Лучшим решением было бы установить значение во время инициализации класса в сфинксе. Но найти это может быть нелегко.

Это решение намного лучше, чем previous, так как оно не удваивает число правил CSS, чтобы соответствовать цвету кода.

+0

Решение docutils красиво и хорошо документировано. Тем не менее, насколько я знаю, он не может быть легко применен к сфинксу. Таким образом, решение, совместимое с sphinx, по-прежнему подразумевает двойное количество css, если я получу все правильно. – blaurent

4

Найдено лучшее (сфинкс-только) решение: в sphinx/builders/html.py найти строку

from docutils.core import Publisher 

и изменить его на:

from docutils.core import Publisher 
def process_programmatic_settings(self, settings_spec, 
            settings_overrides, 
            config_section): 
    if self.settings is None: 
     defaults = (settings_overrides or {}).copy() 
     # Propagate exceptions by default when used programmatically: 
     defaults.setdefault('traceback', True) 
     defaults.setdefault('syntax_highlight', 'short') # ADDED THIS LINE 
     self.get_settings(settings_spec=settings_spec, 
          config_section=config_section, 
          **defaults) 
Publisher.process_programmatic_settings = process_programmatic_settings 

Это решение лучше, чем предыдущие: так как это Безразлично» t удваивает количество правил css и не изменяет docutils.

Тем не менее, идеальное решение изменило бы только conf.py. Таким образом, есть много возможностей для улучшения.

+0

Решение docutils красиво и хорошо документировано. Тем не менее, насколько я знаю, он не может быть легко применен к сфинксу. Таким образом, решение, совместимое с sphinx, по-прежнему будет подразумевать двойное количество css, если я получу все правильно. – blaurent

+0

@binoua: что вы имеете в виду? Каждый из трех ответов, которые я написал, решает проблему для сфинксов. Один из них решает его, предоставляя «pygments.css», другой изменяет параметр по умолчанию на docutils, наконец, этот модифицирует сфинкс. – Adobe

+0

спасибо за ваш ответ. Метод pygments.css - это в основном [решение, которое я придумал] (http://stackoverflow.com/a/21601271/378147), то есть предоставление css с короткими и длинными именами. Исправьте меня, если я ошибаюсь, но два других решения подразумевают прямое изменение пакета (docutils в одном случае, sphinx в другом), который я согласен, также является решением, но без обид, не очень приятным, поскольку этот патч следует применять после каждое обновление пакета, хотя и не фиксировано непосредственно командой разработчиков docutils/sphinx. – blaurent

0

syntax_highlight - обычная установка docutils, которая может быть установлена ​​в docutils.conf. Этот файл уважается Сфинкса тоже, если поместить в configuration directory (где conf.py пребывает) Сфинкса:

[restructuredtext parser] 
syntax_highlight = short 

Это намного лучше, чем латать docutils или sphinx код или создать CSS файл длинных имен.