@@ -1332,7 +1332,7 @@ def endTagBlock(self, token):
1332
1332
def endTagForm (self , token ):
1333
1333
node = self .tree .formPointer
1334
1334
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 ):
1336
1336
self .parser .parseError ("unexpected-end-tag" ,
1337
1337
{"name" :"form" })
1338
1338
else :
@@ -1670,8 +1670,10 @@ def startTagInput(self, token):
1670
1670
1671
1671
def startTagForm (self , token ):
1672
1672
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 ()
1675
1677
1676
1678
def startTagOther (self , token ):
1677
1679
self .parser .parseError ("unexpected-start-tag-implies-table-voodoo" , {"name" : token ["name" ]})
@@ -2367,9 +2369,23 @@ def processCharacters(self, token):
2367
2369
2368
2370
def processEOF (self ):
2369
2371
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
2373
2389
self .parser .phase .processEOF ()
2374
2390
2375
2391
def processStartTag (self , token ):
@@ -2431,10 +2447,11 @@ def processEndTag(self, token):
2431
2447
if node .namespace == self .tree .defaultNamespace :
2432
2448
assert self .parser .secondaryPhase != self
2433
2449
self .parser .secondaryPhase .processEndTag (token )
2434
- if self .parser .phase == self and not self .nonHTMLElementInScope ():
2435
- self .parser .phase = self .parser .secondaryPhase
2436
2450
break
2437
2451
2452
+ if self .parser .phase == self and not self .nonHTMLElementInScope ():
2453
+ self .parser .phase = self .parser .secondaryPhase
2454
+
2438
2455
else :
2439
2456
assert self .parser .secondaryPhase != self
2440
2457
self .parser .secondaryPhase .processEndTag (token )
0 commit comments