@@ -1006,32 +1006,24 @@ def startTagForm(self, token):
1006
1006
1007
1007
def startTagListItem (self , token ):
1008
1008
self .parser .framesetOK = False
1009
- if self .tree .elementInScope ("p" ):
1010
- self .endTagP (impliedTagToken ("p" ))
1011
- stopNames = {"li" :("li" ), "dd" :("dd" , "dt" ), "dt" :("dd" , "dt" )}
1012
- stopName = stopNames [token ["name" ]]
1013
- # AT Use reversed in Python 2.4...
1014
- for i , node in enumerate (self .tree .openElements [::- 1 ]):
1015
- if node .name in stopName :
1016
- poppedNodes = []
1017
- for j in range (i + 1 ):
1018
- poppedNodes .append (self .tree .openElements .pop ())
1019
- if i >= 1 :
1020
- self .parser .parseError (
1021
- i == 1 and "missing-end-tag" or "missing-end-tags" ,
1022
- {"name" : u", " .join ([item .name
1023
- for item
1024
- in poppedNodes [:- 1 ]])})
1025
- break
1026
-
1027
1009
1028
- # Phrasing elements are all non special, non scoping, non
1029
- # formatting elements
1030
- if (node .nameTuple in
1031
- (specialElements | scopingElements )
1032
- and node .name not in ("address" , "div" )):
1010
+ stopNamesMap = {"li" :["li" ],
1011
+ "dt" :["dt" , "dd" ],
1012
+ "dd" :["dt" , "dd" ]}
1013
+ stopNames = stopNamesMap [token ["name" ]]
1014
+ for node in reversed (self .tree .openElements ):
1015
+ if node .name in stopNames :
1016
+ self .parser .phase .processEndTag (
1017
+ impliedTagToken (node .name , "EndTag" ))
1033
1018
break
1034
- # Always insert an <li> element.
1019
+ if (node .nameTuple in (scopingElements | specialElements ) and
1020
+ node .name not in ("address" , "div" , "p" )):
1021
+ break
1022
+
1023
+ if self .tree .elementInScope ("p" ):
1024
+ self .parser .phase .processEndTag (
1025
+ impliedTagToken ("p" , "EndTag" ))
1026
+
1035
1027
self .tree .insertElement (token )
1036
1028
1037
1029
def startTagPlaintext (self , token ):
@@ -1335,14 +1327,18 @@ def endTagForm(self, token):
1335
1327
self .tree .openElements .remove (node )
1336
1328
1337
1329
def endTagListItem (self , token ):
1338
- # AT Could merge this with the Block case
1339
- if self .tree .elementInScope (token ["name" ]):
1340
- self .tree .generateImpliedEndTags (token ["name" ])
1341
-
1342
- if self .tree .openElements [- 1 ].name != token ["name" ]:
1343
- self .parser .parseError ("end-tag-too-early" , {"name" : token ["name" ]})
1344
-
1345
- if self .tree .elementInScope (token ["name" ]):
1330
+ if token ["name" ] == "li" :
1331
+ variant = "list"
1332
+ else :
1333
+ variant = None
1334
+ if not self .tree .elementInScope (token ["name" ], variant = variant ):
1335
+ self .parser .parseError ("unexpected-end-tag" , {"name" : token ["name" ]})
1336
+ else :
1337
+ self .tree .generateImpliedEndTags (exclude = token ["name" ])
1338
+ if self .tree .openElements [- 1 ].name != token ["name" ]:
1339
+ self .parser .parseError (
1340
+ "end-tag-too-early" ,
1341
+ {"name" : token ["name" ]})
1346
1342
node = self .tree .openElements .pop ()
1347
1343
while node .name != token ["name" ]:
1348
1344
node = self .tree .openElements .pop ()
@@ -1667,7 +1663,7 @@ def startTagOther(self, token):
1667
1663
self .tree .insertFromTable = False
1668
1664
1669
1665
def endTagTable (self , token ):
1670
- if self .tree .elementInScope ("table" , True ):
1666
+ if self .tree .elementInScope ("table" , variant = "table" ):
1671
1667
self .tree .generateImpliedEndTags ()
1672
1668
if self .tree .openElements [- 1 ].name != "table" :
1673
1669
self .parser .parseError ("end-tag-too-early-named" ,
@@ -1759,7 +1755,7 @@ def __init__(self, parser, tree):
1759
1755
self .endTagHandler .default = self .endTagOther
1760
1756
1761
1757
def ignoreEndTagCaption (self ):
1762
- return not self .tree .elementInScope ("caption" , True )
1758
+ return not self .tree .elementInScope ("caption" , variant = "table" )
1763
1759
1764
1760
def processEOF (self ):
1765
1761
self .parser .phases ["inBody" ].processEOF ()
@@ -1930,9 +1926,9 @@ def startTagTableCell(self, token):
1930
1926
1931
1927
def startTagTableOther (self , token ):
1932
1928
# XXX AT Any ideas on how to share this with endTagTable?
1933
- if (self .tree .elementInScope ("tbody" , True ) or
1934
- self .tree .elementInScope ("thead" , True ) or
1935
- self .tree .elementInScope ("tfoot" , True )):
1929
+ if (self .tree .elementInScope ("tbody" , variant = "table" ) or
1930
+ self .tree .elementInScope ("thead" , variant = "table" ) or
1931
+ self .tree .elementInScope ("tfoot" , variant = "table" )):
1936
1932
self .clearStackToTableBodyContext ()
1937
1933
self .endTagTableRowGroup (
1938
1934
impliedTagToken (self .tree .openElements [- 1 ].name ))
@@ -1945,7 +1941,7 @@ def startTagOther(self, token):
1945
1941
self .parser .phases ["inTable" ].processStartTag (token )
1946
1942
1947
1943
def endTagTableRowGroup (self , token ):
1948
- if self .tree .elementInScope (token ["name" ], True ):
1944
+ if self .tree .elementInScope (token ["name" ], variant = "table" ):
1949
1945
self .clearStackToTableBodyContext ()
1950
1946
self .tree .openElements .pop ()
1951
1947
self .parser .phase = self .parser .phases ["inTable" ]
@@ -1954,9 +1950,9 @@ def endTagTableRowGroup(self, token):
1954
1950
{"name" : token ["name" ]})
1955
1951
1956
1952
def endTagTable (self , token ):
1957
- if (self .tree .elementInScope ("tbody" , True ) or
1958
- self .tree .elementInScope ("thead" , True ) or
1959
- self .tree .elementInScope ("tfoot" , True )):
1953
+ if (self .tree .elementInScope ("tbody" , variant = "table" ) or
1954
+ self .tree .elementInScope ("thead" , variant = "table" ) or
1955
+ self .tree .elementInScope ("tfoot" , variant = "table" )):
1960
1956
self .clearStackToTableBodyContext ()
1961
1957
self .endTagTableRowGroup (
1962
1958
impliedTagToken (self .tree .openElements [- 1 ].name ))
@@ -2002,7 +1998,7 @@ def clearStackToTableRowContext(self):
2002
1998
self .tree .openElements .pop ()
2003
1999
2004
2000
def ignoreEndTagTr (self ):
2005
- return not self .tree .elementInScope ("tr" , tableVariant = True )
2001
+ return not self .tree .elementInScope ("tr" , variant = "table" )
2006
2002
2007
2003
# the rest
2008
2004
def processEOF (self ):
@@ -2049,7 +2045,7 @@ def endTagTable(self, token):
2049
2045
self .parser .phase .processEndTag (token )
2050
2046
2051
2047
def endTagTableRowGroup (self , token ):
2052
- if self .tree .elementInScope (token ["name" ], True ):
2048
+ if self .tree .elementInScope (token ["name" ], variant = "table" ):
2053
2049
self .endTagTr ("tr" )
2054
2050
self .parser .phase .processEndTag (token )
2055
2051
else :
@@ -2083,9 +2079,9 @@ def __init__(self, parser, tree):
2083
2079
2084
2080
# helper
2085
2081
def closeCell (self ):
2086
- if self .tree .elementInScope ("td" , True ):
2082
+ if self .tree .elementInScope ("td" , variant = "table" ):
2087
2083
self .endTagTableCell (impliedTagToken ("td" ))
2088
- elif self .tree .elementInScope ("th" , True ):
2084
+ elif self .tree .elementInScope ("th" , variant = "table" ):
2089
2085
self .endTagTableCell (impliedTagToken ("th" ))
2090
2086
2091
2087
# the rest
@@ -2096,8 +2092,8 @@ def processCharacters(self, token):
2096
2092
self .parser .phases ["inBody" ].processCharacters (token )
2097
2093
2098
2094
def startTagTableOther (self , token ):
2099
- if (self .tree .elementInScope ("td" , True ) or
2100
- self .tree .elementInScope ("th" , True )):
2095
+ if (self .tree .elementInScope ("td" , variant = "table" ) or
2096
+ self .tree .elementInScope ("th" , variant = "table" )):
2101
2097
self .closeCell ()
2102
2098
self .parser .phase .processStartTag (token )
2103
2099
else :
@@ -2112,7 +2108,7 @@ def startTagOther(self, token):
2112
2108
self .parser .phases ["inBody" ].processStartTag
2113
2109
2114
2110
def endTagTableCell (self , token ):
2115
- if self .tree .elementInScope (token ["name" ], True ):
2111
+ if self .tree .elementInScope (token ["name" ], variant = "table" ):
2116
2112
self .tree .generateImpliedEndTags (token ["name" ])
2117
2113
if self .tree .openElements [- 1 ].name != token ["name" ]:
2118
2114
self .parser .parseError ("unexpected-cell-end-tag" ,
@@ -2132,7 +2128,7 @@ def endTagIgnore(self, token):
2132
2128
self .parser .parseError ("unexpected-end-tag" , {"name" : token ["name" ]})
2133
2129
2134
2130
def endTagImply (self , token ):
2135
- if self .tree .elementInScope (token ["name" ], True ):
2131
+ if self .tree .elementInScope (token ["name" ], variant = "table" ):
2136
2132
self .closeCell ()
2137
2133
self .parser .phase .processEndTag (token )
2138
2134
else :
@@ -2197,7 +2193,7 @@ def startTagSelect(self, token):
2197
2193
2198
2194
def startTagInput (self , token ):
2199
2195
self .parser .parseError ("unexpected-input-in-select" )
2200
- if self .tree .elementInScope ("select" , True ):
2196
+ if self .tree .elementInScope ("select" , variant = "table" ):
2201
2197
self .endTagSelect ("select" )
2202
2198
self .parser .phase .processStartTag (token )
2203
2199
@@ -2226,7 +2222,7 @@ def endTagOptgroup(self, token):
2226
2222
{"name" : "optgroup" })
2227
2223
2228
2224
def endTagSelect (self , token ):
2229
- if self .tree .elementInScope ("select" , True ):
2225
+ if self .tree .elementInScope ("select" , variant = "table" ):
2230
2226
node = self .tree .openElements .pop ()
2231
2227
while node .name != "select" :
2232
2228
node = self .tree .openElements .pop ()
@@ -2238,7 +2234,7 @@ def endTagSelect(self, token):
2238
2234
def endTagTableElements (self , token ):
2239
2235
self .parser .parseError ("unexpected-end-tag-in-select" ,
2240
2236
{"name" : token ["name" ]})
2241
- if self .tree .elementInScope (token ["name" ], True ):
2237
+ if self .tree .elementInScope (token ["name" ], variant = "table" ):
2242
2238
self .endTagSelect ("select" )
2243
2239
self .parser .phase .processEndTag (token )
2244
2240
@@ -2279,7 +2275,7 @@ def startTagOther(self, token):
2279
2275
2280
2276
def endTagTable (self , token ):
2281
2277
self .parser .parseError ("unexpected-table-element-end-tag-in-select-in-table" , {"name" : token ["name" ]})
2282
- if self .tree .elementInScope (token ["name" ], tableVariant = True ):
2278
+ if self .tree .elementInScope (token ["name" ], variant = "table" ):
2283
2279
self .endTagOther (impliedTagToken ("select" ))
2284
2280
self .parser .phase .processEndTag (token )
2285
2281
0 commit comments