Skip to content

Commit eaf8892

Browse files
committed
the big inBody move; no actual changes made
--HG-- extra : convert_revision : svn%3Aacbfec75-9323-0410-a652-858a13e371e0/trunk%40153
1 parent 35ba8db commit eaf8892

1 file changed

Lines changed: 153 additions & 151 deletions

File tree

parser.py

Lines changed: 153 additions & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -692,14 +692,20 @@ def anythingElse(self):
692692

693693

694694
class InBody(InsertionMode):
695+
# helper
696+
def addFormattingElement(self, name, attributes):
697+
self.parser.insertElement(name, attributes)
698+
self.parser.activeFormattingElements.append(
699+
self.parser.openElements[-1])
695700

701+
# the real deal
696702
def processCharacter(self, data):
697703
self.parser.reconstructActiveFormattingElements()
698704
self.parser.openElements[-1].appendChild(TextNode(data))
699705

700706
def processStartTag(self, name, attributes):
701707
handlers=utils.MethodDispatcher([
702-
("script",self.startTagScript),
708+
("script", self.startTagScript),
703709
(("base", "link", "meta", "style", "title"),
704710
self.startTagFromHead),
705711
("body", self.startTagBody),
@@ -734,38 +740,6 @@ def processStartTag(self, name, attributes):
734740
handlers.setDefaultValue(self.startTagOther)
735741
handlers[name](name, attributes)
736742

737-
def processEndTag(self, name):
738-
handlers = utils.MethodDispatcher([
739-
("p",self.endTagP),
740-
("body",self.endTagBody),
741-
("html",self.endTagHtml),
742-
(("address", "blockquote", "centre", "div", "dl", "fieldset",
743-
"listing", "menu", "ol", "pre", "ul"), self.endTagBlock),
744-
("form", self.endTagForm),
745-
(("dd", "dt", "li"), self.endTagListItem),
746-
(headingElements, self.endTagHeading),
747-
(("a", "b", "big", "em", "font", "i", "nobr", "s", "small",
748-
"strike", "strong", "tt", "u"), self.endTagFormatting),
749-
(("marquee", "object", "button"), self.endTagButtonMarqueeObject),
750-
(("caption", "col", "colgroup", "frame", "frameset", "head",
751-
"option", "optgroup", "tbody", "td", "tfoot", "th", "thead",
752-
"tr", "area", "basefont", "bgsound", "br", "embed", "hr",
753-
"iframe", "image", "img", "input", "isindex", "noembed",
754-
"noframes", "param", "select", "spacer", "table", "textarea",
755-
"wbr", "noscript"),self.endTagMisplacedNone),
756-
(("event-source", "section", "nav", "article", "aside", "header",
757-
"footer", "datagrid", "command"), self.endTagNew)
758-
])
759-
handlers.setDefaultValue(self.endTagOther)
760-
handlers[name](name)
761-
762-
def endTagP(self, name):
763-
self.parser.generateImpliedEndTags("p")
764-
if self.parser.openElements[-1].name != "p":
765-
self.parser.parseError()
766-
while self.parser.elementInScope("p"):
767-
self.parser.openElements.pop()
768-
769743
def startTagScript(self, name, attributes):
770744
self.parser.phase.insertionModes["inHead"](self.parser).processStartTag(name,
771745
attributes)
@@ -783,20 +757,6 @@ def startTagBody(self, name, attributes):
783757
if attr not in self.parser.openElements[1].attributes:
784758
self.parser.openElements[1].attributes[attr] = value
785759

786-
def endTagBody(self, name):
787-
if self.parser.openElements[1].name != "body":
788-
assert self.parser.innerHTML
789-
self.parser.parseError()
790-
else:
791-
if self.parser.openElements[-1].name != "body":
792-
assert self.parser.innerHTML
793-
self.parser.switchInsertionMode("afterBody")
794-
795-
def endTagHtml(self, name):
796-
self.endTagBody(name)
797-
if not self.parser.innerHTML:
798-
self.parser.processEndTag(name)
799-
800760
def startTagCloseP(self, name, attributes):
801761
if self.parser.elementInScope("p"):
802762
self.endTagP(name)
@@ -834,33 +794,6 @@ def startTagPlaintext(self, name, attributes):
834794
self.parser.insertElement(name, attributes)
835795
self.tokenizer.contentModelFlag = contentModelFlags["PLAINTEXT"]
836796

837-
def endTagBlock(self, name):
838-
if self.parser.elementInScope(name):
839-
self.parser.generateImpliedEndTags()
840-
if self.parser.openElements[-1].name != name:
841-
self.parser.parseError()
842-
843-
if self.parser.elementInScope(name):
844-
node = self.parser.openElements.pop()
845-
while node.name != name:
846-
node = self.parser.openElements.pop()
847-
848-
def endTagForm(self, name):
849-
self.endTagBlock(name)
850-
self.parser.formPointer = None
851-
852-
def endTagListItem(self, name):
853-
# AT Could merge this with the Block case
854-
if self.parser.elementInScope(name):
855-
self.parser.generateImpliedEndTags(name)
856-
if self.parser.openElements[-1].name != name:
857-
self.parser.parseError()
858-
859-
if self.parser.elementInScope(name):
860-
node = self.parser.openElements.pop()
861-
while node.name != name:
862-
node = self.parser.openElements.pop()
863-
864797
def startTagHeading(self, name, attributes):
865798
if self.parser.elementInScope("p"):
866799
self.endTagP("p")
@@ -873,26 +806,6 @@ def startTagHeading(self, name, attributes):
873806
break
874807
self.parser.insertElement(name, attributes)
875808

876-
def endTagHeading(self, name):
877-
for item in headingElements:
878-
if self.parser.elementInScope(item):
879-
self.parser.generateImpliedEndTags()
880-
break
881-
if self.parser.openElements[-1].name != name:
882-
self.parser.parseError()
883-
884-
for item in headingElements:
885-
if self.parser.elementInScope(item):
886-
item = self.parser.openElements.pop()
887-
while item.name not in headingElements:
888-
item = self.parser.openElements.pop()
889-
break
890-
891-
def addFormattingElement(self, name, attributes):
892-
self.parser.insertElement(name, attributes)
893-
self.parser.activeFormattingElements.append(
894-
self.parser.openElements[-1])
895-
896809
def startTagA(self, name, attributes):
897810
afeAElement = self.parser.elementInActiveFormattingElements("a")
898811
if afeAElement:
@@ -909,41 +822,6 @@ def startTagFormatting(self, name, attributes):
909822
self.parser.reconstructActiveFormattingElements()
910823
self.addFormattingElement(name, attributes)
911824

912-
def endTagFormatting(self, name):
913-
"""The much-feared adoption agency algorithm"""
914-
afeElement = self.parser.elementInActiveFormattingElements(name)
915-
if not afeElement or (afeElement in self.parser.openElements and
916-
not self.parser.elementInScope(afeElement)):
917-
self.parser.parseError()
918-
return
919-
elif afeElement not in self.parser.activeFormattingElements:
920-
self.parser.parseError()
921-
self.parser.activeFormattingElements.remove(afeElement)
922-
return
923-
924-
if afeElement != self.parser.openElements[-1]:
925-
self.parser.parseError()
926-
927-
# XXX Start of the adoption agency algorithm proper
928-
afeIndex = self.parser.openElements.index(afeElement)
929-
furthestBlock = None
930-
for element in self.parser.openElements[afeIndex:]:
931-
if element.name in (specialElements | scopingElements):
932-
furthestBlock = element
933-
break
934-
if furthestBlock is None:
935-
element = self.parser.openElements.pop()
936-
while element != afeElement:
937-
element = self.parser.openElements.pop()
938-
self.parser.activeFormattingElements.remove(element)
939-
return
940-
commonAncestor = self.parser.openElements[afeIndex-1]
941-
942-
if furthestBlock.parent:
943-
furthestBlock.childNodes.remove(furthestBlock)
944-
# XXX Need to finish this
945-
raise NotImplementedError
946-
947825
def startTagButton(self, name, attributes):
948826
if self.parser.elementInScope("button"):
949827
self.parser.parseError()
@@ -959,18 +837,6 @@ def startTagMarqueeObject(self, name, attributes):
959837
self.parser.insertElement(name, attributes)
960838
self.parser.activeFormattingElements.append(Marker)
961839

962-
def endTagButtonMarqueeObject(self, name):
963-
if self.parser.elementInScope(name):
964-
self.parser.generateImpliedEndTags()
965-
if self.parser.openElements[-1].name != name:
966-
self.parser.parseError()
967-
968-
if self.parser.elementInScope(name):
969-
element = self.parser.openElements.pop()
970-
while element.name != name:
971-
element = self.parser.openElements.pop()
972-
self.parser.clearActiveFormattingElements()
973-
974840
def startTagXmp(self, name, attributes):
975841
self.parser.reconstructActiveFormattingElements()
976842
self.parser.insertElement(name, attributes)
@@ -1044,6 +910,152 @@ def startTagMisplaced(self, name, attributes):
1044910
"""
1045911
self.parser.parseError()
1046912

913+
def startTagNew(self, name, other):
914+
"""New HTML5 elements, "event-source", "section", "nav",
915+
"article", "aside", "header", "footer", "datagrid", "command"
916+
"""
917+
raise NotImplementedError
918+
919+
def startTagOther(self, name, attributes):
920+
self.parser.reconstructActiveFormattingElements()
921+
self.parser.insertElement(name, attributes)
922+
923+
924+
def processEndTag(self, name):
925+
handlers = utils.MethodDispatcher([
926+
("p",self.endTagP),
927+
("body",self.endTagBody),
928+
("html",self.endTagHtml),
929+
(("address", "blockquote", "centre", "div", "dl", "fieldset",
930+
"listing", "menu", "ol", "pre", "ul"), self.endTagBlock),
931+
("form", self.endTagForm),
932+
(("dd", "dt", "li"), self.endTagListItem),
933+
(headingElements, self.endTagHeading),
934+
(("a", "b", "big", "em", "font", "i", "nobr", "s", "small",
935+
"strike", "strong", "tt", "u"), self.endTagFormatting),
936+
(("marquee", "object", "button"), self.endTagButtonMarqueeObject),
937+
(("caption", "col", "colgroup", "frame", "frameset", "head",
938+
"option", "optgroup", "tbody", "td", "tfoot", "th", "thead",
939+
"tr", "area", "basefont", "bgsound", "br", "embed", "hr",
940+
"iframe", "image", "img", "input", "isindex", "noembed",
941+
"noframes", "param", "select", "spacer", "table", "textarea",
942+
"wbr", "noscript"),self.endTagMisplacedNone),
943+
(("event-source", "section", "nav", "article", "aside", "header",
944+
"footer", "datagrid", "command"), self.endTagNew)
945+
])
946+
handlers.setDefaultValue(self.endTagOther)
947+
handlers[name](name)
948+
949+
def endTagP(self, name):
950+
self.parser.generateImpliedEndTags("p")
951+
if self.parser.openElements[-1].name != "p":
952+
self.parser.parseError()
953+
while self.parser.elementInScope("p"):
954+
self.parser.openElements.pop()
955+
956+
def endTagBody(self, name):
957+
if self.parser.openElements[1].name != "body":
958+
assert self.parser.innerHTML
959+
self.parser.parseError()
960+
else:
961+
if self.parser.openElements[-1].name != "body":
962+
assert self.parser.innerHTML
963+
self.parser.switchInsertionMode("afterBody")
964+
965+
def endTagHtml(self, name):
966+
self.endTagBody(name)
967+
if not self.parser.innerHTML:
968+
self.parser.processEndTag(name)
969+
970+
def endTagBlock(self, name):
971+
if self.parser.elementInScope(name):
972+
self.parser.generateImpliedEndTags()
973+
if self.parser.openElements[-1].name != name:
974+
self.parser.parseError()
975+
976+
if self.parser.elementInScope(name):
977+
node = self.parser.openElements.pop()
978+
while node.name != name:
979+
node = self.parser.openElements.pop()
980+
981+
def endTagForm(self, name):
982+
self.endTagBlock(name)
983+
self.parser.formPointer = None
984+
985+
def endTagListItem(self, name):
986+
# AT Could merge this with the Block case
987+
if self.parser.elementInScope(name):
988+
self.parser.generateImpliedEndTags(name)
989+
if self.parser.openElements[-1].name != name:
990+
self.parser.parseError()
991+
992+
if self.parser.elementInScope(name):
993+
node = self.parser.openElements.pop()
994+
while node.name != name:
995+
node = self.parser.openElements.pop()
996+
997+
def endTagHeading(self, name):
998+
for item in headingElements:
999+
if self.parser.elementInScope(item):
1000+
self.parser.generateImpliedEndTags()
1001+
break
1002+
if self.parser.openElements[-1].name != name:
1003+
self.parser.parseError()
1004+
1005+
for item in headingElements:
1006+
if self.parser.elementInScope(item):
1007+
item = self.parser.openElements.pop()
1008+
while item.name not in headingElements:
1009+
item = self.parser.openElements.pop()
1010+
break
1011+
1012+
def endTagFormatting(self, name):
1013+
"""The much-feared adoption agency algorithm"""
1014+
afeElement = self.parser.elementInActiveFormattingElements(name)
1015+
if not afeElement or (afeElement in self.parser.openElements and
1016+
not self.parser.elementInScope(afeElement)):
1017+
self.parser.parseError()
1018+
return
1019+
elif afeElement not in self.parser.activeFormattingElements:
1020+
self.parser.parseError()
1021+
self.parser.activeFormattingElements.remove(afeElement)
1022+
return
1023+
1024+
if afeElement != self.parser.openElements[-1]:
1025+
self.parser.parseError()
1026+
1027+
# XXX Start of the adoption agency algorithm proper
1028+
afeIndex = self.parser.openElements.index(afeElement)
1029+
furthestBlock = None
1030+
for element in self.parser.openElements[afeIndex:]:
1031+
if element.name in (specialElements | scopingElements):
1032+
furthestBlock = element
1033+
break
1034+
if furthestBlock is None:
1035+
element = self.parser.openElements.pop()
1036+
while element != afeElement:
1037+
element = self.parser.openElements.pop()
1038+
self.parser.activeFormattingElements.remove(element)
1039+
return
1040+
commonAncestor = self.parser.openElements[afeIndex-1]
1041+
1042+
if furthestBlock.parent:
1043+
furthestBlock.childNodes.remove(furthestBlock)
1044+
# XXX Need to finish this
1045+
raise NotImplementedError
1046+
1047+
def endTagButtonMarqueeObject(self, name):
1048+
if self.parser.elementInScope(name):
1049+
self.parser.generateImpliedEndTags()
1050+
if self.parser.openElements[-1].name != name:
1051+
self.parser.parseError()
1052+
1053+
if self.parser.elementInScope(name):
1054+
element = self.parser.openElements.pop()
1055+
while element.name != name:
1056+
element = self.parser.openElements.pop()
1057+
self.parser.clearActiveFormattingElements()
1058+
10471059
def endTagMisplacedNone(self, name):
10481060
""" Elements that should be children of other elements that have a
10491061
different insertion mode or elements that have no end tag;
@@ -1056,22 +1068,12 @@ def endTagMisplacedNone(self, name):
10561068
"""
10571069
self.parser.parseError()
10581070

1059-
def startTagNew(self, name, other):
1060-
"""New HTML5 elements, "event-source", "section", "nav",
1061-
"article", "aside", "header", "footer", "datagrid", "command"
1062-
"""
1063-
raise NotImplementedError
1064-
10651071
def endTagNew(self, name):
10661072
"""New HTML5 elements, "event-source", "section", "nav",
10671073
"article", "aside", "header", "footer", "datagrid", "command"
10681074
"""
10691075
raise NotImplementedError
10701076

1071-
def startTagOther(self, name, attributes):
1072-
self.parser.reconstructActiveFormattingElements()
1073-
self.parser.insertElement(name, attributes)
1074-
10751077
def endTagOther(self, name):
10761078
# XXX This logic should be moved into the treebuilder
10771079
# AT should use reversed instead of [::-1] when Python 2.4 == True.

0 commit comments

Comments
 (0)