@@ -1006,32 +1006,24 @@ def startTagForm(self, token):
10061006
10071007def startTagListItem (self ,token ):
10081008self .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-
10271009
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" ))
10331018break
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+
10351027self .tree .insertElement (token )
10361028
10371029def startTagPlaintext (self ,token ):
@@ -1335,14 +1327,18 @@ def endTagForm(self, token):
13351327self .tree .openElements .remove (node )
13361328
13371329def 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" ]})
13461342node = self .tree .openElements .pop ()
13471343while node .name != token ["name" ]:
13481344node = self .tree .openElements .pop ()
@@ -1667,7 +1663,7 @@ def startTagOther(self, token):
16671663self .tree .insertFromTable = False
16681664
16691665def endTagTable (self ,token ):
1670- if self .tree .elementInScope ("table" ,True ):
1666+ if self .tree .elementInScope ("table" ,variant = "table" ):
16711667self .tree .generateImpliedEndTags ()
16721668if self .tree .openElements [- 1 ].name != "table" :
16731669self .parser .parseError ("end-tag-too-early-named" ,
@@ -1759,7 +1755,7 @@ def __init__(self, parser, tree):
17591755self .endTagHandler .default = self .endTagOther
17601756
17611757def ignoreEndTagCaption (self ):
1762- return not self .tree .elementInScope ("caption" ,True )
1758+ return not self .tree .elementInScope ("caption" ,variant = "table" )
17631759
17641760def processEOF (self ):
17651761self .parser .phases ["inBody" ].processEOF ()
@@ -1930,9 +1926,9 @@ def startTagTableCell(self, token):
19301926
19311927def startTagTableOther (self ,token ):
19321928# 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" )):
19361932self .clearStackToTableBodyContext ()
19371933self .endTagTableRowGroup (
19381934impliedTagToken (self .tree .openElements [- 1 ].name ))
@@ -1945,7 +1941,7 @@ def startTagOther(self, token):
19451941self .parser .phases ["inTable" ].processStartTag (token )
19461942
19471943def endTagTableRowGroup (self ,token ):
1948- if self .tree .elementInScope (token ["name" ],True ):
1944+ if self .tree .elementInScope (token ["name" ],variant = "table" ):
19491945self .clearStackToTableBodyContext ()
19501946self .tree .openElements .pop ()
19511947self .parser .phase = self .parser .phases ["inTable" ]
@@ -1954,9 +1950,9 @@ def endTagTableRowGroup(self, token):
19541950 {"name" :token ["name" ]})
19551951
19561952def 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" )):
19601956self .clearStackToTableBodyContext ()
19611957self .endTagTableRowGroup (
19621958impliedTagToken (self .tree .openElements [- 1 ].name ))
@@ -2002,7 +1998,7 @@ def clearStackToTableRowContext(self):
20021998self .tree .openElements .pop ()
20031999
20042000def ignoreEndTagTr (self ):
2005- return not self .tree .elementInScope ("tr" ,tableVariant = True )
2001+ return not self .tree .elementInScope ("tr" ,variant = "table" )
20062002
20072003# the rest
20082004def processEOF (self ):
@@ -2049,7 +2045,7 @@ def endTagTable(self, token):
20492045self .parser .phase .processEndTag (token )
20502046
20512047def endTagTableRowGroup (self ,token ):
2052- if self .tree .elementInScope (token ["name" ],True ):
2048+ if self .tree .elementInScope (token ["name" ],variant = "table" ):
20532049self .endTagTr ("tr" )
20542050self .parser .phase .processEndTag (token )
20552051else :
@@ -2083,9 +2079,9 @@ def __init__(self, parser, tree):
20832079
20842080# helper
20852081def closeCell (self ):
2086- if self .tree .elementInScope ("td" ,True ):
2082+ if self .tree .elementInScope ("td" ,variant = "table" ):
20872083self .endTagTableCell (impliedTagToken ("td" ))
2088- elif self .tree .elementInScope ("th" ,True ):
2084+ elif self .tree .elementInScope ("th" ,variant = "table" ):
20892085self .endTagTableCell (impliedTagToken ("th" ))
20902086
20912087# the rest
@@ -2096,8 +2092,8 @@ def processCharacters(self, token):
20962092self .parser .phases ["inBody" ].processCharacters (token )
20972093
20982094def 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" )):
21012097self .closeCell ()
21022098self .parser .phase .processStartTag (token )
21032099else :
@@ -2112,7 +2108,7 @@ def startTagOther(self, token):
21122108self .parser .phases ["inBody" ].processStartTag
21132109
21142110def endTagTableCell (self ,token ):
2115- if self .tree .elementInScope (token ["name" ],True ):
2111+ if self .tree .elementInScope (token ["name" ],variant = "table" ):
21162112self .tree .generateImpliedEndTags (token ["name" ])
21172113if self .tree .openElements [- 1 ].name != token ["name" ]:
21182114self .parser .parseError ("unexpected-cell-end-tag" ,
@@ -2132,7 +2128,7 @@ def endTagIgnore(self, token):
21322128self .parser .parseError ("unexpected-end-tag" , {"name" :token ["name" ]})
21332129
21342130def endTagImply (self ,token ):
2135- if self .tree .elementInScope (token ["name" ],True ):
2131+ if self .tree .elementInScope (token ["name" ],variant = "table" ):
21362132self .closeCell ()
21372133self .parser .phase .processEndTag (token )
21382134else :
@@ -2197,7 +2193,7 @@ def startTagSelect(self, token):
21972193
21982194def startTagInput (self ,token ):
21992195self .parser .parseError ("unexpected-input-in-select" )
2200- if self .tree .elementInScope ("select" ,True ):
2196+ if self .tree .elementInScope ("select" ,variant = "table" ):
22012197self .endTagSelect ("select" )
22022198self .parser .phase .processStartTag (token )
22032199
@@ -2226,7 +2222,7 @@ def endTagOptgroup(self, token):
22262222 {"name" :"optgroup" })
22272223
22282224def endTagSelect (self ,token ):
2229- if self .tree .elementInScope ("select" ,True ):
2225+ if self .tree .elementInScope ("select" ,variant = "table" ):
22302226node = self .tree .openElements .pop ()
22312227while node .name != "select" :
22322228node = self .tree .openElements .pop ()
@@ -2238,7 +2234,7 @@ def endTagSelect(self, token):
22382234def endTagTableElements (self ,token ):
22392235self .parser .parseError ("unexpected-end-tag-in-select" ,
22402236 {"name" :token ["name" ]})
2241- if self .tree .elementInScope (token ["name" ],True ):
2237+ if self .tree .elementInScope (token ["name" ],variant = "table" ):
22422238self .endTagSelect ("select" )
22432239self .parser .phase .processEndTag (token )
22442240
@@ -2279,7 +2275,7 @@ def startTagOther(self, token):
22792275
22802276def endTagTable (self ,token ):
22812277self .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" ):
22832279self .endTagOther (impliedTagToken ("select" ))
22842280self .parser .phase .processEndTag (token )
22852281