@@ -692,14 +692,20 @@ def anythingElse(self):
692692
693693
694694class 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