Skip to content

Commit

Permalink
Tweaked [7082] and [7084] a little bit to also allow comment nodes pr…
Browse files Browse the repository at this point in the history
…ior to the extends tag.

This would be little less fiddly if we knew nodelist were always of type
NodeList, but they could be normal lists. Or if we merged successive TextNodes,
instead of appending them. Something to think about going forwards.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@7089 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
malcolmt committed Feb 5, 2008
1 parent 0cdd65a commit 00f96de
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 12 deletions.
15 changes: 12 additions & 3 deletions django/template/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,9 +289,14 @@ def create_nodelist(self):
return NodeList()

def extend_nodelist(self, nodelist, node, token):
if (node.must_be_first and nodelist and
(not isinstance(nodelist[0], TextNode) or len(nodelist) > 2)):
raise TemplateSyntaxError("%r must be the first tag in the template." % node)
if node.must_be_first and nodelist:
try:
if nodelist.contains_nontext:
raise AttributeError
except AttributeError:
raise TemplateSyntaxError("%r must be the first tag in the template." % node)
if isinstance(nodelist, NodeList) and not isinstance(node, TextNode):
nodelist.contains_nontext = True
nodelist.append(node)

def enter_command(self, command, token):
Expand Down Expand Up @@ -732,6 +737,10 @@ def get_nodes_by_type(self, nodetype):
return nodes

class NodeList(list):
# Set to True the first time a non-TextNode is inserted by
# extend_nodelist().
contains_nontext = False

def render(self, context):
bits = []
for node in self:
Expand Down
14 changes: 5 additions & 9 deletions django/template/loader_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,10 @@ def get_parent(self, context):

def render(self, context):
compiled_parent = self.get_parent(context)
if len(compiled_parent.nodelist) > 1:
n0, n1 = compiled_parent.nodelist[:2]
else:
n0, n1 = compiled_parent.nodelist[0], None
parent_is_child = (isinstance(n0, ExtendsNode) or
(isinstance(n0, TextNode) and isinstance(n1, ExtendsNode)))
if parent_is_child:
extend_node = int(not isinstance(n0, ExtendsNode))
pos = 0
while isinstance(compiled_parent.nodelist[pos], TextNode):
pos += 1
parent_is_child = isinstance(compiled_parent.nodelist[pos], ExtendsNode)
parent_blocks = dict([(n.name, n) for n in compiled_parent.nodelist.get_nodes_by_type(BlockNode)])
for block_node in self.nodelist.get_nodes_by_type(BlockNode):
# Check for a BlockNode with this node's name, and replace it if found.
Expand All @@ -88,7 +84,7 @@ def render(self, context):
# add this BlockNode to the parent's ExtendsNode nodelist, so
# it'll be checked when the parent node's render() is called.
if parent_is_child:
compiled_parent.nodelist[extend_node].nodelist.append(block_node)
compiled_parent.nodelist[pos].nodelist.append(block_node)
else:
# Keep any existing parents and add a new one. Used by BlockNode.
parent_block.parent = block_node.parent
Expand Down

0 comments on commit 00f96de

Please sign in to comment.