mirror of
https://github.com/golang/go
synced 2024-11-24 21:10:04 -07: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
@ -584,6 +584,7 @@ func (d *Decoder) RawToken() (Token, error) {
|
||||
if inquote == 0 && b == '>' && depth == 0 {
|
||||
break
|
||||
}
|
||||
HandleB:
|
||||
d.buf.WriteByte(b)
|
||||
switch {
|
||||
case b == inquote:
|
||||
@ -599,7 +600,35 @@ func (d *Decoder) RawToken() (Token, error) {
|
||||
depth--
|
||||
|
||||
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
|
||||
|
@ -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…
Reference in New Issue
Block a user