csssyntax-highlightingpython-sphinxrestructuredtextpygments

Sphinx inline code highlight


I use Sphinx to make a website that contains code samples. I'm successful using the .. code-block directive to get syntax highlighting. But I can't get inline syntax highlighting using this code:

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

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

.. code-block:: bash

    export FOO="bar"

which produces this output i.e. inline code not highlighted while block code is:

result

Problem to me is that the generated HTML for inline code contains long class names while it does not for code blocks. Here is the output HTML (indented for readability):

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

Any help would be very much appreciated.


Solution

  • OK I used this workaround: I generate a css file that contains both short and long names. I'm still interested in the "good" answer.

    #!/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()