[svn] added minimal template evaluator
authorArmin Ronacher <armin.ronacher@active-4.com>
Tue, 27 Feb 2007 19:21:45 +0000 (20:21 +0100)
committerArmin Ronacher <armin.ronacher@active-4.com>
Tue, 27 Feb 2007 19:21:45 +0000 (20:21 +0100)
--HG--
branch : trunk

jinja/filters.py
jinja/lexer.py
jinja/nodes.py
jinja/template.py [new file with mode: 0644]
jinja/translators/python.py
test.py

index 083f90aaa3e4e489517fd01cec36b3e7c3b09d8c..a7bb9d398233267eb066c1e09d7d91e09d643d79 100644 (file)
@@ -33,11 +33,11 @@ def stringfilter(f):
     """
     def decorator(*args):
         def wrapped(env, context, value):
-            args = list(args)
-            for idx, var in enumerate(args):
+            nargs = list(args)
+            for idx, var in enumerate(nargs):
                 if isinstance(var, str):
-                    args[idx] = env.to_unicode(var)
-            return f(env.to_unicode(value), *args)
+                    nargs[idx] = env.to_unicode(var)
+            return f(env.to_unicode(value), *nargs)
         return wrapped
     return decorator
 
@@ -53,6 +53,7 @@ def do_replace(s, old, new, count=None):
     if count is None:
         return s.replace(old, new)
     return s.replace(old, new, count)
+do_replace = stringfilter(do_replace)
 
 
 def do_upper(s):
@@ -62,6 +63,7 @@ def do_upper(s):
     Return a copy of s converted to uppercase.
     """
     return s.upper()
+do_upper = stringfilter(do_upper)
 
 
 def do_lower(s):
@@ -71,6 +73,7 @@ def do_lower(s):
     Return a copy of s converted to lowercase.
     """
     return s.lower()
+do_lower = stringfilter(do_lower)
 
 
 def do_escape(s, attribute=False):
@@ -84,6 +87,7 @@ def do_escape(s, attribute=False):
     if attribute:
         s = s.replace('"', "&quot;")
     return s
+escape = stringfilter(do_escape)
 
 
 def do_addslashes(s):
@@ -93,6 +97,7 @@ def do_addslashes(s):
     Adds slashes to s.
     """
     return s.encode('utf-8').encode('string-escape').decode('utf-8')
+do_addslashes = stringfilter(do_addslashes)
 
 
 def do_capitalize(s):
@@ -103,6 +108,7 @@ def do_capitalize(s):
     capitalized.
     """
     return s.capitalize()
+do_capitalize = stringfilter(do_capitalize)
 
 
 def do_title(s):
@@ -113,6 +119,7 @@ def do_title(s):
     characters, all remaining cased characters have lowercase.
     """
     return s.title()
+do_title = stringfilter(do_title)
 
 
 def do_default(default_value=u''):
@@ -123,6 +130,7 @@ def do_default(default_value=u''):
     which is '' per default.
     """
     return lambda e, c, v: v or default_value
+do_default = stringfilter(do_default)
 
 
 def do_join(d=u''):
@@ -146,10 +154,7 @@ def do_count():
     Return the length of var. In case if getting an integer or float
     it will convert it into a string an return the length of the new
     string.
-    If the object doesn't provide a __len__ function it will return
-    zero.st(value)
-        l.reverse()
-        return 
+    If the object doesn't provide a __len__ function it will return zero
     """
     def wrapped(env, context, value):
         try:
index 55a4497bd53de22e35cfda49d371b41ff5ba18f7..5f2f72b49b4cc1618ffb13d5eb090081af945f7c 100644 (file)
@@ -2,6 +2,9 @@
 """
     jinja.lexer
     ~~~~~~~~~~~
+
+    :copyright: 2006 by Armin Ronacher.
+    :license: BSD, see LICENSE for more details.
 """
 import re
 from jinja.datastructure import TokenStream
index 7d75c58cb0b596aa0edc3cc6726fc3b9fa6c7dc7..2109b67ac2e48156a4a1a40d9117c75d578e2be6 100644 (file)
@@ -19,7 +19,10 @@ def inc_lineno(offset, tree):
     todo = [tree]
     while todo:
         node = todo.pop()
-        node.lineno = (node.lineno or 0) + offset
+        if node.lineno:
+            node.lineno += offset - 1
+        else:
+            node.lineno = offset
         todo.extend(node.getChildNodes())
 
 
diff --git a/jinja/template.py b/jinja/template.py
new file mode 100644 (file)
index 0000000..ad969d3
--- /dev/null
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+"""
+    jinja.template
+    ~~~~~~~~~~~~~~
+
+    Template class.
+
+    :copyright: 2006 by Armin Ronacher.
+    :license: BSD, see LICENSE for more details.
+
+"""
+from jinja.datastructure import Context
+
+
+class Template(object):
+    """
+    Represents a finished template.
+    """
+
+    def __init__(self, environment, generate_func):
+        self.environment = environment
+        self.generate_func = generate_func
+
+    def render(self, *args, **kwargs):
+        result = []
+        ctx = Context(self.environment, *args, **kwargs)
+        self.generate_func(ctx, result.append)
+        return u''.join(result)
index b8f52eb496195cd9ff941a4567218baaf0c6ff2b..278f873a31bd9339c07bef3861493e287e6c1357 100644 (file)
@@ -359,8 +359,8 @@ class PythonTranslator(object):
                     args or ''
                 ))
             elif n.__class__ is ast.Name:
-                filters.append('environment.prepare_filter(%s)' %
-                               self.handle_node(n))
+                filters.append('environment.prepare_filter(%r)' %
+                               n.name)
             else:
                 raise TemplateSyntaxError('invalid filter. filter must be a '
                                           'hardcoded function name from the '
@@ -536,7 +536,7 @@ class PythonTranslator(object):
 
     def translate(self):
         return (
-            'from jinja.datastructures import Undefined, LoopContext, CycleContext\n'
+            'from jinja.datastructure import Undefined, LoopContext, CycleContext\n'
             'def generate(context, write, write_var=None):\n'
             '    environment = context.environment\n'
             '    if write_var is None:\n'
diff --git a/test.py b/test.py
index 8ce99bc5e5d1938c9677d4c4d94086dbdfe73b21..d5352563ec74dfe9855fb834ed3eb5342444ea34 100644 (file)
--- a/test.py
+++ b/test.py
@@ -11,3 +11,13 @@ def test_parser(x):
     from jinja.parser import Parser
     from jinja.translators.python import translate
     print translate(e, Parser(e, x).parse())
+
+
+def load_template(x):
+    from jinja.template import Template
+    from jinja.parser import Parser
+    from jinja.translators.python import translate
+    code = translate(e, Parser(e, x).parse())
+    ns = {}
+    exec code in ns
+    return Template(e, ns['generate'])