mirror of
https://github.com/golang/go
synced 2024-11-02 11:50:30 +00:00
html: improve parsing of lists
Make a <li> tag close the previous <li> element. Make a </ul> tag close <li> elements. Pass tests1.dat, test 33: <!DOCTYPE html><li>hello<li>world<ul>how<li>do</ul>you</body><!--do--> | <!DOCTYPE html> | <html> | <head> | <body> | <li> | "hello" | <li> | "world" | <ul> | "how" | <li> | "do" | "you" | <!-- do --> R=nigeltao CC=golang-dev https://golang.org/cl/5321051
This commit is contained in:
parent
6e318bda6c
commit
05ed18f4f6
2 changed files with 21 additions and 1 deletions
|
@ -576,6 +576,24 @@ func inBodyIM(p *parser) (insertionMode, bool) {
|
|||
p.framesetOK = false
|
||||
// TODO: detect <select> inside a table.
|
||||
return inSelectIM, true
|
||||
case "li":
|
||||
p.framesetOK = false
|
||||
for i := len(p.oe) - 1; i >= 0; i-- {
|
||||
node := p.oe[i]
|
||||
switch node.Data {
|
||||
case "li":
|
||||
p.popUntil(listItemScopeStopTags, "li")
|
||||
case "address", "div", "p":
|
||||
continue
|
||||
default:
|
||||
if !isSpecialElement[node.Data] {
|
||||
continue
|
||||
}
|
||||
}
|
||||
break
|
||||
}
|
||||
p.popUntil(buttonScopeStopTags, "p")
|
||||
p.addElement("li", p.tok.Attr)
|
||||
default:
|
||||
// TODO.
|
||||
p.addElement(p.tok.Data, p.tok.Attr)
|
||||
|
@ -592,6 +610,8 @@ func inBodyIM(p *parser) (insertionMode, bool) {
|
|||
p.popUntil(buttonScopeStopTags, "p")
|
||||
case "a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u":
|
||||
p.inBodyEndTagFormatting(p.tok.Data)
|
||||
case "address", "article", "aside", "blockquote", "button", "center", "details", "dir", "div", "dl", "fieldset", "figcaption", "figure", "footer", "header", "hgroup", "listing", "menu", "nav", "ol", "pre", "section", "summary", "ul":
|
||||
p.popUntil(defaultScopeStopTags, p.tok.Data)
|
||||
default:
|
||||
p.inBodyEndTagOther(p.tok.Data)
|
||||
}
|
||||
|
|
|
@ -132,7 +132,7 @@ func TestParser(t *testing.T) {
|
|||
rc := make(chan io.Reader)
|
||||
go readDat(filename, rc)
|
||||
// TODO(nigeltao): Process all test cases, not just a subset.
|
||||
for i := 0; i < 33; i++ {
|
||||
for i := 0; i < 34; i++ {
|
||||
// Parse the #data section.
|
||||
b, err := ioutil.ReadAll(<-rc)
|
||||
if err != nil {
|
||||
|
|
Loading…
Reference in a new issue