mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
encoding/xml: parse comments in DOCTYPE
R=rsc, n13m3y3r CC=golang-dev https://golang.org/cl/6330061
This commit is contained in:
parent
2785f9528e
commit
a11b748fa2
2 changed files with 63 additions and 1 deletions
|
|
@ -584,6 +584,7 @@ func (d *Decoder) RawToken() (Token, error) {
|
||||||
if inquote == 0 && b == '>' && depth == 0 {
|
if inquote == 0 && b == '>' && depth == 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
HandleB:
|
||||||
d.buf.WriteByte(b)
|
d.buf.WriteByte(b)
|
||||||
switch {
|
switch {
|
||||||
case b == inquote:
|
case b == inquote:
|
||||||
|
|
@ -599,7 +600,35 @@ func (d *Decoder) RawToken() (Token, error) {
|
||||||
depth--
|
depth--
|
||||||
|
|
||||||
case b == '<' && inquote == 0:
|
case b == '<' && inquote == 0:
|
||||||
depth++
|
// Look for <!-- to begin comment.
|
||||||
|
s := "!--"
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
if b, ok = d.mustgetc(); !ok {
|
||||||
|
return nil, d.err
|
||||||
|
}
|
||||||
|
if b != s[i] {
|
||||||
|
for j := 0; j < i; j++ {
|
||||||
|
d.buf.WriteByte(s[j])
|
||||||
|
}
|
||||||
|
depth++
|
||||||
|
goto HandleB
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove < that was written above.
|
||||||
|
d.buf.Truncate(d.buf.Len() - 1)
|
||||||
|
|
||||||
|
// Look for terminator.
|
||||||
|
var b0, b1 byte
|
||||||
|
for {
|
||||||
|
if b, ok = d.mustgetc(); !ok {
|
||||||
|
return nil, d.err
|
||||||
|
}
|
||||||
|
if b0 == '-' && b1 == '-' && b == '>' {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
b0, b1 = b1, b
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Directive(d.buf.Bytes()), nil
|
return Directive(d.buf.Bytes()), nil
|
||||||
|
|
|
||||||
|
|
@ -621,3 +621,36 @@ func TestProcInstEncoding(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure that directives with comments include the complete
|
||||||
|
// text of any nested directives.
|
||||||
|
|
||||||
|
var directivesWithCommentsInput = `
|
||||||
|
<!DOCTYPE [<!-- a comment --><!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">]>
|
||||||
|
<!DOCTYPE [<!ENTITY go "Golang"><!-- a comment-->]>
|
||||||
|
<!DOCTYPE <!-> <!> <!----> <!-->--> <!--->--> [<!ENTITY go "Golang"><!-- a comment-->]>
|
||||||
|
`
|
||||||
|
|
||||||
|
var directivesWithCommentsTokens = []Token{
|
||||||
|
CharData("\n"),
|
||||||
|
Directive(`DOCTYPE [<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">]`),
|
||||||
|
CharData("\n"),
|
||||||
|
Directive(`DOCTYPE [<!ENTITY go "Golang">]`),
|
||||||
|
CharData("\n"),
|
||||||
|
Directive(`DOCTYPE <!-> <!> [<!ENTITY go "Golang">]`),
|
||||||
|
CharData("\n"),
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDirectivesWithComments(t *testing.T) {
|
||||||
|
d := NewDecoder(strings.NewReader(directivesWithCommentsInput))
|
||||||
|
|
||||||
|
for i, want := range directivesWithCommentsTokens {
|
||||||
|
have, err := d.Token()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("token %d: unexpected error: %s", i, err)
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(have, want) {
|
||||||
|
t.Errorf("token %d = %#v want %#v", i, have, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue