OpenSecurity/install/web.py-0.37/web/contrib/template.py
author om
Mon, 02 Dec 2013 14:02:05 +0100
changeset 3 65432e6c6042
permissions -rwxr-xr-x
initial deployment and project layout commit
om@3
     1
"""
om@3
     2
Interface to various templating engines.
om@3
     3
"""
om@3
     4
import os.path
om@3
     5
om@3
     6
__all__ = [
om@3
     7
    "render_cheetah", "render_genshi", "render_mako",
om@3
     8
    "cache", 
om@3
     9
]
om@3
    10
om@3
    11
class render_cheetah:
om@3
    12
    """Rendering interface to Cheetah Templates.
om@3
    13
om@3
    14
    Example:
om@3
    15
om@3
    16
        render = render_cheetah('templates')
om@3
    17
        render.hello(name="cheetah")
om@3
    18
    """
om@3
    19
    def __init__(self, path):
om@3
    20
        # give error if Chetah is not installed
om@3
    21
        from Cheetah.Template import Template
om@3
    22
        self.path = path
om@3
    23
om@3
    24
    def __getattr__(self, name):
om@3
    25
        from Cheetah.Template import Template
om@3
    26
        path = os.path.join(self.path, name + ".html")
om@3
    27
        
om@3
    28
        def template(**kw):
om@3
    29
            t = Template(file=path, searchList=[kw])
om@3
    30
            return t.respond()
om@3
    31
om@3
    32
        return template
om@3
    33
    
om@3
    34
class render_genshi:
om@3
    35
    """Rendering interface genshi templates.
om@3
    36
    Example:
om@3
    37
om@3
    38
    for xml/html templates.
om@3
    39
om@3
    40
        render = render_genshi(['templates/'])
om@3
    41
        render.hello(name='genshi')
om@3
    42
om@3
    43
    For text templates:
om@3
    44
om@3
    45
        render = render_genshi(['templates/'], type='text')
om@3
    46
        render.hello(name='genshi')
om@3
    47
    """
om@3
    48
om@3
    49
    def __init__(self, *a, **kwargs):
om@3
    50
        from genshi.template import TemplateLoader
om@3
    51
om@3
    52
        self._type = kwargs.pop('type', None)
om@3
    53
        self._loader = TemplateLoader(*a, **kwargs)
om@3
    54
om@3
    55
    def __getattr__(self, name):
om@3
    56
        # Assuming all templates are html
om@3
    57
        path = name + ".html"
om@3
    58
om@3
    59
        if self._type == "text":
om@3
    60
            from genshi.template import TextTemplate
om@3
    61
            cls = TextTemplate
om@3
    62
            type = "text"
om@3
    63
        else:
om@3
    64
            cls = None
om@3
    65
            type = None
om@3
    66
om@3
    67
        t = self._loader.load(path, cls=cls)
om@3
    68
        def template(**kw):
om@3
    69
            stream = t.generate(**kw)
om@3
    70
            if type:
om@3
    71
                return stream.render(type)
om@3
    72
            else:
om@3
    73
                return stream.render()
om@3
    74
        return template
om@3
    75
om@3
    76
class render_jinja:
om@3
    77
    """Rendering interface to Jinja2 Templates
om@3
    78
    
om@3
    79
    Example:
om@3
    80
om@3
    81
        render= render_jinja('templates')
om@3
    82
        render.hello(name='jinja2')
om@3
    83
    """
om@3
    84
    def __init__(self, *a, **kwargs):
om@3
    85
        extensions = kwargs.pop('extensions', [])
om@3
    86
        globals = kwargs.pop('globals', {})
om@3
    87
om@3
    88
        from jinja2 import Environment,FileSystemLoader
om@3
    89
        self._lookup = Environment(loader=FileSystemLoader(*a, **kwargs), extensions=extensions)
om@3
    90
        self._lookup.globals.update(globals)
om@3
    91
        
om@3
    92
    def __getattr__(self, name):
om@3
    93
        # Assuming all templates end with .html
om@3
    94
        path = name + '.html'
om@3
    95
        t = self._lookup.get_template(path)
om@3
    96
        return t.render
om@3
    97
        
om@3
    98
class render_mako:
om@3
    99
    """Rendering interface to Mako Templates.
om@3
   100
om@3
   101
    Example:
om@3
   102
om@3
   103
        render = render_mako(directories=['templates'])
om@3
   104
        render.hello(name="mako")
om@3
   105
    """
om@3
   106
    def __init__(self, *a, **kwargs):
om@3
   107
        from mako.lookup import TemplateLookup
om@3
   108
        self._lookup = TemplateLookup(*a, **kwargs)
om@3
   109
om@3
   110
    def __getattr__(self, name):
om@3
   111
        # Assuming all templates are html
om@3
   112
        path = name + ".html"
om@3
   113
        t = self._lookup.get_template(path)
om@3
   114
        return t.render
om@3
   115
om@3
   116
class cache:
om@3
   117
    """Cache for any rendering interface.
om@3
   118
    
om@3
   119
    Example:
om@3
   120
om@3
   121
        render = cache(render_cheetah("templates/"))
om@3
   122
        render.hello(name='cache')
om@3
   123
    """
om@3
   124
    def __init__(self, render):
om@3
   125
        self._render = render
om@3
   126
        self._cache = {}
om@3
   127
om@3
   128
    def __getattr__(self, name):
om@3
   129
        if name not in self._cache:
om@3
   130
            self._cache[name] = getattr(self._render, name)
om@3
   131
        return self._cache[name]