1
0
mirror of https://github.com/golang/go synced 2024-11-22 08:44:41 -07:00

html: parse <caption> elements

Pass tests2.dat, test 33:
<!DOCTYPE html><table><caption>test TEST</caption><td>test

| <!DOCTYPE html>
| <html>
|   <head>
|   <body>
|     <table>
|       <caption>
|         "test TEST"
|       <tbody>
|         <tr>
|           <td>
|             "test"

R=nigeltao
CC=golang-dev
https://golang.org/cl/5371099
This commit is contained in:
Andrew Balholm 2011-11-16 12:18:11 +11:00 committed by Nigel Tao
parent 5e5c5c2789
commit 28546ed56a
2 changed files with 48 additions and 2 deletions

View File

@ -298,7 +298,7 @@ func (p *parser) resetInsertionMode() {
case "tbody", "thead", "tfoot": case "tbody", "thead", "tfoot":
p.im = inTableBodyIM p.im = inTableBodyIM
case "caption": case "caption":
// TODO: p.im = inCaptionIM p.im = inCaptionIM
case "colgroup": case "colgroup":
p.im = inColumnGroupIM p.im = inColumnGroupIM
case "table": case "table":
@ -887,6 +887,12 @@ func inTableIM(p *parser) bool {
// TODO. // TODO.
case StartTagToken: case StartTagToken:
switch p.tok.Data { switch p.tok.Data {
case "caption":
p.clearStackToContext(tableScopeStopTags)
p.afe = append(p.afe, &scopeMarker)
p.addElement(p.tok.Data, p.tok.Attr)
p.im = inCaptionIM
return true
case "tbody", "tfoot", "thead": case "tbody", "tfoot", "thead":
p.clearStackToContext(tableScopeStopTags) p.clearStackToContext(tableScopeStopTags)
p.addElement(p.tok.Data, p.tok.Attr) p.addElement(p.tok.Data, p.tok.Attr)
@ -960,6 +966,46 @@ func (p *parser) clearStackToContext(stopTags []string) {
} }
} }
// Section 11.2.5.4.11.
func inCaptionIM(p *parser) bool {
switch p.tok.Type {
case StartTagToken:
switch p.tok.Data {
case "caption", "col", "colgroup", "tbody", "td", "tfoot", "thead", "tr":
if p.popUntil(tableScopeStopTags, "caption") {
p.clearActiveFormattingElements()
p.im = inTableIM
return false
} else {
// Ignore the token.
return true
}
}
case EndTagToken:
switch p.tok.Data {
case "caption":
if p.popUntil(tableScopeStopTags, "caption") {
p.clearActiveFormattingElements()
p.im = inTableIM
}
return true
case "table":
if p.popUntil(tableScopeStopTags, "caption") {
p.clearActiveFormattingElements()
p.im = inTableIM
return false
} else {
// Ignore the token.
return true
}
case "body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr":
// Ignore the token.
return true
}
}
return inBodyIM(p)
}
// Section 11.2.5.4.12. // Section 11.2.5.4.12.
func inColumnGroupIM(p *parser) bool { func inColumnGroupIM(p *parser) bool {
switch p.tok.Type { switch p.tok.Type {

View File

@ -134,7 +134,7 @@ func TestParser(t *testing.T) {
}{ }{
// TODO(nigeltao): Process all the test cases from all the .dat files. // TODO(nigeltao): Process all the test cases from all the .dat files.
{"tests1.dat", -1}, {"tests1.dat", -1},
{"tests2.dat", 33}, {"tests2.dat", 34},
{"tests3.dat", 0}, {"tests3.dat", 0},
} }
for _, tf := range testFiles { for _, tf := range testFiles {