glose_Fb

fpoirotte: 55b79c9db46829213a7d9677f04240fc9210f6f3

#!/usr/bin/env python
 
"""A small wrapper file for parsing ReST files at GitHub."""
 
__author__ = "Jannis Leidel"
__copyright__ = "Copyright (C) 2008 Jannis Leidel"
__license__ = "Public Domain"
__version__ = "0.1"
 
try:
    import locale
    locale.setlocale(locale.LC_ALL, '')
except:
    pass
 
import sys
import codecs
 
from docutils.core import publish_parts
from docutils.writers.html4css1 import Writer
from docutils import nodes
from docutils.parsers.rst import directives, Directive
 
SETTINGS = {
    'cloak_email_addresses': True,
    'file_insertion_enabled': False,
    'raw_enabled': False,
    'strip_comments': True,
    'doctitle_xform': False,
    'report_level': 5,
}
 
try:
    from pygments import highlight
    from pygments.lexers import get_lexer_by_name
    from pygments.formatters import HtmlFormatter
except:
    highlight = get_lexer_by_name = HtmlFormatter = None
 
class Pygments(Directive):
    """
    Adds support for Pygments syntax highlighting.
    """
 
    required_arguments = 1
    optional_arguments = 0
    final_argument_whitespace = True
    option_spec = {
        'linenos': directives.flag,
        'hl_lines': directives.positive_int_list,
        'linenostart': directives.nonnegative_int,
        'linenostep': directives.positive_int,
        'linenospecial': directives.nonnegative_int,
        'nobackground': directives.flag,
        'anchorlinenos': directives.flag,
        'noclasses': directives.flag,
    }
    has_content = True
 
    def run(self):
        """
        Renders code directives into docutils nodes,
        while applying syntax highlighting using Pygments.
        """
        self.assert_has_content()
        try:
            lexer = get_lexer_by_name(self.arguments[0])
        except ValueError:
            # no lexer found
            lexer = get_lexer_by_name('text')
 
        # Prepare the options that will be used
        # to render the code in the HtmlFormatter.
        options={}
        for (option, converter) in self.option_spec.iteritems():
            if converter == directives.flag:
                if option in self.options:
                    options[option] = True
            elif option in self.options:
                options[option] = self.options[option]
 
        formatter = HtmlFormatter(**options)
        parsed = highlight(u'\n'.join(self.content), lexer, formatter)
        return [nodes.raw('', parsed, format='html')]
 
# Only register the Pygments directive
# if pygments is indeed available.
if highlight:
    # We register the same aliases as those
    # recognized by Sphinx (for compatibility).
    directives.register_directive('code', Pygments)
    directives.register_directive('code-block', Pygments)
    directives.register_directive('sourcecode', Pygments)
    directives.register_directive('sourcecode-block', Pygments)
 
 
def main():
    """
    Parses the given ReST file or the redirected string input and returns the
    HTML body.
 
    Usage: rest2html < README.rst
           rest2html README.rst
    """
    try:
        text = codecs.open(sys.argv[1], 'r', 'utf-8').read()
    except IOError: # given filename could not be found
        return ''
    except IndexError: # no filename given
        text = sys.stdin.read()
 
    parts = publish_parts(text, writer=Writer(), settings_overrides=SETTINGS)
    if 'html_body' in parts:
        html = parts['html_body']
        return html.encode('utf-8')
    return ''
 
if __name__ == '__main__':
    print main()