1
0
mirror of https://github.com/golang/go synced 2024-11-19 16:54:44 -07:00

xml: allow attributes without value in non-strict mode.

Attributes without value are commen in html and the xml
parser will accept them in non-strict mode and use the
attribute name as value. Thus parsing <p nowrap> as
<p norwar="nowrap">.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/4601053
This commit is contained in:
Volker Dobler 2011-06-16 12:56:49 -04:00 committed by Russ Cox
parent d81147b617
commit 7f3e109d2f
2 changed files with 41 additions and 9 deletions

View File

@ -659,17 +659,22 @@ func (p *Parser) RawToken() (Token, os.Error) {
return nil, p.err
}
if b != '=' {
p.err = p.syntaxError("attribute name without = in element")
return nil, p.err
if p.Strict {
p.err = p.syntaxError("attribute name without = in element")
return nil, p.err
} else {
p.ungetc(b)
a.Value = a.Name.Local
}
} else {
p.space()
data := p.attrval()
if data == nil {
return nil, p.err
}
a.Value = string(data)
}
p.space()
data := p.attrval()
if data == nil {
return nil, p.err
}
a.Value = string(data)
}
if empty {
p.needClose = true
p.toClose = name

View File

@ -445,6 +445,33 @@ func TestUnquotedAttrs(t *testing.T) {
}
}
func TestValuelessAttrs(t *testing.T) {
tests := [][3]string{
{"<p nowrap>", "p", "nowrap"},
{"<p nowrap >", "p", "nowrap"},
{"<input checked/>", "input", "checked"},
{"<input checked />", "input", "checked"},
}
for _, test := range tests {
p := NewParser(StringReader(test[0]))
p.Strict = false
token, err := p.Token()
if _, ok := err.(*SyntaxError); ok {
t.Errorf("Unexpected error: %v", err)
}
if token.(StartElement).Name.Local != test[1] {
t.Errorf("Unexpected tag name: %v", token.(StartElement).Name.Local)
}
attr := token.(StartElement).Attr[0]
if attr.Value != test[2] {
t.Errorf("Unexpected attribute value: %v", attr.Value)
}
if attr.Name.Local != test[2] {
t.Errorf("Unexpected attribute name: %v", attr.Name.Local)
}
}
}
func TestCopyTokenCharData(t *testing.T) {
data := []byte("same data")
var tok1 Token = CharData(data)