Skip to content

Commit 0d56d13

Browse files
committed
Fix some bugs that were crashing the tests
--HG-- extra : convert_revision : svn%3Aacbfec75-9323-0410-a652-858a13e371e0/trunk%40137
1 parent 0079330 commit 0d56d13

1 file changed

Lines changed: 29 additions & 24 deletions

File tree

parser.py

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@ def __str__(self):
5050
return '#document'
5151

5252
def printTree(self):
53-
for line in Node.printTree(self, -1)[2:].split('\n'):
54-
print line
53+
tree = str(self)
54+
for child in self.childNodes:
55+
tree += child.printTree(2)
56+
return tree
5557

5658
class DocumentType(Node):
5759
def __init__(self, name):
@@ -181,7 +183,7 @@ def elementInScope(self, target, tableVariant=False):
181183
# AT How about while True and simply set node to [-1] and set it to
182184
# [-2] at the end...
183185
for node in self.openElements[::-1]:
184-
if node == target:
186+
if node.name == target:
185187
return True
186188
elif node.name == "table":
187189
return False
@@ -246,13 +248,12 @@ def insertElement(self, name, attributes, parent=None):
246248
raise NotImplementedError
247249

248250
def generateImpliedEndTags(self, exclude=None):
249-
while True:
250-
name = self.openElements[-1].name
251-
if name in frozenset(("dd", "dt", "li", "p", "td", "th",
252-
"tr")) and name != exclude:
253-
self.phase.processEndTag(name)
254-
else:
255-
break
251+
name = self.openElements[-1].name
252+
if name != exclude and name in frozenset(("dd", "dt", "li", "p",
253+
"td", "th", "tr")):
254+
self.processEndTag(name)
255+
self.generateImpliedEndTags()
256+
256257
# XXX AT:
257258
# name = self.openElements[-1].name
258259
# while name in frozenset(("dd", "dt", "li", "p", "td", "th", "tr")) and \
@@ -517,14 +518,18 @@ def processStartTag(self, name, attributes):
517518
handlers.get(name, self.createHeadNode)(name, attributes)
518519

519520
def processEndTag(self, name):
520-
handlers = {"html":self.createHeadNode}
521+
handlers = {"html":self.endTagHtml}
521522
handlers.get(name, self.endTagOther)(name)
522523

523524
def startTagHead(self, name, attributes):
524525
self.parser.insertElement(name, attributes)
525526
self.parser.headPointer = self.parser.openElements[-1]
526527
self.parser.switchInsertionMode('inHead')
527528

529+
def endTagHtml(self, name):
530+
self.startTagHead("head", [])
531+
self.parser.processEndTag(name)
532+
528533
def endTagOther(self, name):
529534
self.parser.parseError()
530535

@@ -580,17 +585,17 @@ def startTagHead(self, name, attributes):
580585
self.parser.switchInsertionMode('inHead')
581586

582587
def appendToHead(self, element):
583-
if self.headPointer is not None:
588+
if self.parser.headPointer is not None:
584589
self.parser.headPointer.appendChild(element)
585590
else:
586591
assert self.innerHTML
587592
self.parser.openElements[-1].append(element)
588593

589594
def startTagTitleStyle(self, name, attributes):
590-
stateFlags = {"title":"RCDATA", "style":"CDATA"}
595+
cmFlags = {"title":"RCDATA", "style":"CDATA"}
591596
element = self.parser.createElement(name, attributes)
592597
self.appendToHead(element)
593-
self.parser.tokenizer.state = self.parser.tokenizer.states[stateFlags[name]]
598+
self.parser.tokenizer.contentModelFlag = contentModelFlags[cmFlags[name]]
594599
# We have to start collecting characters
595600
self.collectingCharacters = True
596601
self.collectionStartTag = name
@@ -600,7 +605,7 @@ def startTagScript(self, name, attributes):
600605
element._flags.append("parser-inserted")
601606
# XXX Should this be moved to after we finish collecting characters
602607
self.appendToHead(element)
603-
self.parser.tokenizer.state = self.parser.tokenizer.states["CDATA"]
608+
self.parser.tokenizer.contentModelFlag = contentModelFlags["CDATA"]
604609

605610
def startTagBaseLinkMeta(self, name, attributes):
606611
element = self.createElement(name, attributes)
@@ -746,35 +751,35 @@ def endTagP(self, name):
746751
self.parser.openElements.pop()
747752

748753
def startTagScript(self, name, attributes):
749-
self.insertionModes["inHead"](self.parser).processStartTag(name,
754+
self.parser.phase.insertionModes["inHead"](self.parser).processStartTag(name,
750755
attributes)
751756

752757
def startTagFromHead(self, name, attributes):
753758
self.parser.parseError()
754-
self.parser.insertionModes["inHead"](self.parser).processStartTag(name,
759+
self.parser.phase.insertionModes["inHead"](self.parser).processStartTag(name,
755760
attributes)
756761
def startTagBody(self, name, attributes):
757762
self.parser.parseError()
758763
if len(self.parser.openElements)==1 or self.parser.openElements[1].name != "body":
759-
assert self.parser.innerHtml
764+
assert self.parser.innerHTML
760765
else:
761766
for attr, value in attributes.iteritems():
762767
if attr not in self.parser.openElements[1].attributes:
763768
self.parser.openElements[1].attributes[attr] = value
764769

765770
def endTagBody(self, name):
766771
if self.parser.openElements[1].name != "body":
767-
assert self.innerHtml
772+
assert self.innerHTML
768773
self.parser.parseError()
769774
else:
770775
if self.parser.openElements[-1].name != "body":
771-
assert self.innerHtml
776+
assert self.innerHTML
772777
self.parser.switchInsertionMode("afterBody")
773778

774-
def endTagHtml(self, name, attributes):
775-
self.bodyEndTag(name)
776-
if not self.parser.innerHtml:
777-
self.endTagHtml(name)
779+
def endTagHtml(self, name):
780+
self.endTagBody(name)
781+
if not self.parser.innerHTML:
782+
self.parser.processEndTag(name)
778783

779784
def startTagCloseP(self, name, attributes):
780785
if self.parser.elementInScope("p"):

0 commit comments

Comments
 (0)