Tweaked [7082] and [7084] a little bit to also allow comment nodes prior 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
This commit is contained in:
parent
0cdd65aa28
commit
00f96de5d6
|
@ -289,9 +289,14 @@ class Parser(object):
|
||||||
return NodeList()
|
return NodeList()
|
||||||
|
|
||||||
def extend_nodelist(self, nodelist, node, token):
|
def extend_nodelist(self, nodelist, node, token):
|
||||||
if (node.must_be_first and nodelist and
|
if node.must_be_first and nodelist:
|
||||||
(not isinstance(nodelist[0], TextNode) or len(nodelist) > 2)):
|
try:
|
||||||
|
if nodelist.contains_nontext:
|
||||||
|
raise AttributeError
|
||||||
|
except AttributeError:
|
||||||
raise TemplateSyntaxError("%r must be the first tag in the template." % node)
|
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)
|
nodelist.append(node)
|
||||||
|
|
||||||
def enter_command(self, command, token):
|
def enter_command(self, command, token):
|
||||||
|
@ -732,6 +737,10 @@ class Node(object):
|
||||||
return nodes
|
return nodes
|
||||||
|
|
||||||
class NodeList(list):
|
class NodeList(list):
|
||||||
|
# Set to True the first time a non-TextNode is inserted by
|
||||||
|
# extend_nodelist().
|
||||||
|
contains_nontext = False
|
||||||
|
|
||||||
def render(self, context):
|
def render(self, context):
|
||||||
bits = []
|
bits = []
|
||||||
for node in self:
|
for node in self:
|
||||||
|
|
|
@ -69,14 +69,10 @@ class ExtendsNode(Node):
|
||||||
|
|
||||||
def render(self, context):
|
def render(self, context):
|
||||||
compiled_parent = self.get_parent(context)
|
compiled_parent = self.get_parent(context)
|
||||||
if len(compiled_parent.nodelist) > 1:
|
pos = 0
|
||||||
n0, n1 = compiled_parent.nodelist[:2]
|
while isinstance(compiled_parent.nodelist[pos], TextNode):
|
||||||
else:
|
pos += 1
|
||||||
n0, n1 = compiled_parent.nodelist[0], None
|
parent_is_child = isinstance(compiled_parent.nodelist[pos], ExtendsNode)
|
||||||
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))
|
|
||||||
parent_blocks = dict([(n.name, n) for n in compiled_parent.nodelist.get_nodes_by_type(BlockNode)])
|
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):
|
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.
|
# Check for a BlockNode with this node's name, and replace it if found.
|
||||||
|
@ -88,7 +84,7 @@ class ExtendsNode(Node):
|
||||||
# add this BlockNode to the parent's ExtendsNode nodelist, so
|
# add this BlockNode to the parent's ExtendsNode nodelist, so
|
||||||
# it'll be checked when the parent node's render() is called.
|
# it'll be checked when the parent node's render() is called.
|
||||||
if parent_is_child:
|
if parent_is_child:
|
||||||
compiled_parent.nodelist[extend_node].nodelist.append(block_node)
|
compiled_parent.nodelist[pos].nodelist.append(block_node)
|
||||||
else:
|
else:
|
||||||
# Keep any existing parents and add a new one. Used by BlockNode.
|
# Keep any existing parents and add a new one. Used by BlockNode.
|
||||||
parent_block.parent = block_node.parent
|
parent_block.parent = block_node.parent
|
||||||
|
|
Loading…
Reference in New Issue