""" HTML macros Macros for generating snippets of HTML. """ import genshi import pygments import pygments.formatters import pygments.lexers import pygments.util from genshi import builder from genshi.filters import HTMLSanitizer sanitizer = HTMLSanitizer() def pre(macro, environ, *args, **kwargs): """ Return the raw text of body, rendered in a
 block.

    **Arguments:** //None//

    **Example:**
    {{{
    <
>
    def hello():
        print "Hello World!"

    hello()
    <
> }}} """ if macro.body is None: return None return builder.tag.pre(macro.body) def code(macro, environ, *args, **kwargs): """Render syntax highlighted code""" if not macro.body: return None lang = kwargs.get('lang', None) if lang is not None: if not macro.isblock: return None try: lexer = pygments.lexers.get_lexer_by_name(lang, stripall=True) except pygments.util.ClassNotFound: return None else: lexer = None if lexer: text = pygments.highlight( macro.body, lexer, pygments.formatters.HtmlFormatter(), ) output = genshi.core.Markup(text) elif macro.isblock: output = genshi.builder.tag.pre(macro.body) else: output = genshi.builder.tag.code( macro.body, style='white-space:pre-wrap', class_='highlight', ) return output def source(macro, environ, *args, **kwargs): """Return the parsed text of body, rendered in a
 block."""
    if macro.body is None:
        return None

    return builder.tag.pre(environ['parser'].render(macro.body, environ=environ).decode('utf-8'))


def div(macro, environ, cls=None, float=None, id=None, style=None, *args, **kwargs):
    if macro.body is None:
        return None

    if float and float in ('left', 'right'):
        style = f'float: {float}; {style}'

    if style:
        style = ';'.join(sanitizer.sanitize_css(style))

    context = 'block' if macro.isblock else 'inline'

    contents = environ['parser'].generate(
        macro.body,
        environ=environ,
        context=context,
    )

    return builder.tag.div(contents, id=id, class_=cls, style=style)


def span(macro, environ, class_=None, id=None, style=None, *args, **kwargs):
    """..."""
    if macro.body is None:
        return None

    if style:
        style = ';'.join(sanitizer.sanitize_css(style))

    contents = environ['parser'].generate(
        macro.body,
        environ=environ,
        context='inline',
    )

    return builder.tag.span(contents, id=id, class_=class_, style=style)