Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Unified Diff: third_party/handlebar/handlebar.py

Issue 65643009: Docserver: Attach intro metadata to the template itself, not to an object which (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/handlebar/handlebar.py
diff --git a/third_party/handlebar/handlebar.py b/third_party/handlebar/handlebar.py
index f35764f4b8277cbc663739079d375ea886d753bd..ac1db6e6ac7cfdd522fc7970fb8c89c3d0dafd3c 100644
--- a/third_party/handlebar/handlebar.py
+++ b/third_party/handlebar/handlebar.py
@@ -643,6 +643,20 @@ class _JsonNode(_LeafNode):
def __repr__(self):
return '{{*%s}}' % self._id
+class _PartialNodeWithArguments(_DecoratorNode):
+ def __init__(self, partial, args):
+ if isinstance(partial, Handlebar):
+ # Preserve any get() method that the caller has added.
+ if hasattr(partial, 'get'):
+ self.get = partial.get
+ partial = partial._top_node
+ _DecoratorNode.__init__(self, partial)
+ self._partial = partial
+ self._args = args
+
+ def Render(self, render_state):
+ render_state.contexts.Scope(self._args, self._partial.Render, render_state)
+
class _PartialNode(_LeafNode):
'''{{+var:foo}} ... {{/foo}}
'''
@@ -651,7 +665,6 @@ class _PartialNode(_LeafNode):
self._bind_to = bind_to
self._id = id_
self._content = content
- self._resolved_args = None
self._args = None
self._pass_through_id = None
@@ -680,20 +693,17 @@ class _PartialNode(_LeafNode):
context = render_state.contexts.Resolve(self._pass_through_id.name)
if context is not None:
arg_context[self._pass_through_id.name] = context
- if self._resolved_args is not None:
- arg_context.update(self._resolved_args)
if self._args is not None:
def resolve_args(args):
resolved = {}
for key, value in args.iteritems():
if isinstance(value, dict):
assert len(value.keys()) == 1
- inner_id, inner_args = value.items()[0]
- inner_partial = render_state.contexts.Resolve(inner_id.name)
- if inner_partial is not None:
- context = _PartialNode(None, inner_id, inner_partial)
- context.SetResolvedArguments(resolve_args(inner_args))
- resolved[key] = context
+ id_of_partial, partial_args = value.items()[0]
+ partial = render_state.contexts.Resolve(id_of_partial.name)
+ if partial is not None:
+ resolved[key] = _PartialNodeWithArguments(
+ partial, resolve_args(partial_args))
else:
context = render_state.contexts.Resolve(value.name)
if context is not None:
@@ -711,9 +721,6 @@ class _PartialNode(_LeafNode):
partial_render_state,
text_transform=lambda text: text[:-1] if text.endswith('\n') else text)
- def SetResolvedArguments(self, args):
- self._resolved_args = args
-
def SetArguments(self, args):
self._args = args
@@ -1092,10 +1099,14 @@ class Handlebar(object):
'''Renders this template given a variable number of contexts to read out
values from (such as those appearing in {{foo}}).
'''
- name = self._name or '<root>'
internal_context = _InternalContext()
- render_state = _RenderState(
- name, _Contexts([{'_': internal_context}] + list(user_contexts)))
+ contexts = list(user_contexts)
+ contexts.append({
+ '_': internal_context,
+ 'false': False,
+ 'true': True,
+ })
+ render_state = _RenderState(self._name or '<root>', _Contexts(contexts))
internal_context.SetRenderState(render_state)
self._top_node.Render(render_state)
return render_state.GetResult()

Powered by Google App Engine
This is Rietveld 408576698