diff --git a/sls/_renderers/genshi.py b/sls/_renderers/genshi.py new file mode 100644 index 0000000..0e83aee --- /dev/null +++ b/sls/_renderers/genshi.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +''' +Genshi Renderer for Salt +''' + +from __future__ import absolute_import, print_function, unicode_literals +import logging +log = logging.getLogger(__name__) + +# Import salt libs +from salt.ext import six +from salt.exceptions import SaltRenderError + +# Import 3rd party libs +try: + from genshi.template import MarkupTemplate + from genshi.template import NewTextTemplate + from genshi.template import OldTextTemplate + HAS_LIBS = True +except ImportError: + HAS_LIBS = False + +def render(genshi_data, saltenv='base', sls='', method='xml', **kws): + ''' + Render a Genshi template. A method should be passed in as part of the + kwargs. If no method is passed in, xml is assumed. Valid methods are: + + .. code-block: + + - xml + - xhtml + - html + - text + - newtext + - oldtext + + Note that the ``text`` method will call ``NewTextTemplate``. If ``oldtext`` + is desired, it must be called explicitly + + :rtype: A Python data structure + ''' + if not HAS_LIBS: + raise SaltRenderError('Failed to import genshi template') + + if not isinstance(genshi_data, six.string_types): + genshi_data = genshi_data.read() + + if genshi_data.startswith('#!'): + genshi_data = genshi_data[(genshi_data.find('\n') + 1):] + if not genshi_data.strip(): + return {} + + if method == 'text' or method == 'newtext': + tmpl = NewTextTemplate(genshi_data) + elif method == 'oldtext': + tmpl = OldTextTemplate(genshi_data) + else: + tmpl = MarkupTemplate(genshi_data) + + generated = tmpl.generate( + salt=__salt__, grains=__grains__, pillar=__pillar__, + opts=__opts__, proxy=__proxy__, + saltenv=saltenv, sls=sls, **kws) + + return generated.render(method)