]> Cypherpunks repositories - gostls13.git/commitdiff
html: stop at scope marker node when generating implied </a> tags
authorAndrew Balholm <andybalholm@gmail.com>
Wed, 2 Nov 2011 00:47:05 +0000 (11:47 +1100)
committerNigel Tao <nigeltao@golang.org>
Wed, 2 Nov 2011 00:47:05 +0000 (11:47 +1100)
A <a> tag generates implied end tags for any open <a> elements.
But it shouldn't do that when it is inside a table cell the the open <a>
is outside the table.
So stop the search for an open <a> when we reach a scope marker node.

Pass tests1.dat, test 78:
<a href="blah">aba<table><tr><td><a href="foo">br</td></tr>x</table>aoe

| <html>
|   <head>
|   <body>
|     <a>
|       href="blah"
|       "abax"
|       <table>
|         <tbody>
|           <tr>
|             <td>
|               <a>
|                 href="foo"
|                 "br"
|       "aoe"

Also pass test 79:
<table><a href="blah">aba<tr><td><a href="foo">br</td></tr>x</table>aoe

R=nigeltao
CC=golang-dev
https://golang.org/cl/5320063

src/pkg/html/node.go
src/pkg/html/parse.go
src/pkg/html/parse_test.go

index 4ecfd6ca238e45ef47005bb7f5e91f6a46a9b5e0..5ca6035c118aac8051a8baf8dd34926d39106d6d 100644 (file)
@@ -135,6 +135,8 @@ func (s *nodeStack) remove(n *Node) {
        *s = (*s)[:j]
 }
 
+// TODO(nigeltao): forTag no longer used. Should it be deleted?
+
 // forTag returns the top-most element node with the given tag.
 func (s *nodeStack) forTag(tag string) *Node {
        for i := len(*s) - 1; i >= 0; i-- {
index 2538ea98115116d5a1360439c1978c258e955464..54f7e2e8a55debaae9df9046aa2436c6271b46c0 100644 (file)
@@ -553,10 +553,13 @@ func inBodyIM(p *parser) (insertionMode, bool) {
                        }
                        p.addElement(p.tok.Data, p.tok.Attr)
                case "a":
-                       if n := p.afe.forTag("a"); n != nil {
-                               p.inBodyEndTagFormatting("a")
-                               p.oe.remove(n)
-                               p.afe.remove(n)
+                       for i := len(p.afe) - 1; i >= 0 && p.afe[i].Type != scopeMarkerNode; i-- {
+                               if n := p.afe[i]; n.Type == ElementNode && n.Data == "a" {
+                                       p.inBodyEndTagFormatting("a")
+                                       p.oe.remove(n)
+                                       p.afe.remove(n)
+                                       break
+                               }
                        }
                        p.reconstructActiveFormattingElements()
                        p.addFormattingElement(p.tok.Data, p.tok.Attr)
index 067eb26d04f46ad2a6b5be0acef6751e7df30ba8..b9572fa12344607658ba2bbd8a74bea3e9b117a8 100644 (file)
@@ -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 < 78; i++ {
+               for i := 0; i < 80; i++ {
                        // Parse the #data section.
                        b, err := ioutil.ReadAll(<-rc)
                        if err != nil {