"""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 ablock.""" 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 = "float: %s; %s" % (float, style) if style: style = ";".join(sanitizer.sanitize_css(style)) if macro.isblock: context = "block" else: context = "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)