buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/highlighting.py
changeset 179 d8ac696cc51f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/external/python/lib/common/Sphinx-0.5.1-py2.5.egg/sphinx/highlighting.py	Wed Dec 23 19:29:07 2009 +0200
@@ -0,0 +1,195 @@
+# -*- coding: utf-8 -*-
+"""
+    sphinx.highlighting
+    ~~~~~~~~~~~~~~~~~~~
+
+    Highlight code blocks using Pygments.
+
+    :copyright: 2007-2008 by Georg Brandl.
+    :license: BSD.
+"""
+
+import sys
+import cgi
+import re
+import parser
+
+from sphinx.util.texescape import tex_hl_escape_map
+
+try:
+    import pygments
+    from pygments import highlight
+    from pygments.lexers import PythonLexer, PythonConsoleLexer, CLexer, \
+         TextLexer, RstLexer
+    from pygments.lexers import get_lexer_by_name, guess_lexer
+    from pygments.formatters import HtmlFormatter, LatexFormatter
+    from pygments.filters import ErrorToken
+    from pygments.style import Style
+    from pygments.styles import get_style_by_name
+    from pygments.styles.friendly import FriendlyStyle
+    from pygments.token import Generic, Comment, Number
+except ImportError:
+    pygments = None
+else:
+    class SphinxStyle(Style):
+        """
+        Like friendly, but a bit darker to enhance contrast on the green
+        background.
+        """
+
+        background_color = '#eeffcc'
+        default_style = ''
+
+        styles = FriendlyStyle.styles
+        styles.update({
+            Generic.Output: '#333',
+            Comment: 'italic #408090',
+            Number: '#208050',
+        })
+
+    lexers = dict(
+        none = TextLexer(),
+        python = PythonLexer(),
+        pycon = PythonConsoleLexer(),
+        # the python3 option exists as of Pygments 0.12, but it doesn't
+        # do any harm in previous versions
+        pycon3 = PythonConsoleLexer(python3=True),
+        rest = RstLexer(),
+        c = CLexer(),
+    )
+    for _lexer in lexers.values():
+        _lexer.add_filter('raiseonerror')
+
+
+escape_hl_chars = {ord(u'@'): u'@PYGZat[]',
+                   ord(u'['): u'@PYGZlb[]',
+                   ord(u']'): u'@PYGZrb[]'}
+
+# used if Pygments is not available
+_LATEX_STYLES = r'''
+\newcommand\PYGZat{@}
+\newcommand\PYGZlb{[}
+\newcommand\PYGZrb{]}
+'''
+
+
+parsing_exceptions = (SyntaxError, UnicodeEncodeError)
+if sys.version_info < (2, 5):
+    # Python <= 2.4 raises MemoryError when parsing an
+    # invalid encoding cookie
+    parsing_exceptions += MemoryError,
+
+
+class PygmentsBridge(object):
+    def __init__(self, dest='html', stylename='sphinx'):
+        self.dest = dest
+        if not pygments:
+            return
+        if stylename == 'sphinx':
+            style = SphinxStyle
+        elif '.' in stylename:
+            module, stylename = stylename.rsplit('.', 1)
+            style = getattr(__import__(module, None, None, ['']), stylename)
+        else:
+            style = get_style_by_name(stylename)
+        self.hfmter = {False: HtmlFormatter(style=style),
+                       True: HtmlFormatter(style=style, linenos=True)}
+        self.lfmter = {False: LatexFormatter(style=style, commandprefix='PYG'),
+                       True: LatexFormatter(style=style, linenos=True,
+                                            commandprefix='PYG')}
+
+    def unhighlighted(self, source):
+        if self.dest == 'html':
+            return '<pre>' + cgi.escape(source) + '</pre>\n'
+        else:
+            # first, escape highlighting characters like Pygments does
+            source = source.translate(escape_hl_chars)
+            # then, escape all characters nonrepresentable in LaTeX
+            source = source.translate(tex_hl_escape_map)
+            return '\\begin{Verbatim}[commandchars=@\\[\\]]\n' + \
+                   source + '\\end{Verbatim}\n'
+
+    def try_parse(self, src):
+        # Make sure it ends in a newline
+        src += '\n'
+
+        # Replace "..." by a mark which is also a valid python expression
+        # (Note, the highlighter gets the original source, this is only done
+        #  to allow "..." in code and still highlight it as Python code.)
+        mark = "__highlighting__ellipsis__"
+        src = src.replace("...", mark)
+
+        # lines beginning with "..." are probably placeholders for suite
+        src = re.sub(r"(?m)^(\s*)" + mark + "(.)", r"\1"+ mark + r"# \2", src)
+
+        # if we're using 2.5, use the with statement
+        if sys.version_info >= (2, 5):
+            src = 'from __future__ import with_statement\n' + src
+
+        if isinstance(src, unicode):
+            # Non-ASCII chars will only occur in string literals
+            # and comments.  If we wanted to give them to the parser
+            # correctly, we'd have to find out the correct source
+            # encoding.  Since it may not even be given in a snippet,
+            # just replace all non-ASCII characters.
+            src = src.encode('ascii', 'replace')
+
+        try:
+            parser.suite(src)
+        except parsing_exceptions:
+            return False
+        else:
+            return True
+
+    def highlight_block(self, source, lang, linenos=False):
+        if not pygments:
+            return self.unhighlighted(source)
+        if lang in ('py', 'python'):
+            if source.startswith('>>>'):
+                # interactive session
+                lexer = lexers['pycon']
+            else:
+                # maybe Python -- try parsing it
+                if self.try_parse(source):
+                    lexer = lexers['python']
+                else:
+                    return self.unhighlighted(source)
+        elif lang in ('python3', 'py3') and source.startswith('>>>'):
+            # for py3, recognize interactive sessions, but do not try parsing...
+            lexer = lexers['pycon3']
+        elif lang == 'guess':
+            try:
+                lexer = guess_lexer(source)
+            except Exception:
+                return self.unhighlighted(source)
+        else:
+            if lang in lexers:
+                lexer = lexers[lang]
+            else:
+                lexer = lexers[lang] = get_lexer_by_name(lang)
+                lexer.add_filter('raiseonerror')
+        try:
+            if self.dest == 'html':
+                return highlight(source, lexer, self.hfmter[bool(linenos)])
+            else:
+                hlsource = highlight(source, lexer, self.lfmter[bool(linenos)])
+                return hlsource.translate(tex_hl_escape_map)
+        except ErrorToken:
+            # this is most probably not the selected language,
+            # so let it pass unhighlighted
+            return self.unhighlighted(source)
+
+    def get_stylesheet(self):
+        if not pygments:
+            if self.dest == 'latex':
+                return _LATEX_STYLES
+            # no HTML styles needed
+            return ''
+        if self.dest == 'html':
+            return self.hfmter[0].get_style_defs()
+        else:
+            styledefs = self.lfmter[0].get_style_defs()
+            # workaround for Pygments < 0.12
+            if styledefs.startswith('\\newcommand\\at{@}'):
+                styledefs += _LATEX_STYLES
+            return styledefs