diff --git a/src/pkg/html/parse.go b/src/pkg/html/parse.go index 5b91204240a..2c15d2d31e9 100644 --- a/src/pkg/html/parse.go +++ b/src/pkg/html/parse.go @@ -298,7 +298,7 @@ func (p *parser) resetInsertionMode() { case "tbody", "thead", "tfoot": p.im = inTableBodyIM case "caption": - // TODO: p.im = inCaptionIM + p.im = inCaptionIM case "colgroup": p.im = inColumnGroupIM case "table": @@ -887,6 +887,12 @@ func inTableIM(p *parser) bool { // TODO. case StartTagToken: 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": p.clearStackToContext(tableScopeStopTags) 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. func inColumnGroupIM(p *parser) bool { switch p.tok.Type { diff --git a/src/pkg/html/parse_test.go b/src/pkg/html/parse_test.go index 0fd2dc82b30..3837f34b191 100644 --- a/src/pkg/html/parse_test.go +++ b/src/pkg/html/parse_test.go @@ -134,7 +134,7 @@ func TestParser(t *testing.T) { }{ // TODO(nigeltao): Process all the test cases from all the .dat files. {"tests1.dat", -1}, - {"tests2.dat", 33}, + {"tests2.dat", 34}, {"tests3.dat", 0}, } for _, tf := range testFiles {