github/markup — pull request #136 by AndisthermalFindLasthree (2012-07-14 07:26:57+00:00)
Title: 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()