summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hellkamp <marc@gsites.de>2009-10-06 00:48:00 +0200
committerMarcel Hellkamp <marc@gsites.de>2009-10-06 00:48:00 +0200
commit0d0425150126cf8dad4d86502acf738368fdc1c6 (patch)
treeb1aeedc73fa12e6c3659b464acd1fff0b6a24c89
parentcd8c6b755a62a051d683b60d86142b56e081e45f (diff)
downloadbottle-0d0425150126cf8dad4d86502acf738368fdc1c6.tar.gz
SimpleTemplate: Now it is even possible to access objects created in subtemplates using '_'
Example: %include helper_functions %myhelper = _['test_helper']
-rw-r--r--bottle.py26
1 files changed, 14 insertions, 12 deletions
diff --git a/bottle.py b/bottle.py
index 04b7b0d..ce8803e 100644
--- a/bottle.py
+++ b/bottle.py
@@ -855,8 +855,8 @@ class SimpleTemplate(BaseTemplate):
self.includes[name] = SimpleTemplate(name=name, lookup=self.lookup)
if subtpl == 'include':
code.append(' ' * indent +
- "_inc=dict(%s);_inc.update(_stdout=_stdout);_includes[%s].render(**_inc)\n"
- % (args, repr(name)))
+ "_ = _includes[%s].execute(_stdout, %s)\n"
+ % (repr(name), args))
else:
code.append(' ' * indent +
"_tpl['_rebase'] = (_includes[%s], dict(%s))\n"
@@ -879,20 +879,22 @@ class SimpleTemplate(BaseTemplate):
flush()
return ''.join(code)
- def render(self, **args):
- """ Render the template using keyword arguments as local variables. """
- stdout = args.get('_stdout',[])
+ def execute(self, stdout, **args):
args['_stdout'] = stdout
args['_includes'] = self.includes
args['_tpl'] = args
eval(self.co, args)
- if '_rebase' not in args:
- return args['_stdout']
- subtpl, args = args['_rebase']
- args['_base'] = stdout[:] #copy stdout
- del stdout[:] # clear stdout
- args['_stdout'] = stdout #reattach stdout
- return subtpl.render(**args)
+ if '_rebase' in args:
+ subtpl, args = args['_rebase']
+ args['_base'] = stdout[:] #copy stdout
+ del stdout[:] # clear stdout
+ return subtpl.execute(stdout, **args)
+ return args
+ def render(self, **args):
+ """ Render the template using keyword arguments as local variables. """
+ stdout = []
+ self.execute(stdout, **args)
+ return stdout