Commit 849fc19c authored by Nigel Tao's avatar Nigel Tao

html: clean up the z.rawTag calculation in the tokenizer.

R=andybalholm
CC=golang-dev
https://golang.org/cl/5440064
parent 3b392277
...@@ -379,6 +379,28 @@ func (z *Tokenizer) readMarkupDeclaration() TokenType { ...@@ -379,6 +379,28 @@ func (z *Tokenizer) readMarkupDeclaration() TokenType {
return DoctypeToken return DoctypeToken
} }
// startTagIn returns whether the start tag in z.buf[z.data.start:z.data.end]
// case-insensitively matches any element of ss.
func (z *Tokenizer) startTagIn(ss ...string) bool {
loop:
for _, s := range ss {
if z.data.end-z.data.start != len(s) {
continue loop
}
for i := 0; i < len(s); i++ {
c := z.buf[z.data.start+i]
if 'A' <= c && c <= 'Z' {
c += 'a' - 'A'
}
if c != s[i] {
continue loop
}
}
return true
}
return false
}
// readStartTag reads the next start tag token. The opening "<a" has already // readStartTag reads the next start tag token. The opening "<a" has already
// been consumed, where 'a' means anything in [A-Za-z]. // been consumed, where 'a' means anything in [A-Za-z].
func (z *Tokenizer) readStartTag() TokenType { func (z *Tokenizer) readStartTag() TokenType {
...@@ -406,15 +428,26 @@ func (z *Tokenizer) readStartTag() TokenType { ...@@ -406,15 +428,26 @@ func (z *Tokenizer) readStartTag() TokenType {
} }
} }
// Several tags flag the tokenizer's next token as raw. // Several tags flag the tokenizer's next token as raw.
// The tag name lengths of these special cases ranges in [3, 9]. c, raw := z.buf[z.data.start], false
if x := z.data.end - z.data.start; 3 <= x && x <= 9 { if 'A' <= c && c <= 'Z' {
switch z.buf[z.data.start] { c += 'a' - 'A'
case 'i', 'n', 'p', 's', 't', 'x', 'I', 'N', 'P', 'S', 'T', 'X': }
switch s := strings.ToLower(string(z.buf[z.data.start:z.data.end])); s { switch c {
case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "textarea", "title", "xmp": case 'i':
z.rawTag = s raw = z.startTagIn("iframe")
} case 'n':
} raw = z.startTagIn("noembed", "noframes", "noscript")
case 'p':
raw = z.startTagIn("plaintext")
case 's':
raw = z.startTagIn("script", "style")
case 't':
raw = z.startTagIn("textarea", "title")
case 'x':
raw = z.startTagIn("xmp")
}
if raw {
z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end]))
} }
// Look for a self-closing token like "<br/>". // Look for a self-closing token like "<br/>".
if z.err == nil && z.buf[z.raw.end-2] == '/' { if z.err == nil && z.buf[z.raw.end-2] == '/' {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment