summaryrefslogtreecommitdiff
path: root/paste/util/template.py
diff options
context:
space:
mode:
authorianb <devnull@localhost>2007-06-13 03:00:26 +0000
committerianb <devnull@localhost>2007-06-13 03:00:26 +0000
commit2e66fbce02c51673f6fdbb6a7f17524fa24d6478 (patch)
treebb9b9a33bfd22296f115e281704a14f54b46c156 /paste/util/template.py
parentec2dc54ea78b8ebbe9e0d62d0aaa6386b81ba6cb (diff)
downloadpaste-2e66fbce02c51673f6fdbb6a7f17524fa24d6478.tar.gz
Added {{default}} directive to paste.util.template
Diffstat (limited to 'paste/util/template.py')
-rw-r--r--paste/util/template.py30
1 files changed, 30 insertions, 0 deletions
diff --git a/paste/util/template.py b/paste/util/template.py
index 4da60c8..9f44e23 100644
--- a/paste/util/template.py
+++ b/paste/util/template.py
@@ -15,6 +15,7 @@ syntax is::
def foo(bar):
return 'baz'
}}
+ {{default var = default_value}}
You use this with the ``Template`` class or the ``sub`` shortcut.
The ``Template`` class takes the template string and the name of
@@ -39,6 +40,7 @@ __all__ = ['TemplateError', 'Template', 'sub', 'HTMLTemplate',
token_re = re.compile(r'\{\{|\}\}')
in_re = re.compile(r'\s+in\s+')
+var_re = re.compile(r'^[a-z_][a-z0-9_]*$', re.I)
class TemplateError(Exception):
"""Exception raised while parsing a template
@@ -148,6 +150,11 @@ class Template(object):
func = self._eval(part, ns, pos)
base = func(base)
out.append(self._repr(base, pos))
+ elif name == 'default':
+ var, expr = code[2], code[3]
+ if var not in ns:
+ result = self._eval(expr, ns, pos)
+ ns[var] = result
else:
assert 0, "Unknown code: %r" % name
@@ -570,6 +577,8 @@ def parse_expr(tokens, name, context=()):
position=pos, name=name)
elif expr.startswith('for '):
return parse_for(tokens, name, context)
+ elif expr.startswith('default '):
+ return parse_default(tokens, name, context)
return ('expr', pos, tokens[0][0]), tokens[1:]
def parse_cond(tokens, name, context):
@@ -647,6 +656,27 @@ def parse_for(tokens, name, context):
next, tokens = parse_expr(tokens, name, context)
content.append(next)
+def parse_default(tokens, name, context):
+ first, pos = tokens[0]
+ assert first.startswith('default ')
+ first = first.split(None, 1)[1]
+ parts = first.split('=', 1)
+ if len(parts) == 1:
+ raise TemplateError(
+ "Expression must be {{default var=value}}; no = found in %r" % first,
+ position=pos, name=name)
+ var = parts[0].strip()
+ if ',' in var:
+ raise TemplateError(
+ "{{default x, y = ...}} is not supported",
+ position=pos, name=name)
+ if not var_re.search(var):
+ raise TemplateError(
+ "Not a valid variable name for {{default}}: %r"
+ % var, position=pos, name=name)
+ expr = parts[1].strip()
+ return ('default', pos, var, expr), tokens[1:]
+
_fill_command_usage = """\
%prog [OPTIONS] TEMPLATE arg=value