@@ -1332,7 +1332,7 @@ def endTagBlock(self, token):
13321332 def endTagForm (self , token ):
13331333 node = self .tree .formPointer
13341334 self .tree .formPointer = None
1335- if node is None or not self .tree .elementInScope (node . name ):
1335+ if node is None or not self .tree .elementInScope (node ):
13361336 self .parser .parseError ("unexpected-end-tag" ,
13371337 {"name" :"form" })
13381338 else :
@@ -1670,8 +1670,10 @@ def startTagInput(self, token):
16701670
16711671 def startTagForm (self , token ):
16721672 self .parser .parseError ("unexpected-form-in-table" )
1673- self .tree .insertElement (token )
1674- self .tree .openElements .pop ()
1673+ if self .tree .formPointer is None :
1674+ self .tree .insertElement (token )
1675+ self .tree .formPointer = self .tree .openElements [- 1 ]
1676+ self .tree .openElements .pop ()
16751677
16761678 def startTagOther (self , token ):
16771679 self .parser .parseError ("unexpected-start-tag-implies-table-voodoo" , {"name" : token ["name" ]})
@@ -2367,9 +2369,23 @@ def processCharacters(self, token):
23672369
23682370 def processEOF (self ):
23692371 self .parser .parseError ("eof-in-foreign-lands" )
2370- #while self.tree.openElements.pop().name not in ("svg", "math"):
2371- # pass
2372- self .parser .phase = self .parser .secondaryPhase
2372+
2373+ stopNodes = frozenset ([(namespaces ["mathml" ], "mi" ),
2374+ (namespaces ["mathml" ], "mo" ),
2375+ (namespaces ["mathml" ], "mn" ),
2376+ (namespaces ["mathml" ], "ms" ),
2377+ (namespaces ["mathml" ], "mtext" ),
2378+ (namespaces ["svg" ], "foreignObject" ),
2379+ (namespaces ["svg" ], "desc" ),
2380+ (namespaces ["svg" ], "title" )])
2381+ while True :
2382+ node = self .tree .openElements .pop ()
2383+ if (node .nameTuple in stopNodes or
2384+ node .nameTuple [0 ] == namespaces ["html" ]):
2385+ break
2386+
2387+ if self .parser .phase == self and not self .nonHTMLElementInScope ():
2388+ self .parser .phase = self .parser .secondaryPhase
23732389 self .parser .phase .processEOF ()
23742390
23752391 def processStartTag (self , token ):
@@ -2431,10 +2447,11 @@ def processEndTag(self, token):
24312447 if node .namespace == self .tree .defaultNamespace :
24322448 assert self .parser .secondaryPhase != self
24332449 self .parser .secondaryPhase .processEndTag (token )
2434- if self .parser .phase == self and not self .nonHTMLElementInScope ():
2435- self .parser .phase = self .parser .secondaryPhase
24362450 break
24372451
2452+ if self .parser .phase == self and not self .nonHTMLElementInScope ():
2453+ self .parser .phase = self .parser .secondaryPhase
2454+
24382455 else :
24392456 assert self .parser .secondaryPhase != self
24402457 self .parser .secondaryPhase .processEndTag (token )
0 commit comments