diff options
Diffstat (limited to 'src/pkg/xml/xml.go')
-rw-r--r-- | src/pkg/xml/xml.go | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/src/pkg/xml/xml.go b/src/pkg/xml/xml.go index 33a86a255..67cbb824f 100644 --- a/src/pkg/xml/xml.go +++ b/src/pkg/xml/xml.go @@ -589,14 +589,7 @@ func (p *Parser) RawToken() (Token, os.Error) { return nil, p.err } p.space() - if b, ok = p.mustgetc(); !ok { - return nil, p.err - } - if b != '"' && b != '\'' { - p.err = SyntaxError("unquoted or missing attribute value in element") - return nil, p.err - } - data := p.text(int(b), false) + data := p.attrval() if data == nil { return nil, p.err } @@ -610,6 +603,40 @@ func (p *Parser) RawToken() (Token, os.Error) { return StartElement{name, attr}, nil } +func (p *Parser) attrval() []byte { + b, ok := p.mustgetc() + if !ok { + return nil + } + // Handle quoted attribute values + if b == '"' || b == '\'' { + return p.text(int(b), false) + } + // Handle unquoted attribute values for strict parsers + if p.Strict { + p.err = SyntaxError("unquoted or missing attribute value in element") + return nil + } + // Handle unquoted attribute values for unstrict parsers + p.ungetc(b) + p.buf.Reset() + for { + b, ok = p.mustgetc() + if !ok { + return nil + } + // http://www.w3.org/TR/REC-html40/intro/sgmltut.html#h-3.2.2 + if 'a' <= b && b <= 'z' || 'A' <= b && b <= 'Z' || + '0' <= b && b <= '9' || b == '_' || b == ':' || b == '-' { + p.buf.WriteByte(b) + } else { + p.ungetc(b) + break + } + } + return p.buf.Bytes() +} + // Skip spaces if any func (p *Parser) space() { for { |