mirror of https://github.com/ethereum/go-ethereum
commit
1564f1a020
@ -0,0 +1,78 @@ |
|||||||
|
// Copyright 2012 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package atom provides integer codes (also known as atoms) for a fixed set of
|
||||||
|
// frequently occurring HTML strings: tag names and attribute keys such as "p"
|
||||||
|
// and "id".
|
||||||
|
//
|
||||||
|
// Sharing an atom's name between all elements with the same tag can result in
|
||||||
|
// fewer string allocations when tokenizing and parsing HTML. Integer
|
||||||
|
// comparisons are also generally faster than string comparisons.
|
||||||
|
//
|
||||||
|
// The value of an atom's particular code is not guaranteed to stay the same
|
||||||
|
// between versions of this package. Neither is any ordering guaranteed:
|
||||||
|
// whether atom.H1 < atom.H2 may also change. The codes are not guaranteed to
|
||||||
|
// be dense. The only guarantees are that e.g. looking up "div" will yield
|
||||||
|
// atom.Div, calling atom.Div.String will return "div", and atom.Div != 0.
|
||||||
|
package atom |
||||||
|
|
||||||
|
// Atom is an integer code for a string. The zero value maps to "".
|
||||||
|
type Atom uint32 |
||||||
|
|
||||||
|
// String returns the atom's name.
|
||||||
|
func (a Atom) String() string { |
||||||
|
start := uint32(a >> 8) |
||||||
|
n := uint32(a & 0xff) |
||||||
|
if start+n > uint32(len(atomText)) { |
||||||
|
return "" |
||||||
|
} |
||||||
|
return atomText[start : start+n] |
||||||
|
} |
||||||
|
|
||||||
|
func (a Atom) string() string { |
||||||
|
return atomText[a>>8 : a>>8+a&0xff] |
||||||
|
} |
||||||
|
|
||||||
|
// fnv computes the FNV hash with an arbitrary starting value h.
|
||||||
|
func fnv(h uint32, s []byte) uint32 { |
||||||
|
for i := range s { |
||||||
|
h ^= uint32(s[i]) |
||||||
|
h *= 16777619 |
||||||
|
} |
||||||
|
return h |
||||||
|
} |
||||||
|
|
||||||
|
func match(s string, t []byte) bool { |
||||||
|
for i, c := range t { |
||||||
|
if s[i] != c { |
||||||
|
return false |
||||||
|
} |
||||||
|
} |
||||||
|
return true |
||||||
|
} |
||||||
|
|
||||||
|
// Lookup returns the atom whose name is s. It returns zero if there is no
|
||||||
|
// such atom. The lookup is case sensitive.
|
||||||
|
func Lookup(s []byte) Atom { |
||||||
|
if len(s) == 0 || len(s) > maxAtomLen { |
||||||
|
return 0 |
||||||
|
} |
||||||
|
h := fnv(hash0, s) |
||||||
|
if a := table[h&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { |
||||||
|
return a |
||||||
|
} |
||||||
|
if a := table[(h>>16)&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { |
||||||
|
return a |
||||||
|
} |
||||||
|
return 0 |
||||||
|
} |
||||||
|
|
||||||
|
// String returns a string whose contents are equal to s. In that sense, it is
|
||||||
|
// equivalent to string(s) but may be more efficient.
|
||||||
|
func String(s []byte) string { |
||||||
|
if a := Lookup(s); a != 0 { |
||||||
|
return a.String() |
||||||
|
} |
||||||
|
return string(s) |
||||||
|
} |
@ -0,0 +1,109 @@ |
|||||||
|
// Copyright 2012 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package atom |
||||||
|
|
||||||
|
import ( |
||||||
|
"sort" |
||||||
|
"testing" |
||||||
|
) |
||||||
|
|
||||||
|
func TestKnown(t *testing.T) { |
||||||
|
for _, s := range testAtomList { |
||||||
|
if atom := Lookup([]byte(s)); atom.String() != s { |
||||||
|
t.Errorf("Lookup(%q) = %#x (%q)", s, uint32(atom), atom.String()) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestHits(t *testing.T) { |
||||||
|
for _, a := range table { |
||||||
|
if a == 0 { |
||||||
|
continue |
||||||
|
} |
||||||
|
got := Lookup([]byte(a.String())) |
||||||
|
if got != a { |
||||||
|
t.Errorf("Lookup(%q) = %#x, want %#x", a.String(), uint32(got), uint32(a)) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestMisses(t *testing.T) { |
||||||
|
testCases := []string{ |
||||||
|
"", |
||||||
|
"\x00", |
||||||
|
"\xff", |
||||||
|
"A", |
||||||
|
"DIV", |
||||||
|
"Div", |
||||||
|
"dIV", |
||||||
|
"aa", |
||||||
|
"a\x00", |
||||||
|
"ab", |
||||||
|
"abb", |
||||||
|
"abbr0", |
||||||
|
"abbr ", |
||||||
|
" abbr", |
||||||
|
" a", |
||||||
|
"acceptcharset", |
||||||
|
"acceptCharset", |
||||||
|
"accept_charset", |
||||||
|
"h0", |
||||||
|
"h1h2", |
||||||
|
"h7", |
||||||
|
"onClick", |
||||||
|
"λ", |
||||||
|
// The following string has the same hash (0xa1d7fab7) as "onmouseover".
|
||||||
|
"\x00\x00\x00\x00\x00\x50\x18\xae\x38\xd0\xb7", |
||||||
|
} |
||||||
|
for _, tc := range testCases { |
||||||
|
got := Lookup([]byte(tc)) |
||||||
|
if got != 0 { |
||||||
|
t.Errorf("Lookup(%q): got %d, want 0", tc, got) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestForeignObject(t *testing.T) { |
||||||
|
const ( |
||||||
|
afo = Foreignobject |
||||||
|
afO = ForeignObject |
||||||
|
sfo = "foreignobject" |
||||||
|
sfO = "foreignObject" |
||||||
|
) |
||||||
|
if got := Lookup([]byte(sfo)); got != afo { |
||||||
|
t.Errorf("Lookup(%q): got %#v, want %#v", sfo, got, afo) |
||||||
|
} |
||||||
|
if got := Lookup([]byte(sfO)); got != afO { |
||||||
|
t.Errorf("Lookup(%q): got %#v, want %#v", sfO, got, afO) |
||||||
|
} |
||||||
|
if got := afo.String(); got != sfo { |
||||||
|
t.Errorf("Atom(%#v).String(): got %q, want %q", afo, got, sfo) |
||||||
|
} |
||||||
|
if got := afO.String(); got != sfO { |
||||||
|
t.Errorf("Atom(%#v).String(): got %q, want %q", afO, got, sfO) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func BenchmarkLookup(b *testing.B) { |
||||||
|
sortedTable := make([]string, 0, len(table)) |
||||||
|
for _, a := range table { |
||||||
|
if a != 0 { |
||||||
|
sortedTable = append(sortedTable, a.String()) |
||||||
|
} |
||||||
|
} |
||||||
|
sort.Strings(sortedTable) |
||||||
|
|
||||||
|
x := make([][]byte, 1000) |
||||||
|
for i := range x { |
||||||
|
x[i] = []byte(sortedTable[i%len(sortedTable)]) |
||||||
|
} |
||||||
|
|
||||||
|
b.ResetTimer() |
||||||
|
for i := 0; i < b.N; i++ { |
||||||
|
for _, s := range x { |
||||||
|
Lookup(s) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,648 @@ |
|||||||
|
// Copyright 2012 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main |
||||||
|
|
||||||
|
// This program generates table.go and table_test.go.
|
||||||
|
// Invoke as
|
||||||
|
//
|
||||||
|
// go run gen.go |gofmt >table.go
|
||||||
|
// go run gen.go -test |gofmt >table_test.go
|
||||||
|
|
||||||
|
import ( |
||||||
|
"flag" |
||||||
|
"fmt" |
||||||
|
"math/rand" |
||||||
|
"os" |
||||||
|
"sort" |
||||||
|
"strings" |
||||||
|
) |
||||||
|
|
||||||
|
// identifier converts s to a Go exported identifier.
|
||||||
|
// It converts "div" to "Div" and "accept-charset" to "AcceptCharset".
|
||||||
|
func identifier(s string) string { |
||||||
|
b := make([]byte, 0, len(s)) |
||||||
|
cap := true |
||||||
|
for _, c := range s { |
||||||
|
if c == '-' { |
||||||
|
cap = true |
||||||
|
continue |
||||||
|
} |
||||||
|
if cap && 'a' <= c && c <= 'z' { |
||||||
|
c -= 'a' - 'A' |
||||||
|
} |
||||||
|
cap = false |
||||||
|
b = append(b, byte(c)) |
||||||
|
} |
||||||
|
return string(b) |
||||||
|
} |
||||||
|
|
||||||
|
var test = flag.Bool("test", false, "generate table_test.go") |
||||||
|
|
||||||
|
func main() { |
||||||
|
flag.Parse() |
||||||
|
|
||||||
|
var all []string |
||||||
|
all = append(all, elements...) |
||||||
|
all = append(all, attributes...) |
||||||
|
all = append(all, eventHandlers...) |
||||||
|
all = append(all, extra...) |
||||||
|
sort.Strings(all) |
||||||
|
|
||||||
|
if *test { |
||||||
|
fmt.Printf("// generated by go run gen.go -test; DO NOT EDIT\n\n") |
||||||
|
fmt.Printf("package atom\n\n") |
||||||
|
fmt.Printf("var testAtomList = []string{\n") |
||||||
|
for _, s := range all { |
||||||
|
fmt.Printf("\t%q,\n", s) |
||||||
|
} |
||||||
|
fmt.Printf("}\n") |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
// uniq - lists have dups
|
||||||
|
// compute max len too
|
||||||
|
maxLen := 0 |
||||||
|
w := 0 |
||||||
|
for _, s := range all { |
||||||
|
if w == 0 || all[w-1] != s { |
||||||
|
if maxLen < len(s) { |
||||||
|
maxLen = len(s) |
||||||
|
} |
||||||
|
all[w] = s |
||||||
|
w++ |
||||||
|
} |
||||||
|
} |
||||||
|
all = all[:w] |
||||||
|
|
||||||
|
// Find hash that minimizes table size.
|
||||||
|
var best *table |
||||||
|
for i := 0; i < 1000000; i++ { |
||||||
|
if best != nil && 1<<(best.k-1) < len(all) { |
||||||
|
break |
||||||
|
} |
||||||
|
h := rand.Uint32() |
||||||
|
for k := uint(0); k <= 16; k++ { |
||||||
|
if best != nil && k >= best.k { |
||||||
|
break |
||||||
|
} |
||||||
|
var t table |
||||||
|
if t.init(h, k, all) { |
||||||
|
best = &t |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
if best == nil { |
||||||
|
fmt.Fprintf(os.Stderr, "failed to construct string table\n") |
||||||
|
os.Exit(1) |
||||||
|
} |
||||||
|
|
||||||
|
// Lay out strings, using overlaps when possible.
|
||||||
|
layout := append([]string{}, all...) |
||||||
|
|
||||||
|
// Remove strings that are substrings of other strings
|
||||||
|
for changed := true; changed; { |
||||||
|
changed = false |
||||||
|
for i, s := range layout { |
||||||
|
if s == "" { |
||||||
|
continue |
||||||
|
} |
||||||
|
for j, t := range layout { |
||||||
|
if i != j && t != "" && strings.Contains(s, t) { |
||||||
|
changed = true |
||||||
|
layout[j] = "" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Join strings where one suffix matches another prefix.
|
||||||
|
for { |
||||||
|
// Find best i, j, k such that layout[i][len-k:] == layout[j][:k],
|
||||||
|
// maximizing overlap length k.
|
||||||
|
besti := -1 |
||||||
|
bestj := -1 |
||||||
|
bestk := 0 |
||||||
|
for i, s := range layout { |
||||||
|
if s == "" { |
||||||
|
continue |
||||||
|
} |
||||||
|
for j, t := range layout { |
||||||
|
if i == j { |
||||||
|
continue |
||||||
|
} |
||||||
|
for k := bestk + 1; k <= len(s) && k <= len(t); k++ { |
||||||
|
if s[len(s)-k:] == t[:k] { |
||||||
|
besti = i |
||||||
|
bestj = j |
||||||
|
bestk = k |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
if bestk > 0 { |
||||||
|
layout[besti] += layout[bestj][bestk:] |
||||||
|
layout[bestj] = "" |
||||||
|
continue |
||||||
|
} |
||||||
|
break |
||||||
|
} |
||||||
|
|
||||||
|
text := strings.Join(layout, "") |
||||||
|
|
||||||
|
atom := map[string]uint32{} |
||||||
|
for _, s := range all { |
||||||
|
off := strings.Index(text, s) |
||||||
|
if off < 0 { |
||||||
|
panic("lost string " + s) |
||||||
|
} |
||||||
|
atom[s] = uint32(off<<8 | len(s)) |
||||||
|
} |
||||||
|
|
||||||
|
// Generate the Go code.
|
||||||
|
fmt.Printf("// generated by go run gen.go; DO NOT EDIT\n\n") |
||||||
|
fmt.Printf("package atom\n\nconst (\n") |
||||||
|
for _, s := range all { |
||||||
|
fmt.Printf("\t%s Atom = %#x\n", identifier(s), atom[s]) |
||||||
|
} |
||||||
|
fmt.Printf(")\n\n") |
||||||
|
|
||||||
|
fmt.Printf("const hash0 = %#x\n\n", best.h0) |
||||||
|
fmt.Printf("const maxAtomLen = %d\n\n", maxLen) |
||||||
|
|
||||||
|
fmt.Printf("var table = [1<<%d]Atom{\n", best.k) |
||||||
|
for i, s := range best.tab { |
||||||
|
if s == "" { |
||||||
|
continue |
||||||
|
} |
||||||
|
fmt.Printf("\t%#x: %#x, // %s\n", i, atom[s], s) |
||||||
|
} |
||||||
|
fmt.Printf("}\n") |
||||||
|
datasize := (1 << best.k) * 4 |
||||||
|
|
||||||
|
fmt.Printf("const atomText =\n") |
||||||
|
textsize := len(text) |
||||||
|
for len(text) > 60 { |
||||||
|
fmt.Printf("\t%q +\n", text[:60]) |
||||||
|
text = text[60:] |
||||||
|
} |
||||||
|
fmt.Printf("\t%q\n\n", text) |
||||||
|
|
||||||
|
fmt.Fprintf(os.Stderr, "%d atoms; %d string bytes + %d tables = %d total data\n", len(all), textsize, datasize, textsize+datasize) |
||||||
|
} |
||||||
|
|
||||||
|
type byLen []string |
||||||
|
|
||||||
|
func (x byLen) Less(i, j int) bool { return len(x[i]) > len(x[j]) } |
||||||
|
func (x byLen) Swap(i, j int) { x[i], x[j] = x[j], x[i] } |
||||||
|
func (x byLen) Len() int { return len(x) } |
||||||
|
|
||||||
|
// fnv computes the FNV hash with an arbitrary starting value h.
|
||||||
|
func fnv(h uint32, s string) uint32 { |
||||||
|
for i := 0; i < len(s); i++ { |
||||||
|
h ^= uint32(s[i]) |
||||||
|
h *= 16777619 |
||||||
|
} |
||||||
|
return h |
||||||
|
} |
||||||
|
|
||||||
|
// A table represents an attempt at constructing the lookup table.
|
||||||
|
// The lookup table uses cuckoo hashing, meaning that each string
|
||||||
|
// can be found in one of two positions.
|
||||||
|
type table struct { |
||||||
|
h0 uint32 |
||||||
|
k uint |
||||||
|
mask uint32 |
||||||
|
tab []string |
||||||
|
} |
||||||
|
|
||||||
|
// hash returns the two hashes for s.
|
||||||
|
func (t *table) hash(s string) (h1, h2 uint32) { |
||||||
|
h := fnv(t.h0, s) |
||||||
|
h1 = h & t.mask |
||||||
|
h2 = (h >> 16) & t.mask |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
// init initializes the table with the given parameters.
|
||||||
|
// h0 is the initial hash value,
|
||||||
|
// k is the number of bits of hash value to use, and
|
||||||
|
// x is the list of strings to store in the table.
|
||||||
|
// init returns false if the table cannot be constructed.
|
||||||
|
func (t *table) init(h0 uint32, k uint, x []string) bool { |
||||||
|
t.h0 = h0 |
||||||
|
t.k = k |
||||||
|
t.tab = make([]string, 1<<k) |
||||||
|
t.mask = 1<<k - 1 |
||||||
|
for _, s := range x { |
||||||
|
if !t.insert(s) { |
||||||
|
return false |
||||||
|
} |
||||||
|
} |
||||||
|
return true |
||||||
|
} |
||||||
|
|
||||||
|
// insert inserts s in the table.
|
||||||
|
func (t *table) insert(s string) bool { |
||||||
|
h1, h2 := t.hash(s) |
||||||
|
if t.tab[h1] == "" { |
||||||
|
t.tab[h1] = s |
||||||
|
return true |
||||||
|
} |
||||||
|
if t.tab[h2] == "" { |
||||||
|
t.tab[h2] = s |
||||||
|
return true |
||||||
|
} |
||||||
|
if t.push(h1, 0) { |
||||||
|
t.tab[h1] = s |
||||||
|
return true |
||||||
|
} |
||||||
|
if t.push(h2, 0) { |
||||||
|
t.tab[h2] = s |
||||||
|
return true |
||||||
|
} |
||||||
|
return false |
||||||
|
} |
||||||
|
|
||||||
|
// push attempts to push aside the entry in slot i.
|
||||||
|
func (t *table) push(i uint32, depth int) bool { |
||||||
|
if depth > len(t.tab) { |
||||||
|
return false |
||||||
|
} |
||||||
|
s := t.tab[i] |
||||||
|
h1, h2 := t.hash(s) |
||||||
|
j := h1 + h2 - i |
||||||
|
if t.tab[j] != "" && !t.push(j, depth+1) { |
||||||
|
return false |
||||||
|
} |
||||||
|
t.tab[j] = s |
||||||
|
return true |
||||||
|
} |
||||||
|
|
||||||
|
// The lists of element names and attribute keys were taken from
|
||||||
|
// https://html.spec.whatwg.org/multipage/indices.html#index
|
||||||
|
// as of the "HTML Living Standard - Last Updated 21 February 2015" version.
|
||||||
|
|
||||||
|
var elements = []string{ |
||||||
|
"a", |
||||||
|
"abbr", |
||||||
|
"address", |
||||||
|
"area", |
||||||
|
"article", |
||||||
|
"aside", |
||||||
|
"audio", |
||||||
|
"b", |
||||||
|
"base", |
||||||
|
"bdi", |
||||||
|
"bdo", |
||||||
|
"blockquote", |
||||||
|
"body", |
||||||
|
"br", |
||||||
|
"button", |
||||||
|
"canvas", |
||||||
|
"caption", |
||||||
|
"cite", |
||||||
|
"code", |
||||||
|
"col", |
||||||
|
"colgroup", |
||||||
|
"command", |
||||||
|
"data", |
||||||
|
"datalist", |
||||||
|
"dd", |
||||||
|
"del", |
||||||
|
"details", |
||||||
|
"dfn", |
||||||
|
"dialog", |
||||||
|
"div", |
||||||
|
"dl", |
||||||
|
"dt", |
||||||
|
"em", |
||||||
|
"embed", |
||||||
|
"fieldset", |
||||||
|
"figcaption", |
||||||
|
"figure", |
||||||
|
"footer", |
||||||
|
"form", |
||||||
|
"h1", |
||||||
|
"h2", |
||||||
|
"h3", |
||||||
|
"h4", |
||||||
|
"h5", |
||||||
|
"h6", |
||||||
|
"head", |
||||||
|
"header", |
||||||
|
"hgroup", |
||||||
|
"hr", |
||||||
|
"html", |
||||||
|
"i", |
||||||
|
"iframe", |
||||||
|
"img", |
||||||
|
"input", |
||||||
|
"ins", |
||||||
|
"kbd", |
||||||
|
"keygen", |
||||||
|
"label", |
||||||
|
"legend", |
||||||
|
"li", |
||||||
|
"link", |
||||||
|
"map", |
||||||
|
"mark", |
||||||
|
"menu", |
||||||
|
"menuitem", |
||||||
|
"meta", |
||||||
|
"meter", |
||||||
|
"nav", |
||||||
|
"noscript", |
||||||
|
"object", |
||||||
|
"ol", |
||||||
|
"optgroup", |
||||||
|
"option", |
||||||
|
"output", |
||||||
|
"p", |
||||||
|
"param", |
||||||
|
"pre", |
||||||
|
"progress", |
||||||
|
"q", |
||||||
|
"rp", |
||||||
|
"rt", |
||||||
|
"ruby", |
||||||
|
"s", |
||||||
|
"samp", |
||||||
|
"script", |
||||||
|
"section", |
||||||
|
"select", |
||||||
|
"small", |
||||||
|
"source", |
||||||
|
"span", |
||||||
|
"strong", |
||||||
|
"style", |
||||||
|
"sub", |
||||||
|
"summary", |
||||||
|
"sup", |
||||||
|
"table", |
||||||
|
"tbody", |
||||||
|
"td", |
||||||
|
"template", |
||||||
|
"textarea", |
||||||
|
"tfoot", |
||||||
|
"th", |
||||||
|
"thead", |
||||||
|
"time", |
||||||
|
"title", |
||||||
|
"tr", |
||||||
|
"track", |
||||||
|
"u", |
||||||
|
"ul", |
||||||
|
"var", |
||||||
|
"video", |
||||||
|
"wbr", |
||||||
|
} |
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/indices.html#attributes-3
|
||||||
|
|
||||||
|
var attributes = []string{ |
||||||
|
"abbr", |
||||||
|
"accept", |
||||||
|
"accept-charset", |
||||||
|
"accesskey", |
||||||
|
"action", |
||||||
|
"alt", |
||||||
|
"async", |
||||||
|
"autocomplete", |
||||||
|
"autofocus", |
||||||
|
"autoplay", |
||||||
|
"challenge", |
||||||
|
"charset", |
||||||
|
"checked", |
||||||
|
"cite", |
||||||
|
"class", |
||||||
|
"cols", |
||||||
|
"colspan", |
||||||
|
"command", |
||||||
|
"content", |
||||||
|
"contenteditable", |
||||||
|
"contextmenu", |
||||||
|
"controls", |
||||||
|
"coords", |
||||||
|
"crossorigin", |
||||||
|
"data", |
||||||
|
"datetime", |
||||||
|
"default", |
||||||
|
"defer", |
||||||
|
"dir", |
||||||
|
"dirname", |
||||||
|
"disabled", |
||||||
|
"download", |
||||||
|
"draggable", |
||||||
|
"dropzone", |
||||||
|
"enctype", |
||||||
|
"for", |
||||||
|
"form", |
||||||
|
"formaction", |
||||||
|
"formenctype", |
||||||
|
"formmethod", |
||||||
|
"formnovalidate", |
||||||
|
"formtarget", |
||||||
|
"headers", |
||||||
|
"height", |
||||||
|
"hidden", |
||||||
|
"high", |
||||||
|
"href", |
||||||
|
"hreflang", |
||||||
|
"http-equiv", |
||||||
|
"icon", |
||||||
|
"id", |
||||||
|
"inputmode", |
||||||
|
"ismap", |
||||||
|
"itemid", |
||||||
|
"itemprop", |
||||||
|
"itemref", |
||||||
|
"itemscope", |
||||||
|
"itemtype", |
||||||
|
"keytype", |
||||||
|
"kind", |
||||||
|
"label", |
||||||
|
"lang", |
||||||
|
"list", |
||||||
|
"loop", |
||||||
|
"low", |
||||||
|
"manifest", |
||||||
|
"max", |
||||||
|
"maxlength", |
||||||
|
"media", |
||||||
|
"mediagroup", |
||||||
|
"method", |
||||||
|
"min", |
||||||
|
"minlength", |
||||||
|
"multiple", |
||||||
|
"muted", |
||||||
|
"name", |
||||||
|
"novalidate", |
||||||
|
"open", |
||||||
|
"optimum", |
||||||
|
"pattern", |
||||||
|
"ping", |
||||||
|
"placeholder", |
||||||
|
"poster", |
||||||
|
"preload", |
||||||
|
"radiogroup", |
||||||
|
"readonly", |
||||||
|
"rel", |
||||||
|
"required", |
||||||
|
"reversed", |
||||||
|
"rows", |
||||||
|
"rowspan", |
||||||
|
"sandbox", |
||||||
|
"spellcheck", |
||||||
|
"scope", |
||||||
|
"scoped", |
||||||
|
"seamless", |
||||||
|
"selected", |
||||||
|
"shape", |
||||||
|
"size", |
||||||
|
"sizes", |
||||||
|
"sortable", |
||||||
|
"sorted", |
||||||
|
"span", |
||||||
|
"src", |
||||||
|
"srcdoc", |
||||||
|
"srclang", |
||||||
|
"start", |
||||||
|
"step", |
||||||
|
"style", |
||||||
|
"tabindex", |
||||||
|
"target", |
||||||
|
"title", |
||||||
|
"translate", |
||||||
|
"type", |
||||||
|
"typemustmatch", |
||||||
|
"usemap", |
||||||
|
"value", |
||||||
|
"width", |
||||||
|
"wrap", |
||||||
|
} |
||||||
|
|
||||||
|
var eventHandlers = []string{ |
||||||
|
"onabort", |
||||||
|
"onautocomplete", |
||||||
|
"onautocompleteerror", |
||||||
|
"onafterprint", |
||||||
|
"onbeforeprint", |
||||||
|
"onbeforeunload", |
||||||
|
"onblur", |
||||||
|
"oncancel", |
||||||
|
"oncanplay", |
||||||
|
"oncanplaythrough", |
||||||
|
"onchange", |
||||||
|
"onclick", |
||||||
|
"onclose", |
||||||
|
"oncontextmenu", |
||||||
|
"oncuechange", |
||||||
|
"ondblclick", |
||||||
|
"ondrag", |
||||||
|
"ondragend", |
||||||
|
"ondragenter", |
||||||
|
"ondragleave", |
||||||
|
"ondragover", |
||||||
|
"ondragstart", |
||||||
|
"ondrop", |
||||||
|
"ondurationchange", |
||||||
|
"onemptied", |
||||||
|
"onended", |
||||||
|
"onerror", |
||||||
|
"onfocus", |
||||||
|
"onhashchange", |
||||||
|
"oninput", |
||||||
|
"oninvalid", |
||||||
|
"onkeydown", |
||||||
|
"onkeypress", |
||||||
|
"onkeyup", |
||||||
|
"onlanguagechange", |
||||||
|
"onload", |
||||||
|
"onloadeddata", |
||||||
|
"onloadedmetadata", |
||||||
|
"onloadstart", |
||||||
|
"onmessage", |
||||||
|
"onmousedown", |
||||||
|
"onmousemove", |
||||||
|
"onmouseout", |
||||||
|
"onmouseover", |
||||||
|
"onmouseup", |
||||||
|
"onmousewheel", |
||||||
|
"onoffline", |
||||||
|
"ononline", |
||||||
|
"onpagehide", |
||||||
|
"onpageshow", |
||||||
|
"onpause", |
||||||
|
"onplay", |
||||||
|
"onplaying", |
||||||
|
"onpopstate", |
||||||
|
"onprogress", |
||||||
|
"onratechange", |
||||||
|
"onreset", |
||||||
|
"onresize", |
||||||
|
"onscroll", |
||||||
|
"onseeked", |
||||||
|
"onseeking", |
||||||
|
"onselect", |
||||||
|
"onshow", |
||||||
|
"onsort", |
||||||
|
"onstalled", |
||||||
|
"onstorage", |
||||||
|
"onsubmit", |
||||||
|
"onsuspend", |
||||||
|
"ontimeupdate", |
||||||
|
"ontoggle", |
||||||
|
"onunload", |
||||||
|
"onvolumechange", |
||||||
|
"onwaiting", |
||||||
|
} |
||||||
|
|
||||||
|
// extra are ad-hoc values not covered by any of the lists above.
|
||||||
|
var extra = []string{ |
||||||
|
"align", |
||||||
|
"annotation", |
||||||
|
"annotation-xml", |
||||||
|
"applet", |
||||||
|
"basefont", |
||||||
|
"bgsound", |
||||||
|
"big", |
||||||
|
"blink", |
||||||
|
"center", |
||||||
|
"color", |
||||||
|
"desc", |
||||||
|
"face", |
||||||
|
"font", |
||||||
|
"foreignObject", // HTML is case-insensitive, but SVG-embedded-in-HTML is case-sensitive.
|
||||||
|
"foreignobject", |
||||||
|
"frame", |
||||||
|
"frameset", |
||||||
|
"image", |
||||||
|
"isindex", |
||||||
|
"listing", |
||||||
|
"malignmark", |
||||||
|
"marquee", |
||||||
|
"math", |
||||||
|
"mglyph", |
||||||
|
"mi", |
||||||
|
"mn", |
||||||
|
"mo", |
||||||
|
"ms", |
||||||
|
"mtext", |
||||||
|
"nobr", |
||||||
|
"noembed", |
||||||
|
"noframes", |
||||||
|
"plaintext", |
||||||
|
"prompt", |
||||||
|
"public", |
||||||
|
"spacer", |
||||||
|
"strike", |
||||||
|
"svg", |
||||||
|
"system", |
||||||
|
"tt", |
||||||
|
"xmp", |
||||||
|
} |
@ -0,0 +1,713 @@ |
|||||||
|
// generated by go run gen.go; DO NOT EDIT
|
||||||
|
|
||||||
|
package atom |
||||||
|
|
||||||
|
const ( |
||||||
|
A Atom = 0x1 |
||||||
|
Abbr Atom = 0x4 |
||||||
|
Accept Atom = 0x2106 |
||||||
|
AcceptCharset Atom = 0x210e |
||||||
|
Accesskey Atom = 0x3309 |
||||||
|
Action Atom = 0x1f606 |
||||||
|
Address Atom = 0x4f307 |
||||||
|
Align Atom = 0x1105 |
||||||
|
Alt Atom = 0x4503 |
||||||
|
Annotation Atom = 0x1670a |
||||||
|
AnnotationXml Atom = 0x1670e |
||||||
|
Applet Atom = 0x2b306 |
||||||
|
Area Atom = 0x2fa04 |
||||||
|
Article Atom = 0x38807 |
||||||
|
Aside Atom = 0x8305 |
||||||
|
Async Atom = 0x7b05 |
||||||
|
Audio Atom = 0xa605 |
||||||
|
Autocomplete Atom = 0x1fc0c |
||||||
|
Autofocus Atom = 0xb309 |
||||||
|
Autoplay Atom = 0xce08 |
||||||
|
B Atom = 0x101 |
||||||
|
Base Atom = 0xd604 |
||||||
|
Basefont Atom = 0xd608 |
||||||
|
Bdi Atom = 0x1a03 |
||||||
|
Bdo Atom = 0xe703 |
||||||
|
Bgsound Atom = 0x11807 |
||||||
|
Big Atom = 0x12403 |
||||||
|
Blink Atom = 0x12705 |
||||||
|
Blockquote Atom = 0x12c0a |
||||||
|
Body Atom = 0x2f04 |
||||||
|
Br Atom = 0x202 |
||||||
|
Button Atom = 0x13606 |
||||||
|
Canvas Atom = 0x7f06 |
||||||
|
Caption Atom = 0x1bb07 |
||||||
|
Center Atom = 0x5b506 |
||||||
|
Challenge Atom = 0x21f09 |
||||||
|
Charset Atom = 0x2807 |
||||||
|
Checked Atom = 0x32807 |
||||||
|
Cite Atom = 0x3c804 |
||||||
|
Class Atom = 0x4de05 |
||||||
|
Code Atom = 0x14904 |
||||||
|
Col Atom = 0x15003 |
||||||
|
Colgroup Atom = 0x15008 |
||||||
|
Color Atom = 0x15d05 |
||||||
|
Cols Atom = 0x16204 |
||||||
|
Colspan Atom = 0x16207 |
||||||
|
Command Atom = 0x17507 |
||||||
|
Content Atom = 0x42307 |
||||||
|
Contenteditable Atom = 0x4230f |
||||||
|
Contextmenu Atom = 0x3310b |
||||||
|
Controls Atom = 0x18808 |
||||||
|
Coords Atom = 0x19406 |
||||||
|
Crossorigin Atom = 0x19f0b |
||||||
|
Data Atom = 0x44a04 |
||||||
|
Datalist Atom = 0x44a08 |
||||||
|
Datetime Atom = 0x23c08 |
||||||
|
Dd Atom = 0x26702 |
||||||
|
Default Atom = 0x8607 |
||||||
|
Defer Atom = 0x14b05 |
||||||
|
Del Atom = 0x3ef03 |
||||||
|
Desc Atom = 0x4db04 |
||||||
|
Details Atom = 0x4807 |
||||||
|
Dfn Atom = 0x6103 |
||||||
|
Dialog Atom = 0x1b06 |
||||||
|
Dir Atom = 0x6903 |
||||||
|
Dirname Atom = 0x6907 |
||||||
|
Disabled Atom = 0x10c08 |
||||||
|
Div Atom = 0x11303 |
||||||
|
Dl Atom = 0x11e02 |
||||||
|
Download Atom = 0x40008 |
||||||
|
Draggable Atom = 0x17b09 |
||||||
|
Dropzone Atom = 0x39108 |
||||||
|
Dt Atom = 0x50902 |
||||||
|
Em Atom = 0x6502 |
||||||
|
Embed Atom = 0x6505 |
||||||
|
Enctype Atom = 0x21107 |
||||||
|
Face Atom = 0x5b304 |
||||||
|
Fieldset Atom = 0x1b008 |
||||||
|
Figcaption Atom = 0x1b80a |
||||||
|
Figure Atom = 0x1cc06 |
||||||
|
Font Atom = 0xda04 |
||||||
|
Footer Atom = 0x8d06 |
||||||
|
For Atom = 0x1d803 |
||||||
|
ForeignObject Atom = 0x1d80d |
||||||
|
Foreignobject Atom = 0x1e50d |
||||||
|
Form Atom = 0x1f204 |
||||||
|
Formaction Atom = 0x1f20a |
||||||
|
Formenctype Atom = 0x20d0b |
||||||
|
Formmethod Atom = 0x2280a |
||||||
|
Formnovalidate Atom = 0x2320e |
||||||
|
Formtarget Atom = 0x2470a |
||||||
|
Frame Atom = 0x9a05 |
||||||
|
Frameset Atom = 0x9a08 |
||||||
|
H1 Atom = 0x26e02 |
||||||
|
H2 Atom = 0x29402 |
||||||
|
H3 Atom = 0x2a702 |
||||||
|
H4 Atom = 0x2e902 |
||||||
|
H5 Atom = 0x2f302 |
||||||
|
H6 Atom = 0x50b02 |
||||||
|
Head Atom = 0x2d504 |
||||||
|
Header Atom = 0x2d506 |
||||||
|
Headers Atom = 0x2d507 |
||||||
|
Height Atom = 0x25106 |
||||||
|
Hgroup Atom = 0x25906 |
||||||
|
Hidden Atom = 0x26506 |
||||||
|
High Atom = 0x26b04 |
||||||
|
Hr Atom = 0x27002 |
||||||
|
Href Atom = 0x27004 |
||||||
|
Hreflang Atom = 0x27008 |
||||||
|
Html Atom = 0x25504 |
||||||
|
HttpEquiv Atom = 0x2780a |
||||||
|
I Atom = 0x601 |
||||||
|
Icon Atom = 0x42204 |
||||||
|
Id Atom = 0x8502 |
||||||
|
Iframe Atom = 0x29606 |
||||||
|
Image Atom = 0x29c05 |
||||||
|
Img Atom = 0x2a103 |
||||||
|
Input Atom = 0x3e805 |
||||||
|
Inputmode Atom = 0x3e809 |
||||||
|
Ins Atom = 0x1a803 |
||||||
|
Isindex Atom = 0x2a907 |
||||||
|
Ismap Atom = 0x2b005 |
||||||
|
Itemid Atom = 0x33c06 |
||||||
|
Itemprop Atom = 0x3c908 |
||||||
|
Itemref Atom = 0x5ad07 |
||||||
|
Itemscope Atom = 0x2b909 |
||||||
|
Itemtype Atom = 0x2c308 |
||||||
|
Kbd Atom = 0x1903 |
||||||
|
Keygen Atom = 0x3906 |
||||||
|
Keytype Atom = 0x53707 |
||||||
|
Kind Atom = 0x10904 |
||||||
|
Label Atom = 0xf005 |
||||||
|
Lang Atom = 0x27404 |
||||||
|
Legend Atom = 0x18206 |
||||||
|
Li Atom = 0x1202 |
||||||
|
Link Atom = 0x12804 |
||||||
|
List Atom = 0x44e04 |
||||||
|
Listing Atom = 0x44e07 |
||||||
|
Loop Atom = 0xf404 |
||||||
|
Low Atom = 0x11f03 |
||||||
|
Malignmark Atom = 0x100a |
||||||
|
Manifest Atom = 0x5f108 |
||||||
|
Map Atom = 0x2b203 |
||||||
|
Mark Atom = 0x1604 |
||||||
|
Marquee Atom = 0x2cb07 |
||||||
|
Math Atom = 0x2d204 |
||||||
|
Max Atom = 0x2e103 |
||||||
|
Maxlength Atom = 0x2e109 |
||||||
|
Media Atom = 0x6e05 |
||||||
|
Mediagroup Atom = 0x6e0a |
||||||
|
Menu Atom = 0x33804 |
||||||
|
Menuitem Atom = 0x33808 |
||||||
|
Meta Atom = 0x45d04 |
||||||
|
Meter Atom = 0x24205 |
||||||
|
Method Atom = 0x22c06 |
||||||
|
Mglyph Atom = 0x2a206 |
||||||
|
Mi Atom = 0x2eb02 |
||||||
|
Min Atom = 0x2eb03 |
||||||
|
Minlength Atom = 0x2eb09 |
||||||
|
Mn Atom = 0x23502 |
||||||
|
Mo Atom = 0x3ed02 |
||||||
|
Ms Atom = 0x2bc02 |
||||||
|
Mtext Atom = 0x2f505 |
||||||
|
Multiple Atom = 0x30308 |
||||||
|
Muted Atom = 0x30b05 |
||||||
|
Name Atom = 0x6c04 |
||||||
|
Nav Atom = 0x3e03 |
||||||
|
Nobr Atom = 0x5704 |
||||||
|
Noembed Atom = 0x6307 |
||||||
|
Noframes Atom = 0x9808 |
||||||
|
Noscript Atom = 0x3d208 |
||||||
|
Novalidate Atom = 0x2360a |
||||||
|
Object Atom = 0x1ec06 |
||||||
|
Ol Atom = 0xc902 |
||||||
|
Onabort Atom = 0x13a07 |
||||||
|
Onafterprint Atom = 0x1c00c |
||||||
|
Onautocomplete Atom = 0x1fa0e |
||||||
|
Onautocompleteerror Atom = 0x1fa13 |
||||||
|
Onbeforeprint Atom = 0x6040d |
||||||
|
Onbeforeunload Atom = 0x4e70e |
||||||
|
Onblur Atom = 0xaa06 |
||||||
|
Oncancel Atom = 0xe908 |
||||||
|
Oncanplay Atom = 0x28509 |
||||||
|
Oncanplaythrough Atom = 0x28510 |
||||||
|
Onchange Atom = 0x3a708 |
||||||
|
Onclick Atom = 0x31007 |
||||||
|
Onclose Atom = 0x31707 |
||||||
|
Oncontextmenu Atom = 0x32f0d |
||||||
|
Oncuechange Atom = 0x3420b |
||||||
|
Ondblclick Atom = 0x34d0a |
||||||
|
Ondrag Atom = 0x35706 |
||||||
|
Ondragend Atom = 0x35709 |
||||||
|
Ondragenter Atom = 0x3600b |
||||||
|
Ondragleave Atom = 0x36b0b |
||||||
|
Ondragover Atom = 0x3760a |
||||||
|
Ondragstart Atom = 0x3800b |
||||||
|
Ondrop Atom = 0x38f06 |
||||||
|
Ondurationchange Atom = 0x39f10 |
||||||
|
Onemptied Atom = 0x39609 |
||||||
|
Onended Atom = 0x3af07 |
||||||
|
Onerror Atom = 0x3b607 |
||||||
|
Onfocus Atom = 0x3bd07 |
||||||
|
Onhashchange Atom = 0x3da0c |
||||||
|
Oninput Atom = 0x3e607 |
||||||
|
Oninvalid Atom = 0x3f209 |
||||||
|
Onkeydown Atom = 0x3fb09 |
||||||
|
Onkeypress Atom = 0x4080a |
||||||
|
Onkeyup Atom = 0x41807 |
||||||
|
Onlanguagechange Atom = 0x43210 |
||||||
|
Onload Atom = 0x44206 |
||||||
|
Onloadeddata Atom = 0x4420c |
||||||
|
Onloadedmetadata Atom = 0x45510 |
||||||
|
Onloadstart Atom = 0x46b0b |
||||||
|
Onmessage Atom = 0x47609 |
||||||
|
Onmousedown Atom = 0x47f0b |
||||||
|
Onmousemove Atom = 0x48a0b |
||||||
|
Onmouseout Atom = 0x4950a |
||||||
|
Onmouseover Atom = 0x4a20b |
||||||
|
Onmouseup Atom = 0x4ad09 |
||||||
|
Onmousewheel Atom = 0x4b60c |
||||||
|
Onoffline Atom = 0x4c209 |
||||||
|
Ononline Atom = 0x4cb08 |
||||||
|
Onpagehide Atom = 0x4d30a |
||||||
|
Onpageshow Atom = 0x4fe0a |
||||||
|
Onpause Atom = 0x50d07 |
||||||
|
Onplay Atom = 0x51706 |
||||||
|
Onplaying Atom = 0x51709 |
||||||
|
Onpopstate Atom = 0x5200a |
||||||
|
Onprogress Atom = 0x52a0a |
||||||
|
Onratechange Atom = 0x53e0c |
||||||
|
Onreset Atom = 0x54a07 |
||||||
|
Onresize Atom = 0x55108 |
||||||
|
Onscroll Atom = 0x55f08 |
||||||
|
Onseeked Atom = 0x56708 |
||||||
|
Onseeking Atom = 0x56f09 |
||||||
|
Onselect Atom = 0x57808 |
||||||
|
Onshow Atom = 0x58206 |
||||||
|
Onsort Atom = 0x58b06 |
||||||
|
Onstalled Atom = 0x59509 |
||||||
|
Onstorage Atom = 0x59e09 |
||||||
|
Onsubmit Atom = 0x5a708 |
||||||
|
Onsuspend Atom = 0x5bb09 |
||||||
|
Ontimeupdate Atom = 0xdb0c |
||||||
|
Ontoggle Atom = 0x5c408 |
||||||
|
Onunload Atom = 0x5cc08 |
||||||
|
Onvolumechange Atom = 0x5d40e |
||||||
|
Onwaiting Atom = 0x5e209 |
||||||
|
Open Atom = 0x3cf04 |
||||||
|
Optgroup Atom = 0xf608 |
||||||
|
Optimum Atom = 0x5eb07 |
||||||
|
Option Atom = 0x60006 |
||||||
|
Output Atom = 0x49c06 |
||||||
|
P Atom = 0xc01 |
||||||
|
Param Atom = 0xc05 |
||||||
|
Pattern Atom = 0x5107 |
||||||
|
Ping Atom = 0x7704 |
||||||
|
Placeholder Atom = 0xc30b |
||||||
|
Plaintext Atom = 0xfd09 |
||||||
|
Poster Atom = 0x15706 |
||||||
|
Pre Atom = 0x25e03 |
||||||
|
Preload Atom = 0x25e07 |
||||||
|
Progress Atom = 0x52c08 |
||||||
|
Prompt Atom = 0x5fa06 |
||||||
|
Public Atom = 0x41e06 |
||||||
|
Q Atom = 0x13101 |
||||||
|
Radiogroup Atom = 0x30a |
||||||
|
Readonly Atom = 0x2fb08 |
||||||
|
Rel Atom = 0x25f03 |
||||||
|
Required Atom = 0x1d008 |
||||||
|
Reversed Atom = 0x5a08 |
||||||
|
Rows Atom = 0x9204 |
||||||
|
Rowspan Atom = 0x9207 |
||||||
|
Rp Atom = 0x1c602 |
||||||
|
Rt Atom = 0x13f02 |
||||||
|
Ruby Atom = 0xaf04 |
||||||
|
S Atom = 0x2c01 |
||||||
|
Samp Atom = 0x4e04 |
||||||
|
Sandbox Atom = 0xbb07 |
||||||
|
Scope Atom = 0x2bd05 |
||||||
|
Scoped Atom = 0x2bd06 |
||||||
|
Script Atom = 0x3d406 |
||||||
|
Seamless Atom = 0x31c08 |
||||||
|
Section Atom = 0x4e207 |
||||||
|
Select Atom = 0x57a06 |
||||||
|
Selected Atom = 0x57a08 |
||||||
|
Shape Atom = 0x4f905 |
||||||
|
Size Atom = 0x55504 |
||||||
|
Sizes Atom = 0x55505 |
||||||
|
Small Atom = 0x18f05 |
||||||
|
Sortable Atom = 0x58d08 |
||||||
|
Sorted Atom = 0x19906 |
||||||
|
Source Atom = 0x1aa06 |
||||||
|
Spacer Atom = 0x2db06 |
||||||
|
Span Atom = 0x9504 |
||||||
|
Spellcheck Atom = 0x3230a |
||||||
|
Src Atom = 0x3c303 |
||||||
|
Srcdoc Atom = 0x3c306 |
||||||
|
Srclang Atom = 0x41107 |
||||||
|
Start Atom = 0x38605 |
||||||
|
Step Atom = 0x5f704 |
||||||
|
Strike Atom = 0x53306 |
||||||
|
Strong Atom = 0x55906 |
||||||
|
Style Atom = 0x61105 |
||||||
|
Sub Atom = 0x5a903 |
||||||
|
Summary Atom = 0x61607 |
||||||
|
Sup Atom = 0x61d03 |
||||||
|
Svg Atom = 0x62003 |
||||||
|
System Atom = 0x62306 |
||||||
|
Tabindex Atom = 0x46308 |
||||||
|
Table Atom = 0x42d05 |
||||||
|
Target Atom = 0x24b06 |
||||||
|
Tbody Atom = 0x2e05 |
||||||
|
Td Atom = 0x4702 |
||||||
|
Template Atom = 0x62608 |
||||||
|
Textarea Atom = 0x2f608 |
||||||
|
Tfoot Atom = 0x8c05 |
||||||
|
Th Atom = 0x22e02 |
||||||
|
Thead Atom = 0x2d405 |
||||||
|
Time Atom = 0xdd04 |
||||||
|
Title Atom = 0xa105 |
||||||
|
Tr Atom = 0x10502 |
||||||
|
Track Atom = 0x10505 |
||||||
|
Translate Atom = 0x14009 |
||||||
|
Tt Atom = 0x5302 |
||||||
|
Type Atom = 0x21404 |
||||||
|
Typemustmatch Atom = 0x2140d |
||||||
|
U Atom = 0xb01 |
||||||
|
Ul Atom = 0x8a02 |
||||||
|
Usemap Atom = 0x51106 |
||||||
|
Value Atom = 0x4005 |
||||||
|
Var Atom = 0x11503 |
||||||
|
Video Atom = 0x28105 |
||||||
|
Wbr Atom = 0x12103 |
||||||
|
Width Atom = 0x50705 |
||||||
|
Wrap Atom = 0x58704 |
||||||
|
Xmp Atom = 0xc103 |
||||||
|
) |
||||||
|
|
||||||
|
const hash0 = 0xc17da63e |
||||||
|
|
||||||
|
const maxAtomLen = 19 |
||||||
|
|
||||||
|
var table = [1 << 9]Atom{ |
||||||
|
0x1: 0x48a0b, // onmousemove
|
||||||
|
0x2: 0x5e209, // onwaiting
|
||||||
|
0x3: 0x1fa13, // onautocompleteerror
|
||||||
|
0x4: 0x5fa06, // prompt
|
||||||
|
0x7: 0x5eb07, // optimum
|
||||||
|
0x8: 0x1604, // mark
|
||||||
|
0xa: 0x5ad07, // itemref
|
||||||
|
0xb: 0x4fe0a, // onpageshow
|
||||||
|
0xc: 0x57a06, // select
|
||||||
|
0xd: 0x17b09, // draggable
|
||||||
|
0xe: 0x3e03, // nav
|
||||||
|
0xf: 0x17507, // command
|
||||||
|
0x11: 0xb01, // u
|
||||||
|
0x14: 0x2d507, // headers
|
||||||
|
0x15: 0x44a08, // datalist
|
||||||
|
0x17: 0x4e04, // samp
|
||||||
|
0x1a: 0x3fb09, // onkeydown
|
||||||
|
0x1b: 0x55f08, // onscroll
|
||||||
|
0x1c: 0x15003, // col
|
||||||
|
0x20: 0x3c908, // itemprop
|
||||||
|
0x21: 0x2780a, // http-equiv
|
||||||
|
0x22: 0x61d03, // sup
|
||||||
|
0x24: 0x1d008, // required
|
||||||
|
0x2b: 0x25e07, // preload
|
||||||
|
0x2c: 0x6040d, // onbeforeprint
|
||||||
|
0x2d: 0x3600b, // ondragenter
|
||||||
|
0x2e: 0x50902, // dt
|
||||||
|
0x2f: 0x5a708, // onsubmit
|
||||||
|
0x30: 0x27002, // hr
|
||||||
|
0x31: 0x32f0d, // oncontextmenu
|
||||||
|
0x33: 0x29c05, // image
|
||||||
|
0x34: 0x50d07, // onpause
|
||||||
|
0x35: 0x25906, // hgroup
|
||||||
|
0x36: 0x7704, // ping
|
||||||
|
0x37: 0x57808, // onselect
|
||||||
|
0x3a: 0x11303, // div
|
||||||
|
0x3b: 0x1fa0e, // onautocomplete
|
||||||
|
0x40: 0x2eb02, // mi
|
||||||
|
0x41: 0x31c08, // seamless
|
||||||
|
0x42: 0x2807, // charset
|
||||||
|
0x43: 0x8502, // id
|
||||||
|
0x44: 0x5200a, // onpopstate
|
||||||
|
0x45: 0x3ef03, // del
|
||||||
|
0x46: 0x2cb07, // marquee
|
||||||
|
0x47: 0x3309, // accesskey
|
||||||
|
0x49: 0x8d06, // footer
|
||||||
|
0x4a: 0x44e04, // list
|
||||||
|
0x4b: 0x2b005, // ismap
|
||||||
|
0x51: 0x33804, // menu
|
||||||
|
0x52: 0x2f04, // body
|
||||||
|
0x55: 0x9a08, // frameset
|
||||||
|
0x56: 0x54a07, // onreset
|
||||||
|
0x57: 0x12705, // blink
|
||||||
|
0x58: 0xa105, // title
|
||||||
|
0x59: 0x38807, // article
|
||||||
|
0x5b: 0x22e02, // th
|
||||||
|
0x5d: 0x13101, // q
|
||||||
|
0x5e: 0x3cf04, // open
|
||||||
|
0x5f: 0x2fa04, // area
|
||||||
|
0x61: 0x44206, // onload
|
||||||
|
0x62: 0xda04, // font
|
||||||
|
0x63: 0xd604, // base
|
||||||
|
0x64: 0x16207, // colspan
|
||||||
|
0x65: 0x53707, // keytype
|
||||||
|
0x66: 0x11e02, // dl
|
||||||
|
0x68: 0x1b008, // fieldset
|
||||||
|
0x6a: 0x2eb03, // min
|
||||||
|
0x6b: 0x11503, // var
|
||||||
|
0x6f: 0x2d506, // header
|
||||||
|
0x70: 0x13f02, // rt
|
||||||
|
0x71: 0x15008, // colgroup
|
||||||
|
0x72: 0x23502, // mn
|
||||||
|
0x74: 0x13a07, // onabort
|
||||||
|
0x75: 0x3906, // keygen
|
||||||
|
0x76: 0x4c209, // onoffline
|
||||||
|
0x77: 0x21f09, // challenge
|
||||||
|
0x78: 0x2b203, // map
|
||||||
|
0x7a: 0x2e902, // h4
|
||||||
|
0x7b: 0x3b607, // onerror
|
||||||
|
0x7c: 0x2e109, // maxlength
|
||||||
|
0x7d: 0x2f505, // mtext
|
||||||
|
0x7e: 0xbb07, // sandbox
|
||||||
|
0x7f: 0x58b06, // onsort
|
||||||
|
0x80: 0x100a, // malignmark
|
||||||
|
0x81: 0x45d04, // meta
|
||||||
|
0x82: 0x7b05, // async
|
||||||
|
0x83: 0x2a702, // h3
|
||||||
|
0x84: 0x26702, // dd
|
||||||
|
0x85: 0x27004, // href
|
||||||
|
0x86: 0x6e0a, // mediagroup
|
||||||
|
0x87: 0x19406, // coords
|
||||||
|
0x88: 0x41107, // srclang
|
||||||
|
0x89: 0x34d0a, // ondblclick
|
||||||
|
0x8a: 0x4005, // value
|
||||||
|
0x8c: 0xe908, // oncancel
|
||||||
|
0x8e: 0x3230a, // spellcheck
|
||||||
|
0x8f: 0x9a05, // frame
|
||||||
|
0x91: 0x12403, // big
|
||||||
|
0x94: 0x1f606, // action
|
||||||
|
0x95: 0x6903, // dir
|
||||||
|
0x97: 0x2fb08, // readonly
|
||||||
|
0x99: 0x42d05, // table
|
||||||
|
0x9a: 0x61607, // summary
|
||||||
|
0x9b: 0x12103, // wbr
|
||||||
|
0x9c: 0x30a, // radiogroup
|
||||||
|
0x9d: 0x6c04, // name
|
||||||
|
0x9f: 0x62306, // system
|
||||||
|
0xa1: 0x15d05, // color
|
||||||
|
0xa2: 0x7f06, // canvas
|
||||||
|
0xa3: 0x25504, // html
|
||||||
|
0xa5: 0x56f09, // onseeking
|
||||||
|
0xac: 0x4f905, // shape
|
||||||
|
0xad: 0x25f03, // rel
|
||||||
|
0xae: 0x28510, // oncanplaythrough
|
||||||
|
0xaf: 0x3760a, // ondragover
|
||||||
|
0xb0: 0x62608, // template
|
||||||
|
0xb1: 0x1d80d, // foreignObject
|
||||||
|
0xb3: 0x9204, // rows
|
||||||
|
0xb6: 0x44e07, // listing
|
||||||
|
0xb7: 0x49c06, // output
|
||||||
|
0xb9: 0x3310b, // contextmenu
|
||||||
|
0xbb: 0x11f03, // low
|
||||||
|
0xbc: 0x1c602, // rp
|
||||||
|
0xbd: 0x5bb09, // onsuspend
|
||||||
|
0xbe: 0x13606, // button
|
||||||
|
0xbf: 0x4db04, // desc
|
||||||
|
0xc1: 0x4e207, // section
|
||||||
|
0xc2: 0x52a0a, // onprogress
|
||||||
|
0xc3: 0x59e09, // onstorage
|
||||||
|
0xc4: 0x2d204, // math
|
||||||
|
0xc5: 0x4503, // alt
|
||||||
|
0xc7: 0x8a02, // ul
|
||||||
|
0xc8: 0x5107, // pattern
|
||||||
|
0xc9: 0x4b60c, // onmousewheel
|
||||||
|
0xca: 0x35709, // ondragend
|
||||||
|
0xcb: 0xaf04, // ruby
|
||||||
|
0xcc: 0xc01, // p
|
||||||
|
0xcd: 0x31707, // onclose
|
||||||
|
0xce: 0x24205, // meter
|
||||||
|
0xcf: 0x11807, // bgsound
|
||||||
|
0xd2: 0x25106, // height
|
||||||
|
0xd4: 0x101, // b
|
||||||
|
0xd5: 0x2c308, // itemtype
|
||||||
|
0xd8: 0x1bb07, // caption
|
||||||
|
0xd9: 0x10c08, // disabled
|
||||||
|
0xdb: 0x33808, // menuitem
|
||||||
|
0xdc: 0x62003, // svg
|
||||||
|
0xdd: 0x18f05, // small
|
||||||
|
0xde: 0x44a04, // data
|
||||||
|
0xe0: 0x4cb08, // ononline
|
||||||
|
0xe1: 0x2a206, // mglyph
|
||||||
|
0xe3: 0x6505, // embed
|
||||||
|
0xe4: 0x10502, // tr
|
||||||
|
0xe5: 0x46b0b, // onloadstart
|
||||||
|
0xe7: 0x3c306, // srcdoc
|
||||||
|
0xeb: 0x5c408, // ontoggle
|
||||||
|
0xed: 0xe703, // bdo
|
||||||
|
0xee: 0x4702, // td
|
||||||
|
0xef: 0x8305, // aside
|
||||||
|
0xf0: 0x29402, // h2
|
||||||
|
0xf1: 0x52c08, // progress
|
||||||
|
0xf2: 0x12c0a, // blockquote
|
||||||
|
0xf4: 0xf005, // label
|
||||||
|
0xf5: 0x601, // i
|
||||||
|
0xf7: 0x9207, // rowspan
|
||||||
|
0xfb: 0x51709, // onplaying
|
||||||
|
0xfd: 0x2a103, // img
|
||||||
|
0xfe: 0xf608, // optgroup
|
||||||
|
0xff: 0x42307, // content
|
||||||
|
0x101: 0x53e0c, // onratechange
|
||||||
|
0x103: 0x3da0c, // onhashchange
|
||||||
|
0x104: 0x4807, // details
|
||||||
|
0x106: 0x40008, // download
|
||||||
|
0x109: 0x14009, // translate
|
||||||
|
0x10b: 0x4230f, // contenteditable
|
||||||
|
0x10d: 0x36b0b, // ondragleave
|
||||||
|
0x10e: 0x2106, // accept
|
||||||
|
0x10f: 0x57a08, // selected
|
||||||
|
0x112: 0x1f20a, // formaction
|
||||||
|
0x113: 0x5b506, // center
|
||||||
|
0x115: 0x45510, // onloadedmetadata
|
||||||
|
0x116: 0x12804, // link
|
||||||
|
0x117: 0xdd04, // time
|
||||||
|
0x118: 0x19f0b, // crossorigin
|
||||||
|
0x119: 0x3bd07, // onfocus
|
||||||
|
0x11a: 0x58704, // wrap
|
||||||
|
0x11b: 0x42204, // icon
|
||||||
|
0x11d: 0x28105, // video
|
||||||
|
0x11e: 0x4de05, // class
|
||||||
|
0x121: 0x5d40e, // onvolumechange
|
||||||
|
0x122: 0xaa06, // onblur
|
||||||
|
0x123: 0x2b909, // itemscope
|
||||||
|
0x124: 0x61105, // style
|
||||||
|
0x127: 0x41e06, // public
|
||||||
|
0x129: 0x2320e, // formnovalidate
|
||||||
|
0x12a: 0x58206, // onshow
|
||||||
|
0x12c: 0x51706, // onplay
|
||||||
|
0x12d: 0x3c804, // cite
|
||||||
|
0x12e: 0x2bc02, // ms
|
||||||
|
0x12f: 0xdb0c, // ontimeupdate
|
||||||
|
0x130: 0x10904, // kind
|
||||||
|
0x131: 0x2470a, // formtarget
|
||||||
|
0x135: 0x3af07, // onended
|
||||||
|
0x136: 0x26506, // hidden
|
||||||
|
0x137: 0x2c01, // s
|
||||||
|
0x139: 0x2280a, // formmethod
|
||||||
|
0x13a: 0x3e805, // input
|
||||||
|
0x13c: 0x50b02, // h6
|
||||||
|
0x13d: 0xc902, // ol
|
||||||
|
0x13e: 0x3420b, // oncuechange
|
||||||
|
0x13f: 0x1e50d, // foreignobject
|
||||||
|
0x143: 0x4e70e, // onbeforeunload
|
||||||
|
0x144: 0x2bd05, // scope
|
||||||
|
0x145: 0x39609, // onemptied
|
||||||
|
0x146: 0x14b05, // defer
|
||||||
|
0x147: 0xc103, // xmp
|
||||||
|
0x148: 0x39f10, // ondurationchange
|
||||||
|
0x149: 0x1903, // kbd
|
||||||
|
0x14c: 0x47609, // onmessage
|
||||||
|
0x14d: 0x60006, // option
|
||||||
|
0x14e: 0x2eb09, // minlength
|
||||||
|
0x14f: 0x32807, // checked
|
||||||
|
0x150: 0xce08, // autoplay
|
||||||
|
0x152: 0x202, // br
|
||||||
|
0x153: 0x2360a, // novalidate
|
||||||
|
0x156: 0x6307, // noembed
|
||||||
|
0x159: 0x31007, // onclick
|
||||||
|
0x15a: 0x47f0b, // onmousedown
|
||||||
|
0x15b: 0x3a708, // onchange
|
||||||
|
0x15e: 0x3f209, // oninvalid
|
||||||
|
0x15f: 0x2bd06, // scoped
|
||||||
|
0x160: 0x18808, // controls
|
||||||
|
0x161: 0x30b05, // muted
|
||||||
|
0x162: 0x58d08, // sortable
|
||||||
|
0x163: 0x51106, // usemap
|
||||||
|
0x164: 0x1b80a, // figcaption
|
||||||
|
0x165: 0x35706, // ondrag
|
||||||
|
0x166: 0x26b04, // high
|
||||||
|
0x168: 0x3c303, // src
|
||||||
|
0x169: 0x15706, // poster
|
||||||
|
0x16b: 0x1670e, // annotation-xml
|
||||||
|
0x16c: 0x5f704, // step
|
||||||
|
0x16d: 0x4, // abbr
|
||||||
|
0x16e: 0x1b06, // dialog
|
||||||
|
0x170: 0x1202, // li
|
||||||
|
0x172: 0x3ed02, // mo
|
||||||
|
0x175: 0x1d803, // for
|
||||||
|
0x176: 0x1a803, // ins
|
||||||
|
0x178: 0x55504, // size
|
||||||
|
0x179: 0x43210, // onlanguagechange
|
||||||
|
0x17a: 0x8607, // default
|
||||||
|
0x17b: 0x1a03, // bdi
|
||||||
|
0x17c: 0x4d30a, // onpagehide
|
||||||
|
0x17d: 0x6907, // dirname
|
||||||
|
0x17e: 0x21404, // type
|
||||||
|
0x17f: 0x1f204, // form
|
||||||
|
0x181: 0x28509, // oncanplay
|
||||||
|
0x182: 0x6103, // dfn
|
||||||
|
0x183: 0x46308, // tabindex
|
||||||
|
0x186: 0x6502, // em
|
||||||
|
0x187: 0x27404, // lang
|
||||||
|
0x189: 0x39108, // dropzone
|
||||||
|
0x18a: 0x4080a, // onkeypress
|
||||||
|
0x18b: 0x23c08, // datetime
|
||||||
|
0x18c: 0x16204, // cols
|
||||||
|
0x18d: 0x1, // a
|
||||||
|
0x18e: 0x4420c, // onloadeddata
|
||||||
|
0x190: 0xa605, // audio
|
||||||
|
0x192: 0x2e05, // tbody
|
||||||
|
0x193: 0x22c06, // method
|
||||||
|
0x195: 0xf404, // loop
|
||||||
|
0x196: 0x29606, // iframe
|
||||||
|
0x198: 0x2d504, // head
|
||||||
|
0x19e: 0x5f108, // manifest
|
||||||
|
0x19f: 0xb309, // autofocus
|
||||||
|
0x1a0: 0x14904, // code
|
||||||
|
0x1a1: 0x55906, // strong
|
||||||
|
0x1a2: 0x30308, // multiple
|
||||||
|
0x1a3: 0xc05, // param
|
||||||
|
0x1a6: 0x21107, // enctype
|
||||||
|
0x1a7: 0x5b304, // face
|
||||||
|
0x1a8: 0xfd09, // plaintext
|
||||||
|
0x1a9: 0x26e02, // h1
|
||||||
|
0x1aa: 0x59509, // onstalled
|
||||||
|
0x1ad: 0x3d406, // script
|
||||||
|
0x1ae: 0x2db06, // spacer
|
||||||
|
0x1af: 0x55108, // onresize
|
||||||
|
0x1b0: 0x4a20b, // onmouseover
|
||||||
|
0x1b1: 0x5cc08, // onunload
|
||||||
|
0x1b2: 0x56708, // onseeked
|
||||||
|
0x1b4: 0x2140d, // typemustmatch
|
||||||
|
0x1b5: 0x1cc06, // figure
|
||||||
|
0x1b6: 0x4950a, // onmouseout
|
||||||
|
0x1b7: 0x25e03, // pre
|
||||||
|
0x1b8: 0x50705, // width
|
||||||
|
0x1b9: 0x19906, // sorted
|
||||||
|
0x1bb: 0x5704, // nobr
|
||||||
|
0x1be: 0x5302, // tt
|
||||||
|
0x1bf: 0x1105, // align
|
||||||
|
0x1c0: 0x3e607, // oninput
|
||||||
|
0x1c3: 0x41807, // onkeyup
|
||||||
|
0x1c6: 0x1c00c, // onafterprint
|
||||||
|
0x1c7: 0x210e, // accept-charset
|
||||||
|
0x1c8: 0x33c06, // itemid
|
||||||
|
0x1c9: 0x3e809, // inputmode
|
||||||
|
0x1cb: 0x53306, // strike
|
||||||
|
0x1cc: 0x5a903, // sub
|
||||||
|
0x1cd: 0x10505, // track
|
||||||
|
0x1ce: 0x38605, // start
|
||||||
|
0x1d0: 0xd608, // basefont
|
||||||
|
0x1d6: 0x1aa06, // source
|
||||||
|
0x1d7: 0x18206, // legend
|
||||||
|
0x1d8: 0x2d405, // thead
|
||||||
|
0x1da: 0x8c05, // tfoot
|
||||||
|
0x1dd: 0x1ec06, // object
|
||||||
|
0x1de: 0x6e05, // media
|
||||||
|
0x1df: 0x1670a, // annotation
|
||||||
|
0x1e0: 0x20d0b, // formenctype
|
||||||
|
0x1e2: 0x3d208, // noscript
|
||||||
|
0x1e4: 0x55505, // sizes
|
||||||
|
0x1e5: 0x1fc0c, // autocomplete
|
||||||
|
0x1e6: 0x9504, // span
|
||||||
|
0x1e7: 0x9808, // noframes
|
||||||
|
0x1e8: 0x24b06, // target
|
||||||
|
0x1e9: 0x38f06, // ondrop
|
||||||
|
0x1ea: 0x2b306, // applet
|
||||||
|
0x1ec: 0x5a08, // reversed
|
||||||
|
0x1f0: 0x2a907, // isindex
|
||||||
|
0x1f3: 0x27008, // hreflang
|
||||||
|
0x1f5: 0x2f302, // h5
|
||||||
|
0x1f6: 0x4f307, // address
|
||||||
|
0x1fa: 0x2e103, // max
|
||||||
|
0x1fb: 0xc30b, // placeholder
|
||||||
|
0x1fc: 0x2f608, // textarea
|
||||||
|
0x1fe: 0x4ad09, // onmouseup
|
||||||
|
0x1ff: 0x3800b, // ondragstart
|
||||||
|
} |
||||||
|
|
||||||
|
const atomText = "abbradiogrouparamalignmarkbdialogaccept-charsetbodyaccesskey" + |
||||||
|
"genavaluealtdetailsampatternobreversedfnoembedirnamediagroup" + |
||||||
|
"ingasyncanvasidefaultfooterowspanoframesetitleaudionblurubya" + |
||||||
|
"utofocusandboxmplaceholderautoplaybasefontimeupdatebdoncance" + |
||||||
|
"labelooptgrouplaintextrackindisabledivarbgsoundlowbrbigblink" + |
||||||
|
"blockquotebuttonabortranslatecodefercolgroupostercolorcolspa" + |
||||||
|
"nnotation-xmlcommandraggablegendcontrolsmallcoordsortedcross" + |
||||||
|
"originsourcefieldsetfigcaptionafterprintfigurequiredforeignO" + |
||||||
|
"bjectforeignobjectformactionautocompleteerrorformenctypemust" + |
||||||
|
"matchallengeformmethodformnovalidatetimeterformtargetheightm" + |
||||||
|
"lhgroupreloadhiddenhigh1hreflanghttp-equivideoncanplaythroug" + |
||||||
|
"h2iframeimageimglyph3isindexismappletitemscopeditemtypemarqu" + |
||||||
|
"eematheaderspacermaxlength4minlength5mtextareadonlymultiplem" + |
||||||
|
"utedonclickoncloseamlesspellcheckedoncontextmenuitemidoncuec" + |
||||||
|
"hangeondblclickondragendondragenterondragleaveondragoverondr" + |
||||||
|
"agstarticleondropzonemptiedondurationchangeonendedonerroronf" + |
||||||
|
"ocusrcdocitempropenoscriptonhashchangeoninputmodeloninvalido" + |
||||||
|
"nkeydownloadonkeypressrclangonkeyupublicontenteditableonlang" + |
||||||
|
"uagechangeonloadeddatalistingonloadedmetadatabindexonloadsta" + |
||||||
|
"rtonmessageonmousedownonmousemoveonmouseoutputonmouseoveronm" + |
||||||
|
"ouseuponmousewheelonofflineononlineonpagehidesclassectionbef" + |
||||||
|
"oreunloaddresshapeonpageshowidth6onpausemaponplayingonpopsta" + |
||||||
|
"teonprogresstrikeytypeonratechangeonresetonresizestrongonscr" + |
||||||
|
"ollonseekedonseekingonselectedonshowraponsortableonstalledon" + |
||||||
|
"storageonsubmitemrefacenteronsuspendontoggleonunloadonvolume" + |
||||||
|
"changeonwaitingoptimumanifestepromptoptionbeforeprintstylesu" + |
||||||
|
"mmarysupsvgsystemplate" |
@ -0,0 +1,351 @@ |
|||||||
|
// generated by go run gen.go -test; DO NOT EDIT
|
||||||
|
|
||||||
|
package atom |
||||||
|
|
||||||
|
var testAtomList = []string{ |
||||||
|
"a", |
||||||
|
"abbr", |
||||||
|
"abbr", |
||||||
|
"accept", |
||||||
|
"accept-charset", |
||||||
|
"accesskey", |
||||||
|
"action", |
||||||
|
"address", |
||||||
|
"align", |
||||||
|
"alt", |
||||||
|
"annotation", |
||||||
|
"annotation-xml", |
||||||
|
"applet", |
||||||
|
"area", |
||||||
|
"article", |
||||||
|
"aside", |
||||||
|
"async", |
||||||
|
"audio", |
||||||
|
"autocomplete", |
||||||
|
"autofocus", |
||||||
|
"autoplay", |
||||||
|
"b", |
||||||
|
"base", |
||||||
|
"basefont", |
||||||
|
"bdi", |
||||||
|
"bdo", |
||||||
|
"bgsound", |
||||||
|
"big", |
||||||
|
"blink", |
||||||
|
"blockquote", |
||||||
|
"body", |
||||||
|
"br", |
||||||
|
"button", |
||||||
|
"canvas", |
||||||
|
"caption", |
||||||
|
"center", |
||||||
|
"challenge", |
||||||
|
"charset", |
||||||
|
"checked", |
||||||
|
"cite", |
||||||
|
"cite", |
||||||
|
"class", |
||||||
|
"code", |
||||||
|
"col", |
||||||
|
"colgroup", |
||||||
|
"color", |
||||||
|
"cols", |
||||||
|
"colspan", |
||||||
|
"command", |
||||||
|
"command", |
||||||
|
"content", |
||||||
|
"contenteditable", |
||||||
|
"contextmenu", |
||||||
|
"controls", |
||||||
|
"coords", |
||||||
|
"crossorigin", |
||||||
|
"data", |
||||||
|
"data", |
||||||
|
"datalist", |
||||||
|
"datetime", |
||||||
|
"dd", |
||||||
|
"default", |
||||||
|
"defer", |
||||||
|
"del", |
||||||
|
"desc", |
||||||
|
"details", |
||||||
|
"dfn", |
||||||
|
"dialog", |
||||||
|
"dir", |
||||||
|
"dirname", |
||||||
|
"disabled", |
||||||
|
"div", |
||||||
|
"dl", |
||||||
|
"download", |
||||||
|
"draggable", |
||||||
|
"dropzone", |
||||||
|
"dt", |
||||||
|
"em", |
||||||
|
"embed", |
||||||
|
"enctype", |
||||||
|
"face", |
||||||
|
"fieldset", |
||||||
|
"figcaption", |
||||||
|
"figure", |
||||||
|
"font", |
||||||
|
"footer", |
||||||
|
"for", |
||||||
|
"foreignObject", |
||||||
|
"foreignobject", |
||||||
|
"form", |
||||||
|
"form", |
||||||
|
"formaction", |
||||||
|
"formenctype", |
||||||
|
"formmethod", |
||||||
|
"formnovalidate", |
||||||
|
"formtarget", |
||||||
|
"frame", |
||||||
|
"frameset", |
||||||
|
"h1", |
||||||
|
"h2", |
||||||
|
"h3", |
||||||
|
"h4", |
||||||
|
"h5", |
||||||
|
"h6", |
||||||
|
"head", |
||||||
|
"header", |
||||||
|
"headers", |
||||||
|
"height", |
||||||
|
"hgroup", |
||||||
|
"hidden", |
||||||
|
"high", |
||||||
|
"hr", |
||||||
|
"href", |
||||||
|
"hreflang", |
||||||
|
"html", |
||||||
|
"http-equiv", |
||||||
|
"i", |
||||||
|
"icon", |
||||||
|
"id", |
||||||
|
"iframe", |
||||||
|
"image", |
||||||
|
"img", |
||||||
|
"input", |
||||||
|
"inputmode", |
||||||
|
"ins", |
||||||
|
"isindex", |
||||||
|
"ismap", |
||||||
|
"itemid", |
||||||
|
"itemprop", |
||||||
|
"itemref", |
||||||
|
"itemscope", |
||||||
|
"itemtype", |
||||||
|
"kbd", |
||||||
|
"keygen", |
||||||
|
"keytype", |
||||||
|
"kind", |
||||||
|
"label", |
||||||
|
"label", |
||||||
|
"lang", |
||||||
|
"legend", |
||||||
|
"li", |
||||||
|
"link", |
||||||
|
"list", |
||||||
|
"listing", |
||||||
|
"loop", |
||||||
|
"low", |
||||||
|
"malignmark", |
||||||
|
"manifest", |
||||||
|
"map", |
||||||
|
"mark", |
||||||
|
"marquee", |
||||||
|
"math", |
||||||
|
"max", |
||||||
|
"maxlength", |
||||||
|
"media", |
||||||
|
"mediagroup", |
||||||
|
"menu", |
||||||
|
"menuitem", |
||||||
|
"meta", |
||||||
|
"meter", |
||||||
|
"method", |
||||||
|
"mglyph", |
||||||
|
"mi", |
||||||
|
"min", |
||||||
|
"minlength", |
||||||
|
"mn", |
||||||
|
"mo", |
||||||
|
"ms", |
||||||
|
"mtext", |
||||||
|
"multiple", |
||||||
|
"muted", |
||||||
|
"name", |
||||||
|
"nav", |
||||||
|
"nobr", |
||||||
|
"noembed", |
||||||
|
"noframes", |
||||||
|
"noscript", |
||||||
|
"novalidate", |
||||||
|
"object", |
||||||
|
"ol", |
||||||
|
"onabort", |
||||||
|
"onafterprint", |
||||||
|
"onautocomplete", |
||||||
|
"onautocompleteerror", |
||||||
|
"onbeforeprint", |
||||||
|
"onbeforeunload", |
||||||
|
"onblur", |
||||||
|
"oncancel", |
||||||
|
"oncanplay", |
||||||
|
"oncanplaythrough", |
||||||
|
"onchange", |
||||||
|
"onclick", |
||||||
|
"onclose", |
||||||
|
"oncontextmenu", |
||||||
|
"oncuechange", |
||||||
|
"ondblclick", |
||||||
|
"ondrag", |
||||||
|
"ondragend", |
||||||
|
"ondragenter", |
||||||
|
"ondragleave", |
||||||
|
"ondragover", |
||||||
|
"ondragstart", |
||||||
|
"ondrop", |
||||||
|
"ondurationchange", |
||||||
|
"onemptied", |
||||||
|
"onended", |
||||||
|
"onerror", |
||||||
|
"onfocus", |
||||||
|
"onhashchange", |
||||||
|
"oninput", |
||||||
|
"oninvalid", |
||||||
|
"onkeydown", |
||||||
|
"onkeypress", |
||||||
|
"onkeyup", |
||||||
|
"onlanguagechange", |
||||||
|
"onload", |
||||||
|
"onloadeddata", |
||||||
|
"onloadedmetadata", |
||||||
|
"onloadstart", |
||||||
|
"onmessage", |
||||||
|
"onmousedown", |
||||||
|
"onmousemove", |
||||||
|
"onmouseout", |
||||||
|
"onmouseover", |
||||||
|
"onmouseup", |
||||||
|
"onmousewheel", |
||||||
|
"onoffline", |
||||||
|
"ononline", |
||||||
|
"onpagehide", |
||||||
|
"onpageshow", |
||||||
|
"onpause", |
||||||
|
"onplay", |
||||||
|
"onplaying", |
||||||
|
"onpopstate", |
||||||
|
"onprogress", |
||||||
|
"onratechange", |
||||||
|
"onreset", |
||||||
|
"onresize", |
||||||
|
"onscroll", |
||||||
|
"onseeked", |
||||||
|
"onseeking", |
||||||
|
"onselect", |
||||||
|
"onshow", |
||||||
|
"onsort", |
||||||
|
"onstalled", |
||||||
|
"onstorage", |
||||||
|
"onsubmit", |
||||||
|
"onsuspend", |
||||||
|
"ontimeupdate", |
||||||
|
"ontoggle", |
||||||
|
"onunload", |
||||||
|
"onvolumechange", |
||||||
|
"onwaiting", |
||||||
|
"open", |
||||||
|
"optgroup", |
||||||
|
"optimum", |
||||||
|
"option", |
||||||
|
"output", |
||||||
|
"p", |
||||||
|
"param", |
||||||
|
"pattern", |
||||||
|
"ping", |
||||||
|
"placeholder", |
||||||
|
"plaintext", |
||||||
|
"poster", |
||||||
|
"pre", |
||||||
|
"preload", |
||||||
|
"progress", |
||||||
|
"prompt", |
||||||
|
"public", |
||||||
|
"q", |
||||||
|
"radiogroup", |
||||||
|
"readonly", |
||||||
|
"rel", |
||||||
|
"required", |
||||||
|
"reversed", |
||||||
|
"rows", |
||||||
|
"rowspan", |
||||||
|
"rp", |
||||||
|
"rt", |
||||||
|
"ruby", |
||||||
|
"s", |
||||||
|
"samp", |
||||||
|
"sandbox", |
||||||
|
"scope", |
||||||
|
"scoped", |
||||||
|
"script", |
||||||
|
"seamless", |
||||||
|
"section", |
||||||
|
"select", |
||||||
|
"selected", |
||||||
|
"shape", |
||||||
|
"size", |
||||||
|
"sizes", |
||||||
|
"small", |
||||||
|
"sortable", |
||||||
|
"sorted", |
||||||
|
"source", |
||||||
|
"spacer", |
||||||
|
"span", |
||||||
|
"span", |
||||||
|
"spellcheck", |
||||||
|
"src", |
||||||
|
"srcdoc", |
||||||
|
"srclang", |
||||||
|
"start", |
||||||
|
"step", |
||||||
|
"strike", |
||||||
|
"strong", |
||||||
|
"style", |
||||||
|
"style", |
||||||
|
"sub", |
||||||
|
"summary", |
||||||
|
"sup", |
||||||
|
"svg", |
||||||
|
"system", |
||||||
|
"tabindex", |
||||||
|
"table", |
||||||
|
"target", |
||||||
|
"tbody", |
||||||
|
"td", |
||||||
|
"template", |
||||||
|
"textarea", |
||||||
|
"tfoot", |
||||||
|
"th", |
||||||
|
"thead", |
||||||
|
"time", |
||||||
|
"title", |
||||||
|
"title", |
||||||
|
"tr", |
||||||
|
"track", |
||||||
|
"translate", |
||||||
|
"tt", |
||||||
|
"type", |
||||||
|
"typemustmatch", |
||||||
|
"u", |
||||||
|
"ul", |
||||||
|
"usemap", |
||||||
|
"value", |
||||||
|
"var", |
||||||
|
"video", |
||||||
|
"wbr", |
||||||
|
"width", |
||||||
|
"wrap", |
||||||
|
"xmp", |
||||||
|
} |
@ -0,0 +1,244 @@ |
|||||||
|
// Copyright 2013 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package charset provides common text encodings for HTML documents.
|
||||||
|
//
|
||||||
|
// The mapping from encoding labels to encodings is defined at
|
||||||
|
// https://encoding.spec.whatwg.org/.
|
||||||
|
package charset |
||||||
|
|
||||||
|
import ( |
||||||
|
"bytes" |
||||||
|
"fmt" |
||||||
|
"io" |
||||||
|
"mime" |
||||||
|
"strings" |
||||||
|
"unicode/utf8" |
||||||
|
|
||||||
|
"golang.org/x/net/html" |
||||||
|
"golang.org/x/text/encoding" |
||||||
|
"golang.org/x/text/encoding/charmap" |
||||||
|
"golang.org/x/text/transform" |
||||||
|
) |
||||||
|
|
||||||
|
// Lookup returns the encoding with the specified label, and its canonical
|
||||||
|
// name. It returns nil and the empty string if label is not one of the
|
||||||
|
// standard encodings for HTML. Matching is case-insensitive and ignores
|
||||||
|
// leading and trailing whitespace.
|
||||||
|
func Lookup(label string) (e encoding.Encoding, name string) { |
||||||
|
label = strings.ToLower(strings.Trim(label, "\t\n\r\f ")) |
||||||
|
enc := encodings[label] |
||||||
|
return enc.e, enc.name |
||||||
|
} |
||||||
|
|
||||||
|
// DetermineEncoding determines the encoding of an HTML document by examining
|
||||||
|
// up to the first 1024 bytes of content and the declared Content-Type.
|
||||||
|
//
|
||||||
|
// See http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#determining-the-character-encoding
|
||||||
|
func DetermineEncoding(content []byte, contentType string) (e encoding.Encoding, name string, certain bool) { |
||||||
|
if len(content) > 1024 { |
||||||
|
content = content[:1024] |
||||||
|
} |
||||||
|
|
||||||
|
for _, b := range boms { |
||||||
|
if bytes.HasPrefix(content, b.bom) { |
||||||
|
e, name = Lookup(b.enc) |
||||||
|
return e, name, true |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if _, params, err := mime.ParseMediaType(contentType); err == nil { |
||||||
|
if cs, ok := params["charset"]; ok { |
||||||
|
if e, name = Lookup(cs); e != nil { |
||||||
|
return e, name, true |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if len(content) > 0 { |
||||||
|
e, name = prescan(content) |
||||||
|
if e != nil { |
||||||
|
return e, name, false |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Try to detect UTF-8.
|
||||||
|
// First eliminate any partial rune at the end.
|
||||||
|
for i := len(content) - 1; i >= 0 && i > len(content)-4; i-- { |
||||||
|
b := content[i] |
||||||
|
if b < 0x80 { |
||||||
|
break |
||||||
|
} |
||||||
|
if utf8.RuneStart(b) { |
||||||
|
content = content[:i] |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
hasHighBit := false |
||||||
|
for _, c := range content { |
||||||
|
if c >= 0x80 { |
||||||
|
hasHighBit = true |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if hasHighBit && utf8.Valid(content) { |
||||||
|
return encoding.Nop, "utf-8", false |
||||||
|
} |
||||||
|
|
||||||
|
// TODO: change default depending on user's locale?
|
||||||
|
return charmap.Windows1252, "windows-1252", false |
||||||
|
} |
||||||
|
|
||||||
|
// NewReader returns an io.Reader that converts the content of r to UTF-8.
|
||||||
|
// It calls DetermineEncoding to find out what r's encoding is.
|
||||||
|
func NewReader(r io.Reader, contentType string) (io.Reader, error) { |
||||||
|
preview := make([]byte, 1024) |
||||||
|
n, err := io.ReadFull(r, preview) |
||||||
|
switch { |
||||||
|
case err == io.ErrUnexpectedEOF: |
||||||
|
preview = preview[:n] |
||||||
|
r = bytes.NewReader(preview) |
||||||
|
case err != nil: |
||||||
|
return nil, err |
||||||
|
default: |
||||||
|
r = io.MultiReader(bytes.NewReader(preview), r) |
||||||
|
} |
||||||
|
|
||||||
|
if e, _, _ := DetermineEncoding(preview, contentType); e != encoding.Nop { |
||||||
|
r = transform.NewReader(r, e.NewDecoder()) |
||||||
|
} |
||||||
|
return r, nil |
||||||
|
} |
||||||
|
|
||||||
|
// NewReaderLabel returns a reader that converts from the specified charset to
|
||||||
|
// UTF-8. It uses Lookup to find the encoding that corresponds to label, and
|
||||||
|
// returns an error if Lookup returns nil. It is suitable for use as
|
||||||
|
// encoding/xml.Decoder's CharsetReader function.
|
||||||
|
func NewReaderLabel(label string, input io.Reader) (io.Reader, error) { |
||||||
|
e, _ := Lookup(label) |
||||||
|
if e == nil { |
||||||
|
return nil, fmt.Errorf("unsupported charset: %q", label) |
||||||
|
} |
||||||
|
return transform.NewReader(input, e.NewDecoder()), nil |
||||||
|
} |
||||||
|
|
||||||
|
func prescan(content []byte) (e encoding.Encoding, name string) { |
||||||
|
z := html.NewTokenizer(bytes.NewReader(content)) |
||||||
|
for { |
||||||
|
switch z.Next() { |
||||||
|
case html.ErrorToken: |
||||||
|
return nil, "" |
||||||
|
|
||||||
|
case html.StartTagToken, html.SelfClosingTagToken: |
||||||
|
tagName, hasAttr := z.TagName() |
||||||
|
if !bytes.Equal(tagName, []byte("meta")) { |
||||||
|
continue |
||||||
|
} |
||||||
|
attrList := make(map[string]bool) |
||||||
|
gotPragma := false |
||||||
|
|
||||||
|
const ( |
||||||
|
dontKnow = iota |
||||||
|
doNeedPragma |
||||||
|
doNotNeedPragma |
||||||
|
) |
||||||
|
needPragma := dontKnow |
||||||
|
|
||||||
|
name = "" |
||||||
|
e = nil |
||||||
|
for hasAttr { |
||||||
|
var key, val []byte |
||||||
|
key, val, hasAttr = z.TagAttr() |
||||||
|
ks := string(key) |
||||||
|
if attrList[ks] { |
||||||
|
continue |
||||||
|
} |
||||||
|
attrList[ks] = true |
||||||
|
for i, c := range val { |
||||||
|
if 'A' <= c && c <= 'Z' { |
||||||
|
val[i] = c + 0x20 |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
switch ks { |
||||||
|
case "http-equiv": |
||||||
|
if bytes.Equal(val, []byte("content-type")) { |
||||||
|
gotPragma = true |
||||||
|
} |
||||||
|
|
||||||
|
case "content": |
||||||
|
if e == nil { |
||||||
|
name = fromMetaElement(string(val)) |
||||||
|
if name != "" { |
||||||
|
e, name = Lookup(name) |
||||||
|
if e != nil { |
||||||
|
needPragma = doNeedPragma |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
case "charset": |
||||||
|
e, name = Lookup(string(val)) |
||||||
|
needPragma = doNotNeedPragma |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if needPragma == dontKnow || needPragma == doNeedPragma && !gotPragma { |
||||||
|
continue |
||||||
|
} |
||||||
|
|
||||||
|
if strings.HasPrefix(name, "utf-16") { |
||||||
|
name = "utf-8" |
||||||
|
e = encoding.Nop |
||||||
|
} |
||||||
|
|
||||||
|
if e != nil { |
||||||
|
return e, name |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func fromMetaElement(s string) string { |
||||||
|
for s != "" { |
||||||
|
csLoc := strings.Index(s, "charset") |
||||||
|
if csLoc == -1 { |
||||||
|
return "" |
||||||
|
} |
||||||
|
s = s[csLoc+len("charset"):] |
||||||
|
s = strings.TrimLeft(s, " \t\n\f\r") |
||||||
|
if !strings.HasPrefix(s, "=") { |
||||||
|
continue |
||||||
|
} |
||||||
|
s = s[1:] |
||||||
|
s = strings.TrimLeft(s, " \t\n\f\r") |
||||||
|
if s == "" { |
||||||
|
return "" |
||||||
|
} |
||||||
|
if q := s[0]; q == '"' || q == '\'' { |
||||||
|
s = s[1:] |
||||||
|
closeQuote := strings.IndexRune(s, rune(q)) |
||||||
|
if closeQuote == -1 { |
||||||
|
return "" |
||||||
|
} |
||||||
|
return s[:closeQuote] |
||||||
|
} |
||||||
|
|
||||||
|
end := strings.IndexAny(s, "; \t\n\f\r") |
||||||
|
if end == -1 { |
||||||
|
end = len(s) |
||||||
|
} |
||||||
|
return s[:end] |
||||||
|
} |
||||||
|
return "" |
||||||
|
} |
||||||
|
|
||||||
|
var boms = []struct { |
||||||
|
bom []byte |
||||||
|
enc string |
||||||
|
}{ |
||||||
|
{[]byte{0xfe, 0xff}, "utf-16be"}, |
||||||
|
{[]byte{0xff, 0xfe}, "utf-16le"}, |
||||||
|
{[]byte{0xef, 0xbb, 0xbf}, "utf-8"}, |
||||||
|
} |
@ -0,0 +1,111 @@ |
|||||||
|
// Copyright 2013 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main |
||||||
|
|
||||||
|
// Download https://encoding.spec.whatwg.org/encodings.json and use it to
|
||||||
|
// generate table.go.
|
||||||
|
|
||||||
|
import ( |
||||||
|
"encoding/json" |
||||||
|
"fmt" |
||||||
|
"log" |
||||||
|
"net/http" |
||||||
|
"strings" |
||||||
|
) |
||||||
|
|
||||||
|
type enc struct { |
||||||
|
Name string |
||||||
|
Labels []string |
||||||
|
} |
||||||
|
|
||||||
|
type group struct { |
||||||
|
Encodings []enc |
||||||
|
Heading string |
||||||
|
} |
||||||
|
|
||||||
|
const specURL = "https://encoding.spec.whatwg.org/encodings.json" |
||||||
|
|
||||||
|
func main() { |
||||||
|
resp, err := http.Get(specURL) |
||||||
|
if err != nil { |
||||||
|
log.Fatalf("error fetching %s: %s", specURL, err) |
||||||
|
} |
||||||
|
if resp.StatusCode != 200 { |
||||||
|
log.Fatalf("error fetching %s: HTTP status %s", specURL, resp.Status) |
||||||
|
} |
||||||
|
defer resp.Body.Close() |
||||||
|
|
||||||
|
var groups []group |
||||||
|
d := json.NewDecoder(resp.Body) |
||||||
|
err = d.Decode(&groups) |
||||||
|
if err != nil { |
||||||
|
log.Fatalf("error reading encodings.json: %s", err) |
||||||
|
} |
||||||
|
|
||||||
|
fmt.Println("// generated by go run gen.go; DO NOT EDIT") |
||||||
|
fmt.Println() |
||||||
|
fmt.Println("package charset") |
||||||
|
fmt.Println() |
||||||
|
|
||||||
|
fmt.Println("import (") |
||||||
|
fmt.Println(`"golang.org/x/text/encoding"`) |
||||||
|
for _, pkg := range []string{"charmap", "japanese", "korean", "simplifiedchinese", "traditionalchinese", "unicode"} { |
||||||
|
fmt.Printf("\"golang.org/x/text/encoding/%s\"\n", pkg) |
||||||
|
} |
||||||
|
fmt.Println(")") |
||||||
|
fmt.Println() |
||||||
|
|
||||||
|
fmt.Println("var encodings = map[string]struct{e encoding.Encoding; name string} {") |
||||||
|
for _, g := range groups { |
||||||
|
for _, e := range g.Encodings { |
||||||
|
goName, ok := miscNames[e.Name] |
||||||
|
if !ok { |
||||||
|
for k, v := range prefixes { |
||||||
|
if strings.HasPrefix(e.Name, k) { |
||||||
|
goName = v + e.Name[len(k):] |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if goName == "" { |
||||||
|
log.Fatalf("unrecognized encoding name: %s", e.Name) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
for _, label := range e.Labels { |
||||||
|
fmt.Printf("%q: {%s, %q},\n", label, goName, e.Name) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
fmt.Println("}") |
||||||
|
} |
||||||
|
|
||||||
|
var prefixes = map[string]string{ |
||||||
|
"iso-8859-": "charmap.ISO8859_", |
||||||
|
"windows-": "charmap.Windows", |
||||||
|
} |
||||||
|
|
||||||
|
var miscNames = map[string]string{ |
||||||
|
"utf-8": "encoding.Nop", |
||||||
|
"ibm866": "charmap.CodePage866", |
||||||
|
"iso-8859-8-i": "charmap.ISO8859_8", |
||||||
|
"koi8-r": "charmap.KOI8R", |
||||||
|
"koi8-u": "charmap.KOI8U", |
||||||
|
"macintosh": "charmap.Macintosh", |
||||||
|
"x-mac-cyrillic": "charmap.MacintoshCyrillic", |
||||||
|
"gbk": "simplifiedchinese.GBK", |
||||||
|
"gb18030": "simplifiedchinese.GB18030", |
||||||
|
"hz-gb-2312": "simplifiedchinese.HZGB2312", |
||||||
|
"big5": "traditionalchinese.Big5", |
||||||
|
"euc-jp": "japanese.EUCJP", |
||||||
|
"iso-2022-jp": "japanese.ISO2022JP", |
||||||
|
"shift_jis": "japanese.ShiftJIS", |
||||||
|
"euc-kr": "korean.EUCKR", |
||||||
|
"replacement": "encoding.Replacement", |
||||||
|
"utf-16be": "unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)", |
||||||
|
"utf-16le": "unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM)", |
||||||
|
"x-user-defined": "charmap.XUserDefined", |
||||||
|
} |
@ -0,0 +1,235 @@ |
|||||||
|
// generated by go run gen.go; DO NOT EDIT
|
||||||
|
|
||||||
|
package charset |
||||||
|
|
||||||
|
import ( |
||||||
|
"golang.org/x/text/encoding" |
||||||
|
"golang.org/x/text/encoding/charmap" |
||||||
|
"golang.org/x/text/encoding/japanese" |
||||||
|
"golang.org/x/text/encoding/korean" |
||||||
|
"golang.org/x/text/encoding/simplifiedchinese" |
||||||
|
"golang.org/x/text/encoding/traditionalchinese" |
||||||
|
"golang.org/x/text/encoding/unicode" |
||||||
|
) |
||||||
|
|
||||||
|
var encodings = map[string]struct { |
||||||
|
e encoding.Encoding |
||||||
|
name string |
||||||
|
}{ |
||||||
|
"unicode-1-1-utf-8": {encoding.Nop, "utf-8"}, |
||||||
|
"utf-8": {encoding.Nop, "utf-8"}, |
||||||
|
"utf8": {encoding.Nop, "utf-8"}, |
||||||
|
"866": {charmap.CodePage866, "ibm866"}, |
||||||
|
"cp866": {charmap.CodePage866, "ibm866"}, |
||||||
|
"csibm866": {charmap.CodePage866, "ibm866"}, |
||||||
|
"ibm866": {charmap.CodePage866, "ibm866"}, |
||||||
|
"csisolatin2": {charmap.ISO8859_2, "iso-8859-2"}, |
||||||
|
"iso-8859-2": {charmap.ISO8859_2, "iso-8859-2"}, |
||||||
|
"iso-ir-101": {charmap.ISO8859_2, "iso-8859-2"}, |
||||||
|
"iso8859-2": {charmap.ISO8859_2, "iso-8859-2"}, |
||||||
|
"iso88592": {charmap.ISO8859_2, "iso-8859-2"}, |
||||||
|
"iso_8859-2": {charmap.ISO8859_2, "iso-8859-2"}, |
||||||
|
"iso_8859-2:1987": {charmap.ISO8859_2, "iso-8859-2"}, |
||||||
|
"l2": {charmap.ISO8859_2, "iso-8859-2"}, |
||||||
|
"latin2": {charmap.ISO8859_2, "iso-8859-2"}, |
||||||
|
"csisolatin3": {charmap.ISO8859_3, "iso-8859-3"}, |
||||||
|
"iso-8859-3": {charmap.ISO8859_3, "iso-8859-3"}, |
||||||
|
"iso-ir-109": {charmap.ISO8859_3, "iso-8859-3"}, |
||||||
|
"iso8859-3": {charmap.ISO8859_3, "iso-8859-3"}, |
||||||
|
"iso88593": {charmap.ISO8859_3, "iso-8859-3"}, |
||||||
|
"iso_8859-3": {charmap.ISO8859_3, "iso-8859-3"}, |
||||||
|
"iso_8859-3:1988": {charmap.ISO8859_3, "iso-8859-3"}, |
||||||
|
"l3": {charmap.ISO8859_3, "iso-8859-3"}, |
||||||
|
"latin3": {charmap.ISO8859_3, "iso-8859-3"}, |
||||||
|
"csisolatin4": {charmap.ISO8859_4, "iso-8859-4"}, |
||||||
|
"iso-8859-4": {charmap.ISO8859_4, "iso-8859-4"}, |
||||||
|
"iso-ir-110": {charmap.ISO8859_4, "iso-8859-4"}, |
||||||
|
"iso8859-4": {charmap.ISO8859_4, "iso-8859-4"}, |
||||||
|
"iso88594": {charmap.ISO8859_4, "iso-8859-4"}, |
||||||
|
"iso_8859-4": {charmap.ISO8859_4, "iso-8859-4"}, |
||||||
|
"iso_8859-4:1988": {charmap.ISO8859_4, "iso-8859-4"}, |
||||||
|
"l4": {charmap.ISO8859_4, "iso-8859-4"}, |
||||||
|
"latin4": {charmap.ISO8859_4, "iso-8859-4"}, |
||||||
|
"csisolatincyrillic": {charmap.ISO8859_5, "iso-8859-5"}, |
||||||
|
"cyrillic": {charmap.ISO8859_5, "iso-8859-5"}, |
||||||
|
"iso-8859-5": {charmap.ISO8859_5, "iso-8859-5"}, |
||||||
|
"iso-ir-144": {charmap.ISO8859_5, "iso-8859-5"}, |
||||||
|
"iso8859-5": {charmap.ISO8859_5, "iso-8859-5"}, |
||||||
|
"iso88595": {charmap.ISO8859_5, "iso-8859-5"}, |
||||||
|
"iso_8859-5": {charmap.ISO8859_5, "iso-8859-5"}, |
||||||
|
"iso_8859-5:1988": {charmap.ISO8859_5, "iso-8859-5"}, |
||||||
|
"arabic": {charmap.ISO8859_6, "iso-8859-6"}, |
||||||
|
"asmo-708": {charmap.ISO8859_6, "iso-8859-6"}, |
||||||
|
"csiso88596e": {charmap.ISO8859_6, "iso-8859-6"}, |
||||||
|
"csiso88596i": {charmap.ISO8859_6, "iso-8859-6"}, |
||||||
|
"csisolatinarabic": {charmap.ISO8859_6, "iso-8859-6"}, |
||||||
|
"ecma-114": {charmap.ISO8859_6, "iso-8859-6"}, |
||||||
|
"iso-8859-6": {charmap.ISO8859_6, "iso-8859-6"}, |
||||||
|
"iso-8859-6-e": {charmap.ISO8859_6, "iso-8859-6"}, |
||||||
|
"iso-8859-6-i": {charmap.ISO8859_6, "iso-8859-6"}, |
||||||
|
"iso-ir-127": {charmap.ISO8859_6, "iso-8859-6"}, |
||||||
|
"iso8859-6": {charmap.ISO8859_6, "iso-8859-6"}, |
||||||
|
"iso88596": {charmap.ISO8859_6, "iso-8859-6"}, |
||||||
|
"iso_8859-6": {charmap.ISO8859_6, "iso-8859-6"}, |
||||||
|
"iso_8859-6:1987": {charmap.ISO8859_6, "iso-8859-6"}, |
||||||
|
"csisolatingreek": {charmap.ISO8859_7, "iso-8859-7"}, |
||||||
|
"ecma-118": {charmap.ISO8859_7, "iso-8859-7"}, |
||||||
|
"elot_928": {charmap.ISO8859_7, "iso-8859-7"}, |
||||||
|
"greek": {charmap.ISO8859_7, "iso-8859-7"}, |
||||||
|
"greek8": {charmap.ISO8859_7, "iso-8859-7"}, |
||||||
|
"iso-8859-7": {charmap.ISO8859_7, "iso-8859-7"}, |
||||||
|
"iso-ir-126": {charmap.ISO8859_7, "iso-8859-7"}, |
||||||
|
"iso8859-7": {charmap.ISO8859_7, "iso-8859-7"}, |
||||||
|
"iso88597": {charmap.ISO8859_7, "iso-8859-7"}, |
||||||
|
"iso_8859-7": {charmap.ISO8859_7, "iso-8859-7"}, |
||||||
|
"iso_8859-7:1987": {charmap.ISO8859_7, "iso-8859-7"}, |
||||||
|
"sun_eu_greek": {charmap.ISO8859_7, "iso-8859-7"}, |
||||||
|
"csiso88598e": {charmap.ISO8859_8, "iso-8859-8"}, |
||||||
|
"csisolatinhebrew": {charmap.ISO8859_8, "iso-8859-8"}, |
||||||
|
"hebrew": {charmap.ISO8859_8, "iso-8859-8"}, |
||||||
|
"iso-8859-8": {charmap.ISO8859_8, "iso-8859-8"}, |
||||||
|
"iso-8859-8-e": {charmap.ISO8859_8, "iso-8859-8"}, |
||||||
|
"iso-ir-138": {charmap.ISO8859_8, "iso-8859-8"}, |
||||||
|
"iso8859-8": {charmap.ISO8859_8, "iso-8859-8"}, |
||||||
|
"iso88598": {charmap.ISO8859_8, "iso-8859-8"}, |
||||||
|
"iso_8859-8": {charmap.ISO8859_8, "iso-8859-8"}, |
||||||
|
"iso_8859-8:1988": {charmap.ISO8859_8, "iso-8859-8"}, |
||||||
|
"visual": {charmap.ISO8859_8, "iso-8859-8"}, |
||||||
|
"csiso88598i": {charmap.ISO8859_8, "iso-8859-8-i"}, |
||||||
|
"iso-8859-8-i": {charmap.ISO8859_8, "iso-8859-8-i"}, |
||||||
|
"logical": {charmap.ISO8859_8, "iso-8859-8-i"}, |
||||||
|
"csisolatin6": {charmap.ISO8859_10, "iso-8859-10"}, |
||||||
|
"iso-8859-10": {charmap.ISO8859_10, "iso-8859-10"}, |
||||||
|
"iso-ir-157": {charmap.ISO8859_10, "iso-8859-10"}, |
||||||
|
"iso8859-10": {charmap.ISO8859_10, "iso-8859-10"}, |
||||||
|
"iso885910": {charmap.ISO8859_10, "iso-8859-10"}, |
||||||
|
"l6": {charmap.ISO8859_10, "iso-8859-10"}, |
||||||
|
"latin6": {charmap.ISO8859_10, "iso-8859-10"}, |
||||||
|
"iso-8859-13": {charmap.ISO8859_13, "iso-8859-13"}, |
||||||
|
"iso8859-13": {charmap.ISO8859_13, "iso-8859-13"}, |
||||||
|
"iso885913": {charmap.ISO8859_13, "iso-8859-13"}, |
||||||
|
"iso-8859-14": {charmap.ISO8859_14, "iso-8859-14"}, |
||||||
|
"iso8859-14": {charmap.ISO8859_14, "iso-8859-14"}, |
||||||
|
"iso885914": {charmap.ISO8859_14, "iso-8859-14"}, |
||||||
|
"csisolatin9": {charmap.ISO8859_15, "iso-8859-15"}, |
||||||
|
"iso-8859-15": {charmap.ISO8859_15, "iso-8859-15"}, |
||||||
|
"iso8859-15": {charmap.ISO8859_15, "iso-8859-15"}, |
||||||
|
"iso885915": {charmap.ISO8859_15, "iso-8859-15"}, |
||||||
|
"iso_8859-15": {charmap.ISO8859_15, "iso-8859-15"}, |
||||||
|
"l9": {charmap.ISO8859_15, "iso-8859-15"}, |
||||||
|
"iso-8859-16": {charmap.ISO8859_16, "iso-8859-16"}, |
||||||
|
"cskoi8r": {charmap.KOI8R, "koi8-r"}, |
||||||
|
"koi": {charmap.KOI8R, "koi8-r"}, |
||||||
|
"koi8": {charmap.KOI8R, "koi8-r"}, |
||||||
|
"koi8-r": {charmap.KOI8R, "koi8-r"}, |
||||||
|
"koi8_r": {charmap.KOI8R, "koi8-r"}, |
||||||
|
"koi8-u": {charmap.KOI8U, "koi8-u"}, |
||||||
|
"csmacintosh": {charmap.Macintosh, "macintosh"}, |
||||||
|
"mac": {charmap.Macintosh, "macintosh"}, |
||||||
|
"macintosh": {charmap.Macintosh, "macintosh"}, |
||||||
|
"x-mac-roman": {charmap.Macintosh, "macintosh"}, |
||||||
|
"dos-874": {charmap.Windows874, "windows-874"}, |
||||||
|
"iso-8859-11": {charmap.Windows874, "windows-874"}, |
||||||
|
"iso8859-11": {charmap.Windows874, "windows-874"}, |
||||||
|
"iso885911": {charmap.Windows874, "windows-874"}, |
||||||
|
"tis-620": {charmap.Windows874, "windows-874"}, |
||||||
|
"windows-874": {charmap.Windows874, "windows-874"}, |
||||||
|
"cp1250": {charmap.Windows1250, "windows-1250"}, |
||||||
|
"windows-1250": {charmap.Windows1250, "windows-1250"}, |
||||||
|
"x-cp1250": {charmap.Windows1250, "windows-1250"}, |
||||||
|
"cp1251": {charmap.Windows1251, "windows-1251"}, |
||||||
|
"windows-1251": {charmap.Windows1251, "windows-1251"}, |
||||||
|
"x-cp1251": {charmap.Windows1251, "windows-1251"}, |
||||||
|
"ansi_x3.4-1968": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"ascii": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"cp1252": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"cp819": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"csisolatin1": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"ibm819": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"iso-8859-1": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"iso-ir-100": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"iso8859-1": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"iso88591": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"iso_8859-1": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"iso_8859-1:1987": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"l1": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"latin1": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"us-ascii": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"windows-1252": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"x-cp1252": {charmap.Windows1252, "windows-1252"}, |
||||||
|
"cp1253": {charmap.Windows1253, "windows-1253"}, |
||||||
|
"windows-1253": {charmap.Windows1253, "windows-1253"}, |
||||||
|
"x-cp1253": {charmap.Windows1253, "windows-1253"}, |
||||||
|
"cp1254": {charmap.Windows1254, "windows-1254"}, |
||||||
|
"csisolatin5": {charmap.Windows1254, "windows-1254"}, |
||||||
|
"iso-8859-9": {charmap.Windows1254, "windows-1254"}, |
||||||
|
"iso-ir-148": {charmap.Windows1254, "windows-1254"}, |
||||||
|
"iso8859-9": {charmap.Windows1254, "windows-1254"}, |
||||||
|
"iso88599": {charmap.Windows1254, "windows-1254"}, |
||||||
|
"iso_8859-9": {charmap.Windows1254, "windows-1254"}, |
||||||
|
"iso_8859-9:1989": {charmap.Windows1254, "windows-1254"}, |
||||||
|
"l5": {charmap.Windows1254, "windows-1254"}, |
||||||
|
"latin5": {charmap.Windows1254, "windows-1254"}, |
||||||
|
"windows-1254": {charmap.Windows1254, "windows-1254"}, |
||||||
|
"x-cp1254": {charmap.Windows1254, "windows-1254"}, |
||||||
|
"cp1255": {charmap.Windows1255, "windows-1255"}, |
||||||
|
"windows-1255": {charmap.Windows1255, "windows-1255"}, |
||||||
|
"x-cp1255": {charmap.Windows1255, "windows-1255"}, |
||||||
|
"cp1256": {charmap.Windows1256, "windows-1256"}, |
||||||
|
"windows-1256": {charmap.Windows1256, "windows-1256"}, |
||||||
|
"x-cp1256": {charmap.Windows1256, "windows-1256"}, |
||||||
|
"cp1257": {charmap.Windows1257, "windows-1257"}, |
||||||
|
"windows-1257": {charmap.Windows1257, "windows-1257"}, |
||||||
|
"x-cp1257": {charmap.Windows1257, "windows-1257"}, |
||||||
|
"cp1258": {charmap.Windows1258, "windows-1258"}, |
||||||
|
"windows-1258": {charmap.Windows1258, "windows-1258"}, |
||||||
|
"x-cp1258": {charmap.Windows1258, "windows-1258"}, |
||||||
|
"x-mac-cyrillic": {charmap.MacintoshCyrillic, "x-mac-cyrillic"}, |
||||||
|
"x-mac-ukrainian": {charmap.MacintoshCyrillic, "x-mac-cyrillic"}, |
||||||
|
"chinese": {simplifiedchinese.GBK, "gbk"}, |
||||||
|
"csgb2312": {simplifiedchinese.GBK, "gbk"}, |
||||||
|
"csiso58gb231280": {simplifiedchinese.GBK, "gbk"}, |
||||||
|
"gb2312": {simplifiedchinese.GBK, "gbk"}, |
||||||
|
"gb_2312": {simplifiedchinese.GBK, "gbk"}, |
||||||
|
"gb_2312-80": {simplifiedchinese.GBK, "gbk"}, |
||||||
|
"gbk": {simplifiedchinese.GBK, "gbk"}, |
||||||
|
"iso-ir-58": {simplifiedchinese.GBK, "gbk"}, |
||||||
|
"x-gbk": {simplifiedchinese.GBK, "gbk"}, |
||||||
|
"gb18030": {simplifiedchinese.GB18030, "gb18030"}, |
||||||
|
"hz-gb-2312": {simplifiedchinese.HZGB2312, "hz-gb-2312"}, |
||||||
|
"big5": {traditionalchinese.Big5, "big5"}, |
||||||
|
"big5-hkscs": {traditionalchinese.Big5, "big5"}, |
||||||
|
"cn-big5": {traditionalchinese.Big5, "big5"}, |
||||||
|
"csbig5": {traditionalchinese.Big5, "big5"}, |
||||||
|
"x-x-big5": {traditionalchinese.Big5, "big5"}, |
||||||
|
"cseucpkdfmtjapanese": {japanese.EUCJP, "euc-jp"}, |
||||||
|
"euc-jp": {japanese.EUCJP, "euc-jp"}, |
||||||
|
"x-euc-jp": {japanese.EUCJP, "euc-jp"}, |
||||||
|
"csiso2022jp": {japanese.ISO2022JP, "iso-2022-jp"}, |
||||||
|
"iso-2022-jp": {japanese.ISO2022JP, "iso-2022-jp"}, |
||||||
|
"csshiftjis": {japanese.ShiftJIS, "shift_jis"}, |
||||||
|
"ms_kanji": {japanese.ShiftJIS, "shift_jis"}, |
||||||
|
"shift-jis": {japanese.ShiftJIS, "shift_jis"}, |
||||||
|
"shift_jis": {japanese.ShiftJIS, "shift_jis"}, |
||||||
|
"sjis": {japanese.ShiftJIS, "shift_jis"}, |
||||||
|
"windows-31j": {japanese.ShiftJIS, "shift_jis"}, |
||||||
|
"x-sjis": {japanese.ShiftJIS, "shift_jis"}, |
||||||
|
"cseuckr": {korean.EUCKR, "euc-kr"}, |
||||||
|
"csksc56011987": {korean.EUCKR, "euc-kr"}, |
||||||
|
"euc-kr": {korean.EUCKR, "euc-kr"}, |
||||||
|
"iso-ir-149": {korean.EUCKR, "euc-kr"}, |
||||||
|
"korean": {korean.EUCKR, "euc-kr"}, |
||||||
|
"ks_c_5601-1987": {korean.EUCKR, "euc-kr"}, |
||||||
|
"ks_c_5601-1989": {korean.EUCKR, "euc-kr"}, |
||||||
|
"ksc5601": {korean.EUCKR, "euc-kr"}, |
||||||
|
"ksc_5601": {korean.EUCKR, "euc-kr"}, |
||||||
|
"windows-949": {korean.EUCKR, "euc-kr"}, |
||||||
|
"csiso2022kr": {encoding.Replacement, "replacement"}, |
||||||
|
"iso-2022-kr": {encoding.Replacement, "replacement"}, |
||||||
|
"iso-2022-cn": {encoding.Replacement, "replacement"}, |
||||||
|
"iso-2022-cn-ext": {encoding.Replacement, "replacement"}, |
||||||
|
"utf-16be": {unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM), "utf-16be"}, |
||||||
|
"utf-16": {unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), "utf-16le"}, |
||||||
|
"utf-16le": {unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), "utf-16le"}, |
||||||
|
"x-user-defined": {charmap.XUserDefined, "x-user-defined"}, |
||||||
|
} |
48
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/HTTP-charset.html
generated
vendored
48
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/HTTP-charset.html
generated
vendored
@ -0,0 +1,48 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en" > |
||||||
|
<head> |
||||||
|
<title>HTTP charset</title> |
||||||
|
<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> |
||||||
|
<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'> |
||||||
|
<link rel="stylesheet" type="text/css" href="./generatedtests.css"> |
||||||
|
<script src="http://w3c-test.org/resources/testharness.js"></script> |
||||||
|
<script src="http://w3c-test.org/resources/testharnessreport.js"></script> |
||||||
|
<meta name='flags' content='http'> |
||||||
|
<meta name="assert" content="The character encoding of a page can be set using the HTTP header charset declaration."> |
||||||
|
<style type='text/css'> |
||||||
|
.test div { width: 50px; }</style> |
||||||
|
<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-15.css"> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<p class='title'>HTTP charset</p> |
||||||
|
|
||||||
|
|
||||||
|
<div id='log'></div> |
||||||
|
|
||||||
|
|
||||||
|
<div class='test'><div id='box' class='ýäè'> </div></div> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class='description'> |
||||||
|
<p class="assertion" title="Assertion">The character encoding of a page can be set using the HTTP header charset declaration.</p> |
||||||
|
<div class="notes"><p><p>The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.ÜÀÚ</code>. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.</p><p>The only character encoding declaration for this HTML file is in the HTTP header, which sets the encoding to ISO 8859-15.</p></p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-003">Next test</a></div><div class="doctype">HTML5</div> |
||||||
|
<p class="jump">the-input-byte-stream-001<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#basics" target="_blank">Result summary & related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-001" target="_blank">Detailed results for this test</a><br/> <a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p> |
||||||
|
<div class='prereq'>Assumptions: <ul><li>The default encoding for the browser you are testing is not set to ISO 8859-15.</li> |
||||||
|
<li>The test is read from a server that supports HTTP.</li></ul></div> |
||||||
|
</div> |
||||||
|
<script> |
||||||
|
test(function() { |
||||||
|
assert_equals(document.getElementById('box').offsetWidth, 100); |
||||||
|
}, " "); |
||||||
|
</script> |
||||||
|
|
||||||
|
</body> |
||||||
|
</html> |
||||||
|
|
||||||
|
|
48
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html
generated
vendored
48
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html
generated
vendored
49
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html
generated
vendored
49
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html
generated
vendored
@ -0,0 +1,49 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en" > |
||||||
|
<head> |
||||||
|
<meta charset="iso-8859-1" > <title>HTTP vs meta charset</title> |
||||||
|
<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> |
||||||
|
<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'> |
||||||
|
<link rel="stylesheet" type="text/css" href="./generatedtests.css"> |
||||||
|
<script src="http://w3c-test.org/resources/testharness.js"></script> |
||||||
|
<script src="http://w3c-test.org/resources/testharnessreport.js"></script> |
||||||
|
<meta name='flags' content='http'> |
||||||
|
<meta name="assert" content="The HTTP header has a higher precedence than an encoding declaration in a meta charset attribute."> |
||||||
|
<style type='text/css'> |
||||||
|
.test div { width: 50px; }.test div { width: 90px; } |
||||||
|
</style> |
||||||
|
<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-15.css"> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<p class='title'>HTTP vs meta charset</p> |
||||||
|
|
||||||
|
|
||||||
|
<div id='log'></div> |
||||||
|
|
||||||
|
|
||||||
|
<div class='test'><div id='box' class='ýäè'> </div></div> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class='description'> |
||||||
|
<p class="assertion" title="Assertion">The HTTP header has a higher precedence than an encoding declaration in a meta charset attribute.</p> |
||||||
|
<div class="notes"><p><p>The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-1.</p><p>The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.ÜÀÚ</code>. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.</p></p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-037">Next test</a></div><div class="doctype">HTML5</div> |
||||||
|
<p class="jump">the-input-byte-stream-018<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#precedence" target="_blank">Result summary & related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-018" target="_blank">Detailed results for this test</a><br/> <a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p> |
||||||
|
<div class='prereq'>Assumptions: <ul><li>The default encoding for the browser you are testing is not set to ISO 8859-15.</li> |
||||||
|
<li>The test is read from a server that supports HTTP.</li></ul></div> |
||||||
|
</div> |
||||||
|
<script> |
||||||
|
test(function() { |
||||||
|
assert_equals(document.getElementById('box').offsetWidth, 100); |
||||||
|
}, " "); |
||||||
|
</script> |
||||||
|
|
||||||
|
</body> |
||||||
|
</html> |
||||||
|
|
||||||
|
|
49
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html
generated
vendored
49
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html
generated
vendored
@ -0,0 +1,49 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en" > |
||||||
|
<head> |
||||||
|
<meta http-equiv="content-type" content="text/html;charset=iso-8859-1" > <title>HTTP vs meta content</title> |
||||||
|
<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> |
||||||
|
<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'> |
||||||
|
<link rel="stylesheet" type="text/css" href="./generatedtests.css"> |
||||||
|
<script src="http://w3c-test.org/resources/testharness.js"></script> |
||||||
|
<script src="http://w3c-test.org/resources/testharnessreport.js"></script> |
||||||
|
<meta name='flags' content='http'> |
||||||
|
<meta name="assert" content="The HTTP header has a higher precedence than an encoding declaration in a meta content attribute."> |
||||||
|
<style type='text/css'> |
||||||
|
.test div { width: 50px; }.test div { width: 90px; } |
||||||
|
</style> |
||||||
|
<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-15.css"> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<p class='title'>HTTP vs meta content</p> |
||||||
|
|
||||||
|
|
||||||
|
<div id='log'></div> |
||||||
|
|
||||||
|
|
||||||
|
<div class='test'><div id='box' class='ýäè'> </div></div> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class='description'> |
||||||
|
<p class="assertion" title="Assertion">The HTTP header has a higher precedence than an encoding declaration in a meta content attribute.</p> |
||||||
|
<div class="notes"><p><p>The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-1.</p><p>The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.ÜÀÚ</code>. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.</p></p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-018">Next test</a></div><div class="doctype">HTML5</div> |
||||||
|
<p class="jump">the-input-byte-stream-016<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#precedence" target="_blank">Result summary & related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-016" target="_blank">Detailed results for this test</a><br/> <a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p> |
||||||
|
<div class='prereq'>Assumptions: <ul><li>The default encoding for the browser you are testing is not set to ISO 8859-15.</li> |
||||||
|
<li>The test is read from a server that supports HTTP.</li></ul></div> |
||||||
|
</div> |
||||||
|
<script> |
||||||
|
test(function() { |
||||||
|
assert_equals(document.getElementById('box').offsetWidth, 100); |
||||||
|
}, " "); |
||||||
|
</script> |
||||||
|
|
||||||
|
</body> |
||||||
|
</html> |
||||||
|
|
||||||
|
|
@ -0,0 +1,47 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en" > |
||||||
|
<head> |
||||||
|
<title>No encoding declaration</title> |
||||||
|
<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> |
||||||
|
<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'> |
||||||
|
<link rel="stylesheet" type="text/css" href="./generatedtests.css"> |
||||||
|
<script src="http://w3c-test.org/resources/testharness.js"></script> |
||||||
|
<script src="http://w3c-test.org/resources/testharnessreport.js"></script> |
||||||
|
<meta name='flags' content='http'> |
||||||
|
<meta name="assert" content="A page with no encoding information in HTTP, BOM, XML declaration or meta element will be treated as UTF-8."> |
||||||
|
<style type='text/css'> |
||||||
|
.test div { width: 50px; }</style> |
||||||
|
<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-utf8.css"> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<p class='title'>No encoding declaration</p> |
||||||
|
|
||||||
|
|
||||||
|
<div id='log'></div> |
||||||
|
|
||||||
|
|
||||||
|
<div class='test'><div id='box' class='ýäè'> </div></div> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class='description'> |
||||||
|
<p class="assertion" title="Assertion">A page with no encoding information in HTTP, BOM, XML declaration or meta element will be treated as UTF-8.</p> |
||||||
|
<div class="notes"><p><p>The test on this page contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.ýäè</code>. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.</p></p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-034">Next test</a></div><div class="doctype">HTML5</div> |
||||||
|
<p class="jump">the-input-byte-stream-015<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#basics" target="_blank">Result summary & related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-015" target="_blank">Detailed results for this test</a><br/> <a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p> |
||||||
|
<div class='prereq'>Assumptions: <ul><li>The test is read from a server that supports HTTP.</li></ul></div> |
||||||
|
</div> |
||||||
|
<script> |
||||||
|
test(function() { |
||||||
|
assert_equals(document.getElementById('box').offsetWidth, 100); |
||||||
|
}, " "); |
||||||
|
</script> |
||||||
|
|
||||||
|
</body> |
||||||
|
</html> |
||||||
|
|
||||||
|
|
@ -0,0 +1,9 @@ |
|||||||
|
These test cases come from |
||||||
|
http://www.w3.org/International/tests/repository/html5/the-input-byte-stream/results-basics |
||||||
|
|
||||||
|
Distributed under both the W3C Test Suite License |
||||||
|
(http://www.w3.org/Consortium/Legal/2008/04-testsuite-license) |
||||||
|
and the W3C 3-clause BSD License |
||||||
|
(http://www.w3.org/Consortium/Legal/2008/03-bsd-license). |
||||||
|
To contribute to a W3C Test Suite, see the policies and contribution |
||||||
|
forms (http://www.w3.org/2004/10/27-testcases). |
BIN
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html
generated
vendored
BIN
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html
generated
vendored
Binary file not shown.
BIN
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html
generated
vendored
BIN
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html
generated
vendored
Binary file not shown.
48
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html
generated
vendored
48
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html
generated
vendored
@ -0,0 +1,48 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en" > |
||||||
|
<head> |
||||||
|
<meta charset="iso-8859-15"> <title>meta charset attribute</title> |
||||||
|
<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> |
||||||
|
<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'> |
||||||
|
<link rel="stylesheet" type="text/css" href="./generatedtests.css"> |
||||||
|
<script src="http://w3c-test.org/resources/testharness.js"></script> |
||||||
|
<script src="http://w3c-test.org/resources/testharnessreport.js"></script> |
||||||
|
<meta name='flags' content='http'> |
||||||
|
<meta name="assert" content="The character encoding of the page can be set by a meta element with charset attribute."> |
||||||
|
<style type='text/css'> |
||||||
|
.test div { width: 50px; }</style> |
||||||
|
<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-15.css"> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<p class='title'>meta charset attribute</p> |
||||||
|
|
||||||
|
|
||||||
|
<div id='log'></div> |
||||||
|
|
||||||
|
|
||||||
|
<div class='test'><div id='box' class='ýäè'> </div></div> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class='description'> |
||||||
|
<p class="assertion" title="Assertion">The character encoding of the page can be set by a meta element with charset attribute.</p> |
||||||
|
<div class="notes"><p><p>The only character encoding declaration for this HTML file is in the charset attribute of the meta element, which declares the encoding to be ISO 8859-15.</p><p>The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.ÜÀÚ</code>. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.</p></p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-015">Next test</a></div><div class="doctype">HTML5</div> |
||||||
|
<p class="jump">the-input-byte-stream-009<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#basics" target="_blank">Result summary & related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-009" target="_blank">Detailed results for this test</a><br/> <a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p> |
||||||
|
<div class='prereq'>Assumptions: <ul><li>The default encoding for the browser you are testing is not set to ISO 8859-15.</li> |
||||||
|
<li>The test is read from a server that supports HTTP.</li></ul></div> |
||||||
|
</div> |
||||||
|
<script> |
||||||
|
test(function() { |
||||||
|
assert_equals(document.getElementById('box').offsetWidth, 100); |
||||||
|
}, " "); |
||||||
|
</script> |
||||||
|
|
||||||
|
</body> |
||||||
|
</html> |
||||||
|
|
||||||
|
|
48
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/meta-content-attribute.html
generated
vendored
48
Godeps/_workspace/src/golang.org/x/net/html/charset/testdata/meta-content-attribute.html
generated
vendored
@ -0,0 +1,48 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en" > |
||||||
|
<head> |
||||||
|
<meta http-equiv="content-type" content="text/html; charset=iso-8859-15"> <title>meta content attribute</title> |
||||||
|
<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> |
||||||
|
<link rel='help' href='http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream'> |
||||||
|
<link rel="stylesheet" type="text/css" href="./generatedtests.css"> |
||||||
|
<script src="http://w3c-test.org/resources/testharness.js"></script> |
||||||
|
<script src="http://w3c-test.org/resources/testharnessreport.js"></script> |
||||||
|
<meta name='flags' content='http'> |
||||||
|
<meta name="assert" content="The character encoding of the page can be set by a meta element with http-equiv and content attributes."> |
||||||
|
<style type='text/css'> |
||||||
|
.test div { width: 50px; }</style> |
||||||
|
<link rel="stylesheet" type="text/css" href="the-input-byte-stream/support/encodingtests-15.css"> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<p class='title'>meta content attribute</p> |
||||||
|
|
||||||
|
|
||||||
|
<div id='log'></div> |
||||||
|
|
||||||
|
|
||||||
|
<div class='test'><div id='box' class='ýäè'> </div></div> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class='description'> |
||||||
|
<p class="assertion" title="Assertion">The character encoding of the page can be set by a meta element with http-equiv and content attributes.</p> |
||||||
|
<div class="notes"><p><p>The only character encoding declaration for this HTML file is in the content attribute of the meta element, which declares the encoding to be ISO 8859-15.</p><p>The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector <code>.test div.ÜÀÚ</code>. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.</p></p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="nexttest"><div><a href="generate?test=the-input-byte-stream-009">Next test</a></div><div class="doctype">HTML5</div> |
||||||
|
<p class="jump">the-input-byte-stream-007<br /><a href="/International/tests/html5/the-input-byte-stream/results-basics#basics" target="_blank">Result summary & related tests</a><br /><a href="http://w3c-test.org/framework/details/i18n-html5/the-input-byte-stream-007" target="_blank">Detailed results for this test</a><br/> <a href="http://www.w3.org/TR/html5/syntax.html#the-input-byte-stream" target="_blank">Link to spec</a></p> |
||||||
|
<div class='prereq'>Assumptions: <ul><li>The default encoding for the browser you are testing is not set to ISO 8859-15.</li> |
||||||
|
<li>The test is read from a server that supports HTTP.</li></ul></div> |
||||||
|
</div> |
||||||
|
<script> |
||||||
|
test(function() { |
||||||
|
assert_equals(document.getElementById('box').offsetWidth, 100); |
||||||
|
}, " "); |
||||||
|
</script> |
||||||
|
|
||||||
|
</body> |
||||||
|
</html> |
||||||
|
|
||||||
|
|
@ -0,0 +1,102 @@ |
|||||||
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package html |
||||||
|
|
||||||
|
// Section 12.2.3.2 of the HTML5 specification says "The following elements
|
||||||
|
// have varying levels of special parsing rules".
|
||||||
|
// https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements
|
||||||
|
var isSpecialElementMap = map[string]bool{ |
||||||
|
"address": true, |
||||||
|
"applet": true, |
||||||
|
"area": true, |
||||||
|
"article": true, |
||||||
|
"aside": true, |
||||||
|
"base": true, |
||||||
|
"basefont": true, |
||||||
|
"bgsound": true, |
||||||
|
"blockquote": true, |
||||||
|
"body": true, |
||||||
|
"br": true, |
||||||
|
"button": true, |
||||||
|
"caption": true, |
||||||
|
"center": true, |
||||||
|
"col": true, |
||||||
|
"colgroup": true, |
||||||
|
"dd": true, |
||||||
|
"details": true, |
||||||
|
"dir": true, |
||||||
|
"div": true, |
||||||
|
"dl": true, |
||||||
|
"dt": true, |
||||||
|
"embed": true, |
||||||
|
"fieldset": true, |
||||||
|
"figcaption": true, |
||||||
|
"figure": true, |
||||||
|
"footer": true, |
||||||
|
"form": true, |
||||||
|
"frame": true, |
||||||
|
"frameset": true, |
||||||
|
"h1": true, |
||||||
|
"h2": true, |
||||||
|
"h3": true, |
||||||
|
"h4": true, |
||||||
|
"h5": true, |
||||||
|
"h6": true, |
||||||
|
"head": true, |
||||||
|
"header": true, |
||||||
|
"hgroup": true, |
||||||
|
"hr": true, |
||||||
|
"html": true, |
||||||
|
"iframe": true, |
||||||
|
"img": true, |
||||||
|
"input": true, |
||||||
|
"isindex": true, |
||||||
|
"li": true, |
||||||
|
"link": true, |
||||||
|
"listing": true, |
||||||
|
"marquee": true, |
||||||
|
"menu": true, |
||||||
|
"meta": true, |
||||||
|
"nav": true, |
||||||
|
"noembed": true, |
||||||
|
"noframes": true, |
||||||
|
"noscript": true, |
||||||
|
"object": true, |
||||||
|
"ol": true, |
||||||
|
"p": true, |
||||||
|
"param": true, |
||||||
|
"plaintext": true, |
||||||
|
"pre": true, |
||||||
|
"script": true, |
||||||
|
"section": true, |
||||||
|
"select": true, |
||||||
|
"source": true, |
||||||
|
"style": true, |
||||||
|
"summary": true, |
||||||
|
"table": true, |
||||||
|
"tbody": true, |
||||||
|
"td": true, |
||||||
|
"template": true, |
||||||
|
"textarea": true, |
||||||
|
"tfoot": true, |
||||||
|
"th": true, |
||||||
|
"thead": true, |
||||||
|
"title": true, |
||||||
|
"tr": true, |
||||||
|
"track": true, |
||||||
|
"ul": true, |
||||||
|
"wbr": true, |
||||||
|
"xmp": true, |
||||||
|
} |
||||||
|
|
||||||
|
func isSpecialElement(element *Node) bool { |
||||||
|
switch element.Namespace { |
||||||
|
case "", "html": |
||||||
|
return isSpecialElementMap[element.Data] |
||||||
|
case "svg": |
||||||
|
return element.Data == "foreignObject" |
||||||
|
} |
||||||
|
return false |
||||||
|
} |
@ -0,0 +1,106 @@ |
|||||||
|
// Copyright 2010 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
/* |
||||||
|
Package html implements an HTML5-compliant tokenizer and parser. |
||||||
|
|
||||||
|
Tokenization is done by creating a Tokenizer for an io.Reader r. It is the |
||||||
|
caller's responsibility to ensure that r provides UTF-8 encoded HTML. |
||||||
|
|
||||||
|
z := html.NewTokenizer(r) |
||||||
|
|
||||||
|
Given a Tokenizer z, the HTML is tokenized by repeatedly calling z.Next(), |
||||||
|
which parses the next token and returns its type, or an error: |
||||||
|
|
||||||
|
for { |
||||||
|
tt := z.Next() |
||||||
|
if tt == html.ErrorToken { |
||||||
|
// ...
|
||||||
|
return ... |
||||||
|
} |
||||||
|
// Process the current token.
|
||||||
|
} |
||||||
|
|
||||||
|
There are two APIs for retrieving the current token. The high-level API is to |
||||||
|
call Token; the low-level API is to call Text or TagName / TagAttr. Both APIs |
||||||
|
allow optionally calling Raw after Next but before Token, Text, TagName, or |
||||||
|
TagAttr. In EBNF notation, the valid call sequence per token is: |
||||||
|
|
||||||
|
Next {Raw} [ Token | Text | TagName {TagAttr} ] |
||||||
|
|
||||||
|
Token returns an independent data structure that completely describes a token. |
||||||
|
Entities (such as "<") are unescaped, tag names and attribute keys are |
||||||
|
lower-cased, and attributes are collected into a []Attribute. For example: |
||||||
|
|
||||||
|
for { |
||||||
|
if z.Next() == html.ErrorToken { |
||||||
|
// Returning io.EOF indicates success.
|
||||||
|
return z.Err() |
||||||
|
} |
||||||
|
emitToken(z.Token()) |
||||||
|
} |
||||||
|
|
||||||
|
The low-level API performs fewer allocations and copies, but the contents of |
||||||
|
the []byte values returned by Text, TagName and TagAttr may change on the next |
||||||
|
call to Next. For example, to extract an HTML page's anchor text: |
||||||
|
|
||||||
|
depth := 0 |
||||||
|
for { |
||||||
|
tt := z.Next() |
||||||
|
switch tt { |
||||||
|
case ErrorToken: |
||||||
|
return z.Err() |
||||||
|
case TextToken: |
||||||
|
if depth > 0 { |
||||||
|
// emitBytes should copy the []byte it receives,
|
||||||
|
// if it doesn't process it immediately.
|
||||||
|
emitBytes(z.Text()) |
||||||
|
} |
||||||
|
case StartTagToken, EndTagToken: |
||||||
|
tn, _ := z.TagName() |
||||||
|
if len(tn) == 1 && tn[0] == 'a' { |
||||||
|
if tt == StartTagToken { |
||||||
|
depth++ |
||||||
|
} else { |
||||||
|
depth-- |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Parsing is done by calling Parse with an io.Reader, which returns the root of |
||||||
|
the parse tree (the document element) as a *Node. It is the caller's |
||||||
|
responsibility to ensure that the Reader provides UTF-8 encoded HTML. For |
||||||
|
example, to process each anchor node in depth-first order: |
||||||
|
|
||||||
|
doc, err := html.Parse(r) |
||||||
|
if err != nil { |
||||||
|
// ...
|
||||||
|
} |
||||||
|
var f func(*html.Node) |
||||||
|
f = func(n *html.Node) { |
||||||
|
if n.Type == html.ElementNode && n.Data == "a" { |
||||||
|
// Do something with n...
|
||||||
|
} |
||||||
|
for c := n.FirstChild; c != nil; c = c.NextSibling { |
||||||
|
f(c) |
||||||
|
} |
||||||
|
} |
||||||
|
f(doc) |
||||||
|
|
||||||
|
The relevant specifications include: |
||||||
|
https://html.spec.whatwg.org/multipage/syntax.html and
|
||||||
|
https://html.spec.whatwg.org/multipage/syntax.html#tokenization
|
||||||
|
*/ |
||||||
|
package html |
||||||
|
|
||||||
|
// The tokenization algorithm implemented by this package is not a line-by-line
|
||||||
|
// transliteration of the relatively verbose state-machine in the WHATWG
|
||||||
|
// specification. A more direct approach is used instead, where the program
|
||||||
|
// counter implies the state, such as whether it is tokenizing a tag or a text
|
||||||
|
// node. Specification compliance is verified by checking expected and actual
|
||||||
|
// outputs over a test suite rather than aiming for algorithmic fidelity.
|
||||||
|
|
||||||
|
// TODO(nigeltao): Does a DOM API belong in this package or a separate one?
|
||||||
|
// TODO(nigeltao): How does parsing interact with a JavaScript engine?
|
@ -0,0 +1,156 @@ |
|||||||
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package html |
||||||
|
|
||||||
|
import ( |
||||||
|
"strings" |
||||||
|
) |
||||||
|
|
||||||
|
// parseDoctype parses the data from a DoctypeToken into a name,
|
||||||
|
// public identifier, and system identifier. It returns a Node whose Type
|
||||||
|
// is DoctypeNode, whose Data is the name, and which has attributes
|
||||||
|
// named "system" and "public" for the two identifiers if they were present.
|
||||||
|
// quirks is whether the document should be parsed in "quirks mode".
|
||||||
|
func parseDoctype(s string) (n *Node, quirks bool) { |
||||||
|
n = &Node{Type: DoctypeNode} |
||||||
|
|
||||||
|
// Find the name.
|
||||||
|
space := strings.IndexAny(s, whitespace) |
||||||
|
if space == -1 { |
||||||
|
space = len(s) |
||||||
|
} |
||||||
|
n.Data = s[:space] |
||||||
|
// The comparison to "html" is case-sensitive.
|
||||||
|
if n.Data != "html" { |
||||||
|
quirks = true |
||||||
|
} |
||||||
|
n.Data = strings.ToLower(n.Data) |
||||||
|
s = strings.TrimLeft(s[space:], whitespace) |
||||||
|
|
||||||
|
if len(s) < 6 { |
||||||
|
// It can't start with "PUBLIC" or "SYSTEM".
|
||||||
|
// Ignore the rest of the string.
|
||||||
|
return n, quirks || s != "" |
||||||
|
} |
||||||
|
|
||||||
|
key := strings.ToLower(s[:6]) |
||||||
|
s = s[6:] |
||||||
|
for key == "public" || key == "system" { |
||||||
|
s = strings.TrimLeft(s, whitespace) |
||||||
|
if s == "" { |
||||||
|
break |
||||||
|
} |
||||||
|
quote := s[0] |
||||||
|
if quote != '"' && quote != '\'' { |
||||||
|
break |
||||||
|
} |
||||||
|
s = s[1:] |
||||||
|
q := strings.IndexRune(s, rune(quote)) |
||||||
|
var id string |
||||||
|
if q == -1 { |
||||||
|
id = s |
||||||
|
s = "" |
||||||
|
} else { |
||||||
|
id = s[:q] |
||||||
|
s = s[q+1:] |
||||||
|
} |
||||||
|
n.Attr = append(n.Attr, Attribute{Key: key, Val: id}) |
||||||
|
if key == "public" { |
||||||
|
key = "system" |
||||||
|
} else { |
||||||
|
key = "" |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if key != "" || s != "" { |
||||||
|
quirks = true |
||||||
|
} else if len(n.Attr) > 0 { |
||||||
|
if n.Attr[0].Key == "public" { |
||||||
|
public := strings.ToLower(n.Attr[0].Val) |
||||||
|
switch public { |
||||||
|
case "-//w3o//dtd w3 html strict 3.0//en//", "-/w3d/dtd html 4.0 transitional/en", "html": |
||||||
|
quirks = true |
||||||
|
default: |
||||||
|
for _, q := range quirkyIDs { |
||||||
|
if strings.HasPrefix(public, q) { |
||||||
|
quirks = true |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
// The following two public IDs only cause quirks mode if there is no system ID.
|
||||||
|
if len(n.Attr) == 1 && (strings.HasPrefix(public, "-//w3c//dtd html 4.01 frameset//") || |
||||||
|
strings.HasPrefix(public, "-//w3c//dtd html 4.01 transitional//")) { |
||||||
|
quirks = true |
||||||
|
} |
||||||
|
} |
||||||
|
if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && |
||||||
|
strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { |
||||||
|
quirks = true |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return n, quirks |
||||||
|
} |
||||||
|
|
||||||
|
// quirkyIDs is a list of public doctype identifiers that cause a document
|
||||||
|
// to be interpreted in quirks mode. The identifiers should be in lower case.
|
||||||
|
var quirkyIDs = []string{ |
||||||
|
"+//silmaril//dtd html pro v0r11 19970101//", |
||||||
|
"-//advasoft ltd//dtd html 3.0 aswedit + extensions//", |
||||||
|
"-//as//dtd html 3.0 aswedit + extensions//", |
||||||
|
"-//ietf//dtd html 2.0 level 1//", |
||||||
|
"-//ietf//dtd html 2.0 level 2//", |
||||||
|
"-//ietf//dtd html 2.0 strict level 1//", |
||||||
|
"-//ietf//dtd html 2.0 strict level 2//", |
||||||
|
"-//ietf//dtd html 2.0 strict//", |
||||||
|
"-//ietf//dtd html 2.0//", |
||||||
|
"-//ietf//dtd html 2.1e//", |
||||||
|
"-//ietf//dtd html 3.0//", |
||||||
|
"-//ietf//dtd html 3.2 final//", |
||||||
|
"-//ietf//dtd html 3.2//", |
||||||
|
"-//ietf//dtd html 3//", |
||||||
|
"-//ietf//dtd html level 0//", |
||||||
|
"-//ietf//dtd html level 1//", |
||||||
|
"-//ietf//dtd html level 2//", |
||||||
|
"-//ietf//dtd html level 3//", |
||||||
|
"-//ietf//dtd html strict level 0//", |
||||||
|
"-//ietf//dtd html strict level 1//", |
||||||
|
"-//ietf//dtd html strict level 2//", |
||||||
|
"-//ietf//dtd html strict level 3//", |
||||||
|
"-//ietf//dtd html strict//", |
||||||
|
"-//ietf//dtd html//", |
||||||
|
"-//metrius//dtd metrius presentational//", |
||||||
|
"-//microsoft//dtd internet explorer 2.0 html strict//", |
||||||
|
"-//microsoft//dtd internet explorer 2.0 html//", |
||||||
|
"-//microsoft//dtd internet explorer 2.0 tables//", |
||||||
|
"-//microsoft//dtd internet explorer 3.0 html strict//", |
||||||
|
"-//microsoft//dtd internet explorer 3.0 html//", |
||||||
|
"-//microsoft//dtd internet explorer 3.0 tables//", |
||||||
|
"-//netscape comm. corp.//dtd html//", |
||||||
|
"-//netscape comm. corp.//dtd strict html//", |
||||||
|
"-//o'reilly and associates//dtd html 2.0//", |
||||||
|
"-//o'reilly and associates//dtd html extended 1.0//", |
||||||
|
"-//o'reilly and associates//dtd html extended relaxed 1.0//", |
||||||
|
"-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", |
||||||
|
"-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", |
||||||
|
"-//spyglass//dtd html 2.0 extended//", |
||||||
|
"-//sq//dtd html 2.0 hotmetal + extensions//", |
||||||
|
"-//sun microsystems corp.//dtd hotjava html//", |
||||||
|
"-//sun microsystems corp.//dtd hotjava strict html//", |
||||||
|
"-//w3c//dtd html 3 1995-03-24//", |
||||||
|
"-//w3c//dtd html 3.2 draft//", |
||||||
|
"-//w3c//dtd html 3.2 final//", |
||||||
|
"-//w3c//dtd html 3.2//", |
||||||
|
"-//w3c//dtd html 3.2s draft//", |
||||||
|
"-//w3c//dtd html 4.0 frameset//", |
||||||
|
"-//w3c//dtd html 4.0 transitional//", |
||||||
|
"-//w3c//dtd html experimental 19960712//", |
||||||
|
"-//w3c//dtd html experimental 970421//", |
||||||
|
"-//w3c//dtd w3 html//", |
||||||
|
"-//w3o//dtd w3 html 3.0//", |
||||||
|
"-//webtechs//dtd mozilla html 2.0//", |
||||||
|
"-//webtechs//dtd mozilla html//", |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,29 @@ |
|||||||
|
// Copyright 2010 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package html |
||||||
|
|
||||||
|
import ( |
||||||
|
"testing" |
||||||
|
"unicode/utf8" |
||||||
|
) |
||||||
|
|
||||||
|
func TestEntityLength(t *testing.T) { |
||||||
|
// We verify that the length of UTF-8 encoding of each value is <= 1 + len(key).
|
||||||
|
// The +1 comes from the leading "&". This property implies that the length of
|
||||||
|
// unescaped text is <= the length of escaped text.
|
||||||
|
for k, v := range entity { |
||||||
|
if 1+len(k) < utf8.RuneLen(v) { |
||||||
|
t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v)) |
||||||
|
} |
||||||
|
if len(k) > longestEntityWithoutSemicolon && k[len(k)-1] != ';' { |
||||||
|
t.Errorf("entity name %s is %d characters, but longestEntityWithoutSemicolon=%d", k, len(k), longestEntityWithoutSemicolon) |
||||||
|
} |
||||||
|
} |
||||||
|
for k, v := range entity2 { |
||||||
|
if 1+len(k) < utf8.RuneLen(v[0])+utf8.RuneLen(v[1]) { |
||||||
|
t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v[0]) + string(v[1])) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,258 @@ |
|||||||
|
// Copyright 2010 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package html |
||||||
|
|
||||||
|
import ( |
||||||
|
"bytes" |
||||||
|
"strings" |
||||||
|
"unicode/utf8" |
||||||
|
) |
||||||
|
|
||||||
|
// These replacements permit compatibility with old numeric entities that
|
||||||
|
// assumed Windows-1252 encoding.
|
||||||
|
// https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference
|
||||||
|
var replacementTable = [...]rune{ |
||||||
|
'\u20AC', // First entry is what 0x80 should be replaced with.
|
||||||
|
'\u0081', |
||||||
|
'\u201A', |
||||||
|
'\u0192', |
||||||
|
'\u201E', |
||||||
|
'\u2026', |
||||||
|
'\u2020', |
||||||
|
'\u2021', |
||||||
|
'\u02C6', |
||||||
|
'\u2030', |
||||||
|
'\u0160', |
||||||
|
'\u2039', |
||||||
|
'\u0152', |
||||||
|
'\u008D', |
||||||
|
'\u017D', |
||||||
|
'\u008F', |
||||||
|
'\u0090', |
||||||
|
'\u2018', |
||||||
|
'\u2019', |
||||||
|
'\u201C', |
||||||
|
'\u201D', |
||||||
|
'\u2022', |
||||||
|
'\u2013', |
||||||
|
'\u2014', |
||||||
|
'\u02DC', |
||||||
|
'\u2122', |
||||||
|
'\u0161', |
||||||
|
'\u203A', |
||||||
|
'\u0153', |
||||||
|
'\u009D', |
||||||
|
'\u017E', |
||||||
|
'\u0178', // Last entry is 0x9F.
|
||||||
|
// 0x00->'\uFFFD' is handled programmatically.
|
||||||
|
// 0x0D->'\u000D' is a no-op.
|
||||||
|
} |
||||||
|
|
||||||
|
// unescapeEntity reads an entity like "<" from b[src:] and writes the
|
||||||
|
// corresponding "<" to b[dst:], returning the incremented dst and src cursors.
|
||||||
|
// Precondition: b[src] == '&' && dst <= src.
|
||||||
|
// attribute should be true if parsing an attribute value.
|
||||||
|
func unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) { |
||||||
|
// https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference
|
||||||
|
|
||||||
|
// i starts at 1 because we already know that s[0] == '&'.
|
||||||
|
i, s := 1, b[src:] |
||||||
|
|
||||||
|
if len(s) <= 1 { |
||||||
|
b[dst] = b[src] |
||||||
|
return dst + 1, src + 1 |
||||||
|
} |
||||||
|
|
||||||
|
if s[i] == '#' { |
||||||
|
if len(s) <= 3 { // We need to have at least "&#.".
|
||||||
|
b[dst] = b[src] |
||||||
|
return dst + 1, src + 1 |
||||||
|
} |
||||||
|
i++ |
||||||
|
c := s[i] |
||||||
|
hex := false |
||||||
|
if c == 'x' || c == 'X' { |
||||||
|
hex = true |
||||||
|
i++ |
||||||
|
} |
||||||
|
|
||||||
|
x := '\x00' |
||||||
|
for i < len(s) { |
||||||
|
c = s[i] |
||||||
|
i++ |
||||||
|
if hex { |
||||||
|
if '0' <= c && c <= '9' { |
||||||
|
x = 16*x + rune(c) - '0' |
||||||
|
continue |
||||||
|
} else if 'a' <= c && c <= 'f' { |
||||||
|
x = 16*x + rune(c) - 'a' + 10 |
||||||
|
continue |
||||||
|
} else if 'A' <= c && c <= 'F' { |
||||||
|
x = 16*x + rune(c) - 'A' + 10 |
||||||
|
continue |
||||||
|
} |
||||||
|
} else if '0' <= c && c <= '9' { |
||||||
|
x = 10*x + rune(c) - '0' |
||||||
|
continue |
||||||
|
} |
||||||
|
if c != ';' { |
||||||
|
i-- |
||||||
|
} |
||||||
|
break |
||||||
|
} |
||||||
|
|
||||||
|
if i <= 3 { // No characters matched.
|
||||||
|
b[dst] = b[src] |
||||||
|
return dst + 1, src + 1 |
||||||
|
} |
||||||
|
|
||||||
|
if 0x80 <= x && x <= 0x9F { |
||||||
|
// Replace characters from Windows-1252 with UTF-8 equivalents.
|
||||||
|
x = replacementTable[x-0x80] |
||||||
|
} else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF { |
||||||
|
// Replace invalid characters with the replacement character.
|
||||||
|
x = '\uFFFD' |
||||||
|
} |
||||||
|
|
||||||
|
return dst + utf8.EncodeRune(b[dst:], x), src + i |
||||||
|
} |
||||||
|
|
||||||
|
// Consume the maximum number of characters possible, with the
|
||||||
|
// consumed characters matching one of the named references.
|
||||||
|
|
||||||
|
for i < len(s) { |
||||||
|
c := s[i] |
||||||
|
i++ |
||||||
|
// Lower-cased characters are more common in entities, so we check for them first.
|
||||||
|
if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { |
||||||
|
continue |
||||||
|
} |
||||||
|
if c != ';' { |
||||||
|
i-- |
||||||
|
} |
||||||
|
break |
||||||
|
} |
||||||
|
|
||||||
|
entityName := string(s[1:i]) |
||||||
|
if entityName == "" { |
||||||
|
// No-op.
|
||||||
|
} else if attribute && entityName[len(entityName)-1] != ';' && len(s) > i && s[i] == '=' { |
||||||
|
// No-op.
|
||||||
|
} else if x := entity[entityName]; x != 0 { |
||||||
|
return dst + utf8.EncodeRune(b[dst:], x), src + i |
||||||
|
} else if x := entity2[entityName]; x[0] != 0 { |
||||||
|
dst1 := dst + utf8.EncodeRune(b[dst:], x[0]) |
||||||
|
return dst1 + utf8.EncodeRune(b[dst1:], x[1]), src + i |
||||||
|
} else if !attribute { |
||||||
|
maxLen := len(entityName) - 1 |
||||||
|
if maxLen > longestEntityWithoutSemicolon { |
||||||
|
maxLen = longestEntityWithoutSemicolon |
||||||
|
} |
||||||
|
for j := maxLen; j > 1; j-- { |
||||||
|
if x := entity[entityName[:j]]; x != 0 { |
||||||
|
return dst + utf8.EncodeRune(b[dst:], x), src + j + 1 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
dst1, src1 = dst+i, src+i |
||||||
|
copy(b[dst:dst1], b[src:src1]) |
||||||
|
return dst1, src1 |
||||||
|
} |
||||||
|
|
||||||
|
// unescape unescapes b's entities in-place, so that "a<b" becomes "a<b".
|
||||||
|
// attribute should be true if parsing an attribute value.
|
||||||
|
func unescape(b []byte, attribute bool) []byte { |
||||||
|
for i, c := range b { |
||||||
|
if c == '&' { |
||||||
|
dst, src := unescapeEntity(b, i, i, attribute) |
||||||
|
for src < len(b) { |
||||||
|
c := b[src] |
||||||
|
if c == '&' { |
||||||
|
dst, src = unescapeEntity(b, dst, src, attribute) |
||||||
|
} else { |
||||||
|
b[dst] = c |
||||||
|
dst, src = dst+1, src+1 |
||||||
|
} |
||||||
|
} |
||||||
|
return b[0:dst] |
||||||
|
} |
||||||
|
} |
||||||
|
return b |
||||||
|
} |
||||||
|
|
||||||
|
// lower lower-cases the A-Z bytes in b in-place, so that "aBc" becomes "abc".
|
||||||
|
func lower(b []byte) []byte { |
||||||
|
for i, c := range b { |
||||||
|
if 'A' <= c && c <= 'Z' { |
||||||
|
b[i] = c + 'a' - 'A' |
||||||
|
} |
||||||
|
} |
||||||
|
return b |
||||||
|
} |
||||||
|
|
||||||
|
const escapedChars = "&'<>\"\r" |
||||||
|
|
||||||
|
func escape(w writer, s string) error { |
||||||
|
i := strings.IndexAny(s, escapedChars) |
||||||
|
for i != -1 { |
||||||
|
if _, err := w.WriteString(s[:i]); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
var esc string |
||||||
|
switch s[i] { |
||||||
|
case '&': |
||||||
|
esc = "&" |
||||||
|
case '\'': |
||||||
|
// "'" is shorter than "'" and apos was not in HTML until HTML5.
|
||||||
|
esc = "'" |
||||||
|
case '<': |
||||||
|
esc = "<" |
||||||
|
case '>': |
||||||
|
esc = ">" |
||||||
|
case '"': |
||||||
|
// """ is shorter than """.
|
||||||
|
esc = """ |
||||||
|
case '\r': |
||||||
|
esc = " " |
||||||
|
default: |
||||||
|
panic("unrecognized escape character") |
||||||
|
} |
||||||
|
s = s[i+1:] |
||||||
|
if _, err := w.WriteString(esc); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
i = strings.IndexAny(s, escapedChars) |
||||||
|
} |
||||||
|
_, err := w.WriteString(s) |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
// EscapeString escapes special characters like "<" to become "<". It
|
||||||
|
// escapes only five such characters: <, >, &, ' and ".
|
||||||
|
// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't
|
||||||
|
// always true.
|
||||||
|
func EscapeString(s string) string { |
||||||
|
if strings.IndexAny(s, escapedChars) == -1 { |
||||||
|
return s |
||||||
|
} |
||||||
|
var buf bytes.Buffer |
||||||
|
escape(&buf, s) |
||||||
|
return buf.String() |
||||||
|
} |
||||||
|
|
||||||
|
// UnescapeString unescapes entities like "<" to become "<". It unescapes a
|
||||||
|
// larger range of entities than EscapeString escapes. For example, "á"
|
||||||
|
// unescapes to "á", as does "á" and "&xE1;".
|
||||||
|
// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't
|
||||||
|
// always true.
|
||||||
|
func UnescapeString(s string) string { |
||||||
|
for _, c := range s { |
||||||
|
if c == '&' { |
||||||
|
return string(unescape([]byte(s), false)) |
||||||
|
} |
||||||
|
} |
||||||
|
return s |
||||||
|
} |
@ -0,0 +1,97 @@ |
|||||||
|
// Copyright 2013 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package html |
||||||
|
|
||||||
|
import "testing" |
||||||
|
|
||||||
|
type unescapeTest struct { |
||||||
|
// A short description of the test case.
|
||||||
|
desc string |
||||||
|
// The HTML text.
|
||||||
|
html string |
||||||
|
// The unescaped text.
|
||||||
|
unescaped string |
||||||
|
} |
||||||
|
|
||||||
|
var unescapeTests = []unescapeTest{ |
||||||
|
// Handle no entities.
|
||||||
|
{ |
||||||
|
"copy", |
||||||
|
"A\ttext\nstring", |
||||||
|
"A\ttext\nstring", |
||||||
|
}, |
||||||
|
// Handle simple named entities.
|
||||||
|
{ |
||||||
|
"simple", |
||||||
|
"& > <", |
||||||
|
"& > <", |
||||||
|
}, |
||||||
|
// Handle hitting the end of the string.
|
||||||
|
{ |
||||||
|
"stringEnd", |
||||||
|
"& &", |
||||||
|
"& &", |
||||||
|
}, |
||||||
|
// Handle entities with two codepoints.
|
||||||
|
{ |
||||||
|
"multiCodepoint", |
||||||
|
"text ⋛︀ blah", |
||||||
|
"text \u22db\ufe00 blah", |
||||||
|
}, |
||||||
|
// Handle decimal numeric entities.
|
||||||
|
{ |
||||||
|
"decimalEntity", |
||||||
|
"Delta = Δ ", |
||||||
|
"Delta = Δ ", |
||||||
|
}, |
||||||
|
// Handle hexadecimal numeric entities.
|
||||||
|
{ |
||||||
|
"hexadecimalEntity", |
||||||
|
"Lambda = λ = λ ", |
||||||
|
"Lambda = λ = λ ", |
||||||
|
}, |
||||||
|
// Handle numeric early termination.
|
||||||
|
{ |
||||||
|
"numericEnds", |
||||||
|
"&# &#x €43 © = ©f = ©", |
||||||
|
"&# &#x €43 © = ©f = ©", |
||||||
|
}, |
||||||
|
// Handle numeric ISO-8859-1 entity replacements.
|
||||||
|
{ |
||||||
|
"numericReplacements", |
||||||
|
"Footnote‡", |
||||||
|
"Footnote‡", |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
func TestUnescape(t *testing.T) { |
||||||
|
for _, tt := range unescapeTests { |
||||||
|
unescaped := UnescapeString(tt.html) |
||||||
|
if unescaped != tt.unescaped { |
||||||
|
t.Errorf("TestUnescape %s: want %q, got %q", tt.desc, tt.unescaped, unescaped) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestUnescapeEscape(t *testing.T) { |
||||||
|
ss := []string{ |
||||||
|
``, |
||||||
|
`abc def`, |
||||||
|
`a & b`, |
||||||
|
`a&b`, |
||||||
|
`a & b`, |
||||||
|
`"`, |
||||||
|
`"`, |
||||||
|
`"<&>"`, |
||||||
|
`"<&>"`, |
||||||
|
`3&5==1 && 0<1, "0<1", a+acute=á`, |
||||||
|
`The special characters are: <, >, &, ' and "`, |
||||||
|
} |
||||||
|
for _, s := range ss { |
||||||
|
if got := UnescapeString(EscapeString(s)); got != s { |
||||||
|
t.Errorf("got %q want %q", got, s) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,40 @@ |
|||||||
|
// Copyright 2012 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// This example demonstrates parsing HTML data and walking the resulting tree.
|
||||||
|
package html_test |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"log" |
||||||
|
"strings" |
||||||
|
|
||||||
|
"golang.org/x/net/html" |
||||||
|
) |
||||||
|
|
||||||
|
func ExampleParse() { |
||||||
|
s := `<p>Links:</p><ul><li><a href="foo">Foo</a><li><a href="/bar/baz">BarBaz</a></ul>` |
||||||
|
doc, err := html.Parse(strings.NewReader(s)) |
||||||
|
if err != nil { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
var f func(*html.Node) |
||||||
|
f = func(n *html.Node) { |
||||||
|
if n.Type == html.ElementNode && n.Data == "a" { |
||||||
|
for _, a := range n.Attr { |
||||||
|
if a.Key == "href" { |
||||||
|
fmt.Println(a.Val) |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
for c := n.FirstChild; c != nil; c = c.NextSibling { |
||||||
|
f(c) |
||||||
|
} |
||||||
|
} |
||||||
|
f(doc) |
||||||
|
// Output:
|
||||||
|
// foo
|
||||||
|
// /bar/baz
|
||||||
|
} |
@ -0,0 +1,226 @@ |
|||||||
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package html |
||||||
|
|
||||||
|
import ( |
||||||
|
"strings" |
||||||
|
) |
||||||
|
|
||||||
|
func adjustAttributeNames(aa []Attribute, nameMap map[string]string) { |
||||||
|
for i := range aa { |
||||||
|
if newName, ok := nameMap[aa[i].Key]; ok { |
||||||
|
aa[i].Key = newName |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func adjustForeignAttributes(aa []Attribute) { |
||||||
|
for i, a := range aa { |
||||||
|
if a.Key == "" || a.Key[0] != 'x' { |
||||||
|
continue |
||||||
|
} |
||||||
|
switch a.Key { |
||||||
|
case "xlink:actuate", "xlink:arcrole", "xlink:href", "xlink:role", "xlink:show", |
||||||
|
"xlink:title", "xlink:type", "xml:base", "xml:lang", "xml:space", "xmlns:xlink": |
||||||
|
j := strings.Index(a.Key, ":") |
||||||
|
aa[i].Namespace = a.Key[:j] |
||||||
|
aa[i].Key = a.Key[j+1:] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func htmlIntegrationPoint(n *Node) bool { |
||||||
|
if n.Type != ElementNode { |
||||||
|
return false |
||||||
|
} |
||||||
|
switch n.Namespace { |
||||||
|
case "math": |
||||||
|
if n.Data == "annotation-xml" { |
||||||
|
for _, a := range n.Attr { |
||||||
|
if a.Key == "encoding" { |
||||||
|
val := strings.ToLower(a.Val) |
||||||
|
if val == "text/html" || val == "application/xhtml+xml" { |
||||||
|
return true |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case "svg": |
||||||
|
switch n.Data { |
||||||
|
case "desc", "foreignObject", "title": |
||||||
|
return true |
||||||
|
} |
||||||
|
} |
||||||
|
return false |
||||||
|
} |
||||||
|
|
||||||
|
func mathMLTextIntegrationPoint(n *Node) bool { |
||||||
|
if n.Namespace != "math" { |
||||||
|
return false |
||||||
|
} |
||||||
|
switch n.Data { |
||||||
|
case "mi", "mo", "mn", "ms", "mtext": |
||||||
|
return true |
||||||
|
} |
||||||
|
return false |
||||||
|
} |
||||||
|
|
||||||
|
// Section 12.2.5.5.
|
||||||
|
var breakout = map[string]bool{ |
||||||
|
"b": true, |
||||||
|
"big": true, |
||||||
|
"blockquote": true, |
||||||
|
"body": true, |
||||||
|
"br": true, |
||||||
|
"center": true, |
||||||
|
"code": true, |
||||||
|
"dd": true, |
||||||
|
"div": true, |
||||||
|
"dl": true, |
||||||
|
"dt": true, |
||||||
|
"em": true, |
||||||
|
"embed": true, |
||||||
|
"h1": true, |
||||||
|
"h2": true, |
||||||
|
"h3": true, |
||||||
|
"h4": true, |
||||||
|
"h5": true, |
||||||
|
"h6": true, |
||||||
|
"head": true, |
||||||
|
"hr": true, |
||||||
|
"i": true, |
||||||
|
"img": true, |
||||||
|
"li": true, |
||||||
|
"listing": true, |
||||||
|
"menu": true, |
||||||
|
"meta": true, |
||||||
|
"nobr": true, |
||||||
|
"ol": true, |
||||||
|
"p": true, |
||||||
|
"pre": true, |
||||||
|
"ruby": true, |
||||||
|
"s": true, |
||||||
|
"small": true, |
||||||
|
"span": true, |
||||||
|
"strong": true, |
||||||
|
"strike": true, |
||||||
|
"sub": true, |
||||||
|
"sup": true, |
||||||
|
"table": true, |
||||||
|
"tt": true, |
||||||
|
"u": true, |
||||||
|
"ul": true, |
||||||
|
"var": true, |
||||||
|
} |
||||||
|
|
||||||
|
// Section 12.2.5.5.
|
||||||
|
var svgTagNameAdjustments = map[string]string{ |
||||||
|
"altglyph": "altGlyph", |
||||||
|
"altglyphdef": "altGlyphDef", |
||||||
|
"altglyphitem": "altGlyphItem", |
||||||
|
"animatecolor": "animateColor", |
||||||
|
"animatemotion": "animateMotion", |
||||||
|
"animatetransform": "animateTransform", |
||||||
|
"clippath": "clipPath", |
||||||
|
"feblend": "feBlend", |
||||||
|
"fecolormatrix": "feColorMatrix", |
||||||
|
"fecomponenttransfer": "feComponentTransfer", |
||||||
|
"fecomposite": "feComposite", |
||||||
|
"feconvolvematrix": "feConvolveMatrix", |
||||||
|
"fediffuselighting": "feDiffuseLighting", |
||||||
|
"fedisplacementmap": "feDisplacementMap", |
||||||
|
"fedistantlight": "feDistantLight", |
||||||
|
"feflood": "feFlood", |
||||||
|
"fefunca": "feFuncA", |
||||||
|
"fefuncb": "feFuncB", |
||||||
|
"fefuncg": "feFuncG", |
||||||
|
"fefuncr": "feFuncR", |
||||||
|
"fegaussianblur": "feGaussianBlur", |
||||||
|
"feimage": "feImage", |
||||||
|
"femerge": "feMerge", |
||||||
|
"femergenode": "feMergeNode", |
||||||
|
"femorphology": "feMorphology", |
||||||
|
"feoffset": "feOffset", |
||||||
|
"fepointlight": "fePointLight", |
||||||
|
"fespecularlighting": "feSpecularLighting", |
||||||
|
"fespotlight": "feSpotLight", |
||||||
|
"fetile": "feTile", |
||||||
|
"feturbulence": "feTurbulence", |
||||||
|
"foreignobject": "foreignObject", |
||||||
|
"glyphref": "glyphRef", |
||||||
|
"lineargradient": "linearGradient", |
||||||
|
"radialgradient": "radialGradient", |
||||||
|
"textpath": "textPath", |
||||||
|
} |
||||||
|
|
||||||
|
// Section 12.2.5.1
|
||||||
|
var mathMLAttributeAdjustments = map[string]string{ |
||||||
|
"definitionurl": "definitionURL", |
||||||
|
} |
||||||
|
|
||||||
|
var svgAttributeAdjustments = map[string]string{ |
||||||
|
"attributename": "attributeName", |
||||||
|
"attributetype": "attributeType", |
||||||
|
"basefrequency": "baseFrequency", |
||||||
|
"baseprofile": "baseProfile", |
||||||
|
"calcmode": "calcMode", |
||||||
|
"clippathunits": "clipPathUnits", |
||||||
|
"contentscripttype": "contentScriptType", |
||||||
|
"contentstyletype": "contentStyleType", |
||||||
|
"diffuseconstant": "diffuseConstant", |
||||||
|
"edgemode": "edgeMode", |
||||||
|
"externalresourcesrequired": "externalResourcesRequired", |
||||||
|
"filterres": "filterRes", |
||||||
|
"filterunits": "filterUnits", |
||||||
|
"glyphref": "glyphRef", |
||||||
|
"gradienttransform": "gradientTransform", |
||||||
|
"gradientunits": "gradientUnits", |
||||||
|
"kernelmatrix": "kernelMatrix", |
||||||
|
"kernelunitlength": "kernelUnitLength", |
||||||
|
"keypoints": "keyPoints", |
||||||
|
"keysplines": "keySplines", |
||||||
|
"keytimes": "keyTimes", |
||||||
|
"lengthadjust": "lengthAdjust", |
||||||
|
"limitingconeangle": "limitingConeAngle", |
||||||
|
"markerheight": "markerHeight", |
||||||
|
"markerunits": "markerUnits", |
||||||
|
"markerwidth": "markerWidth", |
||||||
|
"maskcontentunits": "maskContentUnits", |
||||||
|
"maskunits": "maskUnits", |
||||||
|
"numoctaves": "numOctaves", |
||||||
|
"pathlength": "pathLength", |
||||||
|
"patterncontentunits": "patternContentUnits", |
||||||
|
"patterntransform": "patternTransform", |
||||||
|
"patternunits": "patternUnits", |
||||||
|
"pointsatx": "pointsAtX", |
||||||
|
"pointsaty": "pointsAtY", |
||||||
|
"pointsatz": "pointsAtZ", |
||||||
|
"preservealpha": "preserveAlpha", |
||||||
|
"preserveaspectratio": "preserveAspectRatio", |
||||||
|
"primitiveunits": "primitiveUnits", |
||||||
|
"refx": "refX", |
||||||
|
"refy": "refY", |
||||||
|
"repeatcount": "repeatCount", |
||||||
|
"repeatdur": "repeatDur", |
||||||
|
"requiredextensions": "requiredExtensions", |
||||||
|
"requiredfeatures": "requiredFeatures", |
||||||
|
"specularconstant": "specularConstant", |
||||||
|
"specularexponent": "specularExponent", |
||||||
|
"spreadmethod": "spreadMethod", |
||||||
|
"startoffset": "startOffset", |
||||||
|
"stddeviation": "stdDeviation", |
||||||
|
"stitchtiles": "stitchTiles", |
||||||
|
"surfacescale": "surfaceScale", |
||||||
|
"systemlanguage": "systemLanguage", |
||||||
|
"tablevalues": "tableValues", |
||||||
|
"targetx": "targetX", |
||||||
|
"targety": "targetY", |
||||||
|
"textlength": "textLength", |
||||||
|
"viewbox": "viewBox", |
||||||
|
"viewtarget": "viewTarget", |
||||||
|
"xchannelselector": "xChannelSelector", |
||||||
|
"ychannelselector": "yChannelSelector", |
||||||
|
"zoomandpan": "zoomAndPan", |
||||||
|
} |
@ -0,0 +1,193 @@ |
|||||||
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package html |
||||||
|
|
||||||
|
import ( |
||||||
|
"golang.org/x/net/html/atom" |
||||||
|
) |
||||||
|
|
||||||
|
// A NodeType is the type of a Node.
|
||||||
|
type NodeType uint32 |
||||||
|
|
||||||
|
const ( |
||||||
|
ErrorNode NodeType = iota |
||||||
|
TextNode |
||||||
|
DocumentNode |
||||||
|
ElementNode |
||||||
|
CommentNode |
||||||
|
DoctypeNode |
||||||
|
scopeMarkerNode |
||||||
|
) |
||||||
|
|
||||||
|
// Section 12.2.3.3 says "scope markers are inserted when entering applet
|
||||||
|
// elements, buttons, object elements, marquees, table cells, and table
|
||||||
|
// captions, and are used to prevent formatting from 'leaking'".
|
||||||
|
var scopeMarker = Node{Type: scopeMarkerNode} |
||||||
|
|
||||||
|
// A Node consists of a NodeType and some Data (tag name for element nodes,
|
||||||
|
// content for text) and are part of a tree of Nodes. Element nodes may also
|
||||||
|
// have a Namespace and contain a slice of Attributes. Data is unescaped, so
|
||||||
|
// that it looks like "a<b" rather than "a<b". For element nodes, DataAtom
|
||||||
|
// is the atom for Data, or zero if Data is not a known tag name.
|
||||||
|
//
|
||||||
|
// An empty Namespace implies a "http://www.w3.org/1999/xhtml" namespace.
|
||||||
|
// Similarly, "math" is short for "http://www.w3.org/1998/Math/MathML", and
|
||||||
|
// "svg" is short for "http://www.w3.org/2000/svg".
|
||||||
|
type Node struct { |
||||||
|
Parent, FirstChild, LastChild, PrevSibling, NextSibling *Node |
||||||
|
|
||||||
|
Type NodeType |
||||||
|
DataAtom atom.Atom |
||||||
|
Data string |
||||||
|
Namespace string |
||||||
|
Attr []Attribute |
||||||
|
} |
||||||
|
|
||||||
|
// InsertBefore inserts newChild as a child of n, immediately before oldChild
|
||||||
|
// in the sequence of n's children. oldChild may be nil, in which case newChild
|
||||||
|
// is appended to the end of n's children.
|
||||||
|
//
|
||||||
|
// It will panic if newChild already has a parent or siblings.
|
||||||
|
func (n *Node) InsertBefore(newChild, oldChild *Node) { |
||||||
|
if newChild.Parent != nil || newChild.PrevSibling != nil || newChild.NextSibling != nil { |
||||||
|
panic("html: InsertBefore called for an attached child Node") |
||||||
|
} |
||||||
|
var prev, next *Node |
||||||
|
if oldChild != nil { |
||||||
|
prev, next = oldChild.PrevSibling, oldChild |
||||||
|
} else { |
||||||
|
prev = n.LastChild |
||||||
|
} |
||||||
|
if prev != nil { |
||||||
|
prev.NextSibling = newChild |
||||||
|
} else { |
||||||
|
n.FirstChild = newChild |
||||||
|
} |
||||||
|
if next != nil { |
||||||
|
next.PrevSibling = newChild |
||||||
|
} else { |
||||||
|
n.LastChild = newChild |
||||||
|
} |
||||||
|
newChild.Parent = n |
||||||
|
newChild.PrevSibling = prev |
||||||
|
newChild.NextSibling = next |
||||||
|
} |
||||||
|
|
||||||
|
// AppendChild adds a node c as a child of n.
|
||||||
|
//
|
||||||
|
// It will panic if c already has a parent or siblings.
|
||||||
|
func (n *Node) AppendChild(c *Node) { |
||||||
|
if c.Parent != nil || c.PrevSibling != nil || c.NextSibling != nil { |
||||||
|
panic("html: AppendChild called for an attached child Node") |
||||||
|
} |
||||||
|
last := n.LastChild |
||||||
|
if last != nil { |
||||||
|
last.NextSibling = c |
||||||
|
} else { |
||||||
|
n.FirstChild = c |
||||||
|
} |
||||||
|
n.LastChild = c |
||||||
|
c.Parent = n |
||||||
|
c.PrevSibling = last |
||||||
|
} |
||||||
|
|
||||||
|
// RemoveChild removes a node c that is a child of n. Afterwards, c will have
|
||||||
|
// no parent and no siblings.
|
||||||
|
//
|
||||||
|
// It will panic if c's parent is not n.
|
||||||
|
func (n *Node) RemoveChild(c *Node) { |
||||||
|
if c.Parent != n { |
||||||
|
panic("html: RemoveChild called for a non-child Node") |
||||||
|
} |
||||||
|
if n.FirstChild == c { |
||||||
|
n.FirstChild = c.NextSibling |
||||||
|
} |
||||||
|
if c.NextSibling != nil { |
||||||
|
c.NextSibling.PrevSibling = c.PrevSibling |
||||||
|
} |
||||||
|
if n.LastChild == c { |
||||||
|
n.LastChild = c.PrevSibling |
||||||
|
} |
||||||
|
if c.PrevSibling != nil { |
||||||
|
c.PrevSibling.NextSibling = c.NextSibling |
||||||
|
} |
||||||
|
c.Parent = nil |
||||||
|
c.PrevSibling = nil |
||||||
|
c.NextSibling = nil |
||||||
|
} |
||||||
|
|
||||||
|
// reparentChildren reparents all of src's child nodes to dst.
|
||||||
|
func reparentChildren(dst, src *Node) { |
||||||
|
for { |
||||||
|
child := src.FirstChild |
||||||
|
if child == nil { |
||||||
|
break |
||||||
|
} |
||||||
|
src.RemoveChild(child) |
||||||
|
dst.AppendChild(child) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// clone returns a new node with the same type, data and attributes.
|
||||||
|
// The clone has no parent, no siblings and no children.
|
||||||
|
func (n *Node) clone() *Node { |
||||||
|
m := &Node{ |
||||||
|
Type: n.Type, |
||||||
|
DataAtom: n.DataAtom, |
||||||
|
Data: n.Data, |
||||||
|
Attr: make([]Attribute, len(n.Attr)), |
||||||
|
} |
||||||
|
copy(m.Attr, n.Attr) |
||||||
|
return m |
||||||
|
} |
||||||
|
|
||||||
|
// nodeStack is a stack of nodes.
|
||||||
|
type nodeStack []*Node |
||||||
|
|
||||||
|
// pop pops the stack. It will panic if s is empty.
|
||||||
|
func (s *nodeStack) pop() *Node { |
||||||
|
i := len(*s) |
||||||
|
n := (*s)[i-1] |
||||||
|
*s = (*s)[:i-1] |
||||||
|
return n |
||||||
|
} |
||||||
|
|
||||||
|
// top returns the most recently pushed node, or nil if s is empty.
|
||||||
|
func (s *nodeStack) top() *Node { |
||||||
|
if i := len(*s); i > 0 { |
||||||
|
return (*s)[i-1] |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
// index returns the index of the top-most occurrence of n in the stack, or -1
|
||||||
|
// if n is not present.
|
||||||
|
func (s *nodeStack) index(n *Node) int { |
||||||
|
for i := len(*s) - 1; i >= 0; i-- { |
||||||
|
if (*s)[i] == n { |
||||||
|
return i |
||||||
|
} |
||||||
|
} |
||||||
|
return -1 |
||||||
|
} |
||||||
|
|
||||||
|
// insert inserts a node at the given index.
|
||||||
|
func (s *nodeStack) insert(i int, n *Node) { |
||||||
|
(*s) = append(*s, nil) |
||||||
|
copy((*s)[i+1:], (*s)[i:]) |
||||||
|
(*s)[i] = n |
||||||
|
} |
||||||
|
|
||||||
|
// remove removes a node from the stack. It is a no-op if n is not present.
|
||||||
|
func (s *nodeStack) remove(n *Node) { |
||||||
|
i := s.index(n) |
||||||
|
if i == -1 { |
||||||
|
return |
||||||
|
} |
||||||
|
copy((*s)[i:], (*s)[i+1:]) |
||||||
|
j := len(*s) - 1 |
||||||
|
(*s)[j] = nil |
||||||
|
*s = (*s)[:j] |
||||||
|
} |
@ -0,0 +1,146 @@ |
|||||||
|
// Copyright 2010 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package html |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
) |
||||||
|
|
||||||
|
// checkTreeConsistency checks that a node and its descendants are all
|
||||||
|
// consistent in their parent/child/sibling relationships.
|
||||||
|
func checkTreeConsistency(n *Node) error { |
||||||
|
return checkTreeConsistency1(n, 0) |
||||||
|
} |
||||||
|
|
||||||
|
func checkTreeConsistency1(n *Node, depth int) error { |
||||||
|
if depth == 1e4 { |
||||||
|
return fmt.Errorf("html: tree looks like it contains a cycle") |
||||||
|
} |
||||||
|
if err := checkNodeConsistency(n); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
for c := n.FirstChild; c != nil; c = c.NextSibling { |
||||||
|
if err := checkTreeConsistency1(c, depth+1); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
// checkNodeConsistency checks that a node's parent/child/sibling relationships
|
||||||
|
// are consistent.
|
||||||
|
func checkNodeConsistency(n *Node) error { |
||||||
|
if n == nil { |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
nParent := 0 |
||||||
|
for p := n.Parent; p != nil; p = p.Parent { |
||||||
|
nParent++ |
||||||
|
if nParent == 1e4 { |
||||||
|
return fmt.Errorf("html: parent list looks like an infinite loop") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
nForward := 0 |
||||||
|
for c := n.FirstChild; c != nil; c = c.NextSibling { |
||||||
|
nForward++ |
||||||
|
if nForward == 1e6 { |
||||||
|
return fmt.Errorf("html: forward list of children looks like an infinite loop") |
||||||
|
} |
||||||
|
if c.Parent != n { |
||||||
|
return fmt.Errorf("html: inconsistent child/parent relationship") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
nBackward := 0 |
||||||
|
for c := n.LastChild; c != nil; c = c.PrevSibling { |
||||||
|
nBackward++ |
||||||
|
if nBackward == 1e6 { |
||||||
|
return fmt.Errorf("html: backward list of children looks like an infinite loop") |
||||||
|
} |
||||||
|
if c.Parent != n { |
||||||
|
return fmt.Errorf("html: inconsistent child/parent relationship") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if n.Parent != nil { |
||||||
|
if n.Parent == n { |
||||||
|
return fmt.Errorf("html: inconsistent parent relationship") |
||||||
|
} |
||||||
|
if n.Parent == n.FirstChild { |
||||||
|
return fmt.Errorf("html: inconsistent parent/first relationship") |
||||||
|
} |
||||||
|
if n.Parent == n.LastChild { |
||||||
|
return fmt.Errorf("html: inconsistent parent/last relationship") |
||||||
|
} |
||||||
|
if n.Parent == n.PrevSibling { |
||||||
|
return fmt.Errorf("html: inconsistent parent/prev relationship") |
||||||
|
} |
||||||
|
if n.Parent == n.NextSibling { |
||||||
|
return fmt.Errorf("html: inconsistent parent/next relationship") |
||||||
|
} |
||||||
|
|
||||||
|
parentHasNAsAChild := false |
||||||
|
for c := n.Parent.FirstChild; c != nil; c = c.NextSibling { |
||||||
|
if c == n { |
||||||
|
parentHasNAsAChild = true |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if !parentHasNAsAChild { |
||||||
|
return fmt.Errorf("html: inconsistent parent/child relationship") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if n.PrevSibling != nil && n.PrevSibling.NextSibling != n { |
||||||
|
return fmt.Errorf("html: inconsistent prev/next relationship") |
||||||
|
} |
||||||
|
if n.NextSibling != nil && n.NextSibling.PrevSibling != n { |
||||||
|
return fmt.Errorf("html: inconsistent next/prev relationship") |
||||||
|
} |
||||||
|
|
||||||
|
if (n.FirstChild == nil) != (n.LastChild == nil) { |
||||||
|
return fmt.Errorf("html: inconsistent first/last relationship") |
||||||
|
} |
||||||
|
if n.FirstChild != nil && n.FirstChild == n.LastChild { |
||||||
|
// We have a sole child.
|
||||||
|
if n.FirstChild.PrevSibling != nil || n.FirstChild.NextSibling != nil { |
||||||
|
return fmt.Errorf("html: inconsistent sole child's sibling relationship") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
seen := map[*Node]bool{} |
||||||
|
|
||||||
|
var last *Node |
||||||
|
for c := n.FirstChild; c != nil; c = c.NextSibling { |
||||||
|
if seen[c] { |
||||||
|
return fmt.Errorf("html: inconsistent repeated child") |
||||||
|
} |
||||||
|
seen[c] = true |
||||||
|
last = c |
||||||
|
} |
||||||
|
if last != n.LastChild { |
||||||
|
return fmt.Errorf("html: inconsistent last relationship") |
||||||
|
} |
||||||
|
|
||||||
|
var first *Node |
||||||
|
for c := n.LastChild; c != nil; c = c.PrevSibling { |
||||||
|
if !seen[c] { |
||||||
|
return fmt.Errorf("html: inconsistent missing child") |
||||||
|
} |
||||||
|
delete(seen, c) |
||||||
|
first = c |
||||||
|
} |
||||||
|
if first != n.FirstChild { |
||||||
|
return fmt.Errorf("html: inconsistent first relationship") |
||||||
|
} |
||||||
|
|
||||||
|
if len(seen) != 0 { |
||||||
|
return fmt.Errorf("html: inconsistent forwards/backwards child list") |
||||||
|
} |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,388 @@ |
|||||||
|
// Copyright 2010 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package html |
||||||
|
|
||||||
|
import ( |
||||||
|
"bufio" |
||||||
|
"bytes" |
||||||
|
"errors" |
||||||
|
"fmt" |
||||||
|
"io" |
||||||
|
"io/ioutil" |
||||||
|
"os" |
||||||
|
"path/filepath" |
||||||
|
"runtime" |
||||||
|
"sort" |
||||||
|
"strings" |
||||||
|
"testing" |
||||||
|
|
||||||
|
"golang.org/x/net/html/atom" |
||||||
|
) |
||||||
|
|
||||||
|
// readParseTest reads a single test case from r.
|
||||||
|
func readParseTest(r *bufio.Reader) (text, want, context string, err error) { |
||||||
|
line, err := r.ReadSlice('\n') |
||||||
|
if err != nil { |
||||||
|
return "", "", "", err |
||||||
|
} |
||||||
|
var b []byte |
||||||
|
|
||||||
|
// Read the HTML.
|
||||||
|
if string(line) != "#data\n" { |
||||||
|
return "", "", "", fmt.Errorf(`got %q want "#data\n"`, line) |
||||||
|
} |
||||||
|
for { |
||||||
|
line, err = r.ReadSlice('\n') |
||||||
|
if err != nil { |
||||||
|
return "", "", "", err |
||||||
|
} |
||||||
|
if line[0] == '#' { |
||||||
|
break |
||||||
|
} |
||||||
|
b = append(b, line...) |
||||||
|
} |
||||||
|
text = strings.TrimSuffix(string(b), "\n") |
||||||
|
b = b[:0] |
||||||
|
|
||||||
|
// Skip the error list.
|
||||||
|
if string(line) != "#errors\n" { |
||||||
|
return "", "", "", fmt.Errorf(`got %q want "#errors\n"`, line) |
||||||
|
} |
||||||
|
for { |
||||||
|
line, err = r.ReadSlice('\n') |
||||||
|
if err != nil { |
||||||
|
return "", "", "", err |
||||||
|
} |
||||||
|
if line[0] == '#' { |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if string(line) == "#document-fragment\n" { |
||||||
|
line, err = r.ReadSlice('\n') |
||||||
|
if err != nil { |
||||||
|
return "", "", "", err |
||||||
|
} |
||||||
|
context = strings.TrimSpace(string(line)) |
||||||
|
line, err = r.ReadSlice('\n') |
||||||
|
if err != nil { |
||||||
|
return "", "", "", err |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Read the dump of what the parse tree should be.
|
||||||
|
if string(line) != "#document\n" { |
||||||
|
return "", "", "", fmt.Errorf(`got %q want "#document\n"`, line) |
||||||
|
} |
||||||
|
inQuote := false |
||||||
|
for { |
||||||
|
line, err = r.ReadSlice('\n') |
||||||
|
if err != nil && err != io.EOF { |
||||||
|
return "", "", "", err |
||||||
|
} |
||||||
|
trimmed := bytes.Trim(line, "| \n") |
||||||
|
if len(trimmed) > 0 { |
||||||
|
if line[0] == '|' && trimmed[0] == '"' { |
||||||
|
inQuote = true |
||||||
|
} |
||||||
|
if trimmed[len(trimmed)-1] == '"' && !(line[0] == '|' && len(trimmed) == 1) { |
||||||
|
inQuote = false |
||||||
|
} |
||||||
|
} |
||||||
|
if len(line) == 0 || len(line) == 1 && line[0] == '\n' && !inQuote { |
||||||
|
break |
||||||
|
} |
||||||
|
b = append(b, line...) |
||||||
|
} |
||||||
|
return text, string(b), context, nil |
||||||
|
} |
||||||
|
|
||||||
|
func dumpIndent(w io.Writer, level int) { |
||||||
|
io.WriteString(w, "| ") |
||||||
|
for i := 0; i < level; i++ { |
||||||
|
io.WriteString(w, " ") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
type sortedAttributes []Attribute |
||||||
|
|
||||||
|
func (a sortedAttributes) Len() int { |
||||||
|
return len(a) |
||||||
|
} |
||||||
|
|
||||||
|
func (a sortedAttributes) Less(i, j int) bool { |
||||||
|
if a[i].Namespace != a[j].Namespace { |
||||||
|
return a[i].Namespace < a[j].Namespace |
||||||
|
} |
||||||
|
return a[i].Key < a[j].Key |
||||||
|
} |
||||||
|
|
||||||
|
func (a sortedAttributes) Swap(i, j int) { |
||||||
|
a[i], a[j] = a[j], a[i] |
||||||
|
} |
||||||
|
|
||||||
|
func dumpLevel(w io.Writer, n *Node, level int) error { |
||||||
|
dumpIndent(w, level) |
||||||
|
switch n.Type { |
||||||
|
case ErrorNode: |
||||||
|
return errors.New("unexpected ErrorNode") |
||||||
|
case DocumentNode: |
||||||
|
return errors.New("unexpected DocumentNode") |
||||||
|
case ElementNode: |
||||||
|
if n.Namespace != "" { |
||||||
|
fmt.Fprintf(w, "<%s %s>", n.Namespace, n.Data) |
||||||
|
} else { |
||||||
|
fmt.Fprintf(w, "<%s>", n.Data) |
||||||
|
} |
||||||
|
attr := sortedAttributes(n.Attr) |
||||||
|
sort.Sort(attr) |
||||||
|
for _, a := range attr { |
||||||
|
io.WriteString(w, "\n") |
||||||
|
dumpIndent(w, level+1) |
||||||
|
if a.Namespace != "" { |
||||||
|
fmt.Fprintf(w, `%s %s="%s"`, a.Namespace, a.Key, a.Val) |
||||||
|
} else { |
||||||
|
fmt.Fprintf(w, `%s="%s"`, a.Key, a.Val) |
||||||
|
} |
||||||
|
} |
||||||
|
case TextNode: |
||||||
|
fmt.Fprintf(w, `"%s"`, n.Data) |
||||||
|
case CommentNode: |
||||||
|
fmt.Fprintf(w, "<!-- %s -->", n.Data) |
||||||
|
case DoctypeNode: |
||||||
|
fmt.Fprintf(w, "<!DOCTYPE %s", n.Data) |
||||||
|
if n.Attr != nil { |
||||||
|
var p, s string |
||||||
|
for _, a := range n.Attr { |
||||||
|
switch a.Key { |
||||||
|
case "public": |
||||||
|
p = a.Val |
||||||
|
case "system": |
||||||
|
s = a.Val |
||||||
|
} |
||||||
|
} |
||||||
|
if p != "" || s != "" { |
||||||
|
fmt.Fprintf(w, ` "%s"`, p) |
||||||
|
fmt.Fprintf(w, ` "%s"`, s) |
||||||
|
} |
||||||
|
} |
||||||
|
io.WriteString(w, ">") |
||||||
|
case scopeMarkerNode: |
||||||
|
return errors.New("unexpected scopeMarkerNode") |
||||||
|
default: |
||||||
|
return errors.New("unknown node type") |
||||||
|
} |
||||||
|
io.WriteString(w, "\n") |
||||||
|
for c := n.FirstChild; c != nil; c = c.NextSibling { |
||||||
|
if err := dumpLevel(w, c, level+1); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func dump(n *Node) (string, error) { |
||||||
|
if n == nil || n.FirstChild == nil { |
||||||
|
return "", nil |
||||||
|
} |
||||||
|
var b bytes.Buffer |
||||||
|
for c := n.FirstChild; c != nil; c = c.NextSibling { |
||||||
|
if err := dumpLevel(&b, c, 0); err != nil { |
||||||
|
return "", err |
||||||
|
} |
||||||
|
} |
||||||
|
return b.String(), nil |
||||||
|
} |
||||||
|
|
||||||
|
const testDataDir = "testdata/webkit/" |
||||||
|
|
||||||
|
func TestParser(t *testing.T) { |
||||||
|
testFiles, err := filepath.Glob(testDataDir + "*.dat") |
||||||
|
if err != nil { |
||||||
|
t.Fatal(err) |
||||||
|
} |
||||||
|
for _, tf := range testFiles { |
||||||
|
f, err := os.Open(tf) |
||||||
|
if err != nil { |
||||||
|
t.Fatal(err) |
||||||
|
} |
||||||
|
defer f.Close() |
||||||
|
r := bufio.NewReader(f) |
||||||
|
|
||||||
|
for i := 0; ; i++ { |
||||||
|
text, want, context, err := readParseTest(r) |
||||||
|
if err == io.EOF { |
||||||
|
break |
||||||
|
} |
||||||
|
if err != nil { |
||||||
|
t.Fatal(err) |
||||||
|
} |
||||||
|
|
||||||
|
err = testParseCase(text, want, context) |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
t.Errorf("%s test #%d %q, %s", tf, i, text, err) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// testParseCase tests one test case from the test files. If the test does not
|
||||||
|
// pass, it returns an error that explains the failure.
|
||||||
|
// text is the HTML to be parsed, want is a dump of the correct parse tree,
|
||||||
|
// and context is the name of the context node, if any.
|
||||||
|
func testParseCase(text, want, context string) (err error) { |
||||||
|
defer func() { |
||||||
|
if x := recover(); x != nil { |
||||||
|
switch e := x.(type) { |
||||||
|
case error: |
||||||
|
err = e |
||||||
|
default: |
||||||
|
err = fmt.Errorf("%v", e) |
||||||
|
} |
||||||
|
} |
||||||
|
}() |
||||||
|
|
||||||
|
var doc *Node |
||||||
|
if context == "" { |
||||||
|
doc, err = Parse(strings.NewReader(text)) |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
} else { |
||||||
|
contextNode := &Node{ |
||||||
|
Type: ElementNode, |
||||||
|
DataAtom: atom.Lookup([]byte(context)), |
||||||
|
Data: context, |
||||||
|
} |
||||||
|
nodes, err := ParseFragment(strings.NewReader(text), contextNode) |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
doc = &Node{ |
||||||
|
Type: DocumentNode, |
||||||
|
} |
||||||
|
for _, n := range nodes { |
||||||
|
doc.AppendChild(n) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if err := checkTreeConsistency(doc); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
got, err := dump(doc) |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
// Compare the parsed tree to the #document section.
|
||||||
|
if got != want { |
||||||
|
return fmt.Errorf("got vs want:\n----\n%s----\n%s----", got, want) |
||||||
|
} |
||||||
|
|
||||||
|
if renderTestBlacklist[text] || context != "" { |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
// Check that rendering and re-parsing results in an identical tree.
|
||||||
|
pr, pw := io.Pipe() |
||||||
|
go func() { |
||||||
|
pw.CloseWithError(Render(pw, doc)) |
||||||
|
}() |
||||||
|
doc1, err := Parse(pr) |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
got1, err := dump(doc1) |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if got != got1 { |
||||||
|
return fmt.Errorf("got vs got1:\n----\n%s----\n%s----", got, got1) |
||||||
|
} |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
// Some test input result in parse trees are not 'well-formed' despite
|
||||||
|
// following the HTML5 recovery algorithms. Rendering and re-parsing such a
|
||||||
|
// tree will not result in an exact clone of that tree. We blacklist such
|
||||||
|
// inputs from the render test.
|
||||||
|
var renderTestBlacklist = map[string]bool{ |
||||||
|
// The second <a> will be reparented to the first <table>'s parent. This
|
||||||
|
// results in an <a> whose parent is an <a>, which is not 'well-formed'.
|
||||||
|
`<a><table><td><a><table></table><a></tr><a></table><b>X</b>C<a>Y`: true, |
||||||
|
// The same thing with a <p>:
|
||||||
|
`<p><table></p>`: true, |
||||||
|
// More cases of <a> being reparented:
|
||||||
|
`<a href="blah">aba<table><a href="foo">br<tr><td></td></tr>x</table>aoe`: true, |
||||||
|
`<a><table><a></table><p><a><div><a>`: true, |
||||||
|
`<a><table><td><a><table></table><a></tr><a></table><a>`: true, |
||||||
|
// A similar reparenting situation involving <nobr>:
|
||||||
|
`<!DOCTYPE html><body><b><nobr>1<table><nobr></b><i><nobr>2<nobr></i>3`: true, |
||||||
|
// A <plaintext> element is reparented, putting it before a table.
|
||||||
|
// A <plaintext> element can't have anything after it in HTML.
|
||||||
|
`<table><plaintext><td>`: true, |
||||||
|
`<!doctype html><table><plaintext></plaintext>`: true, |
||||||
|
`<!doctype html><table><tbody><plaintext></plaintext>`: true, |
||||||
|
`<!doctype html><table><tbody><tr><plaintext></plaintext>`: true, |
||||||
|
// A form inside a table inside a form doesn't work either.
|
||||||
|
`<!doctype html><form><table></form><form></table></form>`: true, |
||||||
|
// A script that ends at EOF may escape its own closing tag when rendered.
|
||||||
|
`<!doctype html><script><!--<script `: true, |
||||||
|
`<!doctype html><script><!--<script <`: true, |
||||||
|
`<!doctype html><script><!--<script <a`: true, |
||||||
|
`<!doctype html><script><!--<script </`: true, |
||||||
|
`<!doctype html><script><!--<script </s`: true, |
||||||
|
`<!doctype html><script><!--<script </script`: true, |
||||||
|
`<!doctype html><script><!--<script </scripta`: true, |
||||||
|
`<!doctype html><script><!--<script -`: true, |
||||||
|
`<!doctype html><script><!--<script -a`: true, |
||||||
|
`<!doctype html><script><!--<script -<`: true, |
||||||
|
`<!doctype html><script><!--<script --`: true, |
||||||
|
`<!doctype html><script><!--<script --a`: true, |
||||||
|
`<!doctype html><script><!--<script --<`: true, |
||||||
|
`<script><!--<script `: true, |
||||||
|
`<script><!--<script <a`: true, |
||||||
|
`<script><!--<script </script`: true, |
||||||
|
`<script><!--<script </scripta`: true, |
||||||
|
`<script><!--<script -`: true, |
||||||
|
`<script><!--<script -a`: true, |
||||||
|
`<script><!--<script --`: true, |
||||||
|
`<script><!--<script --a`: true, |
||||||
|
`<script><!--<script <`: true, |
||||||
|
`<script><!--<script </`: true, |
||||||
|
`<script><!--<script </s`: true, |
||||||
|
// Reconstructing the active formatting elements results in a <plaintext>
|
||||||
|
// element that contains an <a> element.
|
||||||
|
`<!doctype html><p><a><plaintext>b`: true, |
||||||
|
} |
||||||
|
|
||||||
|
func TestNodeConsistency(t *testing.T) { |
||||||
|
// inconsistentNode is a Node whose DataAtom and Data do not agree.
|
||||||
|
inconsistentNode := &Node{ |
||||||
|
Type: ElementNode, |
||||||
|
DataAtom: atom.Frameset, |
||||||
|
Data: "table", |
||||||
|
} |
||||||
|
_, err := ParseFragment(strings.NewReader("<p>hello</p>"), inconsistentNode) |
||||||
|
if err == nil { |
||||||
|
t.Errorf("got nil error, want non-nil") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func BenchmarkParser(b *testing.B) { |
||||||
|
buf, err := ioutil.ReadFile("testdata/go1.html") |
||||||
|
if err != nil { |
||||||
|
b.Fatalf("could not read testdata/go1.html: %v", err) |
||||||
|
} |
||||||
|
b.SetBytes(int64(len(buf))) |
||||||
|
runtime.GC() |
||||||
|
b.ReportAllocs() |
||||||
|
b.ResetTimer() |
||||||
|
for i := 0; i < b.N; i++ { |
||||||
|
Parse(bytes.NewBuffer(buf)) |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,271 @@ |
|||||||
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package html |
||||||
|
|
||||||
|
import ( |
||||||
|
"bufio" |
||||||
|
"errors" |
||||||
|
"fmt" |
||||||
|
"io" |
||||||
|
"strings" |
||||||
|
) |
||||||
|
|
||||||
|
type writer interface { |
||||||
|
io.Writer |
||||||
|
WriteByte(c byte) error // in Go 1.1, use io.ByteWriter
|
||||||
|
WriteString(string) (int, error) |
||||||
|
} |
||||||
|
|
||||||
|
// Render renders the parse tree n to the given writer.
|
||||||
|
//
|
||||||
|
// Rendering is done on a 'best effort' basis: calling Parse on the output of
|
||||||
|
// Render will always result in something similar to the original tree, but it
|
||||||
|
// is not necessarily an exact clone unless the original tree was 'well-formed'.
|
||||||
|
// 'Well-formed' is not easily specified; the HTML5 specification is
|
||||||
|
// complicated.
|
||||||
|
//
|
||||||
|
// Calling Parse on arbitrary input typically results in a 'well-formed' parse
|
||||||
|
// tree. However, it is possible for Parse to yield a 'badly-formed' parse tree.
|
||||||
|
// For example, in a 'well-formed' parse tree, no <a> element is a child of
|
||||||
|
// another <a> element: parsing "<a><a>" results in two sibling elements.
|
||||||
|
// Similarly, in a 'well-formed' parse tree, no <a> element is a child of a
|
||||||
|
// <table> element: parsing "<p><table><a>" results in a <p> with two sibling
|
||||||
|
// children; the <a> is reparented to the <table>'s parent. However, calling
|
||||||
|
// Parse on "<a><table><a>" does not return an error, but the result has an <a>
|
||||||
|
// element with an <a> child, and is therefore not 'well-formed'.
|
||||||
|
//
|
||||||
|
// Programmatically constructed trees are typically also 'well-formed', but it
|
||||||
|
// is possible to construct a tree that looks innocuous but, when rendered and
|
||||||
|
// re-parsed, results in a different tree. A simple example is that a solitary
|
||||||
|
// text node would become a tree containing <html>, <head> and <body> elements.
|
||||||
|
// Another example is that the programmatic equivalent of "a<head>b</head>c"
|
||||||
|
// becomes "<html><head><head/><body>abc</body></html>".
|
||||||
|
func Render(w io.Writer, n *Node) error { |
||||||
|
if x, ok := w.(writer); ok { |
||||||
|
return render(x, n) |
||||||
|
} |
||||||
|
buf := bufio.NewWriter(w) |
||||||
|
if err := render(buf, n); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
return buf.Flush() |
||||||
|
} |
||||||
|
|
||||||
|
// plaintextAbort is returned from render1 when a <plaintext> element
|
||||||
|
// has been rendered. No more end tags should be rendered after that.
|
||||||
|
var plaintextAbort = errors.New("html: internal error (plaintext abort)") |
||||||
|
|
||||||
|
func render(w writer, n *Node) error { |
||||||
|
err := render1(w, n) |
||||||
|
if err == plaintextAbort { |
||||||
|
err = nil |
||||||
|
} |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
func render1(w writer, n *Node) error { |
||||||
|
// Render non-element nodes; these are the easy cases.
|
||||||
|
switch n.Type { |
||||||
|
case ErrorNode: |
||||||
|
return errors.New("html: cannot render an ErrorNode node") |
||||||
|
case TextNode: |
||||||
|
return escape(w, n.Data) |
||||||
|
case DocumentNode: |
||||||
|
for c := n.FirstChild; c != nil; c = c.NextSibling { |
||||||
|
if err := render1(w, c); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
} |
||||||
|
return nil |
||||||
|
case ElementNode: |
||||||
|
// No-op.
|
||||||
|
case CommentNode: |
||||||
|
if _, err := w.WriteString("<!--"); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if _, err := w.WriteString(n.Data); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if _, err := w.WriteString("-->"); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
return nil |
||||||
|
case DoctypeNode: |
||||||
|
if _, err := w.WriteString("<!DOCTYPE "); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if _, err := w.WriteString(n.Data); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if n.Attr != nil { |
||||||
|
var p, s string |
||||||
|
for _, a := range n.Attr { |
||||||
|
switch a.Key { |
||||||
|
case "public": |
||||||
|
p = a.Val |
||||||
|
case "system": |
||||||
|
s = a.Val |
||||||
|
} |
||||||
|
} |
||||||
|
if p != "" { |
||||||
|
if _, err := w.WriteString(" PUBLIC "); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if err := writeQuoted(w, p); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if s != "" { |
||||||
|
if err := w.WriteByte(' '); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if err := writeQuoted(w, s); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
} |
||||||
|
} else if s != "" { |
||||||
|
if _, err := w.WriteString(" SYSTEM "); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if err := writeQuoted(w, s); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return w.WriteByte('>') |
||||||
|
default: |
||||||
|
return errors.New("html: unknown node type") |
||||||
|
} |
||||||
|
|
||||||
|
// Render the <xxx> opening tag.
|
||||||
|
if err := w.WriteByte('<'); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if _, err := w.WriteString(n.Data); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
for _, a := range n.Attr { |
||||||
|
if err := w.WriteByte(' '); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if a.Namespace != "" { |
||||||
|
if _, err := w.WriteString(a.Namespace); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if err := w.WriteByte(':'); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
} |
||||||
|
if _, err := w.WriteString(a.Key); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if _, err := w.WriteString(`="`); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if err := escape(w, a.Val); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if err := w.WriteByte('"'); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
} |
||||||
|
if voidElements[n.Data] { |
||||||
|
if n.FirstChild != nil { |
||||||
|
return fmt.Errorf("html: void element <%s> has child nodes", n.Data) |
||||||
|
} |
||||||
|
_, err := w.WriteString("/>") |
||||||
|
return err |
||||||
|
} |
||||||
|
if err := w.WriteByte('>'); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
// Add initial newline where there is danger of a newline beging ignored.
|
||||||
|
if c := n.FirstChild; c != nil && c.Type == TextNode && strings.HasPrefix(c.Data, "\n") { |
||||||
|
switch n.Data { |
||||||
|
case "pre", "listing", "textarea": |
||||||
|
if err := w.WriteByte('\n'); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Render any child nodes.
|
||||||
|
switch n.Data { |
||||||
|
case "iframe", "noembed", "noframes", "noscript", "plaintext", "script", "style", "xmp": |
||||||
|
for c := n.FirstChild; c != nil; c = c.NextSibling { |
||||||
|
if c.Type == TextNode { |
||||||
|
if _, err := w.WriteString(c.Data); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
} else { |
||||||
|
if err := render1(w, c); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
if n.Data == "plaintext" { |
||||||
|
// Don't render anything else. <plaintext> must be the
|
||||||
|
// last element in the file, with no closing tag.
|
||||||
|
return plaintextAbort |
||||||
|
} |
||||||
|
default: |
||||||
|
for c := n.FirstChild; c != nil; c = c.NextSibling { |
||||||
|
if err := render1(w, c); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Render the </xxx> closing tag.
|
||||||
|
if _, err := w.WriteString("</"); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if _, err := w.WriteString(n.Data); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
return w.WriteByte('>') |
||||||
|
} |
||||||
|
|
||||||
|
// writeQuoted writes s to w surrounded by quotes. Normally it will use double
|
||||||
|
// quotes, but if s contains a double quote, it will use single quotes.
|
||||||
|
// It is used for writing the identifiers in a doctype declaration.
|
||||||
|
// In valid HTML, they can't contain both types of quotes.
|
||||||
|
func writeQuoted(w writer, s string) error { |
||||||
|
var q byte = '"' |
||||||
|
if strings.Contains(s, `"`) { |
||||||
|
q = '\'' |
||||||
|
} |
||||||
|
if err := w.WriteByte(q); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if _, err := w.WriteString(s); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if err := w.WriteByte(q); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
// Section 12.1.2, "Elements", gives this list of void elements. Void elements
|
||||||
|
// are those that can't have any contents.
|
||||||
|
var voidElements = map[string]bool{ |
||||||
|
"area": true, |
||||||
|
"base": true, |
||||||
|
"br": true, |
||||||
|
"col": true, |
||||||
|
"command": true, |
||||||
|
"embed": true, |
||||||
|
"hr": true, |
||||||
|
"img": true, |
||||||
|
"input": true, |
||||||
|
"keygen": true, |
||||||
|
"link": true, |
||||||
|
"meta": true, |
||||||
|
"param": true, |
||||||
|
"source": true, |
||||||
|
"track": true, |
||||||
|
"wbr": true, |
||||||
|
} |
@ -0,0 +1,156 @@ |
|||||||
|
// Copyright 2010 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package html |
||||||
|
|
||||||
|
import ( |
||||||
|
"bytes" |
||||||
|
"testing" |
||||||
|
) |
||||||
|
|
||||||
|
func TestRenderer(t *testing.T) { |
||||||
|
nodes := [...]*Node{ |
||||||
|
0: { |
||||||
|
Type: ElementNode, |
||||||
|
Data: "html", |
||||||
|
}, |
||||||
|
1: { |
||||||
|
Type: ElementNode, |
||||||
|
Data: "head", |
||||||
|
}, |
||||||
|
2: { |
||||||
|
Type: ElementNode, |
||||||
|
Data: "body", |
||||||
|
}, |
||||||
|
3: { |
||||||
|
Type: TextNode, |
||||||
|
Data: "0<1", |
||||||
|
}, |
||||||
|
4: { |
||||||
|
Type: ElementNode, |
||||||
|
Data: "p", |
||||||
|
Attr: []Attribute{ |
||||||
|
{ |
||||||
|
Key: "id", |
||||||
|
Val: "A", |
||||||
|
}, |
||||||
|
{ |
||||||
|
Key: "foo", |
||||||
|
Val: `abc"def`, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
5: { |
||||||
|
Type: TextNode, |
||||||
|
Data: "2", |
||||||
|
}, |
||||||
|
6: { |
||||||
|
Type: ElementNode, |
||||||
|
Data: "b", |
||||||
|
Attr: []Attribute{ |
||||||
|
{ |
||||||
|
Key: "empty", |
||||||
|
Val: "", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
7: { |
||||||
|
Type: TextNode, |
||||||
|
Data: "3", |
||||||
|
}, |
||||||
|
8: { |
||||||
|
Type: ElementNode, |
||||||
|
Data: "i", |
||||||
|
Attr: []Attribute{ |
||||||
|
{ |
||||||
|
Key: "backslash", |
||||||
|
Val: `\`, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
9: { |
||||||
|
Type: TextNode, |
||||||
|
Data: "&4", |
||||||
|
}, |
||||||
|
10: { |
||||||
|
Type: TextNode, |
||||||
|
Data: "5", |
||||||
|
}, |
||||||
|
11: { |
||||||
|
Type: ElementNode, |
||||||
|
Data: "blockquote", |
||||||
|
}, |
||||||
|
12: { |
||||||
|
Type: ElementNode, |
||||||
|
Data: "br", |
||||||
|
}, |
||||||
|
13: { |
||||||
|
Type: TextNode, |
||||||
|
Data: "6", |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
// Build a tree out of those nodes, based on a textual representation.
|
||||||
|
// Only the ".\t"s are significant. The trailing HTML-like text is
|
||||||
|
// just commentary. The "0:" prefixes are for easy cross-reference with
|
||||||
|
// the nodes array.
|
||||||
|
treeAsText := [...]string{ |
||||||
|
0: `<html>`, |
||||||
|
1: `. <head>`, |
||||||
|
2: `. <body>`, |
||||||
|
3: `. . "0<1"`, |
||||||
|
4: `. . <p id="A" foo="abc"def">`, |
||||||
|
5: `. . . "2"`, |
||||||
|
6: `. . . <b empty="">`, |
||||||
|
7: `. . . . "3"`, |
||||||
|
8: `. . . <i backslash="\">`, |
||||||
|
9: `. . . . "&4"`, |
||||||
|
10: `. . "5"`, |
||||||
|
11: `. . <blockquote>`, |
||||||
|
12: `. . <br>`, |
||||||
|
13: `. . "6"`, |
||||||
|
} |
||||||
|
if len(nodes) != len(treeAsText) { |
||||||
|
t.Fatal("len(nodes) != len(treeAsText)") |
||||||
|
} |
||||||
|
var stack [8]*Node |
||||||
|
for i, line := range treeAsText { |
||||||
|
level := 0 |
||||||
|
for line[0] == '.' { |
||||||
|
// Strip a leading ".\t".
|
||||||
|
line = line[2:] |
||||||
|
level++ |
||||||
|
} |
||||||
|
n := nodes[i] |
||||||
|
if level == 0 { |
||||||
|
if stack[0] != nil { |
||||||
|
t.Fatal("multiple root nodes") |
||||||
|
} |
||||||
|
stack[0] = n |
||||||
|
} else { |
||||||
|
stack[level-1].AppendChild(n) |
||||||
|
stack[level] = n |
||||||
|
for i := level + 1; i < len(stack); i++ { |
||||||
|
stack[i] = nil |
||||||
|
} |
||||||
|
} |
||||||
|
// At each stage of tree construction, we check all nodes for consistency.
|
||||||
|
for j, m := range nodes { |
||||||
|
if err := checkNodeConsistency(m); err != nil { |
||||||
|
t.Fatalf("i=%d, j=%d: %v", i, j, err) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
want := `<html><head></head><body>0<1<p id="A" foo="abc"def">` + |
||||||
|
`2<b empty="">3</b><i backslash="\">&4</i></p>` + |
||||||
|
`5<blockquote></blockquote><br/>6</body></html>` |
||||||
|
b := new(bytes.Buffer) |
||||||
|
if err := Render(b, nodes[0]); err != nil { |
||||||
|
t.Fatal(err) |
||||||
|
} |
||||||
|
if got := b.String(); got != want { |
||||||
|
t.Errorf("got vs want:\n%s\n%s\n", got, want) |
||||||
|
} |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,28 @@ |
|||||||
|
The *.dat files in this directory are copied from The WebKit Open Source |
||||||
|
Project, specifically $WEBKITROOT/LayoutTests/html5lib/resources. |
||||||
|
WebKit is licensed under a BSD style license. |
||||||
|
http://webkit.org/coding/bsd-license.html says: |
||||||
|
|
||||||
|
Copyright (C) 2009 Apple Inc. All rights reserved. |
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without |
||||||
|
modification, are permitted provided that the following conditions are met: |
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, |
||||||
|
this list of conditions and the following disclaimer. |
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice, |
||||||
|
this list of conditions and the following disclaimer in the documentation |
||||||
|
and/or other materials provided with the distribution. |
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS "AS IS" AND ANY |
||||||
|
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
||||||
|
DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
||||||
|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
@ -0,0 +1,194 @@ |
|||||||
|
#data |
||||||
|
<a><p></a></p> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| <p> |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<a>1<p>2</a>3</p> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| "1" |
||||||
|
| <p> |
||||||
|
| <a> |
||||||
|
| "2" |
||||||
|
| "3" |
||||||
|
|
||||||
|
#data |
||||||
|
<a>1<button>2</a>3</button> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| "1" |
||||||
|
| <button> |
||||||
|
| <a> |
||||||
|
| "2" |
||||||
|
| "3" |
||||||
|
|
||||||
|
#data |
||||||
|
<a>1<b>2</a>3</b> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| "1" |
||||||
|
| <b> |
||||||
|
| "2" |
||||||
|
| <b> |
||||||
|
| "3" |
||||||
|
|
||||||
|
#data |
||||||
|
<a>1<div>2<div>3</a>4</div>5</div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| "1" |
||||||
|
| <div> |
||||||
|
| <a> |
||||||
|
| "2" |
||||||
|
| <div> |
||||||
|
| <a> |
||||||
|
| "3" |
||||||
|
| "4" |
||||||
|
| "5" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><a>1<p>2</a>3</p> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| "1" |
||||||
|
| <p> |
||||||
|
| <a> |
||||||
|
| "2" |
||||||
|
| "3" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<b><b><a><p></a> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| <b> |
||||||
|
| <a> |
||||||
|
| <p> |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<b><a><b><p></a> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| <a> |
||||||
|
| <b> |
||||||
|
| <b> |
||||||
|
| <p> |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><b><b><p></a> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| <b> |
||||||
|
| <b> |
||||||
|
| <b> |
||||||
|
| <b> |
||||||
|
| <p> |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<p>1<s id="A">2<b id="B">3</p>4</s>5</b> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| "1" |
||||||
|
| <s> |
||||||
|
| id="A" |
||||||
|
| "2" |
||||||
|
| <b> |
||||||
|
| id="B" |
||||||
|
| "3" |
||||||
|
| <s> |
||||||
|
| id="A" |
||||||
|
| <b> |
||||||
|
| id="B" |
||||||
|
| "4" |
||||||
|
| <b> |
||||||
|
| id="B" |
||||||
|
| "5" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><a>1<td>2</td>3</table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| "1" |
||||||
|
| <a> |
||||||
|
| "3" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| "2" |
||||||
|
|
||||||
|
#data |
||||||
|
<table>A<td>B</td>C</table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "AC" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| "B" |
||||||
|
|
||||||
|
#data |
||||||
|
<a><svg><tr><input></a> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| <svg svg> |
||||||
|
| <svg tr> |
||||||
|
| <svg input> |
@ -0,0 +1,31 @@ |
|||||||
|
#data |
||||||
|
<b>1<i>2<p>3</b>4 |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| "1" |
||||||
|
| <i> |
||||||
|
| "2" |
||||||
|
| <i> |
||||||
|
| <p> |
||||||
|
| <b> |
||||||
|
| "3" |
||||||
|
| "4" |
||||||
|
|
||||||
|
#data |
||||||
|
<a><div><style></style><address><a> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| <a> |
||||||
|
| <style> |
||||||
|
| <address> |
||||||
|
| <a> |
||||||
|
| <a> |
@ -0,0 +1,135 @@ |
|||||||
|
#data |
||||||
|
FOO<!-- BAR -->BAZ |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <!-- BAR --> |
||||||
|
| "BAZ" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<!-- BAR --!>BAZ |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <!-- BAR --> |
||||||
|
| "BAZ" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<!-- BAR -- >BAZ |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <!-- BAR -- >BAZ --> |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<!-- BAR -- <QUX> -- MUX -->BAZ |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <!-- BAR -- <QUX> -- MUX --> |
||||||
|
| "BAZ" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<!-- BAR -- <QUX> -- MUX --!>BAZ |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <!-- BAR -- <QUX> -- MUX --> |
||||||
|
| "BAZ" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<!-- BAR -- <QUX> -- MUX -- >BAZ |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <!-- BAR -- <QUX> -- MUX -- >BAZ --> |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<!---->BAZ |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <!-- --> |
||||||
|
| "BAZ" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<!--->BAZ |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <!-- --> |
||||||
|
| "BAZ" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<!-->BAZ |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <!-- --> |
||||||
|
| "BAZ" |
||||||
|
|
||||||
|
#data |
||||||
|
<?xml version="1.0">Hi |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!-- ?xml version="1.0" --> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hi" |
||||||
|
|
||||||
|
#data |
||||||
|
<?xml version="1.0"> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!-- ?xml version="1.0" --> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<?xml version |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!-- ?xml version --> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<!----->BAZ |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <!-- - --> |
||||||
|
| "BAZ" |
@ -0,0 +1,370 @@ |
|||||||
|
#data |
||||||
|
<!DOCTYPE html>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!dOctYpE HtMl>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPEhtml>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE > |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE >Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE > |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato >Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato taco>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato taco "ddd>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato sYstEM>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato sYstEM >Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato sYstEM ggg>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato SYSTEM taco >Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato SYSTEM 'taco"'>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato "" "taco""> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato SYSTEM "taco">Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato "" "taco"> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato SYSTEM "tai'co">Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato "" "tai'co"> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato SYSTEMtaco "ddd">Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato grass SYSTEM taco>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato pUbLIc>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato pUbLIc >Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato pUbLIcgoof>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato PUBLIC goof>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato PUBLIC "go'of">Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato "go'of" ""> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato PUBLIC 'go'of'>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato "go" ""> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato PUBLIC 'go:hh of' >Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato "go:hh of" ""> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE potato PUBLIC "W3C-//dfdf" SYSTEM ggg>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE potato "W3C-//dfdf" ""> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" |
||||||
|
"http://www.w3.org/TR/html4/strict.dtd">Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE ...>Hello |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE ...> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" |
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" |
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE root-element [SYSTEM OR PUBLIC FPI] "uri" [ |
||||||
|
<!-- internal declarations --> |
||||||
|
]> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE root-element> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "]>" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html PUBLIC |
||||||
|
"-//WAPFORUM//DTD XHTML Mobile 1.0//EN" |
||||||
|
"http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE HTML SYSTEM "http://www.w3.org/DTD/HTML4-strict.dtd"><body><b>Mine!</b></body> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html "" "http://www.w3.org/DTD/HTML4-strict.dtd"> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| "Mine!" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"'http://www.w3.org/TR/html4/strict.dtd'> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01//EN"'http://www.w3.org/TR/html4/strict.dtd'> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE HTML PUBLIC'-//W3C//DTD HTML 4.01//EN''http://www.w3.org/TR/html4/strict.dtd'> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
@ -0,0 +1,249 @@ |
|||||||
|
#data |
||||||
|
<div bar="ZZ>YY"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ>YY" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar="ZZ&"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ&" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar='ZZ&'></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ&" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar=ZZ&></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ&" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar="ZZ>=YY"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ>=YY" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar="ZZ>0YY"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ>0YY" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar="ZZ>9YY"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ>9YY" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar="ZZ>aYY"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ>aYY" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar="ZZ>ZYY"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ>ZYY" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar="ZZ> YY"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ> YY" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar="ZZ>"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ>" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar='ZZ>'></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ>" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar=ZZ>></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ>" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar="ZZ£_id=23"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ£_id=23" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar="ZZ&prod_id=23"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ&prod_id=23" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar="ZZ£_id=23"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ£_id=23" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar="ZZ∏_id=23"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ∏_id=23" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar="ZZ£=23"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ£=23" |
||||||
|
|
||||||
|
#data |
||||||
|
<div bar="ZZ&prod=23"></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| bar="ZZ&prod=23" |
||||||
|
|
||||||
|
#data |
||||||
|
<div>ZZ£_id=23</div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| "ZZ£_id=23" |
||||||
|
|
||||||
|
#data |
||||||
|
<div>ZZ&prod_id=23</div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| "ZZ&prod_id=23" |
||||||
|
|
||||||
|
#data |
||||||
|
<div>ZZ£_id=23</div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| "ZZ£_id=23" |
||||||
|
|
||||||
|
#data |
||||||
|
<div>ZZ∏_id=23</div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| "ZZ∏_id=23" |
||||||
|
|
||||||
|
#data |
||||||
|
<div>ZZ£=23</div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| "ZZ£=23" |
||||||
|
|
||||||
|
#data |
||||||
|
<div>ZZ&prod=23</div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| "ZZ&prod=23" |
246
Godeps/_workspace/src/golang.org/x/net/html/testdata/webkit/html5test-com.dat
generated
vendored
246
Godeps/_workspace/src/golang.org/x/net/html/testdata/webkit/html5test-com.dat
generated
vendored
@ -0,0 +1,246 @@ |
|||||||
|
#data |
||||||
|
<div<div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div<div> |
||||||
|
|
||||||
|
#data |
||||||
|
<div foo<bar=''> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| foo<bar="" |
||||||
|
|
||||||
|
#data |
||||||
|
<div foo=`bar`> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| foo="`bar`" |
||||||
|
|
||||||
|
#data |
||||||
|
<div \"foo=''> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| \"foo="" |
||||||
|
|
||||||
|
#data |
||||||
|
<a href='\nbar'></a> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| href="\nbar" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
⟨⟩ |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "⟨⟩" |
||||||
|
|
||||||
|
#data |
||||||
|
' |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "'" |
||||||
|
|
||||||
|
#data |
||||||
|
ⅈ |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "ⅈ" |
||||||
|
|
||||||
|
#data |
||||||
|
𝕂 |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "𝕂" |
||||||
|
|
||||||
|
#data |
||||||
|
∉ |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "∉" |
||||||
|
|
||||||
|
#data |
||||||
|
<?import namespace="foo" implementation="#bar"> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!-- ?import namespace="foo" implementation="#bar" --> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!--foo--bar--> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!-- foo--bar --> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<![CDATA[x]]> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!-- [CDATA[x]] --> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<textarea><!--</textarea>--></textarea> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <textarea> |
||||||
|
| "<!--" |
||||||
|
| "-->" |
||||||
|
|
||||||
|
#data |
||||||
|
<textarea><!--</textarea>--> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <textarea> |
||||||
|
| "<!--" |
||||||
|
| "-->" |
||||||
|
|
||||||
|
#data |
||||||
|
<style><!--</style>--></style> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <style> |
||||||
|
| "<!--" |
||||||
|
| <body> |
||||||
|
| "-->" |
||||||
|
|
||||||
|
#data |
||||||
|
<style><!--</style>--> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <style> |
||||||
|
| "<!--" |
||||||
|
| <body> |
||||||
|
| "-->" |
||||||
|
|
||||||
|
#data |
||||||
|
<ul><li>A </li> <li>B</li></ul> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <ul> |
||||||
|
| <li> |
||||||
|
| "A " |
||||||
|
| " " |
||||||
|
| <li> |
||||||
|
| "B" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><form><input type=hidden><input></form><div></div></table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <input> |
||||||
|
| <div> |
||||||
|
| <table> |
||||||
|
| <form> |
||||||
|
| <input> |
||||||
|
| type="hidden" |
||||||
|
|
||||||
|
#data |
||||||
|
<i>A<b>B<p></i>C</b>D |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <i> |
||||||
|
| "A" |
||||||
|
| <b> |
||||||
|
| "B" |
||||||
|
| <b> |
||||||
|
| <p> |
||||||
|
| <b> |
||||||
|
| <i> |
||||||
|
| "C" |
||||||
|
| "D" |
||||||
|
|
||||||
|
#data |
||||||
|
<div></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<svg></svg> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
|
||||||
|
#data |
||||||
|
<math></math> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
@ -0,0 +1,43 @@ |
|||||||
|
#data |
||||||
|
<button>1</foo> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <button> |
||||||
|
| "1" |
||||||
|
|
||||||
|
#data |
||||||
|
<foo>1<p>2</foo> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <foo> |
||||||
|
| "1" |
||||||
|
| <p> |
||||||
|
| "2" |
||||||
|
|
||||||
|
#data |
||||||
|
<dd>1</foo> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <dd> |
||||||
|
| "1" |
||||||
|
|
||||||
|
#data |
||||||
|
<foo>1<dd>2</foo> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <foo> |
||||||
|
| "1" |
||||||
|
| <dd> |
||||||
|
| "2" |
@ -0,0 +1,40 @@ |
|||||||
|
#data |
||||||
|
<isindex> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <form> |
||||||
|
| <hr> |
||||||
|
| <label> |
||||||
|
| "This is a searchable index. Enter search keywords: " |
||||||
|
| <input> |
||||||
|
| name="isindex" |
||||||
|
| <hr> |
||||||
|
|
||||||
|
#data |
||||||
|
<isindex name="A" action="B" prompt="C" foo="D"> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <form> |
||||||
|
| action="B" |
||||||
|
| <hr> |
||||||
|
| <label> |
||||||
|
| "C" |
||||||
|
| <input> |
||||||
|
| foo="D" |
||||||
|
| name="isindex" |
||||||
|
| <hr> |
||||||
|
|
||||||
|
#data |
||||||
|
<form><isindex> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <form> |
Binary file not shown.
52
Godeps/_workspace/src/golang.org/x/net/html/testdata/webkit/pending-spec-changes.dat
generated
vendored
52
Godeps/_workspace/src/golang.org/x/net/html/testdata/webkit/pending-spec-changes.dat
generated
vendored
@ -0,0 +1,52 @@ |
|||||||
|
#data |
||||||
|
<input type="hidden"><frameset> |
||||||
|
#errors |
||||||
|
21: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. |
||||||
|
31: “frameset” start tag seen. |
||||||
|
31: End of file seen and there were open elements. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><table><caption><svg>foo</table>bar |
||||||
|
#errors |
||||||
|
47: End tag “table” did not match the name of the current open element (“svg”). |
||||||
|
47: “table” closed but “caption” was still open. |
||||||
|
47: End tag “table” seen, but there were open elements. |
||||||
|
36: Unclosed element “svg”. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| <svg svg> |
||||||
|
| "foo" |
||||||
|
| "bar" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tr><td><svg><desc><td></desc><circle> |
||||||
|
#errors |
||||||
|
7: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. |
||||||
|
30: A table cell was implicitly closed, but there were open elements. |
||||||
|
26: Unclosed element “desc”. |
||||||
|
20: Unclosed element “svg”. |
||||||
|
37: Stray end tag “desc”. |
||||||
|
45: End of file seen and there were open elements. |
||||||
|
45: Unclosed element “circle”. |
||||||
|
7: Unclosed element “table”. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <svg svg> |
||||||
|
| <svg desc> |
||||||
|
| <td> |
||||||
|
| <circle> |
BIN
Godeps/_workspace/src/golang.org/x/net/html/testdata/webkit/plain-text-unsafe.dat
generated
vendored
BIN
Godeps/_workspace/src/golang.org/x/net/html/testdata/webkit/plain-text-unsafe.dat
generated
vendored
Binary file not shown.
@ -0,0 +1,308 @@ |
|||||||
|
#data |
||||||
|
FOO<script>'Hello'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "'Hello'" |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script></script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script></script >BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script></script/>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script></script/ >BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script type="text/plain"></scriptx>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| type="text/plain" |
||||||
|
| "</scriptx>BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script></script foo=">" dd>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script>'<'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "'<'" |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script>'<!'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "'<!'" |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script>'<!-'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "'<!-'" |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script>'<!--'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "'<!--'" |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script>'<!---'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "'<!---'" |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script>'<!-->'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "'<!-->'" |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script>'<!-->'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "'<!-->'" |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script>'<!-- potato'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "'<!-- potato'" |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script>'<!-- <sCrIpt'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "'<!-- <sCrIpt'" |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script type="text/plain">'<!-- <sCrIpt>'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| type="text/plain" |
||||||
|
| "'<!-- <sCrIpt>'</script>BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script type="text/plain">'<!-- <sCrIpt> -'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| type="text/plain" |
||||||
|
| "'<!-- <sCrIpt> -'</script>BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script type="text/plain">'<!-- <sCrIpt> --'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| type="text/plain" |
||||||
|
| "'<!-- <sCrIpt> --'</script>BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script>'<!-- <sCrIpt> -->'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| "'<!-- <sCrIpt> -->'" |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script type="text/plain">'<!-- <sCrIpt> --!>'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| type="text/plain" |
||||||
|
| "'<!-- <sCrIpt> --!>'</script>BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script type="text/plain">'<!-- <sCrIpt> -- >'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| type="text/plain" |
||||||
|
| "'<!-- <sCrIpt> -- >'</script>BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script type="text/plain">'<!-- <sCrIpt '</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| type="text/plain" |
||||||
|
| "'<!-- <sCrIpt '</script>BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script type="text/plain">'<!-- <sCrIpt/'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| type="text/plain" |
||||||
|
| "'<!-- <sCrIpt/'</script>BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script type="text/plain">'<!-- <sCrIpt\'</script>BAR |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| type="text/plain" |
||||||
|
| "'<!-- <sCrIpt\'" |
||||||
|
| "BAR" |
||||||
|
|
||||||
|
#data |
||||||
|
FOO<script type="text/plain">'<!-- <sCrIpt/'</script>BAR</script>QUX |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "FOO" |
||||||
|
| <script> |
||||||
|
| type="text/plain" |
||||||
|
| "'<!-- <sCrIpt/'</script>BAR" |
||||||
|
| "QUX" |
15
Godeps/_workspace/src/golang.org/x/net/html/testdata/webkit/scripted/adoption01.dat
generated
vendored
15
Godeps/_workspace/src/golang.org/x/net/html/testdata/webkit/scripted/adoption01.dat
generated
vendored
@ -0,0 +1,15 @@ |
|||||||
|
#data |
||||||
|
<p><b id="A"><script>document.getElementById("A").id = "B"</script></p>TEXT</b> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <b> |
||||||
|
| id="B" |
||||||
|
| <script> |
||||||
|
| "document.getElementById("A").id = "B"" |
||||||
|
| <b> |
||||||
|
| id="A" |
||||||
|
| "TEXT" |
28
Godeps/_workspace/src/golang.org/x/net/html/testdata/webkit/scripted/webkit01.dat
generated
vendored
28
Godeps/_workspace/src/golang.org/x/net/html/testdata/webkit/scripted/webkit01.dat
generated
vendored
@ -0,0 +1,28 @@ |
|||||||
|
#data |
||||||
|
1<script>document.write("2")</script>3 |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "1" |
||||||
|
| <script> |
||||||
|
| "document.write("2")" |
||||||
|
| "23" |
||||||
|
|
||||||
|
#data |
||||||
|
1<script>document.write("<script>document.write('2')</scr"+ "ipt><script>document.write('3')</scr" + "ipt>")</script>4 |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "1" |
||||||
|
| <script> |
||||||
|
| "document.write("<script>document.write('2')</scr"+ "ipt><script>document.write('3')</scr" + "ipt>")" |
||||||
|
| <script> |
||||||
|
| "document.write('2')" |
||||||
|
| "2" |
||||||
|
| <script> |
||||||
|
| "document.write('3')" |
||||||
|
| "34" |
@ -0,0 +1,212 @@ |
|||||||
|
#data |
||||||
|
<table><th> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <th> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><td> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><col foo='bar'> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <colgroup> |
||||||
|
| <col> |
||||||
|
| foo="bar" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><colgroup></html>foo |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "foo" |
||||||
|
| <table> |
||||||
|
| <colgroup> |
||||||
|
|
||||||
|
#data |
||||||
|
<table></table><p>foo |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <p> |
||||||
|
| "foo" |
||||||
|
|
||||||
|
#data |
||||||
|
<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr><td> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><select><option>3</select></table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <option> |
||||||
|
| "3" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><select><table></table></select></table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <table> |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><select></table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><select><option>A<tr><td>B</td></tr></table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <option> |
||||||
|
| "A" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| "B" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><td></body></caption></col></colgroup></html>foo |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| "foo" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><td>A</table>B |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| "A" |
||||||
|
| "B" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tr><caption> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <caption> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tr></body></caption></col></colgroup></html></td></th><td>foo |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| "foo" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><td><tr> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><td><button><td> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <button> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tr><td><svg><desc><td> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <svg svg> |
||||||
|
| <svg desc> |
||||||
|
| <td> |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,799 @@ |
|||||||
|
#data |
||||||
|
<!DOCTYPE html><svg></svg> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><svg></svg><![CDATA[a]]> |
||||||
|
#errors |
||||||
|
29: Bogus comment |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <!-- [CDATA[a]] --> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><svg></svg> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><select><svg></svg></select> |
||||||
|
#errors |
||||||
|
35: Stray “svg” start tag. |
||||||
|
42: Stray end tag “svg” |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><select><option><svg></svg></option></select> |
||||||
|
#errors |
||||||
|
43: Stray “svg” start tag. |
||||||
|
50: Stray end tag “svg” |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <option> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><svg></svg></table> |
||||||
|
#errors |
||||||
|
34: Start tag “svg” seen in “table”. |
||||||
|
41: Stray end tag “svg”. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><svg><g>foo</g></svg></table> |
||||||
|
#errors |
||||||
|
34: Start tag “svg” seen in “table”. |
||||||
|
46: Stray end tag “g”. |
||||||
|
53: Stray end tag “svg”. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| "foo" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><svg><g>foo</g><g>bar</g></svg></table> |
||||||
|
#errors |
||||||
|
34: Start tag “svg” seen in “table”. |
||||||
|
46: Stray end tag “g”. |
||||||
|
58: Stray end tag “g”. |
||||||
|
65: Stray end tag “svg”. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| "foo" |
||||||
|
| <svg g> |
||||||
|
| "bar" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><tbody><svg><g>foo</g><g>bar</g></svg></tbody></table> |
||||||
|
#errors |
||||||
|
41: Start tag “svg” seen in “table”. |
||||||
|
53: Stray end tag “g”. |
||||||
|
65: Stray end tag “g”. |
||||||
|
72: Stray end tag “svg”. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| "foo" |
||||||
|
| <svg g> |
||||||
|
| "bar" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><tbody><tr><svg><g>foo</g><g>bar</g></svg></tr></tbody></table> |
||||||
|
#errors |
||||||
|
45: Start tag “svg” seen in “table”. |
||||||
|
57: Stray end tag “g”. |
||||||
|
69: Stray end tag “g”. |
||||||
|
76: Stray end tag “svg”. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| "foo" |
||||||
|
| <svg g> |
||||||
|
| "bar" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg></td></tr></tbody></table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| "foo" |
||||||
|
| <svg g> |
||||||
|
| "bar" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg><p>baz</td></tr></tbody></table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| "foo" |
||||||
|
| <svg g> |
||||||
|
| "bar" |
||||||
|
| <p> |
||||||
|
| "baz" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</caption></table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| "foo" |
||||||
|
| <svg g> |
||||||
|
| "bar" |
||||||
|
| <p> |
||||||
|
| "baz" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g><p>baz</table><p>quux |
||||||
|
#errors |
||||||
|
70: HTML start tag “p” in a foreign namespace context. |
||||||
|
81: “table” closed but “caption” was still open. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| "foo" |
||||||
|
| <svg g> |
||||||
|
| "bar" |
||||||
|
| <p> |
||||||
|
| "baz" |
||||||
|
| <p> |
||||||
|
| "quux" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g>baz</table><p>quux |
||||||
|
#errors |
||||||
|
78: “table” closed but “caption” was still open. |
||||||
|
78: Unclosed elements on stack. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| "foo" |
||||||
|
| <svg g> |
||||||
|
| "bar" |
||||||
|
| "baz" |
||||||
|
| <p> |
||||||
|
| "quux" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><colgroup><svg><g>foo</g><g>bar</g><p>baz</table><p>quux |
||||||
|
#errors |
||||||
|
44: Start tag “svg” seen in “table”. |
||||||
|
56: Stray end tag “g”. |
||||||
|
68: Stray end tag “g”. |
||||||
|
71: HTML start tag “p” in a foreign namespace context. |
||||||
|
71: Start tag “p” seen in “table”. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| "foo" |
||||||
|
| <svg g> |
||||||
|
| "bar" |
||||||
|
| <p> |
||||||
|
| "baz" |
||||||
|
| <table> |
||||||
|
| <colgroup> |
||||||
|
| <p> |
||||||
|
| "quux" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><tr><td><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux |
||||||
|
#errors |
||||||
|
50: Stray “svg” start tag. |
||||||
|
54: Stray “g” start tag. |
||||||
|
62: Stray end tag “g” |
||||||
|
66: Stray “g” start tag. |
||||||
|
74: Stray end tag “g” |
||||||
|
77: Stray “p” start tag. |
||||||
|
88: “table” end tag with “select” open. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <select> |
||||||
|
| "foobarbaz" |
||||||
|
| <p> |
||||||
|
| "quux" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux |
||||||
|
#errors |
||||||
|
36: Start tag “select” seen in “table”. |
||||||
|
42: Stray “svg” start tag. |
||||||
|
46: Stray “g” start tag. |
||||||
|
54: Stray end tag “g” |
||||||
|
58: Stray “g” start tag. |
||||||
|
66: Stray end tag “g” |
||||||
|
69: Stray “p” start tag. |
||||||
|
80: “table” end tag with “select” open. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| "foobarbaz" |
||||||
|
| <table> |
||||||
|
| <p> |
||||||
|
| "quux" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body></body></html><svg><g>foo</g><g>bar</g><p>baz |
||||||
|
#errors |
||||||
|
41: Stray “svg” start tag. |
||||||
|
68: HTML start tag “p” in a foreign namespace context. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| "foo" |
||||||
|
| <svg g> |
||||||
|
| "bar" |
||||||
|
| <p> |
||||||
|
| "baz" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body></body><svg><g>foo</g><g>bar</g><p>baz |
||||||
|
#errors |
||||||
|
34: Stray “svg” start tag. |
||||||
|
61: HTML start tag “p” in a foreign namespace context. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| "foo" |
||||||
|
| <svg g> |
||||||
|
| "bar" |
||||||
|
| <p> |
||||||
|
| "baz" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><frameset><svg><g></g><g></g><p><span> |
||||||
|
#errors |
||||||
|
31: Stray “svg” start tag. |
||||||
|
35: Stray “g” start tag. |
||||||
|
40: Stray end tag “g” |
||||||
|
44: Stray “g” start tag. |
||||||
|
49: Stray end tag “g” |
||||||
|
52: Stray “p” start tag. |
||||||
|
58: Stray “span” start tag. |
||||||
|
58: End of file seen and there were open elements. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><frameset></frameset><svg><g></g><g></g><p><span> |
||||||
|
#errors |
||||||
|
42: Stray “svg” start tag. |
||||||
|
46: Stray “g” start tag. |
||||||
|
51: Stray end tag “g” |
||||||
|
55: Stray “g” start tag. |
||||||
|
60: Stray end tag “g” |
||||||
|
63: Stray “p” start tag. |
||||||
|
69: Stray “span” start tag. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body xlink:href=foo><svg xlink:href=foo></svg> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| xlink:href="foo" |
||||||
|
| <svg svg> |
||||||
|
| xlink href="foo" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo></g></svg> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| xlink:href="foo" |
||||||
|
| xml:lang="en" |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| xlink href="foo" |
||||||
|
| xml lang="en" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo /></svg> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| xlink:href="foo" |
||||||
|
| xml:lang="en" |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| xlink href="foo" |
||||||
|
| xml lang="en" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo />bar</svg> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| xlink:href="foo" |
||||||
|
| xml:lang="en" |
||||||
|
| <svg svg> |
||||||
|
| <svg g> |
||||||
|
| xlink href="foo" |
||||||
|
| xml lang="en" |
||||||
|
| "bar" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg></path> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
|
||||||
|
#data |
||||||
|
<div><svg></div>a |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <svg svg> |
||||||
|
| "a" |
||||||
|
|
||||||
|
#data |
||||||
|
<div><svg><path></div>a |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <svg svg> |
||||||
|
| <svg path> |
||||||
|
| "a" |
||||||
|
|
||||||
|
#data |
||||||
|
<div><svg><path></svg><path> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <svg svg> |
||||||
|
| <svg path> |
||||||
|
| <path> |
||||||
|
|
||||||
|
#data |
||||||
|
<div><svg><path><foreignObject><math></div>a |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <svg svg> |
||||||
|
| <svg path> |
||||||
|
| <svg foreignObject> |
||||||
|
| <math math> |
||||||
|
| "a" |
||||||
|
|
||||||
|
#data |
||||||
|
<div><svg><path><foreignObject><p></div>a |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <svg svg> |
||||||
|
| <svg path> |
||||||
|
| <svg foreignObject> |
||||||
|
| <p> |
||||||
|
| "a" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><svg><desc><div><svg><ul>a |
||||||
|
#errors |
||||||
|
40: HTML start tag “ul” in a foreign namespace context. |
||||||
|
41: End of file in a foreign namespace context. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg desc> |
||||||
|
| <div> |
||||||
|
| <svg svg> |
||||||
|
| <ul> |
||||||
|
| "a" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><svg><desc><svg><ul>a |
||||||
|
#errors |
||||||
|
35: HTML start tag “ul” in a foreign namespace context. |
||||||
|
36: End of file in a foreign namespace context. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg desc> |
||||||
|
| <svg svg> |
||||||
|
| <ul> |
||||||
|
| "a" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><p><svg><desc><p> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <svg svg> |
||||||
|
| <svg desc> |
||||||
|
| <p> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><p><svg><title><p> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <svg svg> |
||||||
|
| <svg title> |
||||||
|
| <p> |
||||||
|
|
||||||
|
#data |
||||||
|
<div><svg><path><foreignObject><p></foreignObject><p> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <svg svg> |
||||||
|
| <svg path> |
||||||
|
| <svg foreignObject> |
||||||
|
| <p> |
||||||
|
| <p> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><mi><div><object><div><span></span></div></object></div></mi><mi> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| <div> |
||||||
|
| <object> |
||||||
|
| <div> |
||||||
|
| <span> |
||||||
|
| <math mi> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| <svg svg> |
||||||
|
| <svg foreignObject> |
||||||
|
| <div> |
||||||
|
| <div> |
||||||
|
| <math mi> |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><script></script><path> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg script> |
||||||
|
| <svg path> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><svg></svg><tr> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><mi><mglyph> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| <math mglyph> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><mi><malignmark> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| <math malignmark> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><mo><mglyph> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mo> |
||||||
|
| <math mglyph> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><mo><malignmark> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mo> |
||||||
|
| <math malignmark> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><mn><mglyph> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mn> |
||||||
|
| <math mglyph> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><mn><malignmark> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mn> |
||||||
|
| <math malignmark> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><ms><mglyph> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math ms> |
||||||
|
| <math mglyph> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><ms><malignmark> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math ms> |
||||||
|
| <math malignmark> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><mtext><mglyph> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mtext> |
||||||
|
| <math mglyph> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><mtext><malignmark> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mtext> |
||||||
|
| <math malignmark> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><annotation-xml><svg></svg></annotation-xml><mi> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math annotation-xml> |
||||||
|
| <svg svg> |
||||||
|
| <math mi> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math annotation-xml> |
||||||
|
| <svg svg> |
||||||
|
| <svg foreignObject> |
||||||
|
| <div> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| <span> |
||||||
|
| <svg path> |
||||||
|
| <math mi> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math annotation-xml> |
||||||
|
| <svg svg> |
||||||
|
| <svg foreignObject> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| <svg svg> |
||||||
|
| <math mo> |
||||||
|
| <span> |
||||||
|
| <svg path> |
||||||
|
| <math mi> |
@ -0,0 +1,482 @@ |
|||||||
|
#data |
||||||
|
<!DOCTYPE html><body><svg attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' contentScriptType='' contentStyleType='' diffuseConstant='' edgeMode='' externalResourcesRequired='' filterRes='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></svg> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| attributeName="" |
||||||
|
| attributeType="" |
||||||
|
| baseFrequency="" |
||||||
|
| baseProfile="" |
||||||
|
| calcMode="" |
||||||
|
| clipPathUnits="" |
||||||
|
| contentScriptType="" |
||||||
|
| contentStyleType="" |
||||||
|
| diffuseConstant="" |
||||||
|
| edgeMode="" |
||||||
|
| externalResourcesRequired="" |
||||||
|
| filterRes="" |
||||||
|
| filterUnits="" |
||||||
|
| glyphRef="" |
||||||
|
| gradientTransform="" |
||||||
|
| gradientUnits="" |
||||||
|
| kernelMatrix="" |
||||||
|
| kernelUnitLength="" |
||||||
|
| keyPoints="" |
||||||
|
| keySplines="" |
||||||
|
| keyTimes="" |
||||||
|
| lengthAdjust="" |
||||||
|
| limitingConeAngle="" |
||||||
|
| markerHeight="" |
||||||
|
| markerUnits="" |
||||||
|
| markerWidth="" |
||||||
|
| maskContentUnits="" |
||||||
|
| maskUnits="" |
||||||
|
| numOctaves="" |
||||||
|
| pathLength="" |
||||||
|
| patternContentUnits="" |
||||||
|
| patternTransform="" |
||||||
|
| patternUnits="" |
||||||
|
| pointsAtX="" |
||||||
|
| pointsAtY="" |
||||||
|
| pointsAtZ="" |
||||||
|
| preserveAlpha="" |
||||||
|
| preserveAspectRatio="" |
||||||
|
| primitiveUnits="" |
||||||
|
| refX="" |
||||||
|
| refY="" |
||||||
|
| repeatCount="" |
||||||
|
| repeatDur="" |
||||||
|
| requiredExtensions="" |
||||||
|
| requiredFeatures="" |
||||||
|
| specularConstant="" |
||||||
|
| specularExponent="" |
||||||
|
| spreadMethod="" |
||||||
|
| startOffset="" |
||||||
|
| stdDeviation="" |
||||||
|
| stitchTiles="" |
||||||
|
| surfaceScale="" |
||||||
|
| systemLanguage="" |
||||||
|
| tableValues="" |
||||||
|
| targetX="" |
||||||
|
| targetY="" |
||||||
|
| textLength="" |
||||||
|
| viewBox="" |
||||||
|
| viewTarget="" |
||||||
|
| xChannelSelector="" |
||||||
|
| yChannelSelector="" |
||||||
|
| zoomAndPan="" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><BODY><SVG ATTRIBUTENAME='' ATTRIBUTETYPE='' BASEFREQUENCY='' BASEPROFILE='' CALCMODE='' CLIPPATHUNITS='' CONTENTSCRIPTTYPE='' CONTENTSTYLETYPE='' DIFFUSECONSTANT='' EDGEMODE='' EXTERNALRESOURCESREQUIRED='' FILTERRES='' FILTERUNITS='' GLYPHREF='' GRADIENTTRANSFORM='' GRADIENTUNITS='' KERNELMATRIX='' KERNELUNITLENGTH='' KEYPOINTS='' KEYSPLINES='' KEYTIMES='' LENGTHADJUST='' LIMITINGCONEANGLE='' MARKERHEIGHT='' MARKERUNITS='' MARKERWIDTH='' MASKCONTENTUNITS='' MASKUNITS='' NUMOCTAVES='' PATHLENGTH='' PATTERNCONTENTUNITS='' PATTERNTRANSFORM='' PATTERNUNITS='' POINTSATX='' POINTSATY='' POINTSATZ='' PRESERVEALPHA='' PRESERVEASPECTRATIO='' PRIMITIVEUNITS='' REFX='' REFY='' REPEATCOUNT='' REPEATDUR='' REQUIREDEXTENSIONS='' REQUIREDFEATURES='' SPECULARCONSTANT='' SPECULAREXPONENT='' SPREADMETHOD='' STARTOFFSET='' STDDEVIATION='' STITCHTILES='' SURFACESCALE='' SYSTEMLANGUAGE='' TABLEVALUES='' TARGETX='' TARGETY='' TEXTLENGTH='' VIEWBOX='' VIEWTARGET='' XCHANNELSELECTOR='' YCHANNELSELECTOR='' ZOOMANDPAN=''></SVG> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| attributeName="" |
||||||
|
| attributeType="" |
||||||
|
| baseFrequency="" |
||||||
|
| baseProfile="" |
||||||
|
| calcMode="" |
||||||
|
| clipPathUnits="" |
||||||
|
| contentScriptType="" |
||||||
|
| contentStyleType="" |
||||||
|
| diffuseConstant="" |
||||||
|
| edgeMode="" |
||||||
|
| externalResourcesRequired="" |
||||||
|
| filterRes="" |
||||||
|
| filterUnits="" |
||||||
|
| glyphRef="" |
||||||
|
| gradientTransform="" |
||||||
|
| gradientUnits="" |
||||||
|
| kernelMatrix="" |
||||||
|
| kernelUnitLength="" |
||||||
|
| keyPoints="" |
||||||
|
| keySplines="" |
||||||
|
| keyTimes="" |
||||||
|
| lengthAdjust="" |
||||||
|
| limitingConeAngle="" |
||||||
|
| markerHeight="" |
||||||
|
| markerUnits="" |
||||||
|
| markerWidth="" |
||||||
|
| maskContentUnits="" |
||||||
|
| maskUnits="" |
||||||
|
| numOctaves="" |
||||||
|
| pathLength="" |
||||||
|
| patternContentUnits="" |
||||||
|
| patternTransform="" |
||||||
|
| patternUnits="" |
||||||
|
| pointsAtX="" |
||||||
|
| pointsAtY="" |
||||||
|
| pointsAtZ="" |
||||||
|
| preserveAlpha="" |
||||||
|
| preserveAspectRatio="" |
||||||
|
| primitiveUnits="" |
||||||
|
| refX="" |
||||||
|
| refY="" |
||||||
|
| repeatCount="" |
||||||
|
| repeatDur="" |
||||||
|
| requiredExtensions="" |
||||||
|
| requiredFeatures="" |
||||||
|
| specularConstant="" |
||||||
|
| specularExponent="" |
||||||
|
| spreadMethod="" |
||||||
|
| startOffset="" |
||||||
|
| stdDeviation="" |
||||||
|
| stitchTiles="" |
||||||
|
| surfaceScale="" |
||||||
|
| systemLanguage="" |
||||||
|
| tableValues="" |
||||||
|
| targetX="" |
||||||
|
| targetY="" |
||||||
|
| textLength="" |
||||||
|
| viewBox="" |
||||||
|
| viewTarget="" |
||||||
|
| xChannelSelector="" |
||||||
|
| yChannelSelector="" |
||||||
|
| zoomAndPan="" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><svg attributename='' attributetype='' basefrequency='' baseprofile='' calcmode='' clippathunits='' contentscripttype='' contentstyletype='' diffuseconstant='' edgemode='' externalresourcesrequired='' filterres='' filterunits='' glyphref='' gradienttransform='' gradientunits='' kernelmatrix='' kernelunitlength='' keypoints='' keysplines='' keytimes='' lengthadjust='' limitingconeangle='' markerheight='' markerunits='' markerwidth='' maskcontentunits='' maskunits='' numoctaves='' pathlength='' patterncontentunits='' patterntransform='' patternunits='' pointsatx='' pointsaty='' pointsatz='' preservealpha='' preserveaspectratio='' primitiveunits='' refx='' refy='' repeatcount='' repeatdur='' requiredextensions='' requiredfeatures='' specularconstant='' specularexponent='' spreadmethod='' startoffset='' stddeviation='' stitchtiles='' surfacescale='' systemlanguage='' tablevalues='' targetx='' targety='' textlength='' viewbox='' viewtarget='' xchannelselector='' ychannelselector='' zoomandpan=''></svg> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| attributeName="" |
||||||
|
| attributeType="" |
||||||
|
| baseFrequency="" |
||||||
|
| baseProfile="" |
||||||
|
| calcMode="" |
||||||
|
| clipPathUnits="" |
||||||
|
| contentScriptType="" |
||||||
|
| contentStyleType="" |
||||||
|
| diffuseConstant="" |
||||||
|
| edgeMode="" |
||||||
|
| externalResourcesRequired="" |
||||||
|
| filterRes="" |
||||||
|
| filterUnits="" |
||||||
|
| glyphRef="" |
||||||
|
| gradientTransform="" |
||||||
|
| gradientUnits="" |
||||||
|
| kernelMatrix="" |
||||||
|
| kernelUnitLength="" |
||||||
|
| keyPoints="" |
||||||
|
| keySplines="" |
||||||
|
| keyTimes="" |
||||||
|
| lengthAdjust="" |
||||||
|
| limitingConeAngle="" |
||||||
|
| markerHeight="" |
||||||
|
| markerUnits="" |
||||||
|
| markerWidth="" |
||||||
|
| maskContentUnits="" |
||||||
|
| maskUnits="" |
||||||
|
| numOctaves="" |
||||||
|
| pathLength="" |
||||||
|
| patternContentUnits="" |
||||||
|
| patternTransform="" |
||||||
|
| patternUnits="" |
||||||
|
| pointsAtX="" |
||||||
|
| pointsAtY="" |
||||||
|
| pointsAtZ="" |
||||||
|
| preserveAlpha="" |
||||||
|
| preserveAspectRatio="" |
||||||
|
| primitiveUnits="" |
||||||
|
| refX="" |
||||||
|
| refY="" |
||||||
|
| repeatCount="" |
||||||
|
| repeatDur="" |
||||||
|
| requiredExtensions="" |
||||||
|
| requiredFeatures="" |
||||||
|
| specularConstant="" |
||||||
|
| specularExponent="" |
||||||
|
| spreadMethod="" |
||||||
|
| startOffset="" |
||||||
|
| stdDeviation="" |
||||||
|
| stitchTiles="" |
||||||
|
| surfaceScale="" |
||||||
|
| systemLanguage="" |
||||||
|
| tableValues="" |
||||||
|
| targetX="" |
||||||
|
| targetY="" |
||||||
|
| textLength="" |
||||||
|
| viewBox="" |
||||||
|
| viewTarget="" |
||||||
|
| xChannelSelector="" |
||||||
|
| yChannelSelector="" |
||||||
|
| zoomAndPan="" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><math attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' contentScriptType='' contentStyleType='' diffuseConstant='' edgeMode='' externalResourcesRequired='' filterRes='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></math> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| attributename="" |
||||||
|
| attributetype="" |
||||||
|
| basefrequency="" |
||||||
|
| baseprofile="" |
||||||
|
| calcmode="" |
||||||
|
| clippathunits="" |
||||||
|
| contentscripttype="" |
||||||
|
| contentstyletype="" |
||||||
|
| diffuseconstant="" |
||||||
|
| edgemode="" |
||||||
|
| externalresourcesrequired="" |
||||||
|
| filterres="" |
||||||
|
| filterunits="" |
||||||
|
| glyphref="" |
||||||
|
| gradienttransform="" |
||||||
|
| gradientunits="" |
||||||
|
| kernelmatrix="" |
||||||
|
| kernelunitlength="" |
||||||
|
| keypoints="" |
||||||
|
| keysplines="" |
||||||
|
| keytimes="" |
||||||
|
| lengthadjust="" |
||||||
|
| limitingconeangle="" |
||||||
|
| markerheight="" |
||||||
|
| markerunits="" |
||||||
|
| markerwidth="" |
||||||
|
| maskcontentunits="" |
||||||
|
| maskunits="" |
||||||
|
| numoctaves="" |
||||||
|
| pathlength="" |
||||||
|
| patterncontentunits="" |
||||||
|
| patterntransform="" |
||||||
|
| patternunits="" |
||||||
|
| pointsatx="" |
||||||
|
| pointsaty="" |
||||||
|
| pointsatz="" |
||||||
|
| preservealpha="" |
||||||
|
| preserveaspectratio="" |
||||||
|
| primitiveunits="" |
||||||
|
| refx="" |
||||||
|
| refy="" |
||||||
|
| repeatcount="" |
||||||
|
| repeatdur="" |
||||||
|
| requiredextensions="" |
||||||
|
| requiredfeatures="" |
||||||
|
| specularconstant="" |
||||||
|
| specularexponent="" |
||||||
|
| spreadmethod="" |
||||||
|
| startoffset="" |
||||||
|
| stddeviation="" |
||||||
|
| stitchtiles="" |
||||||
|
| surfacescale="" |
||||||
|
| systemlanguage="" |
||||||
|
| tablevalues="" |
||||||
|
| targetx="" |
||||||
|
| targety="" |
||||||
|
| textlength="" |
||||||
|
| viewbox="" |
||||||
|
| viewtarget="" |
||||||
|
| xchannelselector="" |
||||||
|
| ychannelselector="" |
||||||
|
| zoomandpan="" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><svg><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></svg> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg altGlyph> |
||||||
|
| <svg altGlyphDef> |
||||||
|
| <svg altGlyphItem> |
||||||
|
| <svg animateColor> |
||||||
|
| <svg animateMotion> |
||||||
|
| <svg animateTransform> |
||||||
|
| <svg clipPath> |
||||||
|
| <svg feBlend> |
||||||
|
| <svg feColorMatrix> |
||||||
|
| <svg feComponentTransfer> |
||||||
|
| <svg feComposite> |
||||||
|
| <svg feConvolveMatrix> |
||||||
|
| <svg feDiffuseLighting> |
||||||
|
| <svg feDisplacementMap> |
||||||
|
| <svg feDistantLight> |
||||||
|
| <svg feFlood> |
||||||
|
| <svg feFuncA> |
||||||
|
| <svg feFuncB> |
||||||
|
| <svg feFuncG> |
||||||
|
| <svg feFuncR> |
||||||
|
| <svg feGaussianBlur> |
||||||
|
| <svg feImage> |
||||||
|
| <svg feMerge> |
||||||
|
| <svg feMergeNode> |
||||||
|
| <svg feMorphology> |
||||||
|
| <svg feOffset> |
||||||
|
| <svg fePointLight> |
||||||
|
| <svg feSpecularLighting> |
||||||
|
| <svg feSpotLight> |
||||||
|
| <svg feTile> |
||||||
|
| <svg feTurbulence> |
||||||
|
| <svg foreignObject> |
||||||
|
| <svg glyphRef> |
||||||
|
| <svg linearGradient> |
||||||
|
| <svg radialGradient> |
||||||
|
| <svg textPath> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><svg><altglyph /><altglyphdef /><altglyphitem /><animatecolor /><animatemotion /><animatetransform /><clippath /><feblend /><fecolormatrix /><fecomponenttransfer /><fecomposite /><feconvolvematrix /><fediffuselighting /><fedisplacementmap /><fedistantlight /><feflood /><fefunca /><fefuncb /><fefuncg /><fefuncr /><fegaussianblur /><feimage /><femerge /><femergenode /><femorphology /><feoffset /><fepointlight /><fespecularlighting /><fespotlight /><fetile /><feturbulence /><foreignobject /><glyphref /><lineargradient /><radialgradient /><textpath /></svg> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg altGlyph> |
||||||
|
| <svg altGlyphDef> |
||||||
|
| <svg altGlyphItem> |
||||||
|
| <svg animateColor> |
||||||
|
| <svg animateMotion> |
||||||
|
| <svg animateTransform> |
||||||
|
| <svg clipPath> |
||||||
|
| <svg feBlend> |
||||||
|
| <svg feColorMatrix> |
||||||
|
| <svg feComponentTransfer> |
||||||
|
| <svg feComposite> |
||||||
|
| <svg feConvolveMatrix> |
||||||
|
| <svg feDiffuseLighting> |
||||||
|
| <svg feDisplacementMap> |
||||||
|
| <svg feDistantLight> |
||||||
|
| <svg feFlood> |
||||||
|
| <svg feFuncA> |
||||||
|
| <svg feFuncB> |
||||||
|
| <svg feFuncG> |
||||||
|
| <svg feFuncR> |
||||||
|
| <svg feGaussianBlur> |
||||||
|
| <svg feImage> |
||||||
|
| <svg feMerge> |
||||||
|
| <svg feMergeNode> |
||||||
|
| <svg feMorphology> |
||||||
|
| <svg feOffset> |
||||||
|
| <svg fePointLight> |
||||||
|
| <svg feSpecularLighting> |
||||||
|
| <svg feSpotLight> |
||||||
|
| <svg feTile> |
||||||
|
| <svg feTurbulence> |
||||||
|
| <svg foreignObject> |
||||||
|
| <svg glyphRef> |
||||||
|
| <svg linearGradient> |
||||||
|
| <svg radialGradient> |
||||||
|
| <svg textPath> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><BODY><SVG><ALTGLYPH /><ALTGLYPHDEF /><ALTGLYPHITEM /><ANIMATECOLOR /><ANIMATEMOTION /><ANIMATETRANSFORM /><CLIPPATH /><FEBLEND /><FECOLORMATRIX /><FECOMPONENTTRANSFER /><FECOMPOSITE /><FECONVOLVEMATRIX /><FEDIFFUSELIGHTING /><FEDISPLACEMENTMAP /><FEDISTANTLIGHT /><FEFLOOD /><FEFUNCA /><FEFUNCB /><FEFUNCG /><FEFUNCR /><FEGAUSSIANBLUR /><FEIMAGE /><FEMERGE /><FEMERGENODE /><FEMORPHOLOGY /><FEOFFSET /><FEPOINTLIGHT /><FESPECULARLIGHTING /><FESPOTLIGHT /><FETILE /><FETURBULENCE /><FOREIGNOBJECT /><GLYPHREF /><LINEARGRADIENT /><RADIALGRADIENT /><TEXTPATH /></SVG> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg altGlyph> |
||||||
|
| <svg altGlyphDef> |
||||||
|
| <svg altGlyphItem> |
||||||
|
| <svg animateColor> |
||||||
|
| <svg animateMotion> |
||||||
|
| <svg animateTransform> |
||||||
|
| <svg clipPath> |
||||||
|
| <svg feBlend> |
||||||
|
| <svg feColorMatrix> |
||||||
|
| <svg feComponentTransfer> |
||||||
|
| <svg feComposite> |
||||||
|
| <svg feConvolveMatrix> |
||||||
|
| <svg feDiffuseLighting> |
||||||
|
| <svg feDisplacementMap> |
||||||
|
| <svg feDistantLight> |
||||||
|
| <svg feFlood> |
||||||
|
| <svg feFuncA> |
||||||
|
| <svg feFuncB> |
||||||
|
| <svg feFuncG> |
||||||
|
| <svg feFuncR> |
||||||
|
| <svg feGaussianBlur> |
||||||
|
| <svg feImage> |
||||||
|
| <svg feMerge> |
||||||
|
| <svg feMergeNode> |
||||||
|
| <svg feMorphology> |
||||||
|
| <svg feOffset> |
||||||
|
| <svg fePointLight> |
||||||
|
| <svg feSpecularLighting> |
||||||
|
| <svg feSpotLight> |
||||||
|
| <svg feTile> |
||||||
|
| <svg feTurbulence> |
||||||
|
| <svg foreignObject> |
||||||
|
| <svg glyphRef> |
||||||
|
| <svg linearGradient> |
||||||
|
| <svg radialGradient> |
||||||
|
| <svg textPath> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><math><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></math> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math altglyph> |
||||||
|
| <math altglyphdef> |
||||||
|
| <math altglyphitem> |
||||||
|
| <math animatecolor> |
||||||
|
| <math animatemotion> |
||||||
|
| <math animatetransform> |
||||||
|
| <math clippath> |
||||||
|
| <math feblend> |
||||||
|
| <math fecolormatrix> |
||||||
|
| <math fecomponenttransfer> |
||||||
|
| <math fecomposite> |
||||||
|
| <math feconvolvematrix> |
||||||
|
| <math fediffuselighting> |
||||||
|
| <math fedisplacementmap> |
||||||
|
| <math fedistantlight> |
||||||
|
| <math feflood> |
||||||
|
| <math fefunca> |
||||||
|
| <math fefuncb> |
||||||
|
| <math fefuncg> |
||||||
|
| <math fefuncr> |
||||||
|
| <math fegaussianblur> |
||||||
|
| <math feimage> |
||||||
|
| <math femerge> |
||||||
|
| <math femergenode> |
||||||
|
| <math femorphology> |
||||||
|
| <math feoffset> |
||||||
|
| <math fepointlight> |
||||||
|
| <math fespecularlighting> |
||||||
|
| <math fespotlight> |
||||||
|
| <math fetile> |
||||||
|
| <math feturbulence> |
||||||
|
| <math foreignobject> |
||||||
|
| <math glyphref> |
||||||
|
| <math lineargradient> |
||||||
|
| <math radialgradient> |
||||||
|
| <math textpath> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><svg><solidColor /></svg> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg solidcolor> |
@ -0,0 +1,62 @@ |
|||||||
|
#data |
||||||
|
<!DOCTYPE html><body><p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| "foo" |
||||||
|
| <math math> |
||||||
|
| <math mtext> |
||||||
|
| <i> |
||||||
|
| "baz" |
||||||
|
| <math annotation-xml> |
||||||
|
| <svg svg> |
||||||
|
| <svg desc> |
||||||
|
| <b> |
||||||
|
| "eggs" |
||||||
|
| <svg g> |
||||||
|
| <svg foreignObject> |
||||||
|
| <p> |
||||||
|
| "spam" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <img> |
||||||
|
| <svg g> |
||||||
|
| "quux" |
||||||
|
| "bar" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "foo" |
||||||
|
| <math math> |
||||||
|
| <math mtext> |
||||||
|
| <i> |
||||||
|
| "baz" |
||||||
|
| <math annotation-xml> |
||||||
|
| <svg svg> |
||||||
|
| <svg desc> |
||||||
|
| <b> |
||||||
|
| "eggs" |
||||||
|
| <svg g> |
||||||
|
| <svg foreignObject> |
||||||
|
| <p> |
||||||
|
| "spam" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <img> |
||||||
|
| <svg g> |
||||||
|
| "quux" |
||||||
|
| "bar" |
@ -0,0 +1,74 @@ |
|||||||
|
#data |
||||||
|
<!DOCTYPE html><html><body><xyz:abc></xyz:abc> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <xyz:abc> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html><body><xyz:abc></xyz:abc><span></span> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <xyz:abc> |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html><html abc:def=gh><xyz:abc></xyz:abc> |
||||||
|
#errors |
||||||
|
15: Unexpected start tag html |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| abc:def="gh" |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <xyz:abc> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html xml:lang=bar><html xml:lang=foo> |
||||||
|
#errors |
||||||
|
15: Unexpected start tag html |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| xml:lang="bar" |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html 123=456> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| 123="456" |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html 123=456><html 789=012> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| 123="456" |
||||||
|
| 789="012" |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html><body 789=012> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| 789="012" |
@ -0,0 +1,208 @@ |
|||||||
|
#data |
||||||
|
<!DOCTYPE html><p><b><i><u></p> <p>X |
||||||
|
#errors |
||||||
|
Line: 1 Col: 31 Unexpected end tag (p). Ignored. |
||||||
|
Line: 1 Col: 36 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <b> |
||||||
|
| <i> |
||||||
|
| <u> |
||||||
|
| <b> |
||||||
|
| <i> |
||||||
|
| <u> |
||||||
|
| " " |
||||||
|
| <p> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<p><b><i><u></p> |
||||||
|
<p>X |
||||||
|
#errors |
||||||
|
Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 16 Unexpected end tag (p). Ignored. |
||||||
|
Line: 2 Col: 4 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <b> |
||||||
|
| <i> |
||||||
|
| <u> |
||||||
|
| <b> |
||||||
|
| <i> |
||||||
|
| <u> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <p> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html></html> <head> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 22 Unexpected end tag (html) after the (implied) root element. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| " " |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html></body><meta> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <meta> |
||||||
|
|
||||||
|
#data |
||||||
|
<html></html><!-- foo --> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 13 Unexpected end tag (html) after the (implied) root element. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <!-- foo --> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html></body><title>X</title> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <title> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table> X<meta></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 30 Unexpected start tag (meta) in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| " X" |
||||||
|
| <meta> |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table> x</table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| " x" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table> x </table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 25 Unexpected non-space characters in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| " x " |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><tr> x</table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 28 Unexpected non-space characters in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| " x" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table>X<style> <tr>x </style> </table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "X" |
||||||
|
| <table> |
||||||
|
| <style> |
||||||
|
| " <tr>x " |
||||||
|
| " " |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 30 Unexpected start tag (a) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 37 Unexpected end tag (a) in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <a> |
||||||
|
| "foo" |
||||||
|
| <table> |
||||||
|
| " " |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| "bar" |
||||||
|
| " " |
||||||
|
|
||||||
|
#data |
||||||
|
<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes> |
||||||
|
#errors |
||||||
|
6: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. |
||||||
|
13: Stray start tag “frame”. |
||||||
|
21: Stray end tag “frame”. |
||||||
|
29: Stray end tag “frame”. |
||||||
|
39: “frameset” start tag after “body” already open. |
||||||
|
105: End of file seen inside an [R]CDATA element. |
||||||
|
105: End of file seen and there were open elements. |
||||||
|
XXX: These errors are wrong, please fix me! |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
| <frame> |
||||||
|
| <frameset> |
||||||
|
| <frame> |
||||||
|
| <noframes> |
||||||
|
| "</frameset><noframes>" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><object></html> |
||||||
|
#errors |
||||||
|
1: Expected closing tag. Unexpected end of file |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <object> |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,153 @@ |
|||||||
|
#data |
||||||
|
<!doctype html><table><tbody><select><tr> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><tr><select><td> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><tr><td><select><td> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <select> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><tr><th><select><td> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <th> |
||||||
|
| <select> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><caption><select><tr> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| <select> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><select><tr> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><select><td> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><select><th> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><select><tbody> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><select><thead> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><select><tfoot> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><select><caption> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><tr></table>a |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| "a" |
@ -0,0 +1,269 @@ |
|||||||
|
#data |
||||||
|
<!doctype html><plaintext></plaintext> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <plaintext> |
||||||
|
| "</plaintext>" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><plaintext></plaintext> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <plaintext> |
||||||
|
| "</plaintext>" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><tbody><plaintext></plaintext> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <plaintext> |
||||||
|
| "</plaintext>" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><tbody><tr><plaintext></plaintext> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <plaintext> |
||||||
|
| "</plaintext>" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><tbody><tr><plaintext></plaintext> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <plaintext> |
||||||
|
| "</plaintext>" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><td><plaintext></plaintext> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <plaintext> |
||||||
|
| "</plaintext>" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><caption><plaintext></plaintext> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| <plaintext> |
||||||
|
| "</plaintext>" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><tr><style></script></style>abc |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "abc" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <style> |
||||||
|
| "</script>" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><tr><script></style></script>abc |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "abc" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <script> |
||||||
|
| "</style>" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><caption><style></script></style>abc |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| <style> |
||||||
|
| "</script>" |
||||||
|
| "abc" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><td><style></script></style>abc |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <style> |
||||||
|
| "</script>" |
||||||
|
| "abc" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><select><script></style></script>abc |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <script> |
||||||
|
| "</style>" |
||||||
|
| "abc" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><select><script></style></script>abc |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <script> |
||||||
|
| "</style>" |
||||||
|
| "abc" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><tr><select><script></style></script>abc |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <script> |
||||||
|
| "</style>" |
||||||
|
| "abc" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><frameset></frameset><noframes>abc |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
| <noframes> |
||||||
|
| "abc" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc--> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
| <noframes> |
||||||
|
| "abc" |
||||||
|
| <!-- abc --> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><frameset></frameset></html><noframes>abc |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
| <noframes> |
||||||
|
| "abc" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc--> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
| <noframes> |
||||||
|
| "abc" |
||||||
|
| <!-- abc --> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><tr></tbody><tfoot> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <tfoot> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><td><svg></svg>abc<td> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <svg svg> |
||||||
|
| "abc" |
||||||
|
| <td> |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,763 @@ |
|||||||
|
#data |
||||||
|
<!DOCTYPE html>Test |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Test" |
||||||
|
|
||||||
|
#data |
||||||
|
<textarea>test</div>test |
||||||
|
#errors |
||||||
|
Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 24 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <textarea> |
||||||
|
| "test</div>test" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><td> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. |
||||||
|
Line: 1 Col: 11 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><td>test</tbody></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| "test" |
||||||
|
|
||||||
|
#data |
||||||
|
<frame>test |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (frame). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 7 Unexpected start tag frame. Ignored. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "test" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><frameset>test |
||||||
|
#errors |
||||||
|
Line: 1 Col: 29 Unepxected characters in the frameset phase. Characters ignored. |
||||||
|
Line: 1 Col: 29 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><frameset><!DOCTYPE html> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 40 Unexpected DOCTYPE. Ignored. |
||||||
|
Line: 1 Col: 40 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><font><p><b>test</font> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. |
||||||
|
Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <font> |
||||||
|
| <p> |
||||||
|
| <font> |
||||||
|
| <b> |
||||||
|
| "test" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><dt><div><dd> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 28 Missing end tag (div, dt). |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <dt> |
||||||
|
| <div> |
||||||
|
| <dd> |
||||||
|
|
||||||
|
#data |
||||||
|
<script></x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <script> |
||||||
|
| "</x" |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><plaintext><td> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 18 Unexpected start tag (plaintext) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 22 Unexpected end of file. Expected table content. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <plaintext> |
||||||
|
| "<td>" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<plaintext></plaintext> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 11 Unexpected start tag (plaintext). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 23 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <plaintext> |
||||||
|
| "</plaintext>" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><table><tr>TEST |
||||||
|
#errors |
||||||
|
Line: 1 Col: 30 Unexpected non-space characters in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 30 Unexpected end of file. Expected table content. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "TEST" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 37 Unexpected start tag (body). |
||||||
|
Line: 1 Col: 53 Unexpected start tag (body). |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| t1="1" |
||||||
|
| t2="2" |
||||||
|
| t3="3" |
||||||
|
| t4="4" |
||||||
|
|
||||||
|
#data |
||||||
|
</b test |
||||||
|
#errors |
||||||
|
Line: 1 Col: 8 Unexpected end of file in attribute name. |
||||||
|
Line: 1 Col: 8 End tag contains unexpected attributes. |
||||||
|
Line: 1 Col: 8 Unexpected end tag (b). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 8 Unexpected end tag (b) after the (implied) root element. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html></b test<b &=&>X |
||||||
|
#errors |
||||||
|
Line: 1 Col: 32 Named entity didn't end with ';'. |
||||||
|
Line: 1 Col: 33 End tag contains unexpected attributes. |
||||||
|
Line: 1 Col: 33 Unexpected end tag (b) after the (implied) root element. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt |
||||||
|
#errors |
||||||
|
Line: 1 Col: 9 No space after literal string 'DOCTYPE'. |
||||||
|
Line: 1 Col: 54 Unexpected end of file in the tag name. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <script> |
||||||
|
| type="text/x-foobar;baz" |
||||||
|
| "X</SCRipt" |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
& |
||||||
|
#errors |
||||||
|
Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "&" |
||||||
|
|
||||||
|
#data |
||||||
|
&# |
||||||
|
#errors |
||||||
|
Line: 1 Col: 1 Numeric entity expected. Got end of file instead. |
||||||
|
Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "&#" |
||||||
|
|
||||||
|
#data |
||||||
|
&#X |
||||||
|
#errors |
||||||
|
Line: 1 Col: 3 Numeric entity expected but none found. |
||||||
|
Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "&#X" |
||||||
|
|
||||||
|
#data |
||||||
|
&#x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 3 Numeric entity expected but none found. |
||||||
|
Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "&#x" |
||||||
|
|
||||||
|
#data |
||||||
|
- |
||||||
|
#errors |
||||||
|
Line: 1 Col: 4 Numeric entity didn't end with ';'. |
||||||
|
Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "-" |
||||||
|
|
||||||
|
#data |
||||||
|
&x-test |
||||||
|
#errors |
||||||
|
Line: 1 Col: 1 Named entity expected. Got none. |
||||||
|
Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "&x-test" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctypehtml><p><li> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 9 No space after literal string 'DOCTYPE'. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <li> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctypehtml><p><dt> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 9 No space after literal string 'DOCTYPE'. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <dt> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctypehtml><p><dd> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 9 No space after literal string 'DOCTYPE'. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <dd> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctypehtml><p><form> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 9 No space after literal string 'DOCTYPE'. |
||||||
|
Line: 1 Col: 23 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <form> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><p></P>X |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
& |
||||||
|
#errors |
||||||
|
Line: 1 Col: 4 Named entity didn't end with ';'. |
||||||
|
Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "&" |
||||||
|
|
||||||
|
#data |
||||||
|
&AMp; |
||||||
|
#errors |
||||||
|
Line: 1 Col: 1 Named entity expected. Got none. |
||||||
|
Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "&AMp;" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 110 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html>X</body>X |
||||||
|
#errors |
||||||
|
Line: 1 Col: 24 Unexpected non-space characters in the after body phase. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "XX" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><!-- X |
||||||
|
#errors |
||||||
|
Line: 1 Col: 21 Unexpected end of file in comment. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <!-- X --> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><table><caption>test TEST</caption><td>test |
||||||
|
#errors |
||||||
|
Line: 1 Col: 54 Unexpected table cell start tag (td) in the table body phase. |
||||||
|
Line: 1 Col: 58 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| "test TEST" |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| "test" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><select><option><optgroup> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 41 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <option> |
||||||
|
| <optgroup> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 68 Unexpected select start tag in the select phase treated as select end tag. |
||||||
|
Line: 1 Col: 76 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <optgroup> |
||||||
|
| <option> |
||||||
|
| <option> |
||||||
|
| <option> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><select><optgroup><option><optgroup> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 51 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <optgroup> |
||||||
|
| <option> |
||||||
|
| <optgroup> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><datalist><option>foo</datalist>bar |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <datalist> |
||||||
|
| <option> |
||||||
|
| "foo" |
||||||
|
| "bar" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><font><input><input></font> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <font> |
||||||
|
| <input> |
||||||
|
| <input> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><!-- XXX - XXX --> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <!-- XXX - XXX --> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><!-- XXX - XXX |
||||||
|
#errors |
||||||
|
Line: 1 Col: 29 Unexpected end of file in comment (-) |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <!-- XXX - XXX --> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><!-- XXX - XXX - XXX --> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <!-- XXX - XXX - XXX --> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<isindex test=x name=x> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 23 Unexpected start tag (isindex). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 23 Unexpected start tag isindex. Don't use it! |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <form> |
||||||
|
| <hr> |
||||||
|
| <label> |
||||||
|
| "This is a searchable index. Enter search keywords: " |
||||||
|
| <input> |
||||||
|
| name="isindex" |
||||||
|
| test="x" |
||||||
|
| <hr> |
||||||
|
|
||||||
|
#data |
||||||
|
test |
||||||
|
test |
||||||
|
#errors |
||||||
|
Line: 2 Col: 4 Unexpected non-space characters. Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "test |
||||||
|
test" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><title>test</body></title> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <title> |
||||||
|
| "test</body>" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><title>X</title><meta name=z><link rel=foo><style> |
||||||
|
x { content:"</style" } </style> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <title> |
||||||
|
| "X" |
||||||
|
| <meta> |
||||||
|
| name="z" |
||||||
|
| <link> |
||||||
|
| rel="foo" |
||||||
|
| <style> |
||||||
|
| " |
||||||
|
x { content:"</style" } " |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><select><optgroup></optgroup></select> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <optgroup> |
||||||
|
|
||||||
|
#data |
||||||
|
|
||||||
|
|
||||||
|
#errors |
||||||
|
Line: 2 Col: 1 Unexpected End of file. Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html> <html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><script> |
||||||
|
</script> <title>x</title> </head> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <script> |
||||||
|
| " |
||||||
|
" |
||||||
|
| " " |
||||||
|
| <title> |
||||||
|
| "x" |
||||||
|
| " " |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html><body><html id=x> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 38 html needs to be the first start tag. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| id="x" |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html>X</body><html id="x"> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 36 Unexpected start tag token (html) in the after body phase. |
||||||
|
Line: 1 Col: 36 html needs to be the first start tag. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| id="x" |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><head><html id=x> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 32 html needs to be the first start tag. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| id="x" |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html>X</html>X |
||||||
|
#errors |
||||||
|
Line: 1 Col: 24 Unexpected non-space characters in the after body phase. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "XX" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html>X</html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "X " |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html>X</html><p>X |
||||||
|
#errors |
||||||
|
Line: 1 Col: 26 Unexpected start tag (p). |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "X" |
||||||
|
| <p> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html>X<p/x/y/z> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 19 Expected a > after the /. |
||||||
|
Line: 1 Col: 21 Solidus (/) incorrectly placed in tag. |
||||||
|
Line: 1 Col: 23 Solidus (/) incorrectly placed in tag. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "X" |
||||||
|
| <p> |
||||||
|
| x="" |
||||||
|
| y="" |
||||||
|
| z="" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><!--x-- |
||||||
|
#errors |
||||||
|
Line: 1 Col: 22 Unexpected end of file in comment (--). |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <!-- x --> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><table><tr><td></p></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 34 Unexpected end tag (p). Ignored. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <p> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE <!DOCTYPE HTML>><!--<!--x-->--> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 20 Expected space or '>'. Got '' |
||||||
|
Line: 1 Col: 25 Erroneous DOCTYPE. |
||||||
|
Line: 1 Col: 35 Unexpected character in comment found. |
||||||
|
#document |
||||||
|
| <!DOCTYPE <!doctype> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| ">" |
||||||
|
| <!-- <!--x --> |
||||||
|
| "-->" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><div><form></form><div></div></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <form> |
||||||
|
| <div> |
@ -0,0 +1,455 @@ |
|||||||
|
#data |
||||||
|
<!doctype html><p><button><button> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <button> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><address> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <address> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><blockquote> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <blockquote> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><menu> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <menu> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><p> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <p> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><ul> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <ul> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><h1> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <h1> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><h6> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <h6> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><listing> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <listing> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><pre> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <pre> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><form> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <form> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><li> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <li> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><dd> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <dd> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><dt> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <dt> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><plaintext> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <plaintext> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><hr> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <hr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button><xmp> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <xmp> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><button></p> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <button> |
||||||
|
| <p> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><address><button></address>a |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <address> |
||||||
|
| <button> |
||||||
|
| "a" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><address><button></address>a |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <address> |
||||||
|
| <button> |
||||||
|
| "a" |
||||||
|
|
||||||
|
#data |
||||||
|
<p><table></p> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <p> |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><svg> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><figcaption> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <figcaption> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><summary> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <summary> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><form><table><form> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <form> |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><form><form> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <form> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><form></table><form> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <form> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><svg><foreignObject><p> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg foreignObject> |
||||||
|
| <p> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><svg><title>abc |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg title> |
||||||
|
| "abc" |
||||||
|
|
||||||
|
#data |
||||||
|
<option><span><option> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <option> |
||||||
|
| <span> |
||||||
|
| <option> |
||||||
|
|
||||||
|
#data |
||||||
|
<option><option> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <option> |
||||||
|
| <option> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><annotation-xml><div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math annotation-xml> |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><annotation-xml encoding="application/svg+xml"><div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math annotation-xml> |
||||||
|
| encoding="application/svg+xml" |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><annotation-xml encoding="application/xhtml+xml"><div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math annotation-xml> |
||||||
|
| encoding="application/xhtml+xml" |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><annotation-xml encoding="aPPlication/xhtmL+xMl"><div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math annotation-xml> |
||||||
|
| encoding="aPPlication/xhtmL+xMl" |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><annotation-xml encoding="text/html"><div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math annotation-xml> |
||||||
|
| encoding="text/html" |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><annotation-xml encoding="Text/htmL"><div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math annotation-xml> |
||||||
|
| encoding="Text/htmL" |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><annotation-xml encoding=" text/html "><div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math annotation-xml> |
||||||
|
| encoding=" text/html " |
||||||
|
| <div> |
@ -0,0 +1,221 @@ |
|||||||
|
#data |
||||||
|
<svg><![CDATA[foo]]> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "foo" |
||||||
|
|
||||||
|
#data |
||||||
|
<math><![CDATA[foo]]> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| "foo" |
||||||
|
|
||||||
|
#data |
||||||
|
<div><![CDATA[foo]]> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <!-- [CDATA[foo]] --> |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[foo |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "foo" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[foo |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "foo" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[ |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[]]> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[]] >]]> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "]] >" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[]] >]]> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "]] >" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[]] |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "]]" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[] |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "]" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[]>a |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "]>a" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><foreignObject><div><![CDATA[foo]]> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg foreignObject> |
||||||
|
| <div> |
||||||
|
| <!-- [CDATA[foo]] --> |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[<svg>]]> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "<svg>" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[</svg>a]]> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "</svg>a" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[<svg>a |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "<svg>a" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[</svg>a |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "</svg>a" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[<svg>]]><path> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "<svg>" |
||||||
|
| <svg path> |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[<svg>]]></path> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "<svg>" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[<svg>]]><!--path--> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "<svg>" |
||||||
|
| <!-- path --> |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[<svg>]]>path |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "<svg>path" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><![CDATA[<!--svg-->]]> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| "<!--svg-->" |
@ -0,0 +1,157 @@ |
|||||||
|
#data |
||||||
|
<a><b><big><em><strong><div>X</a> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| <b> |
||||||
|
| <big> |
||||||
|
| <em> |
||||||
|
| <strong> |
||||||
|
| <big> |
||||||
|
| <em> |
||||||
|
| <strong> |
||||||
|
| <div> |
||||||
|
| <a> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8>A</a> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| <b> |
||||||
|
| <b> |
||||||
|
| <div> |
||||||
|
| id="1" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="2" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="3" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="4" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="5" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="6" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="7" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="8" |
||||||
|
| <a> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9>A</a> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| <b> |
||||||
|
| <b> |
||||||
|
| <div> |
||||||
|
| id="1" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="2" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="3" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="4" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="5" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="6" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="7" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="8" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="9" |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9><div id=10>A</a> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| <b> |
||||||
|
| <b> |
||||||
|
| <div> |
||||||
|
| id="1" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="2" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="3" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="4" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="5" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="6" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="7" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="8" |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| id="9" |
||||||
|
| <div> |
||||||
|
| id="10" |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<cite><b><cite><i><cite><i><cite><i><div>X</b>TEST |
||||||
|
#errors |
||||||
|
Line: 1 Col: 6 Unexpected start tag (cite). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 46 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. |
||||||
|
Line: 1 Col: 50 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <cite> |
||||||
|
| <b> |
||||||
|
| <cite> |
||||||
|
| <i> |
||||||
|
| <cite> |
||||||
|
| <i> |
||||||
|
| <cite> |
||||||
|
| <i> |
||||||
|
| <i> |
||||||
|
| <i> |
||||||
|
| <div> |
||||||
|
| <b> |
||||||
|
| "X" |
||||||
|
| "TEST" |
@ -0,0 +1,155 @@ |
|||||||
|
#data |
||||||
|
<p><font size=4><font color=red><font size=4><font size=4><font size=4><font size=4><font size=4><font color=red><p>X |
||||||
|
#errors |
||||||
|
3: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. |
||||||
|
116: Unclosed elements. |
||||||
|
117: End of file seen and there were open elements. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| color="red" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| color="red" |
||||||
|
| <p> |
||||||
|
| <font> |
||||||
|
| color="red" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| color="red" |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<p><font size=4><font size=4><font size=4><font size=4><p>X |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <p> |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<p><font size=4><font size=4><font size=4><font size="5"><font size=4><p>X |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="5" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <p> |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="5" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<p><font size=4 id=a><font size=4 id=b><font size=4><font size=4><p>X |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <font> |
||||||
|
| id="a" |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| id="b" |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <p> |
||||||
|
| <font> |
||||||
|
| id="a" |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| id="b" |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| <font> |
||||||
|
| size="4" |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<p><b id=a><b id=a><b id=a><b><object><b id=a><b id=a>X</object><p>Y |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <b> |
||||||
|
| id="a" |
||||||
|
| <b> |
||||||
|
| id="a" |
||||||
|
| <b> |
||||||
|
| id="a" |
||||||
|
| <b> |
||||||
|
| <object> |
||||||
|
| <b> |
||||||
|
| id="a" |
||||||
|
| <b> |
||||||
|
| id="a" |
||||||
|
| "X" |
||||||
|
| <p> |
||||||
|
| <b> |
||||||
|
| id="a" |
||||||
|
| <b> |
||||||
|
| id="a" |
||||||
|
| <b> |
||||||
|
| id="a" |
||||||
|
| <b> |
||||||
|
| "Y" |
@ -0,0 +1,219 @@ |
|||||||
|
#data |
||||||
|
<!DOCTYPE html><body><foo>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <foo> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><area>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <area> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><base>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <base> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><basefont>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <basefont> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><bgsound>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <bgsound> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><br>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <br> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><col>A |
||||||
|
#errors |
||||||
|
26: Stray start tag “col”. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><command>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <command> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><embed>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <embed> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><frame>A |
||||||
|
#errors |
||||||
|
26: Stray start tag “frame”. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><hr>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <hr> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><img>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <img> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><input>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <input> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><keygen>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <keygen> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><link>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <link> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><meta>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <meta> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><param>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <param> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><source>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <source> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><track>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <track> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><wbr>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <wbr> |
||||||
|
| "A" |
@ -0,0 +1,313 @@ |
|||||||
|
#data |
||||||
|
<!DOCTYPE html><body><a href='#1'><nobr>1<nobr></a><br><a href='#2'><nobr>2<nobr></a><br><a href='#3'><nobr>3<nobr></a> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| href="#1" |
||||||
|
| <nobr> |
||||||
|
| "1" |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
| <br> |
||||||
|
| <a> |
||||||
|
| href="#2" |
||||||
|
| <a> |
||||||
|
| href="#2" |
||||||
|
| <nobr> |
||||||
|
| "2" |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
| <br> |
||||||
|
| <a> |
||||||
|
| href="#3" |
||||||
|
| <a> |
||||||
|
| href="#3" |
||||||
|
| <nobr> |
||||||
|
| "3" |
||||||
|
| <nobr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><b><nobr>1<nobr></b><i><nobr>2<nobr></i>3 |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| <nobr> |
||||||
|
| "1" |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
| <i> |
||||||
|
| <i> |
||||||
|
| <nobr> |
||||||
|
| "2" |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
| "3" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><b><nobr>1<table><nobr></b><i><nobr>2<nobr></i>3 |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| <nobr> |
||||||
|
| "1" |
||||||
|
| <nobr> |
||||||
|
| <i> |
||||||
|
| <i> |
||||||
|
| <nobr> |
||||||
|
| "2" |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
| "3" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><b><nobr>1<table><tr><td><nobr></b><i><nobr>2<nobr></i>3 |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| <nobr> |
||||||
|
| "1" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <nobr> |
||||||
|
| <i> |
||||||
|
| <i> |
||||||
|
| <nobr> |
||||||
|
| "2" |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
| "3" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><b><nobr>1<div><nobr></b><i><nobr>2<nobr></i>3 |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| <nobr> |
||||||
|
| "1" |
||||||
|
| <div> |
||||||
|
| <b> |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
| <i> |
||||||
|
| <i> |
||||||
|
| <nobr> |
||||||
|
| "2" |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
| "3" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><b><nobr>1<nobr></b><div><i><nobr>2<nobr></i>3 |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| <nobr> |
||||||
|
| "1" |
||||||
|
| <nobr> |
||||||
|
| <div> |
||||||
|
| <nobr> |
||||||
|
| <i> |
||||||
|
| <i> |
||||||
|
| <nobr> |
||||||
|
| "2" |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
| "3" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><b><nobr>1<nobr><ins></b><i><nobr> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| <nobr> |
||||||
|
| "1" |
||||||
|
| <nobr> |
||||||
|
| <ins> |
||||||
|
| <nobr> |
||||||
|
| <i> |
||||||
|
| <i> |
||||||
|
| <nobr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><b><nobr>1<ins><nobr></b><i>2 |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| <nobr> |
||||||
|
| "1" |
||||||
|
| <ins> |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
| <i> |
||||||
|
| "2" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><b>1<nobr></b><i><nobr>2</i> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| "1" |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
| <i> |
||||||
|
| <i> |
||||||
|
| <nobr> |
||||||
|
| "2" |
||||||
|
|
||||||
|
#data |
||||||
|
<p><code x</code></p> |
||||||
|
|
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <code> |
||||||
|
| code="" |
||||||
|
| x<="" |
||||||
|
| <code> |
||||||
|
| code="" |
||||||
|
| x<="" |
||||||
|
| " |
||||||
|
" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><svg><foreignObject><p><i></p>a |
||||||
|
#errors |
||||||
|
45: End tag “p” seen, but there were open elements. |
||||||
|
41: Unclosed element “i”. |
||||||
|
46: End of file seen and there were open elements. |
||||||
|
35: Unclosed element “foreignObject”. |
||||||
|
20: Unclosed element “svg”. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg foreignObject> |
||||||
|
| <p> |
||||||
|
| <i> |
||||||
|
| <i> |
||||||
|
| "a" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><table><tr><td><svg><foreignObject><p><i></p>a |
||||||
|
#errors |
||||||
|
56: End tag “p” seen, but there were open elements. |
||||||
|
52: Unclosed element “i”. |
||||||
|
57: End of file seen and there were open elements. |
||||||
|
46: Unclosed element “foreignObject”. |
||||||
|
31: Unclosed element “svg”. |
||||||
|
22: Unclosed element “table”. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <svg svg> |
||||||
|
| <svg foreignObject> |
||||||
|
| <p> |
||||||
|
| <i> |
||||||
|
| <i> |
||||||
|
| "a" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><math><mtext><p><i></p>a |
||||||
|
#errors |
||||||
|
38: End tag “p” seen, but there were open elements. |
||||||
|
34: Unclosed element “i”. |
||||||
|
39: End of file in a foreign namespace context. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mtext> |
||||||
|
| <p> |
||||||
|
| <i> |
||||||
|
| <i> |
||||||
|
| "a" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><table><tr><td><math><mtext><p><i></p>a |
||||||
|
#errors |
||||||
|
53: End tag “p” seen, but there were open elements. |
||||||
|
49: Unclosed element “i”. |
||||||
|
54: End of file in a foreign namespace context. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <math math> |
||||||
|
| <math mtext> |
||||||
|
| <p> |
||||||
|
| <i> |
||||||
|
| <i> |
||||||
|
| "a" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><div><!/div>a |
||||||
|
#errors |
||||||
|
29: Bogus comment. |
||||||
|
34: End of file seen and there were open elements. |
||||||
|
26: Unclosed element “div”. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <!-- /div --> |
||||||
|
| "a" |
@ -0,0 +1,305 @@ |
|||||||
|
#data |
||||||
|
<head></head><style></style> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 20 Unexpected start tag (style) that can be in head. Moved. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <style> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<head></head><script></script> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 21 Unexpected start tag (script) that can be in head. Moved. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <script> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<head></head><!-- --><style></style><!-- --><script></script> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 28 Unexpected start tag (style) that can be in head. Moved. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <style> |
||||||
|
| <script> |
||||||
|
| <!-- --> |
||||||
|
| <!-- --> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<head></head><!-- -->x<style></style><!-- --><script></script> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <!-- --> |
||||||
|
| <body> |
||||||
|
| "x" |
||||||
|
| <style> |
||||||
|
| <!-- --> |
||||||
|
| <script> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html><head></head><body><pre> |
||||||
|
</pre></body></html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <pre> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html><head></head><body><pre> |
||||||
|
foo</pre></body></html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <pre> |
||||||
|
| "foo" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html><head></head><body><pre> |
||||||
|
|
||||||
|
foo</pre></body></html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <pre> |
||||||
|
| " |
||||||
|
foo" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html><head></head><body><pre> |
||||||
|
foo |
||||||
|
</pre></body></html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <pre> |
||||||
|
| "foo |
||||||
|
" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html><head></head><body><pre>x</pre><span> |
||||||
|
</span></body></html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <pre> |
||||||
|
| "x" |
||||||
|
| <span> |
||||||
|
| " |
||||||
|
" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html><head></head><body><pre>x |
||||||
|
y</pre></body></html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <pre> |
||||||
|
| "x |
||||||
|
y" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html><head></head><body><pre>x<div> |
||||||
|
y</pre></body></html> |
||||||
|
#errors |
||||||
|
Line: 2 Col: 7 End tag (pre) seen too early. Expected other end tag. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <pre> |
||||||
|
| "x" |
||||||
|
| <div> |
||||||
|
| " |
||||||
|
y" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><pre>

A</pre> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <pre> |
||||||
|
| " |
||||||
|
A" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><HTML><META><HEAD></HEAD></HTML> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 33 Unexpected start tag head in existing head. Ignored. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <meta> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><HTML><HEAD><head></HEAD></HTML> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 33 Unexpected start tag head in existing head. Ignored. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<textarea>foo<span>bar</span><i>baz |
||||||
|
#errors |
||||||
|
Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 35 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <textarea> |
||||||
|
| "foo<span>bar</span><i>baz" |
||||||
|
|
||||||
|
#data |
||||||
|
<title>foo<span>bar</em><i>baz |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 30 Unexpected end of file. Expected end tag (title). |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <title> |
||||||
|
| "foo<span>bar</em><i>baz" |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><textarea> |
||||||
|
</textarea> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <textarea> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><textarea> |
||||||
|
foo</textarea> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <textarea> |
||||||
|
| "foo" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><textarea> |
||||||
|
|
||||||
|
foo</textarea> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <textarea> |
||||||
|
| " |
||||||
|
foo" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><html><head></head><body><ul><li><div><p><li></ul></body></html> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 60 Missing end tag (div, li). |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <ul> |
||||||
|
| <li> |
||||||
|
| <div> |
||||||
|
| <p> |
||||||
|
| <li> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><nobr><nobr><nobr> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 27 Unexpected start tag (nobr) implies end tag (nobr). |
||||||
|
Line: 1 Col: 33 Unexpected start tag (nobr) implies end tag (nobr). |
||||||
|
Line: 1 Col: 33 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><nobr><nobr></nobr><nobr> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 27 Unexpected start tag (nobr) implies end tag (nobr). |
||||||
|
Line: 1 Col: 40 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
| <nobr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><html><body><p><table></table></body></html> |
||||||
|
#errors |
||||||
|
Not known |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<p><table></table> |
||||||
|
#errors |
||||||
|
Not known |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <table> |
@ -0,0 +1,59 @@ |
|||||||
|
#data |
||||||
|
direct div content |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
div |
||||||
|
#document |
||||||
|
| "direct div content" |
||||||
|
|
||||||
|
#data |
||||||
|
direct textarea content |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
textarea |
||||||
|
#document |
||||||
|
| "direct textarea content" |
||||||
|
|
||||||
|
#data |
||||||
|
textarea content with <em>pseudo</em> <foo>markup |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
textarea |
||||||
|
#document |
||||||
|
| "textarea content with <em>pseudo</em> <foo>markup" |
||||||
|
|
||||||
|
#data |
||||||
|
this is CDATA inside a <style> element |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
style |
||||||
|
#document |
||||||
|
| "this is CDATA inside a <style> element" |
||||||
|
|
||||||
|
#data |
||||||
|
</plaintext> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
plaintext |
||||||
|
#document |
||||||
|
| "</plaintext>" |
||||||
|
|
||||||
|
#data |
||||||
|
setting html's innerHTML |
||||||
|
#errors |
||||||
|
Line: 1 Col: 24 Unexpected EOF in inner html mode. |
||||||
|
#document-fragment |
||||||
|
html |
||||||
|
#document |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "setting html's innerHTML" |
||||||
|
|
||||||
|
#data |
||||||
|
<title>setting head's innerHTML</title> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
head |
||||||
|
#document |
||||||
|
| <title> |
||||||
|
| "setting head's innerHTML" |
@ -0,0 +1,191 @@ |
|||||||
|
#data |
||||||
|
<style> <!-- </style>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 22 Unexpected end of file. Expected end tag (style). |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <style> |
||||||
|
| " <!-- " |
||||||
|
| <body> |
||||||
|
| "x" |
||||||
|
|
||||||
|
#data |
||||||
|
<style> <!-- </style> --> </style>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <style> |
||||||
|
| " <!-- " |
||||||
|
| " " |
||||||
|
| <body> |
||||||
|
| "--> x" |
||||||
|
|
||||||
|
#data |
||||||
|
<style> <!--> </style>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <style> |
||||||
|
| " <!--> " |
||||||
|
| <body> |
||||||
|
| "x" |
||||||
|
|
||||||
|
#data |
||||||
|
<style> <!---> </style>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <style> |
||||||
|
| " <!---> " |
||||||
|
| <body> |
||||||
|
| "x" |
||||||
|
|
||||||
|
#data |
||||||
|
<iframe> <!---> </iframe>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <iframe> |
||||||
|
| " <!---> " |
||||||
|
| "x" |
||||||
|
|
||||||
|
#data |
||||||
|
<iframe> <!--- </iframe>->x</iframe> --> </iframe>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <iframe> |
||||||
|
| " <!--- " |
||||||
|
| "->x --> x" |
||||||
|
|
||||||
|
#data |
||||||
|
<script> <!-- </script> --> </script>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <script> |
||||||
|
| " <!-- " |
||||||
|
| " " |
||||||
|
| <body> |
||||||
|
| "--> x" |
||||||
|
|
||||||
|
#data |
||||||
|
<title> <!-- </title> --> </title>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <title> |
||||||
|
| " <!-- " |
||||||
|
| " " |
||||||
|
| <body> |
||||||
|
| "--> x" |
||||||
|
|
||||||
|
#data |
||||||
|
<textarea> <!--- </textarea>->x</textarea> --> </textarea>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <textarea> |
||||||
|
| " <!--- " |
||||||
|
| "->x --> x" |
||||||
|
|
||||||
|
#data |
||||||
|
<style> <!</-- </style>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <style> |
||||||
|
| " <!</-- " |
||||||
|
| <body> |
||||||
|
| "x" |
||||||
|
|
||||||
|
#data |
||||||
|
<p><xmp></xmp> |
||||||
|
#errors |
||||||
|
XXX: Unknown |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <xmp> |
||||||
|
|
||||||
|
#data |
||||||
|
<xmp> <!-- > --> </xmp> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <xmp> |
||||||
|
| " <!-- > --> " |
||||||
|
|
||||||
|
#data |
||||||
|
<title>&</title> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <title> |
||||||
|
| "&" |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<title><!--&--></title> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <title> |
||||||
|
| "<!--&-->" |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<title><!--</title> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 19 Unexpected end of file. Expected end tag (title). |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <title> |
||||||
|
| "<!--" |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<noscript><!--</noscript>--></noscript> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <noscript> |
||||||
|
| "<!--" |
||||||
|
| <body> |
||||||
|
| "-->" |
@ -0,0 +1,663 @@ |
|||||||
|
#data |
||||||
|
<!doctype html></head> <head> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 29 Unexpected start tag head. Ignored. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| " " |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><form><div></form><div> |
||||||
|
#errors |
||||||
|
33: End tag "form" seen but there were unclosed elements. |
||||||
|
38: End of file seen and there were open elements. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <form> |
||||||
|
| <div> |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><title>&</title> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <title> |
||||||
|
| "&" |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><title><!--&--></title> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <title> |
||||||
|
| "<!--&-->" |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 9 No space after literal string 'DOCTYPE'. |
||||||
|
Line: 1 Col: 10 Unexpected > character. Expected DOCTYPE name. |
||||||
|
Line: 1 Col: 10 Erroneous DOCTYPE. |
||||||
|
#document |
||||||
|
| <!DOCTYPE > |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!---x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 6 Unexpected end of file in comment. |
||||||
|
Line: 1 Col: 6 Unexpected End of file. Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <!-- -x --> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<body> |
||||||
|
<div> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 6 Unexpected start tag (body). |
||||||
|
Line: 2 Col: 5 Expected closing tag. Unexpected end of file. |
||||||
|
#document-fragment |
||||||
|
div |
||||||
|
#document |
||||||
|
| " |
||||||
|
" |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<frameset></frameset> |
||||||
|
foo |
||||||
|
#errors |
||||||
|
Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. |
||||||
|
Line: 2 Col: 3 Unexpected non-space characters in the after frameset phase. Ignored. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
| " |
||||||
|
" |
||||||
|
|
||||||
|
#data |
||||||
|
<frameset></frameset> |
||||||
|
<noframes> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. |
||||||
|
Line: 2 Col: 10 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <noframes> |
||||||
|
|
||||||
|
#data |
||||||
|
<frameset></frameset> |
||||||
|
<div> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. |
||||||
|
Line: 2 Col: 5 Unexpected start tag (div) in the after frameset phase. Ignored. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
| " |
||||||
|
" |
||||||
|
|
||||||
|
#data |
||||||
|
<frameset></frameset> |
||||||
|
</html> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
| " |
||||||
|
" |
||||||
|
|
||||||
|
#data |
||||||
|
<frameset></frameset> |
||||||
|
</div> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. |
||||||
|
Line: 2 Col: 6 Unexpected end tag (div) in the after frameset phase. Ignored. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
| " |
||||||
|
" |
||||||
|
|
||||||
|
#data |
||||||
|
<form><form> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 6 Unexpected start tag (form). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 12 Unexpected start tag (form). |
||||||
|
Line: 1 Col: 12 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <form> |
||||||
|
|
||||||
|
#data |
||||||
|
<button><button> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 8 Unexpected start tag (button). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 16 Unexpected start tag (button) implies end tag (button). |
||||||
|
Line: 1 Col: 16 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <button> |
||||||
|
| <button> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tr><td></th> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 20 Unexpected end tag (th). Ignored. |
||||||
|
Line: 1 Col: 20 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><caption><td> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 20 Unexpected end tag (td). Ignored. |
||||||
|
Line: 1 Col: 20 Unexpected table cell start tag (td) in the table body phase. |
||||||
|
Line: 1 Col: 20 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><caption><div> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 21 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
</caption><div> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 10 Unexpected end tag (caption). Ignored. |
||||||
|
Line: 1 Col: 15 Expected closing tag. Unexpected end of file. |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><caption><div></caption> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 31 Unexpected end tag (caption). Missing end tag (div). |
||||||
|
Line: 1 Col: 31 Unexpected end of file. Expected table content. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><caption></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 24 Unexpected end table tag in caption. Generates implied end caption. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
|
||||||
|
#data |
||||||
|
</table><div> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 8 Unexpected end table tag in caption. Generates implied end caption. |
||||||
|
Line: 1 Col: 8 Unexpected end tag (caption). Ignored. |
||||||
|
Line: 1 Col: 13 Expected closing tag. Unexpected end of file. |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><caption></body></col></colgroup></html></tbody></td></tfoot></th></thead></tr> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 23 Unexpected end tag (body). Ignored. |
||||||
|
Line: 1 Col: 29 Unexpected end tag (col). Ignored. |
||||||
|
Line: 1 Col: 40 Unexpected end tag (colgroup). Ignored. |
||||||
|
Line: 1 Col: 47 Unexpected end tag (html). Ignored. |
||||||
|
Line: 1 Col: 55 Unexpected end tag (tbody). Ignored. |
||||||
|
Line: 1 Col: 60 Unexpected end tag (td). Ignored. |
||||||
|
Line: 1 Col: 68 Unexpected end tag (tfoot). Ignored. |
||||||
|
Line: 1 Col: 73 Unexpected end tag (th). Ignored. |
||||||
|
Line: 1 Col: 81 Unexpected end tag (thead). Ignored. |
||||||
|
Line: 1 Col: 86 Unexpected end tag (tr). Ignored. |
||||||
|
Line: 1 Col: 86 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><caption><div></div> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 27 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tr><td></body></caption></col></colgroup></html> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 22 Unexpected end tag (body). Ignored. |
||||||
|
Line: 1 Col: 32 Unexpected end tag (caption). Ignored. |
||||||
|
Line: 1 Col: 38 Unexpected end tag (col). Ignored. |
||||||
|
Line: 1 Col: 49 Unexpected end tag (colgroup). Ignored. |
||||||
|
Line: 1 Col: 56 Unexpected end tag (html). Ignored. |
||||||
|
Line: 1 Col: 56 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
</table></tbody></tfoot></thead></tr><div> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 8 Unexpected end tag (table). Ignored. |
||||||
|
Line: 1 Col: 16 Unexpected end tag (tbody). Ignored. |
||||||
|
Line: 1 Col: 24 Unexpected end tag (tfoot). Ignored. |
||||||
|
Line: 1 Col: 32 Unexpected end tag (thead). Ignored. |
||||||
|
Line: 1 Col: 37 Unexpected end tag (tr). Ignored. |
||||||
|
Line: 1 Col: 42 Expected closing tag. Unexpected end of file. |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><colgroup>foo |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 20 Unexpected non-space characters in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 20 Unexpected end of file. Expected table content. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "foo" |
||||||
|
| <table> |
||||||
|
| <colgroup> |
||||||
|
|
||||||
|
#data |
||||||
|
foo<col> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 3 Unexpected end tag (colgroup). Ignored. |
||||||
|
#document-fragment |
||||||
|
colgroup |
||||||
|
#document |
||||||
|
| <col> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><colgroup></col> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 23 This element (col) has no end tag. |
||||||
|
Line: 1 Col: 23 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <colgroup> |
||||||
|
|
||||||
|
#data |
||||||
|
<frameset><div> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 15 Unexpected start tag token (div) in the frameset phase. Ignored. |
||||||
|
Line: 1 Col: 15 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
</frameset><frame> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 11 Unexpected end tag token (frameset) in the frameset phase (innerHTML). |
||||||
|
#document-fragment |
||||||
|
frameset |
||||||
|
#document |
||||||
|
| <frame> |
||||||
|
|
||||||
|
#data |
||||||
|
<frameset></div> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 16 Unexpected end tag token (div) in the frameset phase. Ignored. |
||||||
|
Line: 1 Col: 16 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
</body><div> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected end tag (body). Ignored. |
||||||
|
Line: 1 Col: 12 Expected closing tag. Unexpected end of file. |
||||||
|
#document-fragment |
||||||
|
body |
||||||
|
#document |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tr><div> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 16 Unexpected start tag (div) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 16 Unexpected end of file. Expected table content. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
</tr><td> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 5 Unexpected end tag (tr). Ignored. |
||||||
|
#document-fragment |
||||||
|
tr |
||||||
|
#document |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
</tbody></tfoot></thead><td> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 8 Unexpected end tag (tbody). Ignored. |
||||||
|
Line: 1 Col: 16 Unexpected end tag (tfoot). Ignored. |
||||||
|
Line: 1 Col: 24 Unexpected end tag (thead). Ignored. |
||||||
|
#document-fragment |
||||||
|
tr |
||||||
|
#document |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tr><div><td> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 16 Unexpected start tag (div) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 20 Unexpected implied end tag (div) in the table row phase. |
||||||
|
Line: 1 Col: 20 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<caption><col><colgroup><tbody><tfoot><thead><tr> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 9 Unexpected start tag (caption). |
||||||
|
Line: 1 Col: 14 Unexpected start tag (col). |
||||||
|
Line: 1 Col: 24 Unexpected start tag (colgroup). |
||||||
|
Line: 1 Col: 31 Unexpected start tag (tbody). |
||||||
|
Line: 1 Col: 38 Unexpected start tag (tfoot). |
||||||
|
Line: 1 Col: 45 Unexpected start tag (thead). |
||||||
|
Line: 1 Col: 49 Unexpected end of file. Expected table content. |
||||||
|
#document-fragment |
||||||
|
tbody |
||||||
|
#document |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tbody></thead> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 22 Unexpected end tag (thead) in the table body phase. Ignored. |
||||||
|
Line: 1 Col: 22 Unexpected end of file. Expected table content. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
|
||||||
|
#data |
||||||
|
</table><tr> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 8 Unexpected end tag (table). Ignored. |
||||||
|
Line: 1 Col: 12 Unexpected end of file. Expected table content. |
||||||
|
#document-fragment |
||||||
|
tbody |
||||||
|
#document |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tbody></body></caption></col></colgroup></html></td></th></tr> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 21 Unexpected end tag (body) in the table body phase. Ignored. |
||||||
|
Line: 1 Col: 31 Unexpected end tag (caption) in the table body phase. Ignored. |
||||||
|
Line: 1 Col: 37 Unexpected end tag (col) in the table body phase. Ignored. |
||||||
|
Line: 1 Col: 48 Unexpected end tag (colgroup) in the table body phase. Ignored. |
||||||
|
Line: 1 Col: 55 Unexpected end tag (html) in the table body phase. Ignored. |
||||||
|
Line: 1 Col: 60 Unexpected end tag (td) in the table body phase. Ignored. |
||||||
|
Line: 1 Col: 65 Unexpected end tag (th) in the table body phase. Ignored. |
||||||
|
Line: 1 Col: 70 Unexpected end tag (tr) in the table body phase. Ignored. |
||||||
|
Line: 1 Col: 70 Unexpected end of file. Expected table content. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tbody></div> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 20 Unexpected end tag (div) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 20 End tag (div) seen too early. Expected other end tag. |
||||||
|
Line: 1 Col: 20 Unexpected end of file. Expected table content. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 14 Unexpected start tag (table) implies end tag (table). |
||||||
|
Line: 1 Col: 14 Unexpected end of file. Expected table content. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 14 Unexpected end tag (body). Ignored. |
||||||
|
Line: 1 Col: 24 Unexpected end tag (caption). Ignored. |
||||||
|
Line: 1 Col: 30 Unexpected end tag (col). Ignored. |
||||||
|
Line: 1 Col: 41 Unexpected end tag (colgroup). Ignored. |
||||||
|
Line: 1 Col: 48 Unexpected end tag (html). Ignored. |
||||||
|
Line: 1 Col: 56 Unexpected end tag (tbody). Ignored. |
||||||
|
Line: 1 Col: 61 Unexpected end tag (td). Ignored. |
||||||
|
Line: 1 Col: 69 Unexpected end tag (tfoot). Ignored. |
||||||
|
Line: 1 Col: 74 Unexpected end tag (th). Ignored. |
||||||
|
Line: 1 Col: 82 Unexpected end tag (thead). Ignored. |
||||||
|
Line: 1 Col: 87 Unexpected end tag (tr). Ignored. |
||||||
|
Line: 1 Col: 87 Unexpected end of file. Expected table content. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
</table><tr> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 8 Unexpected end tag (table). Ignored. |
||||||
|
Line: 1 Col: 12 Unexpected end of file. Expected table content. |
||||||
|
#document-fragment |
||||||
|
table |
||||||
|
#document |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<body></body></html> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 20 Unexpected html end tag in inner html mode. |
||||||
|
Line: 1 Col: 20 Unexpected EOF in inner html mode. |
||||||
|
#document-fragment |
||||||
|
html |
||||||
|
#document |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<html><frameset></frameset></html> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
| " " |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"><html></html> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 50 Erroneous DOCTYPE. |
||||||
|
Line: 1 Col: 63 Unexpected end tag (html) after the (implied) root element. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" ""> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<param><frameset></frameset> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (param). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 17 Unexpected start tag (frameset). |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
<source><frameset></frameset> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (source). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 17 Unexpected start tag (frameset). |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
<track><frameset></frameset> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (track). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 17 Unexpected start tag (frameset). |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
</html><frameset></frameset> |
||||||
|
#errors |
||||||
|
7: End tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. |
||||||
|
17: Stray “frameset” start tag. |
||||||
|
17: “frameset” start tag seen. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
</body><frameset></frameset> |
||||||
|
#errors |
||||||
|
7: End tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. |
||||||
|
17: Stray “frameset” start tag. |
||||||
|
17: “frameset” start tag seen. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
@ -0,0 +1,390 @@ |
|||||||
|
#data |
||||||
|
<!doctype html><body><title>X</title> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <title> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><title>X</title></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 29 Unexpected start tag (title) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 38 Unexpected end tag (title) in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <title> |
||||||
|
| "X" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><head></head><title>X</title> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 35 Unexpected start tag (title) that can be in head. Moved. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <title> |
||||||
|
| "X" |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html></head><title>X</title> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 29 Unexpected start tag (title) that can be in head. Moved. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <title> |
||||||
|
| "X" |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><meta></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 28 Unexpected start tag (meta) in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <meta> |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table>X<tr><td><table> <meta></table></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 45 Unexpected start tag (meta) in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "X" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <meta> |
||||||
|
| <table> |
||||||
|
| " " |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><html> <head> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html> <head> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><style> <tr>x </style> </table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <style> |
||||||
|
| " <tr>x " |
||||||
|
| " " |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><TBODY><script> <tr>x </script> </table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <script> |
||||||
|
| " <tr>x " |
||||||
|
| " " |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><p><applet><p>X</p></applet> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <applet> |
||||||
|
| <p> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><listing> |
||||||
|
X</listing> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <listing> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><select><input>X |
||||||
|
#errors |
||||||
|
Line: 1 Col: 30 Unexpected input start tag in the select phase. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <input> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><select><select>X |
||||||
|
#errors |
||||||
|
Line: 1 Col: 31 Unexpected select start tag in the select phase treated as select end tag. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><input type=hidDEN></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 41 Unexpected input with type hidden in table context. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <input> |
||||||
|
| type="hidDEN" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table>X<input type=hidDEN></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "X" |
||||||
|
| <table> |
||||||
|
| <input> |
||||||
|
| type="hidDEN" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table> <input type=hidDEN></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 43 Unexpected input with type hidden in table context. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| " " |
||||||
|
| <input> |
||||||
|
| type="hidDEN" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table> <input type='hidDEN'></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 45 Unexpected input with type hidden in table context. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| " " |
||||||
|
| <input> |
||||||
|
| type="hidDEN" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><input type=" hidden"><input type=hidDEN></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 44 Unexpected start tag (input) in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <input> |
||||||
|
| type=" hidden" |
||||||
|
| <table> |
||||||
|
| <input> |
||||||
|
| type="hidDEN" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><table><select>X<tr> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 30 Unexpected start tag (select) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 35 Unexpected table element start tag (trs) in the select in table phase. |
||||||
|
Line: 1 Col: 35 Unexpected end of file. Expected table content. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| "X" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><select>X</select> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE hTmL><html></html> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 28 Unexpected end tag (html) after the (implied) root element. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE HTML><html></html> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 28 Unexpected end tag (html) after the (implied) root element. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<body>X</body></body> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 21 Unexpected end tag token (body) in the after body phase. |
||||||
|
Line: 1 Col: 21 Unexpected EOF in inner html mode. |
||||||
|
#document-fragment |
||||||
|
html |
||||||
|
#document |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "X" |
||||||
|
|
||||||
|
#data |
||||||
|
<div><p>a</x> b |
||||||
|
#errors |
||||||
|
Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 13 Unexpected end tag (x). Ignored. |
||||||
|
Line: 1 Col: 15 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <p> |
||||||
|
| "a b" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tr><td><code></code> </table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <code> |
||||||
|
| " " |
||||||
|
|
||||||
|
#data |
||||||
|
<table><b><tr><td>aaa</td></tr>bbb</table>ccc |
||||||
|
#errors |
||||||
|
XXX: Fix me |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| <b> |
||||||
|
| "bbb" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| "aaa" |
||||||
|
| <b> |
||||||
|
| "ccc" |
||||||
|
|
||||||
|
#data |
||||||
|
A<table><tr> B</tr> B</table> |
||||||
|
#errors |
||||||
|
XXX: Fix me |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "A B B" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
A<table><tr> B</tr> </em>C</table> |
||||||
|
#errors |
||||||
|
XXX: Fix me |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "A BC" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| " " |
||||||
|
|
||||||
|
#data |
||||||
|
<select><keygen> |
||||||
|
#errors |
||||||
|
Not known |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <keygen> |
@ -0,0 +1,148 @@ |
|||||||
|
#data |
||||||
|
<div> |
||||||
|
<div></div> |
||||||
|
</span>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. |
||||||
|
Line: 3 Col: 7 Unexpected end tag (span). Ignored. |
||||||
|
Line: 3 Col: 8 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <div> |
||||||
|
| " |
||||||
|
x" |
||||||
|
|
||||||
|
#data |
||||||
|
<div>x<div></div> |
||||||
|
</span>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. |
||||||
|
Line: 2 Col: 7 Unexpected end tag (span). Ignored. |
||||||
|
Line: 2 Col: 8 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| "x" |
||||||
|
| <div> |
||||||
|
| " |
||||||
|
x" |
||||||
|
|
||||||
|
#data |
||||||
|
<div>x<div></div>x</span>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 25 Unexpected end tag (span). Ignored. |
||||||
|
Line: 1 Col: 26 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| "x" |
||||||
|
| <div> |
||||||
|
| "xx" |
||||||
|
|
||||||
|
#data |
||||||
|
<div>x<div></div>y</span>z |
||||||
|
#errors |
||||||
|
Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 25 Unexpected end tag (span). Ignored. |
||||||
|
Line: 1 Col: 26 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| "x" |
||||||
|
| <div> |
||||||
|
| "yz" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><div>x<div></div>x</span>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 12 Unexpected start tag (div) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 18 Unexpected start tag (div) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 24 Unexpected end tag (div) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 32 Unexpected end tag (span) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 32 Unexpected end tag (span). Ignored. |
||||||
|
Line: 1 Col: 33 Unexpected end of file. Expected table content. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| "x" |
||||||
|
| <div> |
||||||
|
| "xx" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
x<table>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. |
||||||
|
Line: 1 Col: 9 Unexpected non-space characters in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 9 Unexpected end of file. Expected table content. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "xx" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
x<table><table>x |
||||||
|
#errors |
||||||
|
Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. |
||||||
|
Line: 1 Col: 15 Unexpected start tag (table) implies end tag (table). |
||||||
|
Line: 1 Col: 16 Unexpected non-space characters in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 16 Unexpected end of file. Expected table content. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "x" |
||||||
|
| <table> |
||||||
|
| "x" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<b>a<div></div><div></b>y |
||||||
|
#errors |
||||||
|
Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 24 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. |
||||||
|
Line: 1 Col: 25 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| "a" |
||||||
|
| <div> |
||||||
|
| <div> |
||||||
|
| <b> |
||||||
|
| "y" |
||||||
|
|
||||||
|
#data |
||||||
|
<a><div><p></a> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. |
||||||
|
Line: 1 Col: 15 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. |
||||||
|
Line: 1 Col: 15 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. |
||||||
|
Line: 1 Col: 15 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| <a> |
||||||
|
| <p> |
||||||
|
| <a> |
@ -0,0 +1,457 @@ |
|||||||
|
#data |
||||||
|
<!DOCTYPE html><math></math> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><math></math> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><math><mi> |
||||||
|
#errors |
||||||
|
25: End of file in a foreign namespace context. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><math><annotation-xml><svg><u> |
||||||
|
#errors |
||||||
|
45: HTML start tag “u” in a foreign namespace context. |
||||||
|
45: End of file seen and there were open elements. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math annotation-xml> |
||||||
|
| <svg svg> |
||||||
|
| <u> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><select><math></math></select> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 35 Unexpected start tag token (math) in the select phase. Ignored. |
||||||
|
Line: 1 Col: 42 Unexpected end tag (math) in the select phase. Ignored. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><select><option><math></math></option></select> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 43 Unexpected start tag token (math) in the select phase. Ignored. |
||||||
|
Line: 1 Col: 50 Unexpected end tag (math) in the select phase. Ignored. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <option> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><math></math></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 41 Unexpected end tag (math) in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><math><mi>foo</mi></math></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 46 Unexpected end tag (mi) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 53 Unexpected end tag (math) in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| "foo" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><math><mi>foo</mi><mi>bar</mi></math></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 46 Unexpected end tag (mi) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 58 Unexpected end tag (mi) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 65 Unexpected end tag (math) in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| "foo" |
||||||
|
| <math mi> |
||||||
|
| "bar" |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><tbody><math><mi>foo</mi><mi>bar</mi></math></tbody></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 41 Unexpected start tag (math) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 53 Unexpected end tag (mi) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 65 Unexpected end tag (mi) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 72 Unexpected end tag (math) in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| "foo" |
||||||
|
| <math mi> |
||||||
|
| "bar" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><tbody><tr><math><mi>foo</mi><mi>bar</mi></math></tr></tbody></table> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 45 Unexpected start tag (math) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 57 Unexpected end tag (mi) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 69 Unexpected end tag (mi) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 76 Unexpected end tag (math) in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| "foo" |
||||||
|
| <math mi> |
||||||
|
| "bar" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math></td></tr></tbody></table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| "foo" |
||||||
|
| <math mi> |
||||||
|
| "bar" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math><p>baz</td></tr></tbody></table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| "foo" |
||||||
|
| <math mi> |
||||||
|
| "bar" |
||||||
|
| <p> |
||||||
|
| "baz" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</caption></table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| "foo" |
||||||
|
| <math mi> |
||||||
|
| "bar" |
||||||
|
| <p> |
||||||
|
| "baz" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux |
||||||
|
#errors |
||||||
|
Line: 1 Col: 70 HTML start tag "p" in a foreign namespace context. |
||||||
|
Line: 1 Col: 81 Unexpected end table tag in caption. Generates implied end caption. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| "foo" |
||||||
|
| <math mi> |
||||||
|
| "bar" |
||||||
|
| <p> |
||||||
|
| "baz" |
||||||
|
| <p> |
||||||
|
| "quux" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi>baz</table><p>quux |
||||||
|
#errors |
||||||
|
Line: 1 Col: 78 Unexpected end table tag in caption. Generates implied end caption. |
||||||
|
Line: 1 Col: 78 Unexpected end tag (caption). Missing end tag (math). |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <caption> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| "foo" |
||||||
|
| <math mi> |
||||||
|
| "bar" |
||||||
|
| "baz" |
||||||
|
| <p> |
||||||
|
| "quux" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><colgroup><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux |
||||||
|
#errors |
||||||
|
Line: 1 Col: 44 Unexpected start tag (math) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 56 Unexpected end tag (mi) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 68 Unexpected end tag (mi) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 71 HTML start tag "p" in a foreign namespace context. |
||||||
|
Line: 1 Col: 71 Unexpected start tag (p) in table context caused voodoo mode. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| "foo" |
||||||
|
| <math mi> |
||||||
|
| "bar" |
||||||
|
| <p> |
||||||
|
| "baz" |
||||||
|
| <table> |
||||||
|
| <colgroup> |
||||||
|
| <p> |
||||||
|
| "quux" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><tr><td><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux |
||||||
|
#errors |
||||||
|
Line: 1 Col: 50 Unexpected start tag token (math) in the select phase. Ignored. |
||||||
|
Line: 1 Col: 54 Unexpected start tag token (mi) in the select phase. Ignored. |
||||||
|
Line: 1 Col: 62 Unexpected end tag (mi) in the select phase. Ignored. |
||||||
|
Line: 1 Col: 66 Unexpected start tag token (mi) in the select phase. Ignored. |
||||||
|
Line: 1 Col: 74 Unexpected end tag (mi) in the select phase. Ignored. |
||||||
|
Line: 1 Col: 77 Unexpected start tag token (p) in the select phase. Ignored. |
||||||
|
Line: 1 Col: 88 Unexpected table element end tag (tables) in the select in table phase. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <select> |
||||||
|
| "foobarbaz" |
||||||
|
| <p> |
||||||
|
| "quux" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body><table><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux |
||||||
|
#errors |
||||||
|
Line: 1 Col: 36 Unexpected start tag (select) in table context caused voodoo mode. |
||||||
|
Line: 1 Col: 42 Unexpected start tag token (math) in the select phase. Ignored. |
||||||
|
Line: 1 Col: 46 Unexpected start tag token (mi) in the select phase. Ignored. |
||||||
|
Line: 1 Col: 54 Unexpected end tag (mi) in the select phase. Ignored. |
||||||
|
Line: 1 Col: 58 Unexpected start tag token (mi) in the select phase. Ignored. |
||||||
|
Line: 1 Col: 66 Unexpected end tag (mi) in the select phase. Ignored. |
||||||
|
Line: 1 Col: 69 Unexpected start tag token (p) in the select phase. Ignored. |
||||||
|
Line: 1 Col: 80 Unexpected table element end tag (tables) in the select in table phase. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| "foobarbaz" |
||||||
|
| <table> |
||||||
|
| <p> |
||||||
|
| "quux" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body></body></html><math><mi>foo</mi><mi>bar</mi><p>baz |
||||||
|
#errors |
||||||
|
Line: 1 Col: 41 Unexpected start tag (math). |
||||||
|
Line: 1 Col: 68 HTML start tag "p" in a foreign namespace context. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| "foo" |
||||||
|
| <math mi> |
||||||
|
| "bar" |
||||||
|
| <p> |
||||||
|
| "baz" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body></body><math><mi>foo</mi><mi>bar</mi><p>baz |
||||||
|
#errors |
||||||
|
Line: 1 Col: 34 Unexpected start tag token (math) in the after body phase. |
||||||
|
Line: 1 Col: 61 HTML start tag "p" in a foreign namespace context. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| "foo" |
||||||
|
| <math mi> |
||||||
|
| "bar" |
||||||
|
| <p> |
||||||
|
| "baz" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><frameset><math><mi></mi><mi></mi><p><span> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 31 Unexpected start tag token (math) in the frameset phase. Ignored. |
||||||
|
Line: 1 Col: 35 Unexpected start tag token (mi) in the frameset phase. Ignored. |
||||||
|
Line: 1 Col: 40 Unexpected end tag token (mi) in the frameset phase. Ignored. |
||||||
|
Line: 1 Col: 44 Unexpected start tag token (mi) in the frameset phase. Ignored. |
||||||
|
Line: 1 Col: 49 Unexpected end tag token (mi) in the frameset phase. Ignored. |
||||||
|
Line: 1 Col: 52 Unexpected start tag token (p) in the frameset phase. Ignored. |
||||||
|
Line: 1 Col: 58 Unexpected start tag token (span) in the frameset phase. Ignored. |
||||||
|
Line: 1 Col: 58 Expected closing tag. Unexpected end of file. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><frameset></frameset><math><mi></mi><mi></mi><p><span> |
||||||
|
#errors |
||||||
|
Line: 1 Col: 42 Unexpected start tag (math) in the after frameset phase. Ignored. |
||||||
|
Line: 1 Col: 46 Unexpected start tag (mi) in the after frameset phase. Ignored. |
||||||
|
Line: 1 Col: 51 Unexpected end tag (mi) in the after frameset phase. Ignored. |
||||||
|
Line: 1 Col: 55 Unexpected start tag (mi) in the after frameset phase. Ignored. |
||||||
|
Line: 1 Col: 60 Unexpected end tag (mi) in the after frameset phase. Ignored. |
||||||
|
Line: 1 Col: 63 Unexpected start tag (p) in the after frameset phase. Ignored. |
||||||
|
Line: 1 Col: 69 Unexpected start tag (span) in the after frameset phase. Ignored. |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body xlink:href=foo><math xlink:href=foo></math> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| xlink:href="foo" |
||||||
|
| <math math> |
||||||
|
| xlink href="foo" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo></mi></math> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| xlink:href="foo" |
||||||
|
| xml:lang="en" |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| xlink href="foo" |
||||||
|
| xml lang="en" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo /></math> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| xlink:href="foo" |
||||||
|
| xml:lang="en" |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| xlink href="foo" |
||||||
|
| xml lang="en" |
||||||
|
|
||||||
|
#data |
||||||
|
<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo />bar</math> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| xlink:href="foo" |
||||||
|
| xml:lang="en" |
||||||
|
| <math math> |
||||||
|
| <math mi> |
||||||
|
| xlink href="foo" |
||||||
|
| xml lang="en" |
||||||
|
| "bar" |
741
Godeps/_workspace/src/golang.org/x/net/html/testdata/webkit/tests_innerHTML_1.dat
generated
vendored
741
Godeps/_workspace/src/golang.org/x/net/html/testdata/webkit/tests_innerHTML_1.dat
generated
vendored
@ -0,0 +1,741 @@ |
|||||||
|
#data |
||||||
|
<body><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
body |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span><body> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
body |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span><body> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
div |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<body><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
html |
||||||
|
#document |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<frameset><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
body |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span><frameset> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
body |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span><frameset> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
div |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<frameset><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
html |
||||||
|
#document |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tr> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
table |
||||||
|
#document |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
</table><tr> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
table |
||||||
|
#document |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
table |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
table |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><caption>a |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
table |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
| <caption> |
||||||
|
| "a" |
||||||
|
|
||||||
|
#data |
||||||
|
<a><colgroup><col> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
table |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
| <colgroup> |
||||||
|
| <col> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><tbody><tr> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
table |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><tfoot><tr> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
table |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
| <tfoot> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><thead><tr> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
table |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
| <thead> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><tr> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
table |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><th> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
table |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <th> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
table |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<table></table><tbody> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
</table><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span></table> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
</caption><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span></caption><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span><caption><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span><col><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span><colgroup><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span><html><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span><tbody><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span><td><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span><tfoot><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span><thead><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span><th><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span><tr><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
<span></table><span> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
caption |
||||||
|
#document |
||||||
|
| <span> |
||||||
|
| <span> |
||||||
|
|
||||||
|
#data |
||||||
|
</colgroup><col> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
colgroup |
||||||
|
#document |
||||||
|
| <col> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><col> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
colgroup |
||||||
|
#document |
||||||
|
| <col> |
||||||
|
|
||||||
|
#data |
||||||
|
<caption><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tbody |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<col><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tbody |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<colgroup><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tbody |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<tbody><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tbody |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<tfoot><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tbody |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<thead><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tbody |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
</table><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tbody |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><tr> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tbody |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tbody |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tbody |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tbody |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<td><table><tbody><a><tr> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tbody |
||||||
|
#document |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <a> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
</tr><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tr |
||||||
|
#document |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<td><table><a><tr></tr><tr> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tr |
||||||
|
#document |
||||||
|
| <td> |
||||||
|
| <a> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<caption><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tr |
||||||
|
#document |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<col><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tr |
||||||
|
#document |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<colgroup><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tr |
||||||
|
#document |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<tbody><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tr |
||||||
|
#document |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<tfoot><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tr |
||||||
|
#document |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<thead><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tr |
||||||
|
#document |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<tr><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tr |
||||||
|
#document |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
</table><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tr |
||||||
|
#document |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<td><table></table><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tr |
||||||
|
#document |
||||||
|
| <td> |
||||||
|
| <table> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<td><table></table><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
tr |
||||||
|
#document |
||||||
|
| <td> |
||||||
|
| <table> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<caption><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<col><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<colgroup><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<tbody><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<tfoot><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<th><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<thead><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<tr><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
</table><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
</tbody><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
</td><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
</tfoot><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
</thead><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
</th><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
</tr><a> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><td><td> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
td |
||||||
|
#document |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
</select><option> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
select |
||||||
|
#document |
||||||
|
| <option> |
||||||
|
|
||||||
|
#data |
||||||
|
<input><option> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
select |
||||||
|
#document |
||||||
|
| <option> |
||||||
|
|
||||||
|
#data |
||||||
|
<keygen><option> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
select |
||||||
|
#document |
||||||
|
| <option> |
||||||
|
|
||||||
|
#data |
||||||
|
<textarea><option> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
select |
||||||
|
#document |
||||||
|
| <option> |
||||||
|
|
||||||
|
#data |
||||||
|
</html><!--abc--> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
html |
||||||
|
#document |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <!-- abc --> |
||||||
|
|
||||||
|
#data |
||||||
|
</frameset><frame> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
frameset |
||||||
|
#document |
||||||
|
| <frame> |
||||||
|
|
||||||
|
#data |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
html |
||||||
|
#document |
||||||
|
| <head> |
||||||
|
| <body> |
@ -0,0 +1,261 @@ |
|||||||
|
#data |
||||||
|
<b><p>Bold </b> Not bold</p> |
||||||
|
Also not bold. |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <b> |
||||||
|
| <p> |
||||||
|
| <b> |
||||||
|
| "Bold " |
||||||
|
| " Not bold" |
||||||
|
| " |
||||||
|
Also not bold." |
||||||
|
|
||||||
|
#data |
||||||
|
<html> |
||||||
|
<font color=red><i>Italic and Red<p>Italic and Red </font> Just italic.</p> Italic only.</i> Plain |
||||||
|
<p>I should not be red. <font color=red>Red. <i>Italic and red.</p> |
||||||
|
<p>Italic and red. </i> Red.</font> I should not be red.</p> |
||||||
|
<b>Bold <i>Bold and italic</b> Only Italic </i> Plain |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <font> |
||||||
|
| color="red" |
||||||
|
| <i> |
||||||
|
| "Italic and Red" |
||||||
|
| <i> |
||||||
|
| <p> |
||||||
|
| <font> |
||||||
|
| color="red" |
||||||
|
| "Italic and Red " |
||||||
|
| " Just italic." |
||||||
|
| " Italic only." |
||||||
|
| " Plain |
||||||
|
" |
||||||
|
| <p> |
||||||
|
| "I should not be red. " |
||||||
|
| <font> |
||||||
|
| color="red" |
||||||
|
| "Red. " |
||||||
|
| <i> |
||||||
|
| "Italic and red." |
||||||
|
| <font> |
||||||
|
| color="red" |
||||||
|
| <i> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <p> |
||||||
|
| <font> |
||||||
|
| color="red" |
||||||
|
| <i> |
||||||
|
| "Italic and red. " |
||||||
|
| " Red." |
||||||
|
| " I should not be red." |
||||||
|
| " |
||||||
|
" |
||||||
|
| <b> |
||||||
|
| "Bold " |
||||||
|
| <i> |
||||||
|
| "Bold and italic" |
||||||
|
| <i> |
||||||
|
| " Only Italic " |
||||||
|
| " Plain" |
||||||
|
|
||||||
|
#data |
||||||
|
<html><body> |
||||||
|
<p><font size="7">First paragraph.</p> |
||||||
|
<p>Second paragraph.</p></font> |
||||||
|
<b><p><i>Bold and Italic</b> Italic</p> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <p> |
||||||
|
| <font> |
||||||
|
| size="7" |
||||||
|
| "First paragraph." |
||||||
|
| <font> |
||||||
|
| size="7" |
||||||
|
| " |
||||||
|
" |
||||||
|
| <p> |
||||||
|
| "Second paragraph." |
||||||
|
| " |
||||||
|
" |
||||||
|
| <b> |
||||||
|
| <p> |
||||||
|
| <b> |
||||||
|
| <i> |
||||||
|
| "Bold and Italic" |
||||||
|
| <i> |
||||||
|
| " Italic" |
||||||
|
|
||||||
|
#data |
||||||
|
<html> |
||||||
|
<dl> |
||||||
|
<dt><b>Boo |
||||||
|
<dd>Goo? |
||||||
|
</dl> |
||||||
|
</html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <dl> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <dt> |
||||||
|
| <b> |
||||||
|
| "Boo |
||||||
|
" |
||||||
|
| <dd> |
||||||
|
| <b> |
||||||
|
| "Goo? |
||||||
|
" |
||||||
|
| <b> |
||||||
|
| " |
||||||
|
" |
||||||
|
|
||||||
|
#data |
||||||
|
<html><body> |
||||||
|
<label><a><div>Hello<div>World</div></a></label> |
||||||
|
</body></html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <label> |
||||||
|
| <a> |
||||||
|
| <div> |
||||||
|
| <a> |
||||||
|
| "Hello" |
||||||
|
| <div> |
||||||
|
| "World" |
||||||
|
| " |
||||||
|
" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><center> <font>a</center> <img> <tr><td> </td> </tr> </table> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <center> |
||||||
|
| " " |
||||||
|
| <font> |
||||||
|
| "a" |
||||||
|
| <font> |
||||||
|
| <img> |
||||||
|
| " " |
||||||
|
| <table> |
||||||
|
| " " |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| " " |
||||||
|
| " " |
||||||
|
| " " |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tr><p><a><p>You should see this text. |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| <a> |
||||||
|
| <p> |
||||||
|
| <a> |
||||||
|
| "You should see this text." |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<TABLE> |
||||||
|
<TR> |
||||||
|
<CENTER><CENTER><TD></TD></TR><TR> |
||||||
|
<FONT> |
||||||
|
<TABLE><tr></tr></TABLE> |
||||||
|
</P> |
||||||
|
<a></font><font></a> |
||||||
|
This page contains an insanely badly-nested tag sequence. |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <center> |
||||||
|
| <center> |
||||||
|
| <font> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <table> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <td> |
||||||
|
| <tr> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <font> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <p> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <a> |
||||||
|
| <a> |
||||||
|
| <font> |
||||||
|
| <font> |
||||||
|
| " |
||||||
|
This page contains an insanely badly-nested tag sequence." |
||||||
|
|
||||||
|
#data |
||||||
|
<html> |
||||||
|
<body> |
||||||
|
<b><nobr><div>This text is in a div inside a nobr</nobr>More text that should not be in the nobr, i.e., the |
||||||
|
nobr should have closed the div inside it implicitly. </b><pre>A pre tag outside everything else.</pre> |
||||||
|
</body> |
||||||
|
</html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <b> |
||||||
|
| <nobr> |
||||||
|
| <div> |
||||||
|
| <b> |
||||||
|
| <nobr> |
||||||
|
| "This text is in a div inside a nobr" |
||||||
|
| "More text that should not be in the nobr, i.e., the |
||||||
|
nobr should have closed the div inside it implicitly. " |
||||||
|
| <pre> |
||||||
|
| "A pre tag outside everything else." |
||||||
|
| " |
||||||
|
|
||||||
|
" |
@ -0,0 +1,610 @@ |
|||||||
|
#data |
||||||
|
Test |
||||||
|
#errors |
||||||
|
Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "Test" |
||||||
|
|
||||||
|
#data |
||||||
|
<div></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<div>Test</div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| "Test" |
||||||
|
|
||||||
|
#data |
||||||
|
<di |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<div>Hello</div> |
||||||
|
<script> |
||||||
|
console.log("PASS"); |
||||||
|
</script> |
||||||
|
<div>Bye</div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| "Hello" |
||||||
|
| " |
||||||
|
" |
||||||
|
| <script> |
||||||
|
| " |
||||||
|
console.log("PASS"); |
||||||
|
" |
||||||
|
| " |
||||||
|
" |
||||||
|
| <div> |
||||||
|
| "Bye" |
||||||
|
|
||||||
|
#data |
||||||
|
<div foo="bar">Hello</div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| foo="bar" |
||||||
|
| "Hello" |
||||||
|
|
||||||
|
#data |
||||||
|
<div>Hello</div> |
||||||
|
<script> |
||||||
|
console.log("FOO<span>BAR</span>BAZ"); |
||||||
|
</script> |
||||||
|
<div>Bye</div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| "Hello" |
||||||
|
| " |
||||||
|
" |
||||||
|
| <script> |
||||||
|
| " |
||||||
|
console.log("FOO<span>BAR</span>BAZ"); |
||||||
|
" |
||||||
|
| " |
||||||
|
" |
||||||
|
| <div> |
||||||
|
| "Bye" |
||||||
|
|
||||||
|
#data |
||||||
|
<foo bar="baz"></foo><potato quack="duck"></potato> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <foo> |
||||||
|
| bar="baz" |
||||||
|
| <potato> |
||||||
|
| quack="duck" |
||||||
|
|
||||||
|
#data |
||||||
|
<foo bar="baz"><potato quack="duck"></potato></foo> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <foo> |
||||||
|
| bar="baz" |
||||||
|
| <potato> |
||||||
|
| quack="duck" |
||||||
|
|
||||||
|
#data |
||||||
|
<foo></foo bar="baz"><potato></potato quack="duck"> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <foo> |
||||||
|
| <potato> |
||||||
|
|
||||||
|
#data |
||||||
|
</ tttt> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!-- tttt --> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<div FOO ><img><img></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| foo="" |
||||||
|
| <img> |
||||||
|
| <img> |
||||||
|
|
||||||
|
#data |
||||||
|
<p>Test</p<p>Test2</p> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| "TestTest2" |
||||||
|
|
||||||
|
#data |
||||||
|
<rdar://problem/6869687> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <rdar:> |
||||||
|
| 6869687="" |
||||||
|
| problem="" |
||||||
|
|
||||||
|
#data |
||||||
|
<A>test< /A> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| "test< /A>" |
||||||
|
|
||||||
|
#data |
||||||
|
< |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "<" |
||||||
|
|
||||||
|
#data |
||||||
|
<body foo='bar'><body foo='baz' yo='mama'> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| foo="bar" |
||||||
|
| yo="mama" |
||||||
|
|
||||||
|
#data |
||||||
|
<body></br foo="bar"></body> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <br> |
||||||
|
|
||||||
|
#data |
||||||
|
<bdy><br foo="bar"></body> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <bdy> |
||||||
|
| <br> |
||||||
|
| foo="bar" |
||||||
|
|
||||||
|
#data |
||||||
|
<body></body></br foo="bar"> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <br> |
||||||
|
|
||||||
|
#data |
||||||
|
<bdy></body><br foo="bar"> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <bdy> |
||||||
|
| <br> |
||||||
|
| foo="bar" |
||||||
|
|
||||||
|
#data |
||||||
|
<html><body></body></html><!-- Hi there --> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <!-- Hi there --> |
||||||
|
|
||||||
|
#data |
||||||
|
<html><body></body></html>x<!-- Hi there --> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "x" |
||||||
|
| <!-- Hi there --> |
||||||
|
|
||||||
|
#data |
||||||
|
<html><body></body></html>x<!-- Hi there --></html><!-- Again --> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "x" |
||||||
|
| <!-- Hi there --> |
||||||
|
| <!-- Again --> |
||||||
|
|
||||||
|
#data |
||||||
|
<html><body></body></html>x<!-- Hi there --></body></html><!-- Again --> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "x" |
||||||
|
| <!-- Hi there --> |
||||||
|
| <!-- Again --> |
||||||
|
|
||||||
|
#data |
||||||
|
<html><body><ruby><div><rp>xx</rp></div></ruby></body></html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <ruby> |
||||||
|
| <div> |
||||||
|
| <rp> |
||||||
|
| "xx" |
||||||
|
|
||||||
|
#data |
||||||
|
<html><body><ruby><div><rt>xx</rt></div></ruby></body></html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <ruby> |
||||||
|
| <div> |
||||||
|
| <rt> |
||||||
|
| "xx" |
||||||
|
|
||||||
|
#data |
||||||
|
<html><frameset><!--1--><noframes>A</noframes><!--2--></frameset><!--3--><noframes>B</noframes><!--4--></html><!--5--><noframes>C</noframes><!--6--> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
| <!-- 1 --> |
||||||
|
| <noframes> |
||||||
|
| "A" |
||||||
|
| <!-- 2 --> |
||||||
|
| <!-- 3 --> |
||||||
|
| <noframes> |
||||||
|
| "B" |
||||||
|
| <!-- 4 --> |
||||||
|
| <noframes> |
||||||
|
| "C" |
||||||
|
| <!-- 5 --> |
||||||
|
| <!-- 6 --> |
||||||
|
|
||||||
|
#data |
||||||
|
<select><option>A<select><option>B<select><option>C<select><option>D<select><option>E<select><option>F<select><option>G<select> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <select> |
||||||
|
| <option> |
||||||
|
| "A" |
||||||
|
| <option> |
||||||
|
| "B" |
||||||
|
| <select> |
||||||
|
| <option> |
||||||
|
| "C" |
||||||
|
| <option> |
||||||
|
| "D" |
||||||
|
| <select> |
||||||
|
| <option> |
||||||
|
| "E" |
||||||
|
| <option> |
||||||
|
| "F" |
||||||
|
| <select> |
||||||
|
| <option> |
||||||
|
| "G" |
||||||
|
|
||||||
|
#data |
||||||
|
<dd><dd><dt><dt><dd><li><li> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <dd> |
||||||
|
| <dd> |
||||||
|
| <dt> |
||||||
|
| <dt> |
||||||
|
| <dd> |
||||||
|
| <li> |
||||||
|
| <li> |
||||||
|
|
||||||
|
#data |
||||||
|
<div><b></div><div><nobr>a<nobr> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <b> |
||||||
|
| <div> |
||||||
|
| <b> |
||||||
|
| <nobr> |
||||||
|
| "a" |
||||||
|
| <nobr> |
||||||
|
|
||||||
|
#data |
||||||
|
<head></head> |
||||||
|
<body></body> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| " |
||||||
|
" |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<head></head> <style></style>ddd |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <style> |
||||||
|
| " " |
||||||
|
| <body> |
||||||
|
| "ddd" |
||||||
|
|
||||||
|
#data |
||||||
|
<kbd><table></kbd><col><select><tr> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <kbd> |
||||||
|
| <select> |
||||||
|
| <table> |
||||||
|
| <colgroup> |
||||||
|
| <col> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
|
||||||
|
#data |
||||||
|
<kbd><table></kbd><col><select><tr></table><div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <kbd> |
||||||
|
| <select> |
||||||
|
| <table> |
||||||
|
| <colgroup> |
||||||
|
| <col> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><li><style></style><title></title></a> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| <li> |
||||||
|
| <a> |
||||||
|
| <style> |
||||||
|
| <title> |
||||||
|
|
||||||
|
#data |
||||||
|
<font></p><p><meta><title></title></font> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <font> |
||||||
|
| <p> |
||||||
|
| <p> |
||||||
|
| <font> |
||||||
|
| <meta> |
||||||
|
| <title> |
||||||
|
|
||||||
|
#data |
||||||
|
<a><center><title></title><a> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <a> |
||||||
|
| <center> |
||||||
|
| <a> |
||||||
|
| <title> |
||||||
|
| <a> |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><title><div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg title> |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><title><rect><div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg title> |
||||||
|
| <rect> |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><title><svg><div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg title> |
||||||
|
| <svg svg> |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<img <="" FAIL> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <img> |
||||||
|
| <="" |
||||||
|
| fail="" |
||||||
|
|
||||||
|
#data |
||||||
|
<ul><li><div id='foo'/>A</li><li>B<div>C</div></li></ul> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <ul> |
||||||
|
| <li> |
||||||
|
| <div> |
||||||
|
| id="foo" |
||||||
|
| "A" |
||||||
|
| <li> |
||||||
|
| "B" |
||||||
|
| <div> |
||||||
|
| "C" |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><em><desc></em> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <em> |
||||||
|
| <desc> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><tr><td><svg><desc><td></desc><circle> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| <svg svg> |
||||||
|
| <svg desc> |
||||||
|
| <td> |
||||||
|
| <circle> |
||||||
|
|
||||||
|
#data |
||||||
|
<svg><tfoot></mi><td> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <svg svg> |
||||||
|
| <svg tfoot> |
||||||
|
| <svg td> |
||||||
|
|
||||||
|
#data |
||||||
|
<math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <math math> |
||||||
|
| <math mrow> |
||||||
|
| <math mrow> |
||||||
|
| <math mn> |
||||||
|
| "1" |
||||||
|
| <math mi> |
||||||
|
| "a" |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><input type="hidden"><frameset> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <frameset> |
||||||
|
|
||||||
|
#data |
||||||
|
<!doctype html><input type="button"><frameset> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <!DOCTYPE html> |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <input> |
||||||
|
| type="button" |
@ -0,0 +1,159 @@ |
|||||||
|
#data |
||||||
|
<foo bar=qux/> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <foo> |
||||||
|
| bar="qux/" |
||||||
|
|
||||||
|
#data |
||||||
|
<p id="status"><noscript><strong>A</strong></noscript><span>B</span></p> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <p> |
||||||
|
| id="status" |
||||||
|
| <noscript> |
||||||
|
| "<strong>A</strong>" |
||||||
|
| <span> |
||||||
|
| "B" |
||||||
|
|
||||||
|
#data |
||||||
|
<div><sarcasm><div></div></sarcasm></div> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <div> |
||||||
|
| <sarcasm> |
||||||
|
| <div> |
||||||
|
|
||||||
|
#data |
||||||
|
<html><body><img src="" border="0" alt="><div>A</div></body></html> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><td></tbody>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| "A" |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
|
||||||
|
#data |
||||||
|
<table><td></thead>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><td></tfoot>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <tbody> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><thead><td></tbody>A |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <table> |
||||||
|
| <thead> |
||||||
|
| <tr> |
||||||
|
| <td> |
||||||
|
| "A" |
||||||
|
|
||||||
|
#data |
||||||
|
<legend>test</legend> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <legend> |
||||||
|
| "test" |
||||||
|
|
||||||
|
#data |
||||||
|
<table><input> |
||||||
|
#errors |
||||||
|
#document |
||||||
|
| <html> |
||||||
|
| <head> |
||||||
|
| <body> |
||||||
|
| <input> |
||||||
|
| <table> |
||||||
|
|
||||||
|
#data |
||||||
|
<b><em><dcell><postfield><postfield><postfield><postfield><missing_glyph><missing_glyph><missing_glyph><missing_glyph><hkern><aside></b></em> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
div |
||||||
|
#document |
||||||
|
| <b> |
||||||
|
| <em> |
||||||
|
| <dcell> |
||||||
|
| <postfield> |
||||||
|
| <postfield> |
||||||
|
| <postfield> |
||||||
|
| <postfield> |
||||||
|
| <missing_glyph> |
||||||
|
| <missing_glyph> |
||||||
|
| <missing_glyph> |
||||||
|
| <missing_glyph> |
||||||
|
| <hkern> |
||||||
|
| <aside> |
||||||
|
| <em> |
||||||
|
| <b> |
||||||
|
|
||||||
|
#data |
||||||
|
<isindex action="x"> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
table |
||||||
|
#document |
||||||
|
| <form> |
||||||
|
| action="x" |
||||||
|
| <hr> |
||||||
|
| <label> |
||||||
|
| "This is a searchable index. Enter search keywords: " |
||||||
|
| <input> |
||||||
|
| name="isindex" |
||||||
|
| <hr> |
||||||
|
|
||||||
|
#data |
||||||
|
<option><XH<optgroup></optgroup> |
||||||
|
#errors |
||||||
|
#document-fragment |
||||||
|
select |
||||||
|
#document |
||||||
|
| <option> |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,748 @@ |
|||||||
|
// Copyright 2010 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package html |
||||||
|
|
||||||
|
import ( |
||||||
|
"bytes" |
||||||
|
"io" |
||||||
|
"io/ioutil" |
||||||
|
"reflect" |
||||||
|
"runtime" |
||||||
|
"strings" |
||||||
|
"testing" |
||||||
|
) |
||||||
|
|
||||||
|
type tokenTest struct { |
||||||
|
// A short description of the test case.
|
||||||
|
desc string |
||||||
|
// The HTML to parse.
|
||||||
|
html string |
||||||
|
// The string representations of the expected tokens, joined by '$'.
|
||||||
|
golden string |
||||||
|
} |
||||||
|
|
||||||
|
var tokenTests = []tokenTest{ |
||||||
|
{ |
||||||
|
"empty", |
||||||
|
"", |
||||||
|
"", |
||||||
|
}, |
||||||
|
// A single text node. The tokenizer should not break text nodes on whitespace,
|
||||||
|
// nor should it normalize whitespace within a text node.
|
||||||
|
{ |
||||||
|
"text", |
||||||
|
"foo bar", |
||||||
|
"foo bar", |
||||||
|
}, |
||||||
|
// An entity.
|
||||||
|
{ |
||||||
|
"entity", |
||||||
|
"one < two", |
||||||
|
"one < two", |
||||||
|
}, |
||||||
|
// A start, self-closing and end tag. The tokenizer does not care if the start
|
||||||
|
// and end tokens don't match; that is the job of the parser.
|
||||||
|
{ |
||||||
|
"tags", |
||||||
|
"<a>b<c/>d</e>", |
||||||
|
"<a>$b$<c/>$d$</e>", |
||||||
|
}, |
||||||
|
// Angle brackets that aren't a tag.
|
||||||
|
{ |
||||||
|
"not a tag #0", |
||||||
|
"<", |
||||||
|
"<", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"not a tag #1", |
||||||
|
"</", |
||||||
|
"</", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"not a tag #2", |
||||||
|
"</>", |
||||||
|
"<!---->", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"not a tag #3", |
||||||
|
"a</>b", |
||||||
|
"a$<!---->$b", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"not a tag #4", |
||||||
|
"</ >", |
||||||
|
"<!-- -->", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"not a tag #5", |
||||||
|
"</.", |
||||||
|
"<!--.-->", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"not a tag #6", |
||||||
|
"</.>", |
||||||
|
"<!--.-->", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"not a tag #7", |
||||||
|
"a < b", |
||||||
|
"a < b", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"not a tag #8", |
||||||
|
"<.>", |
||||||
|
"<.>", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"not a tag #9", |
||||||
|
"a<<<b>>>c", |
||||||
|
"a<<$<b>$>>c", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"not a tag #10", |
||||||
|
"if x<0 and y < 0 then x*y>0", |
||||||
|
"if x<0 and y < 0 then x*y>0", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"not a tag #11", |
||||||
|
"<<p>", |
||||||
|
"<$<p>", |
||||||
|
}, |
||||||
|
// EOF in a tag name.
|
||||||
|
{ |
||||||
|
"tag name eof #0", |
||||||
|
"<a", |
||||||
|
"", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"tag name eof #1", |
||||||
|
"<a ", |
||||||
|
"", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"tag name eof #2", |
||||||
|
"a<b", |
||||||
|
"a", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"tag name eof #3", |
||||||
|
"<a><b", |
||||||
|
"<a>", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"tag name eof #4", |
||||||
|
`<a x`, |
||||||
|
``, |
||||||
|
}, |
||||||
|
// Some malformed tags that are missing a '>'.
|
||||||
|
{ |
||||||
|
"malformed tag #0", |
||||||
|
`<p</p>`, |
||||||
|
`<p< p="">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"malformed tag #1", |
||||||
|
`<p </p>`, |
||||||
|
`<p <="" p="">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"malformed tag #2", |
||||||
|
`<p id`, |
||||||
|
``, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"malformed tag #3", |
||||||
|
`<p id=`, |
||||||
|
``, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"malformed tag #4", |
||||||
|
`<p id=>`, |
||||||
|
`<p id="">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"malformed tag #5", |
||||||
|
`<p id=0`, |
||||||
|
``, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"malformed tag #6", |
||||||
|
`<p id=0</p>`, |
||||||
|
`<p id="0</p">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"malformed tag #7", |
||||||
|
`<p id="0</p>`, |
||||||
|
``, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"malformed tag #8", |
||||||
|
`<p id="0"</p>`, |
||||||
|
`<p id="0" <="" p="">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"malformed tag #9", |
||||||
|
`<p></p id`, |
||||||
|
`<p>`, |
||||||
|
}, |
||||||
|
// Raw text and RCDATA.
|
||||||
|
{ |
||||||
|
"basic raw text", |
||||||
|
"<script><a></b></script>", |
||||||
|
"<script>$<a></b>$</script>", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"unfinished script end tag", |
||||||
|
"<SCRIPT>a</SCR", |
||||||
|
"<script>$a</SCR", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"broken script end tag", |
||||||
|
"<SCRIPT>a</SCR ipt>", |
||||||
|
"<script>$a</SCR ipt>", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"EOF in script end tag", |
||||||
|
"<SCRIPT>a</SCRipt", |
||||||
|
"<script>$a</SCRipt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"scriptx end tag", |
||||||
|
"<SCRIPT>a</SCRiptx", |
||||||
|
"<script>$a</SCRiptx", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"' ' completes script end tag", |
||||||
|
"<SCRIPT>a</SCRipt ", |
||||||
|
"<script>$a", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"'>' completes script end tag", |
||||||
|
"<SCRIPT>a</SCRipt>", |
||||||
|
"<script>$a$</script>", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"self-closing script end tag", |
||||||
|
"<SCRIPT>a</SCRipt/>", |
||||||
|
"<script>$a$</script>", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"nested script tag", |
||||||
|
"<SCRIPT>a</SCRipt<script>", |
||||||
|
"<script>$a</SCRipt<script>", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"script end tag after unfinished", |
||||||
|
"<SCRIPT>a</SCRipt</script>", |
||||||
|
"<script>$a</SCRipt$</script>", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"script/style mismatched tags", |
||||||
|
"<script>a</style>", |
||||||
|
"<script>$a</style>", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"style element with entity", |
||||||
|
"<style>'", |
||||||
|
"<style>$&apos;", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"textarea with tag", |
||||||
|
"<textarea><div></textarea>", |
||||||
|
"<textarea>$<div>$</textarea>", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"title with tag and entity", |
||||||
|
"<title><b>K&R C</b></title>", |
||||||
|
"<title>$<b>K&R C</b>$</title>", |
||||||
|
}, |
||||||
|
// DOCTYPE tests.
|
||||||
|
{ |
||||||
|
"Proper DOCTYPE", |
||||||
|
"<!DOCTYPE html>", |
||||||
|
"<!DOCTYPE html>", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"DOCTYPE with no space", |
||||||
|
"<!doctypehtml>", |
||||||
|
"<!DOCTYPE html>", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"DOCTYPE with two spaces", |
||||||
|
"<!doctype html>", |
||||||
|
"<!DOCTYPE html>", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"looks like DOCTYPE but isn't", |
||||||
|
"<!DOCUMENT html>", |
||||||
|
"<!--DOCUMENT html-->", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"DOCTYPE at EOF", |
||||||
|
"<!DOCtype", |
||||||
|
"<!DOCTYPE >", |
||||||
|
}, |
||||||
|
// XML processing instructions.
|
||||||
|
{ |
||||||
|
"XML processing instruction", |
||||||
|
"<?xml?>", |
||||||
|
"<!--?xml?-->", |
||||||
|
}, |
||||||
|
// Comments.
|
||||||
|
{ |
||||||
|
"comment0", |
||||||
|
"abc<b><!-- skipme --></b>def", |
||||||
|
"abc$<b>$<!-- skipme -->$</b>$def", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"comment1", |
||||||
|
"a<!-->z", |
||||||
|
"a$<!---->$z", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"comment2", |
||||||
|
"a<!--->z", |
||||||
|
"a$<!---->$z", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"comment3", |
||||||
|
"a<!--x>-->z", |
||||||
|
"a$<!--x>-->$z", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"comment4", |
||||||
|
"a<!--x->-->z", |
||||||
|
"a$<!--x->-->$z", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"comment5", |
||||||
|
"a<!>z", |
||||||
|
"a$<!---->$z", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"comment6", |
||||||
|
"a<!->z", |
||||||
|
"a$<!----->$z", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"comment7", |
||||||
|
"a<!---<>z", |
||||||
|
"a$<!---<>z-->", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"comment8", |
||||||
|
"a<!--z", |
||||||
|
"a$<!--z-->", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"comment9", |
||||||
|
"a<!--z-", |
||||||
|
"a$<!--z-->", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"comment10", |
||||||
|
"a<!--z--", |
||||||
|
"a$<!--z-->", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"comment11", |
||||||
|
"a<!--z---", |
||||||
|
"a$<!--z--->", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"comment12", |
||||||
|
"a<!--z----", |
||||||
|
"a$<!--z---->", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"comment13", |
||||||
|
"a<!--x--!>z", |
||||||
|
"a$<!--x-->$z", |
||||||
|
}, |
||||||
|
// An attribute with a backslash.
|
||||||
|
{ |
||||||
|
"backslash", |
||||||
|
`<p id="a\"b">`, |
||||||
|
`<p id="a\" b"="">`, |
||||||
|
}, |
||||||
|
// Entities, tag name and attribute key lower-casing, and whitespace
|
||||||
|
// normalization within a tag.
|
||||||
|
{ |
||||||
|
"tricky", |
||||||
|
"<p \t\n iD=\"a"B\" foo=\"bar\"><EM>te<&;xt</em></p>", |
||||||
|
`<p id="a"B" foo="bar">$<em>$te<&;xt$</em>$</p>`, |
||||||
|
}, |
||||||
|
// A nonexistent entity. Tokenizing and converting back to a string should
|
||||||
|
// escape the "&" to become "&".
|
||||||
|
{ |
||||||
|
"noSuchEntity", |
||||||
|
`<a b="c&noSuchEntity;d"><&alsoDoesntExist;&`, |
||||||
|
`<a b="c&noSuchEntity;d">$<&alsoDoesntExist;&`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"entity without semicolon", |
||||||
|
`¬it;∉<a b="q=z&=5¬ice=hello¬=world">`, |
||||||
|
`¬it;∉$<a b="q=z&amp=5&notice=hello¬=world">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"entity with digits", |
||||||
|
"½", |
||||||
|
"½", |
||||||
|
}, |
||||||
|
// Attribute tests:
|
||||||
|
// http://dev.w3.org/html5/pf-summary/Overview.html#attributes
|
||||||
|
{ |
||||||
|
"Empty attribute", |
||||||
|
`<input disabled FOO>`, |
||||||
|
`<input disabled="" foo="">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Empty attribute, whitespace", |
||||||
|
`<input disabled FOO >`, |
||||||
|
`<input disabled="" foo="">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Unquoted attribute value", |
||||||
|
`<input value=yes FOO=BAR>`, |
||||||
|
`<input value="yes" foo="BAR">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Unquoted attribute value, spaces", |
||||||
|
`<input value = yes FOO = BAR>`, |
||||||
|
`<input value="yes" foo="BAR">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Unquoted attribute value, trailing space", |
||||||
|
`<input value=yes FOO=BAR >`, |
||||||
|
`<input value="yes" foo="BAR">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Single-quoted attribute value", |
||||||
|
`<input value='yes' FOO='BAR'>`, |
||||||
|
`<input value="yes" foo="BAR">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Single-quoted attribute value, trailing space", |
||||||
|
`<input value='yes' FOO='BAR' >`, |
||||||
|
`<input value="yes" foo="BAR">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Double-quoted attribute value", |
||||||
|
`<input value="I'm an attribute" FOO="BAR">`, |
||||||
|
`<input value="I'm an attribute" foo="BAR">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Attribute name characters", |
||||||
|
`<meta http-equiv="content-type">`, |
||||||
|
`<meta http-equiv="content-type">`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Mixed attributes", |
||||||
|
`a<P V="0 1" w='2' X=3 y>z`, |
||||||
|
`a$<p v="0 1" w="2" x="3" y="">$z`, |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Attributes with a solitary single quote", |
||||||
|
`<p id=can't><p id=won't>`, |
||||||
|
`<p id="can't">$<p id="won't">`, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
func TestTokenizer(t *testing.T) { |
||||||
|
loop: |
||||||
|
for _, tt := range tokenTests { |
||||||
|
z := NewTokenizer(strings.NewReader(tt.html)) |
||||||
|
if tt.golden != "" { |
||||||
|
for i, s := range strings.Split(tt.golden, "$") { |
||||||
|
if z.Next() == ErrorToken { |
||||||
|
t.Errorf("%s token %d: want %q got error %v", tt.desc, i, s, z.Err()) |
||||||
|
continue loop |
||||||
|
} |
||||||
|
actual := z.Token().String() |
||||||
|
if s != actual { |
||||||
|
t.Errorf("%s token %d: want %q got %q", tt.desc, i, s, actual) |
||||||
|
continue loop |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
z.Next() |
||||||
|
if z.Err() != io.EOF { |
||||||
|
t.Errorf("%s: want EOF got %q", tt.desc, z.Err()) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestMaxBuffer(t *testing.T) { |
||||||
|
// Exceeding the maximum buffer size generates ErrBufferExceeded.
|
||||||
|
z := NewTokenizer(strings.NewReader("<" + strings.Repeat("t", 10))) |
||||||
|
z.SetMaxBuf(5) |
||||||
|
tt := z.Next() |
||||||
|
if got, want := tt, ErrorToken; got != want { |
||||||
|
t.Fatalf("token type: got: %v want: %v", got, want) |
||||||
|
} |
||||||
|
if got, want := z.Err(), ErrBufferExceeded; got != want { |
||||||
|
t.Errorf("error type: got: %v want: %v", got, want) |
||||||
|
} |
||||||
|
if got, want := string(z.Raw()), "<tttt"; got != want { |
||||||
|
t.Fatalf("buffered before overflow: got: %q want: %q", got, want) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestMaxBufferReconstruction(t *testing.T) { |
||||||
|
// Exceeding the maximum buffer size at any point while tokenizing permits
|
||||||
|
// reconstructing the original input.
|
||||||
|
tests: |
||||||
|
for _, test := range tokenTests { |
||||||
|
for maxBuf := 1; ; maxBuf++ { |
||||||
|
r := strings.NewReader(test.html) |
||||||
|
z := NewTokenizer(r) |
||||||
|
z.SetMaxBuf(maxBuf) |
||||||
|
var tokenized bytes.Buffer |
||||||
|
for { |
||||||
|
tt := z.Next() |
||||||
|
tokenized.Write(z.Raw()) |
||||||
|
if tt == ErrorToken { |
||||||
|
if err := z.Err(); err != io.EOF && err != ErrBufferExceeded { |
||||||
|
t.Errorf("%s: unexpected error: %v", test.desc, err) |
||||||
|
} |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
// Anything tokenized along with untokenized input or data left in the reader.
|
||||||
|
assembled, err := ioutil.ReadAll(io.MultiReader(&tokenized, bytes.NewReader(z.Buffered()), r)) |
||||||
|
if err != nil { |
||||||
|
t.Errorf("%s: ReadAll: %v", test.desc, err) |
||||||
|
continue tests |
||||||
|
} |
||||||
|
if got, want := string(assembled), test.html; got != want { |
||||||
|
t.Errorf("%s: reassembled html:\n got: %q\nwant: %q", test.desc, got, want) |
||||||
|
continue tests |
||||||
|
} |
||||||
|
// EOF indicates that we completed tokenization and hence found the max
|
||||||
|
// maxBuf that generates ErrBufferExceeded, so continue to the next test.
|
||||||
|
if z.Err() == io.EOF { |
||||||
|
break |
||||||
|
} |
||||||
|
} // buffer sizes
|
||||||
|
} // tests
|
||||||
|
} |
||||||
|
|
||||||
|
func TestPassthrough(t *testing.T) { |
||||||
|
// Accumulating the raw output for each parse event should reconstruct the
|
||||||
|
// original input.
|
||||||
|
for _, test := range tokenTests { |
||||||
|
z := NewTokenizer(strings.NewReader(test.html)) |
||||||
|
var parsed bytes.Buffer |
||||||
|
for { |
||||||
|
tt := z.Next() |
||||||
|
parsed.Write(z.Raw()) |
||||||
|
if tt == ErrorToken { |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if got, want := parsed.String(), test.html; got != want { |
||||||
|
t.Errorf("%s: parsed output:\n got: %q\nwant: %q", test.desc, got, want) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestBufAPI(t *testing.T) { |
||||||
|
s := "0<a>1</a>2<b>3<a>4<a>5</a>6</b>7</a>8<a/>9" |
||||||
|
z := NewTokenizer(bytes.NewBufferString(s)) |
||||||
|
var result bytes.Buffer |
||||||
|
depth := 0 |
||||||
|
loop: |
||||||
|
for { |
||||||
|
tt := z.Next() |
||||||
|
switch tt { |
||||||
|
case ErrorToken: |
||||||
|
if z.Err() != io.EOF { |
||||||
|
t.Error(z.Err()) |
||||||
|
} |
||||||
|
break loop |
||||||
|
case TextToken: |
||||||
|
if depth > 0 { |
||||||
|
result.Write(z.Text()) |
||||||
|
} |
||||||
|
case StartTagToken, EndTagToken: |
||||||
|
tn, _ := z.TagName() |
||||||
|
if len(tn) == 1 && tn[0] == 'a' { |
||||||
|
if tt == StartTagToken { |
||||||
|
depth++ |
||||||
|
} else { |
||||||
|
depth-- |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
u := "14567" |
||||||
|
v := string(result.Bytes()) |
||||||
|
if u != v { |
||||||
|
t.Errorf("TestBufAPI: want %q got %q", u, v) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestConvertNewlines(t *testing.T) { |
||||||
|
testCases := map[string]string{ |
||||||
|
"Mac\rDOS\r\nUnix\n": "Mac\nDOS\nUnix\n", |
||||||
|
"Unix\nMac\rDOS\r\n": "Unix\nMac\nDOS\n", |
||||||
|
"DOS\r\nDOS\r\nDOS\r\n": "DOS\nDOS\nDOS\n", |
||||||
|
"": "", |
||||||
|
"\n": "\n", |
||||||
|
"\n\r": "\n\n", |
||||||
|
"\r": "\n", |
||||||
|
"\r\n": "\n", |
||||||
|
"\r\n\n": "\n\n", |
||||||
|
"\r\n\r": "\n\n", |
||||||
|
"\r\n\r\n": "\n\n", |
||||||
|
"\r\r": "\n\n", |
||||||
|
"\r\r\n": "\n\n", |
||||||
|
"\r\r\n\n": "\n\n\n", |
||||||
|
"\r\r\r\n": "\n\n\n", |
||||||
|
"\r \n": "\n \n", |
||||||
|
"xyz": "xyz", |
||||||
|
} |
||||||
|
for in, want := range testCases { |
||||||
|
if got := string(convertNewlines([]byte(in))); got != want { |
||||||
|
t.Errorf("input %q: got %q, want %q", in, got, want) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestReaderEdgeCases(t *testing.T) { |
||||||
|
const s = "<p>An io.Reader can return (0, nil) or (n, io.EOF).</p>" |
||||||
|
testCases := []io.Reader{ |
||||||
|
&zeroOneByteReader{s: s}, |
||||||
|
&eofStringsReader{s: s}, |
||||||
|
&stuckReader{}, |
||||||
|
} |
||||||
|
for i, tc := range testCases { |
||||||
|
got := []TokenType{} |
||||||
|
z := NewTokenizer(tc) |
||||||
|
for { |
||||||
|
tt := z.Next() |
||||||
|
if tt == ErrorToken { |
||||||
|
break |
||||||
|
} |
||||||
|
got = append(got, tt) |
||||||
|
} |
||||||
|
if err := z.Err(); err != nil && err != io.EOF { |
||||||
|
if err != io.ErrNoProgress { |
||||||
|
t.Errorf("i=%d: %v", i, err) |
||||||
|
} |
||||||
|
continue |
||||||
|
} |
||||||
|
want := []TokenType{ |
||||||
|
StartTagToken, |
||||||
|
TextToken, |
||||||
|
EndTagToken, |
||||||
|
} |
||||||
|
if !reflect.DeepEqual(got, want) { |
||||||
|
t.Errorf("i=%d: got %v, want %v", i, got, want) |
||||||
|
continue |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// zeroOneByteReader is like a strings.Reader that alternates between
|
||||||
|
// returning 0 bytes and 1 byte at a time.
|
||||||
|
type zeroOneByteReader struct { |
||||||
|
s string |
||||||
|
n int |
||||||
|
} |
||||||
|
|
||||||
|
func (r *zeroOneByteReader) Read(p []byte) (int, error) { |
||||||
|
if len(p) == 0 { |
||||||
|
return 0, nil |
||||||
|
} |
||||||
|
if len(r.s) == 0 { |
||||||
|
return 0, io.EOF |
||||||
|
} |
||||||
|
r.n++ |
||||||
|
if r.n%2 != 0 { |
||||||
|
return 0, nil |
||||||
|
} |
||||||
|
p[0], r.s = r.s[0], r.s[1:] |
||||||
|
return 1, nil |
||||||
|
} |
||||||
|
|
||||||
|
// eofStringsReader is like a strings.Reader but can return an (n, err) where
|
||||||
|
// n > 0 && err != nil.
|
||||||
|
type eofStringsReader struct { |
||||||
|
s string |
||||||
|
} |
||||||
|
|
||||||
|
func (r *eofStringsReader) Read(p []byte) (int, error) { |
||||||
|
n := copy(p, r.s) |
||||||
|
r.s = r.s[n:] |
||||||
|
if r.s != "" { |
||||||
|
return n, nil |
||||||
|
} |
||||||
|
return n, io.EOF |
||||||
|
} |
||||||
|
|
||||||
|
// stuckReader is an io.Reader that always returns no data and no error.
|
||||||
|
type stuckReader struct{} |
||||||
|
|
||||||
|
func (*stuckReader) Read(p []byte) (int, error) { |
||||||
|
return 0, nil |
||||||
|
} |
||||||
|
|
||||||
|
const ( |
||||||
|
rawLevel = iota |
||||||
|
lowLevel |
||||||
|
highLevel |
||||||
|
) |
||||||
|
|
||||||
|
func benchmarkTokenizer(b *testing.B, level int) { |
||||||
|
buf, err := ioutil.ReadFile("testdata/go1.html") |
||||||
|
if err != nil { |
||||||
|
b.Fatalf("could not read testdata/go1.html: %v", err) |
||||||
|
} |
||||||
|
b.SetBytes(int64(len(buf))) |
||||||
|
runtime.GC() |
||||||
|
b.ReportAllocs() |
||||||
|
b.ResetTimer() |
||||||
|
for i := 0; i < b.N; i++ { |
||||||
|
z := NewTokenizer(bytes.NewBuffer(buf)) |
||||||
|
for { |
||||||
|
tt := z.Next() |
||||||
|
if tt == ErrorToken { |
||||||
|
if err := z.Err(); err != nil && err != io.EOF { |
||||||
|
b.Fatalf("tokenizer error: %v", err) |
||||||
|
} |
||||||
|
break |
||||||
|
} |
||||||
|
switch level { |
||||||
|
case rawLevel: |
||||||
|
// Calling z.Raw just returns the raw bytes of the token. It does
|
||||||
|
// not unescape < to <, or lower-case tag names and attribute keys.
|
||||||
|
z.Raw() |
||||||
|
case lowLevel: |
||||||
|
// Caling z.Text, z.TagName and z.TagAttr returns []byte values
|
||||||
|
// whose contents may change on the next call to z.Next.
|
||||||
|
switch tt { |
||||||
|
case TextToken, CommentToken, DoctypeToken: |
||||||
|
z.Text() |
||||||
|
case StartTagToken, SelfClosingTagToken: |
||||||
|
_, more := z.TagName() |
||||||
|
for more { |
||||||
|
_, _, more = z.TagAttr() |
||||||
|
} |
||||||
|
case EndTagToken: |
||||||
|
z.TagName() |
||||||
|
} |
||||||
|
case highLevel: |
||||||
|
// Calling z.Token converts []byte values to strings whose validity
|
||||||
|
// extend beyond the next call to z.Next.
|
||||||
|
z.Token() |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func BenchmarkRawLevelTokenizer(b *testing.B) { benchmarkTokenizer(b, rawLevel) } |
||||||
|
func BenchmarkLowLevelTokenizer(b *testing.B) { benchmarkTokenizer(b, lowLevel) } |
||||||
|
func BenchmarkHighLevelTokenizer(b *testing.B) { benchmarkTokenizer(b, highLevel) } |
@ -0,0 +1,209 @@ |
|||||||
|
// Copyright 2013 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package charmap provides simple character encodings such as IBM Code Page 437
|
||||||
|
// and Windows 1252.
|
||||||
|
package charmap |
||||||
|
|
||||||
|
import ( |
||||||
|
"unicode/utf8" |
||||||
|
|
||||||
|
"golang.org/x/text/encoding" |
||||||
|
"golang.org/x/text/encoding/internal" |
||||||
|
"golang.org/x/text/encoding/internal/identifier" |
||||||
|
"golang.org/x/text/transform" |
||||||
|
) |
||||||
|
|
||||||
|
// These encodings vary only in the way clients should interpret them. Their
|
||||||
|
// coded character set is identical and a single implementation can be shared.
|
||||||
|
var ( |
||||||
|
// ISO8859_6E is the ISO 8859-6E encoding.
|
||||||
|
ISO8859_6E encoding.Encoding = &iso8859_6E |
||||||
|
|
||||||
|
// ISO8859_6I is the ISO 8859-6I encoding.
|
||||||
|
ISO8859_6I encoding.Encoding = &iso8859_6I |
||||||
|
|
||||||
|
// ISO8859_8E is the ISO 8859-8E encoding.
|
||||||
|
ISO8859_8E encoding.Encoding = &iso8859_8E |
||||||
|
|
||||||
|
// ISO8859_8I is the ISO 8859-8I encoding.
|
||||||
|
ISO8859_8I encoding.Encoding = &iso8859_8I |
||||||
|
|
||||||
|
iso8859_6E = internal.Encoding{ |
||||||
|
ISO8859_6, |
||||||
|
"ISO-8859-6E", |
||||||
|
identifier.ISO88596E, |
||||||
|
} |
||||||
|
|
||||||
|
iso8859_6I = internal.Encoding{ |
||||||
|
ISO8859_6, |
||||||
|
"ISO-8859-6I", |
||||||
|
identifier.ISO88596I, |
||||||
|
} |
||||||
|
|
||||||
|
iso8859_8E = internal.Encoding{ |
||||||
|
ISO8859_8, |
||||||
|
"ISO-8859-8E", |
||||||
|
identifier.ISO88598E, |
||||||
|
} |
||||||
|
|
||||||
|
iso8859_8I = internal.Encoding{ |
||||||
|
ISO8859_8, |
||||||
|
"ISO-8859-8I", |
||||||
|
identifier.ISO88598I, |
||||||
|
} |
||||||
|
) |
||||||
|
|
||||||
|
// All is a list of all defined encodings in this package.
|
||||||
|
var All = listAll |
||||||
|
|
||||||
|
// TODO: implement these encodings, in order of importance.
|
||||||
|
// ASCII, ISO8859_1: Rather common. Close to Windows 1252.
|
||||||
|
// ISO8859_9: Close to Windows 1254.
|
||||||
|
|
||||||
|
// utf8Enc holds a rune's UTF-8 encoding in data[:len].
|
||||||
|
type utf8Enc struct { |
||||||
|
len uint8 |
||||||
|
data [3]byte |
||||||
|
} |
||||||
|
|
||||||
|
// charmap describes an 8-bit character set encoding.
|
||||||
|
type charmap struct { |
||||||
|
// name is the encoding's name.
|
||||||
|
name string |
||||||
|
// mib is the encoding type of this encoder.
|
||||||
|
mib identifier.MIB |
||||||
|
// asciiSuperset states whether the encoding is a superset of ASCII.
|
||||||
|
asciiSuperset bool |
||||||
|
// low is the lower bound of the encoded byte for a non-ASCII rune. If
|
||||||
|
// charmap.asciiSuperset is true then this will be 0x80, otherwise 0x00.
|
||||||
|
low uint8 |
||||||
|
// replacement is the encoded replacement character.
|
||||||
|
replacement byte |
||||||
|
// decode is the map from encoded byte to UTF-8.
|
||||||
|
decode [256]utf8Enc |
||||||
|
// encoding is the map from runes to encoded bytes. Each entry is a
|
||||||
|
// uint32: the high 8 bits are the encoded byte and the low 24 bits are
|
||||||
|
// the rune. The table entries are sorted by ascending rune.
|
||||||
|
encode [256]uint32 |
||||||
|
} |
||||||
|
|
||||||
|
func (m *charmap) NewDecoder() transform.Transformer { |
||||||
|
return charmapDecoder{charmap: m} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *charmap) NewEncoder() transform.Transformer { |
||||||
|
return charmapEncoder{charmap: m} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *charmap) String() string { |
||||||
|
return m.name |
||||||
|
} |
||||||
|
|
||||||
|
func (m *charmap) ID() (mib identifier.MIB, other string) { |
||||||
|
return m.mib, "" |
||||||
|
} |
||||||
|
|
||||||
|
// charmapDecoder implements transform.Transformer by decoding to UTF-8.
|
||||||
|
type charmapDecoder struct { |
||||||
|
transform.NopResetter |
||||||
|
charmap *charmap |
||||||
|
} |
||||||
|
|
||||||
|
func (m charmapDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { |
||||||
|
for i, c := range src { |
||||||
|
if m.charmap.asciiSuperset && c < utf8.RuneSelf { |
||||||
|
if nDst >= len(dst) { |
||||||
|
err = transform.ErrShortDst |
||||||
|
break |
||||||
|
} |
||||||
|
dst[nDst] = c |
||||||
|
nDst++ |
||||||
|
nSrc = i + 1 |
||||||
|
continue |
||||||
|
} |
||||||
|
|
||||||
|
decode := &m.charmap.decode[c] |
||||||
|
n := int(decode.len) |
||||||
|
if nDst+n > len(dst) { |
||||||
|
err = transform.ErrShortDst |
||||||
|
break |
||||||
|
} |
||||||
|
// It's 15% faster to avoid calling copy for these tiny slices.
|
||||||
|
for j := 0; j < n; j++ { |
||||||
|
dst[nDst] = decode.data[j] |
||||||
|
nDst++ |
||||||
|
} |
||||||
|
nSrc = i + 1 |
||||||
|
} |
||||||
|
return nDst, nSrc, err |
||||||
|
} |
||||||
|
|
||||||
|
// charmapEncoder implements transform.Transformer by encoding from UTF-8.
|
||||||
|
type charmapEncoder struct { |
||||||
|
transform.NopResetter |
||||||
|
charmap *charmap |
||||||
|
} |
||||||
|
|
||||||
|
func (m charmapEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { |
||||||
|
r, size := rune(0), 0 |
||||||
|
for nSrc < len(src) { |
||||||
|
if nDst >= len(dst) { |
||||||
|
err = transform.ErrShortDst |
||||||
|
break |
||||||
|
} |
||||||
|
r = rune(src[nSrc]) |
||||||
|
|
||||||
|
// Decode a 1-byte rune.
|
||||||
|
if r < utf8.RuneSelf { |
||||||
|
nSrc++ |
||||||
|
if m.charmap.asciiSuperset { |
||||||
|
dst[nDst] = uint8(r) |
||||||
|
nDst++ |
||||||
|
continue |
||||||
|
} |
||||||
|
|
||||||
|
} else { |
||||||
|
// Decode a multi-byte rune.
|
||||||
|
r, size = utf8.DecodeRune(src[nSrc:]) |
||||||
|
if size == 1 { |
||||||
|
// All valid runes of size 1 (those below utf8.RuneSelf) were
|
||||||
|
// handled above. We have invalid UTF-8 or we haven't seen the
|
||||||
|
// full character yet.
|
||||||
|
if !atEOF && !utf8.FullRune(src[nSrc:]) { |
||||||
|
err = transform.ErrShortSrc |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
nSrc += size |
||||||
|
if r == utf8.RuneError { |
||||||
|
dst[nDst] = m.charmap.replacement |
||||||
|
nDst++ |
||||||
|
continue |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Binary search in [low, high) for that rune in the m.charmap.encode table.
|
||||||
|
for low, high := int(m.charmap.low), 0x100; ; { |
||||||
|
if low >= high { |
||||||
|
dst[nDst] = m.charmap.replacement |
||||||
|
nDst++ |
||||||
|
break |
||||||
|
} |
||||||
|
mid := (low + high) / 2 |
||||||
|
got := m.charmap.encode[mid] |
||||||
|
gotRune := rune(got & (1<<24 - 1)) |
||||||
|
if gotRune < r { |
||||||
|
low = mid + 1 |
||||||
|
} else if gotRune > r { |
||||||
|
high = mid |
||||||
|
} else { |
||||||
|
dst[nDst] = byte(got >> 24) |
||||||
|
nDst++ |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return nDst, nSrc, err |
||||||
|
} |
@ -0,0 +1,415 @@ |
|||||||
|
// Copyright 2013 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main |
||||||
|
|
||||||
|
// This program generates tables.go:
|
||||||
|
// go run maketables.go | gofmt > tables.go
|
||||||
|
|
||||||
|
import ( |
||||||
|
"bufio" |
||||||
|
"fmt" |
||||||
|
"log" |
||||||
|
"net/http" |
||||||
|
"sort" |
||||||
|
"strings" |
||||||
|
"unicode/utf8" |
||||||
|
|
||||||
|
"golang.org/x/text/encoding" |
||||||
|
) |
||||||
|
|
||||||
|
const ascii = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" + |
||||||
|
"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + |
||||||
|
` !"#$%&'()*+,-./0123456789:;<=>?` + |
||||||
|
`@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` + |
||||||
|
"`abcdefghijklmnopqrstuvwxyz{|}~\u007f" |
||||||
|
|
||||||
|
var encodings = []struct { |
||||||
|
name string |
||||||
|
mib string |
||||||
|
comment string |
||||||
|
varName string |
||||||
|
replacement byte |
||||||
|
mapping string |
||||||
|
}{ |
||||||
|
{ |
||||||
|
"IBM Code Page 437", |
||||||
|
"PC8CodePage437", |
||||||
|
"", |
||||||
|
"CodePage437", |
||||||
|
encoding.ASCIISub, |
||||||
|
ascii + |
||||||
|
"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒ" + |
||||||
|
"áíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐" + |
||||||
|
"└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀" + |
||||||
|
"αßΓπΣσµτΦΘΩδ∞∅∈∩≡±≥≤⌠⌡÷≈°•·√ⁿ²∎\u00a0", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"IBM Code Page 866", |
||||||
|
"IBM866", |
||||||
|
"", |
||||||
|
"CodePage866", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-ibm866.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"ISO 8859-2", |
||||||
|
"ISOLatin2", |
||||||
|
"", |
||||||
|
"ISO8859_2", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-iso-8859-2.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"ISO 8859-3", |
||||||
|
"ISOLatin3", |
||||||
|
"", |
||||||
|
"ISO8859_3", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-iso-8859-3.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"ISO 8859-4", |
||||||
|
"ISOLatin4", |
||||||
|
"", |
||||||
|
"ISO8859_4", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-iso-8859-4.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"ISO 8859-5", |
||||||
|
"ISOLatinCyrillic", |
||||||
|
"", |
||||||
|
"ISO8859_5", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-iso-8859-5.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"ISO 8859-6", |
||||||
|
"ISOLatinArabic", |
||||||
|
"", |
||||||
|
"ISO8859_6,ISO8859_6E,ISO8859_6I", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-iso-8859-6.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"ISO 8859-7", |
||||||
|
"ISOLatinGreek", |
||||||
|
"", |
||||||
|
"ISO8859_7", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-iso-8859-7.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"ISO 8859-8", |
||||||
|
"ISOLatinHebrew", |
||||||
|
"", |
||||||
|
"ISO8859_8,ISO8859_8E,ISO8859_8I", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-iso-8859-8.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"ISO 8859-10", |
||||||
|
"ISOLatin6", |
||||||
|
"", |
||||||
|
"ISO8859_10", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-iso-8859-10.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"ISO 8859-13", |
||||||
|
"ISO885913", |
||||||
|
"", |
||||||
|
"ISO8859_13", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-iso-8859-13.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"ISO 8859-14", |
||||||
|
"ISO885914", |
||||||
|
"", |
||||||
|
"ISO8859_14", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-iso-8859-14.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"ISO 8859-15", |
||||||
|
"ISO885915", |
||||||
|
"", |
||||||
|
"ISO8859_15", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-iso-8859-15.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"ISO 8859-16", |
||||||
|
"ISO885916", |
||||||
|
"", |
||||||
|
"ISO8859_16", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-iso-8859-16.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"KOI8-R", |
||||||
|
"KOI8R", |
||||||
|
"", |
||||||
|
"KOI8R", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-koi8-r.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"KOI8-U", |
||||||
|
"KOI8U", |
||||||
|
"", |
||||||
|
"KOI8U", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-koi8-u.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Macintosh", |
||||||
|
"Macintosh", |
||||||
|
"", |
||||||
|
"Macintosh", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-macintosh.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Macintosh Cyrillic", |
||||||
|
"MacintoshCyrillic", |
||||||
|
"", |
||||||
|
"MacintoshCyrillic", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-x-mac-cyrillic.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Windows 874", |
||||||
|
"Windows874", |
||||||
|
"", |
||||||
|
"Windows874", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-windows-874.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Windows 1250", |
||||||
|
"Windows1250", |
||||||
|
"", |
||||||
|
"Windows1250", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-windows-1250.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Windows 1251", |
||||||
|
"Windows1251", |
||||||
|
"", |
||||||
|
"Windows1251", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-windows-1251.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Windows 1252", |
||||||
|
"Windows1252", |
||||||
|
"", |
||||||
|
"Windows1252", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-windows-1252.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Windows 1253", |
||||||
|
"Windows1253", |
||||||
|
"", |
||||||
|
"Windows1253", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-windows-1253.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Windows 1254", |
||||||
|
"Windows1254", |
||||||
|
"", |
||||||
|
"Windows1254", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-windows-1254.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Windows 1255", |
||||||
|
"Windows1255", |
||||||
|
"", |
||||||
|
"Windows1255", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-windows-1255.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Windows 1256", |
||||||
|
"Windows1256", |
||||||
|
"", |
||||||
|
"Windows1256", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-windows-1256.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Windows 1257", |
||||||
|
"Windows1257", |
||||||
|
"", |
||||||
|
"Windows1257", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-windows-1257.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"Windows 1258", |
||||||
|
"Windows1258", |
||||||
|
"", |
||||||
|
"Windows1258", |
||||||
|
encoding.ASCIISub, |
||||||
|
"http://encoding.spec.whatwg.org/index-windows-1258.txt", |
||||||
|
}, |
||||||
|
{ |
||||||
|
"X-User-Defined", |
||||||
|
"XUserDefined", |
||||||
|
"It is defined at http://encoding.spec.whatwg.org/#x-user-defined", |
||||||
|
"XUserDefined", |
||||||
|
encoding.ASCIISub, |
||||||
|
ascii + |
||||||
|
"\uf780\uf781\uf782\uf783\uf784\uf785\uf786\uf787" + |
||||||
|
"\uf788\uf789\uf78a\uf78b\uf78c\uf78d\uf78e\uf78f" + |
||||||
|
"\uf790\uf791\uf792\uf793\uf794\uf795\uf796\uf797" + |
||||||
|
"\uf798\uf799\uf79a\uf79b\uf79c\uf79d\uf79e\uf79f" + |
||||||
|
"\uf7a0\uf7a1\uf7a2\uf7a3\uf7a4\uf7a5\uf7a6\uf7a7" + |
||||||
|
"\uf7a8\uf7a9\uf7aa\uf7ab\uf7ac\uf7ad\uf7ae\uf7af" + |
||||||
|
"\uf7b0\uf7b1\uf7b2\uf7b3\uf7b4\uf7b5\uf7b6\uf7b7" + |
||||||
|
"\uf7b8\uf7b9\uf7ba\uf7bb\uf7bc\uf7bd\uf7be\uf7bf" + |
||||||
|
"\uf7c0\uf7c1\uf7c2\uf7c3\uf7c4\uf7c5\uf7c6\uf7c7" + |
||||||
|
"\uf7c8\uf7c9\uf7ca\uf7cb\uf7cc\uf7cd\uf7ce\uf7cf" + |
||||||
|
"\uf7d0\uf7d1\uf7d2\uf7d3\uf7d4\uf7d5\uf7d6\uf7d7" + |
||||||
|
"\uf7d8\uf7d9\uf7da\uf7db\uf7dc\uf7dd\uf7de\uf7df" + |
||||||
|
"\uf7e0\uf7e1\uf7e2\uf7e3\uf7e4\uf7e5\uf7e6\uf7e7" + |
||||||
|
"\uf7e8\uf7e9\uf7ea\uf7eb\uf7ec\uf7ed\uf7ee\uf7ef" + |
||||||
|
"\uf7f0\uf7f1\uf7f2\uf7f3\uf7f4\uf7f5\uf7f6\uf7f7" + |
||||||
|
"\uf7f8\uf7f9\uf7fa\uf7fb\uf7fc\uf7fd\uf7fe\uf7ff", |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
func getWHATWG(url string) string { |
||||||
|
res, err := http.Get(url) |
||||||
|
if err != nil { |
||||||
|
log.Fatalf("%q: Get: %v", url, err) |
||||||
|
} |
||||||
|
defer res.Body.Close() |
||||||
|
|
||||||
|
mapping := make([]rune, 128) |
||||||
|
for i := range mapping { |
||||||
|
mapping[i] = '\ufffd' |
||||||
|
} |
||||||
|
|
||||||
|
scanner := bufio.NewScanner(res.Body) |
||||||
|
for scanner.Scan() { |
||||||
|
s := strings.TrimSpace(scanner.Text()) |
||||||
|
if s == "" || s[0] == '#' { |
||||||
|
continue |
||||||
|
} |
||||||
|
x, y := 0, 0 |
||||||
|
if _, err := fmt.Sscanf(s, "%d\t0x%x", &x, &y); err != nil { |
||||||
|
log.Fatalf("could not parse %q", s) |
||||||
|
} |
||||||
|
if x < 0 || 128 <= x { |
||||||
|
log.Fatalf("code %d is out of range", x) |
||||||
|
} |
||||||
|
if 0x80 <= y && y < 0xa0 { |
||||||
|
// We diverge from the WHATWG spec by mapping control characters
|
||||||
|
// in the range [0x80, 0xa0) to U+FFFD.
|
||||||
|
continue |
||||||
|
} |
||||||
|
mapping[x] = rune(y) |
||||||
|
} |
||||||
|
return ascii + string(mapping) |
||||||
|
} |
||||||
|
|
||||||
|
func main() { |
||||||
|
mibs := map[string]bool{} |
||||||
|
all := []string{} |
||||||
|
|
||||||
|
buf := make([]byte, 8) |
||||||
|
fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") |
||||||
|
fmt.Printf("package charmap\n\n") |
||||||
|
fmt.Printf("import (\n") |
||||||
|
fmt.Printf("\t\"golang.org/x/text/encoding\"\n") |
||||||
|
fmt.Printf("\t\"golang.org/x/text/encoding/internal/identifier\"\n") |
||||||
|
fmt.Printf(")\n\n") |
||||||
|
for _, e := range encodings { |
||||||
|
varNames := strings.Split(e.varName, ",") |
||||||
|
all = append(all, varNames...) |
||||||
|
varName := varNames[0] |
||||||
|
if strings.HasPrefix(e.mapping, "http://encoding.spec.whatwg.org/") { |
||||||
|
e.mapping = getWHATWG(e.mapping) |
||||||
|
} |
||||||
|
|
||||||
|
asciiSuperset, low := strings.HasPrefix(e.mapping, ascii), 0x00 |
||||||
|
if asciiSuperset { |
||||||
|
low = 0x80 |
||||||
|
} |
||||||
|
lvn := 1 |
||||||
|
if strings.HasPrefix(varName, "ISO") || strings.HasPrefix(varName, "KOI") { |
||||||
|
lvn = 3 |
||||||
|
} |
||||||
|
lowerVarName := strings.ToLower(varName[:lvn]) + varName[lvn:] |
||||||
|
fmt.Printf("// %s is the %s encoding.\n", varName, e.name) |
||||||
|
if e.comment != "" { |
||||||
|
fmt.Printf("//\n// %s\n", e.comment) |
||||||
|
} |
||||||
|
fmt.Printf("var %s encoding.Encoding = &%s\n\nvar %s = charmap{\nname: %q,\n", |
||||||
|
varName, lowerVarName, lowerVarName, e.name) |
||||||
|
if mibs[e.mib] { |
||||||
|
log.Fatalf("MIB type %q declared multiple times.", e.mib) |
||||||
|
} |
||||||
|
fmt.Printf("mib: identifier.%s,\n", e.mib) |
||||||
|
fmt.Printf("asciiSuperset: %t,\n", asciiSuperset) |
||||||
|
fmt.Printf("low: 0x%02x,\n", low) |
||||||
|
fmt.Printf("replacement: 0x%02x,\n", e.replacement) |
||||||
|
|
||||||
|
fmt.Printf("decode: [256]utf8Enc{\n") |
||||||
|
i, backMapping := 0, map[rune]byte{} |
||||||
|
for _, c := range e.mapping { |
||||||
|
if _, ok := backMapping[c]; !ok { |
||||||
|
backMapping[c] = byte(i) |
||||||
|
} |
||||||
|
for j := range buf { |
||||||
|
buf[j] = 0 |
||||||
|
} |
||||||
|
n := utf8.EncodeRune(buf, c) |
||||||
|
if n > 3 { |
||||||
|
panic(fmt.Sprintf("rune %q (%U) is too long", c, c)) |
||||||
|
} |
||||||
|
fmt.Printf("{%d,[3]byte{0x%02x,0x%02x,0x%02x}},", n, buf[0], buf[1], buf[2]) |
||||||
|
if i%2 == 1 { |
||||||
|
fmt.Printf("\n") |
||||||
|
} |
||||||
|
i++ |
||||||
|
} |
||||||
|
fmt.Printf("},\n") |
||||||
|
|
||||||
|
fmt.Printf("encode: [256]uint32{\n") |
||||||
|
encode := make([]uint32, 0, 256) |
||||||
|
for c, i := range backMapping { |
||||||
|
encode = append(encode, uint32(i)<<24|uint32(c)) |
||||||
|
} |
||||||
|
sort.Sort(byRune(encode)) |
||||||
|
for len(encode) < cap(encode) { |
||||||
|
encode = append(encode, encode[len(encode)-1]) |
||||||
|
} |
||||||
|
for i, enc := range encode { |
||||||
|
fmt.Printf("0x%08x,", enc) |
||||||
|
if i%8 == 7 { |
||||||
|
fmt.Printf("\n") |
||||||
|
} |
||||||
|
} |
||||||
|
fmt.Printf("},\n}\n") |
||||||
|
} |
||||||
|
// TODO: add proper line breaking.
|
||||||
|
fmt.Printf("var listAll = []encoding.Encoding{\n%s,\n}\n\n", strings.Join(all, ",\n")) |
||||||
|
} |
||||||
|
|
||||||
|
type byRune []uint32 |
||||||
|
|
||||||
|
func (b byRune) Len() int { return len(b) } |
||||||
|
func (b byRune) Less(i, j int) bool { return b[i]&0xffffff < b[j]&0xffffff } |
||||||
|
func (b byRune) Swap(i, j int) { b[i], b[j] = b[j], b[i] } |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,179 @@ |
|||||||
|
// Copyright 2013 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package encoding defines an interface for character encodings, such as Shift
|
||||||
|
// JIS and Windows 1252, that can convert to and from UTF-8.
|
||||||
|
//
|
||||||
|
// To convert the bytes of an io.Reader r from the encoding e to UTF-8:
|
||||||
|
// rInUTF8 := transform.NewReader(r, e.NewDecoder())
|
||||||
|
// and to convert from UTF-8 to the encoding e:
|
||||||
|
// wInUTF8 := transform.NewWriter(w, e.NewEncoder())
|
||||||
|
// In both cases, import "golang.org/x/text/transform".
|
||||||
|
//
|
||||||
|
// Encoding implementations are provided in other packages, such as
|
||||||
|
// golang.org/x/text/encoding/charmap and
|
||||||
|
// golang.org/x/text/encoding/japanese.
|
||||||
|
package encoding |
||||||
|
|
||||||
|
import ( |
||||||
|
"errors" |
||||||
|
"unicode/utf8" |
||||||
|
|
||||||
|
"golang.org/x/text/transform" |
||||||
|
) |
||||||
|
|
||||||
|
// Encoding is a character set encoding that can be transformed to and from
|
||||||
|
// UTF-8.
|
||||||
|
type Encoding interface { |
||||||
|
// NewDecoder returns a transformer that converts to UTF-8.
|
||||||
|
//
|
||||||
|
// Transforming source bytes that are not of that encoding will not
|
||||||
|
// result in an error per se. Each byte that cannot be transcoded will
|
||||||
|
// be represented in the output by the UTF-8 encoding of '\uFFFD', the
|
||||||
|
// replacement rune.
|
||||||
|
NewDecoder() transform.Transformer |
||||||
|
|
||||||
|
// NewEncoder returns a transformer that converts from UTF-8.
|
||||||
|
//
|
||||||
|
// Transforming source bytes that are not valid UTF-8 will not result in
|
||||||
|
// an error per se. Each rune that cannot be transcoded will be
|
||||||
|
// represented in the output by an encoding-specific replacement such as
|
||||||
|
// "\x1a" (the ASCII substitute character) or "\xff\xfd". To return
|
||||||
|
// early with error instead, use transform.Chain to preprocess the data
|
||||||
|
// with a UTF8Validator.
|
||||||
|
NewEncoder() transform.Transformer |
||||||
|
} |
||||||
|
|
||||||
|
// ASCIISub is the ASCII substitute character, as recommended by
|
||||||
|
// http://unicode.org/reports/tr36/#Text_Comparison
|
||||||
|
const ASCIISub = '\x1a' |
||||||
|
|
||||||
|
// Nop is the nop encoding. Its transformed bytes are the same as the source
|
||||||
|
// bytes; it does not replace invalid UTF-8 sequences.
|
||||||
|
var Nop Encoding = nop{} |
||||||
|
|
||||||
|
type nop struct{} |
||||||
|
|
||||||
|
func (nop) NewDecoder() transform.Transformer { |
||||||
|
return transform.Nop |
||||||
|
} |
||||||
|
|
||||||
|
func (nop) NewEncoder() transform.Transformer { |
||||||
|
return transform.Nop |
||||||
|
} |
||||||
|
|
||||||
|
// Replacement is the replacement encoding. Decoding from the replacement
|
||||||
|
// encoding yields a single '\uFFFD' replacement rune. Encoding from UTF-8 to
|
||||||
|
// the replacement encoding yields the same as the source bytes except that
|
||||||
|
// invalid UTF-8 is converted to '\uFFFD'.
|
||||||
|
//
|
||||||
|
// It is defined at http://encoding.spec.whatwg.org/#replacement
|
||||||
|
var Replacement Encoding = replacement{} |
||||||
|
|
||||||
|
type replacement struct{} |
||||||
|
|
||||||
|
func (replacement) NewDecoder() transform.Transformer { |
||||||
|
return replacementDecoder{} |
||||||
|
} |
||||||
|
|
||||||
|
func (replacement) NewEncoder() transform.Transformer { |
||||||
|
return replacementEncoder{} |
||||||
|
} |
||||||
|
|
||||||
|
type replacementDecoder struct{ transform.NopResetter } |
||||||
|
|
||||||
|
func (replacementDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { |
||||||
|
if len(dst) < 3 { |
||||||
|
return 0, 0, transform.ErrShortDst |
||||||
|
} |
||||||
|
if atEOF { |
||||||
|
const fffd = "\ufffd" |
||||||
|
dst[0] = fffd[0] |
||||||
|
dst[1] = fffd[1] |
||||||
|
dst[2] = fffd[2] |
||||||
|
nDst = 3 |
||||||
|
} |
||||||
|
return nDst, len(src), nil |
||||||
|
} |
||||||
|
|
||||||
|
type replacementEncoder struct{ transform.NopResetter } |
||||||
|
|
||||||
|
func (replacementEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { |
||||||
|
r, size := rune(0), 0 |
||||||
|
|
||||||
|
for ; nSrc < len(src); nSrc += size { |
||||||
|
r = rune(src[nSrc]) |
||||||
|
|
||||||
|
// Decode a 1-byte rune.
|
||||||
|
if r < utf8.RuneSelf { |
||||||
|
size = 1 |
||||||
|
|
||||||
|
} else { |
||||||
|
// Decode a multi-byte rune.
|
||||||
|
r, size = utf8.DecodeRune(src[nSrc:]) |
||||||
|
if size == 1 { |
||||||
|
// All valid runes of size 1 (those below utf8.RuneSelf) were
|
||||||
|
// handled above. We have invalid UTF-8 or we haven't seen the
|
||||||
|
// full character yet.
|
||||||
|
if !atEOF && !utf8.FullRune(src[nSrc:]) { |
||||||
|
err = transform.ErrShortSrc |
||||||
|
break |
||||||
|
} |
||||||
|
r = '\ufffd' |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if nDst+utf8.RuneLen(r) > len(dst) { |
||||||
|
err = transform.ErrShortDst |
||||||
|
break |
||||||
|
} |
||||||
|
nDst += utf8.EncodeRune(dst[nDst:], r) |
||||||
|
} |
||||||
|
return nDst, nSrc, err |
||||||
|
} |
||||||
|
|
||||||
|
// ErrInvalidUTF8 means that a transformer encountered invalid UTF-8.
|
||||||
|
var ErrInvalidUTF8 = errors.New("encoding: invalid UTF-8") |
||||||
|
|
||||||
|
// UTF8Validator is a transformer that returns ErrInvalidUTF8 on the first
|
||||||
|
// input byte that is not valid UTF-8.
|
||||||
|
var UTF8Validator transform.Transformer = utf8Validator{} |
||||||
|
|
||||||
|
type utf8Validator struct{ transform.NopResetter } |
||||||
|
|
||||||
|
func (utf8Validator) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { |
||||||
|
n := len(src) |
||||||
|
if n > len(dst) { |
||||||
|
n = len(dst) |
||||||
|
} |
||||||
|
for i := 0; i < n; { |
||||||
|
if c := src[i]; c < utf8.RuneSelf { |
||||||
|
dst[i] = c |
||||||
|
i++ |
||||||
|
continue |
||||||
|
} |
||||||
|
_, size := utf8.DecodeRune(src[i:]) |
||||||
|
if size == 1 { |
||||||
|
// All valid runes of size 1 (those below utf8.RuneSelf) were
|
||||||
|
// handled above. We have invalid UTF-8 or we haven't seen the
|
||||||
|
// full character yet.
|
||||||
|
err = ErrInvalidUTF8 |
||||||
|
if !atEOF && !utf8.FullRune(src[i:]) { |
||||||
|
err = transform.ErrShortSrc |
||||||
|
} |
||||||
|
return i, i, err |
||||||
|
} |
||||||
|
if i+size > len(dst) { |
||||||
|
return i, i, transform.ErrShortDst |
||||||
|
} |
||||||
|
for ; size > 0; size-- { |
||||||
|
dst[i] = src[i] |
||||||
|
i++ |
||||||
|
} |
||||||
|
} |
||||||
|
if len(src) > len(dst) { |
||||||
|
err = transform.ErrShortDst |
||||||
|
} |
||||||
|
return n, n, err |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,40 @@ |
|||||||
|
// Copyright 2013 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package encoding_test |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"io" |
||||||
|
"os" |
||||||
|
"strings" |
||||||
|
|
||||||
|
"golang.org/x/text/encoding" |
||||||
|
"golang.org/x/text/encoding/charmap" |
||||||
|
"golang.org/x/text/transform" |
||||||
|
) |
||||||
|
|
||||||
|
func ExampleDecodeWindows1252() { |
||||||
|
sr := strings.NewReader("Gar\xe7on !") |
||||||
|
tr := transform.NewReader(sr, charmap.Windows1252.NewDecoder()) |
||||||
|
io.Copy(os.Stdout, tr) |
||||||
|
// Output: Garçon !
|
||||||
|
} |
||||||
|
|
||||||
|
func ExampleUTF8Validator() { |
||||||
|
for i := 0; i < 2; i++ { |
||||||
|
transformer := charmap.Windows1252.NewEncoder() |
||||||
|
if i == 1 { |
||||||
|
transformer = transform.Chain(encoding.UTF8Validator, transformer) |
||||||
|
} |
||||||
|
dst := make([]byte, 256) |
||||||
|
src := []byte("abc\xffxyz") // src is invalid UTF-8.
|
||||||
|
nDst, nSrc, err := transformer.Transform(dst, src, true) |
||||||
|
fmt.Printf("i=%d: produced %q, consumed %q, error %v\n", |
||||||
|
i, dst[:nDst], src[:nSrc], err) |
||||||
|
} |
||||||
|
// Output:
|
||||||
|
// i=0: produced "abc\x1axyz", consumed "abc\xffxyz", error <nil>
|
||||||
|
// i=1: produced "abc", consumed "abc", error encoding: invalid UTF-8
|
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package htmlindex maps character set encoding names to Encodings as
|
||||||
|
// recommended by the W3C for use in HTML 5. See http://www.w3.org/TR/encoding.
|
||||||
|
package htmlindex |
||||||
|
|
||||||
|
// TODO: perhaps have a "bare" version of the index (used by this package) that
|
||||||
|
// is not pre-loaded with all encodings. Global variables in encodings prevent
|
||||||
|
// the linker from being able to purge unneeded tables. This means that
|
||||||
|
// referencing all encodings, as this package does for the default index, links
|
||||||
|
// in all encodings unconditionally.
|
||||||
|
//
|
||||||
|
// This issue can be solved by either solving the linking issue (see
|
||||||
|
// https://github.com/golang/go/issues/6330) or refactoring the encoding tables
|
||||||
|
// (e.g. moving the tables to internal packages that do not use global
|
||||||
|
// variables).
|
||||||
|
|
||||||
|
// TODO: allow canonicalizing names
|
||||||
|
|
||||||
|
import ( |
||||||
|
"golang.org/x/text/encoding" |
||||||
|
"golang.org/x/text/language" |
||||||
|
) |
||||||
|
|
||||||
|
// LanguageDefault returns the canonical name of the default encoding for a
|
||||||
|
// given language.
|
||||||
|
func LanguageDefault(tag language.Tag) string { |
||||||
|
// Note: we'll use the map defined in the W3C spec.
|
||||||
|
panic("TODO: implement") |
||||||
|
} |
||||||
|
|
||||||
|
// Get returns an Encoding for one of the names listed in
|
||||||
|
// http://www.w3.org/TR/encoding using the Default Index. Matching is case-
|
||||||
|
// insensitive.
|
||||||
|
func Get(name string) (encoding.Encoding, error) { |
||||||
|
panic("TODO: implement") |
||||||
|
} |
||||||
|
|
||||||
|
// Name reports the canonical name of the given Encoding. It will return
|
||||||
|
// an error if e is not associated with a supported encoding scheme.
|
||||||
|
func Name(e encoding.Encoding) (string, error) { |
||||||
|
panic("TODO: implement") |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package ianaindex_test |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
|
||||||
|
"golang.org/x/text/encoding/charmap" |
||||||
|
"golang.org/x/text/encoding/ianaindex" |
||||||
|
) |
||||||
|
|
||||||
|
func ExampleIndex() { |
||||||
|
fmt.Println(ianaindex.MIME.Name(charmap.ISO8859_7)) |
||||||
|
|
||||||
|
fmt.Println(ianaindex.IANA.Name(charmap.ISO8859_7)) |
||||||
|
|
||||||
|
e, _ := ianaindex.IANA.Get("cp437") |
||||||
|
fmt.Println(ianaindex.IANA.Name(e)) |
||||||
|
|
||||||
|
// TODO: Output:
|
||||||
|
// ISO-8859-7
|
||||||
|
// ISO8859_7:1987
|
||||||
|
// IBM437
|
||||||
|
} |
@ -0,0 +1,64 @@ |
|||||||
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package ianaindex maps names to Encodings as specified by the IANA registry.
|
||||||
|
// This includes both the MIME and IANA names.
|
||||||
|
//
|
||||||
|
// See http://www.iana.org/assignments/character-sets/character-sets.xhtml for
|
||||||
|
// more details.
|
||||||
|
package ianaindex |
||||||
|
|
||||||
|
import ( |
||||||
|
"golang.org/x/text/encoding" |
||||||
|
) |
||||||
|
|
||||||
|
// TODO: allow users to specify their own aliases?
|
||||||
|
// TODO: allow users to specify their own indexes?
|
||||||
|
// TODO: allow canonicalizing names
|
||||||
|
|
||||||
|
// NOTE: only use these top-level variables if we can get the linker to drop
|
||||||
|
// the indexes when they are not used. Make them a function or perhaps only
|
||||||
|
// support MIME otherwise.
|
||||||
|
|
||||||
|
var ( |
||||||
|
// MIME is an index to map MIME names. It does not support aliases.
|
||||||
|
MIME *Index |
||||||
|
|
||||||
|
// IANA is an index that supports all names and aliases using IANA names as
|
||||||
|
// the canonical identifier.
|
||||||
|
IANA *Index |
||||||
|
) |
||||||
|
|
||||||
|
// Index maps names registered by IANA to Encodings.
|
||||||
|
type Index struct { |
||||||
|
} |
||||||
|
|
||||||
|
// Get returns an Encoding for IANA-registered names. Matching is
|
||||||
|
// case-insensitive.
|
||||||
|
func (x *Index) Get(name string) (encoding.Encoding, error) { |
||||||
|
panic("TODO: implement") |
||||||
|
} |
||||||
|
|
||||||
|
// Name reports the canonical name of the given Encoding. It will return an
|
||||||
|
// error if the e is not associated with a known encoding scheme.
|
||||||
|
func (x *Index) Name(e encoding.Encoding) (string, error) { |
||||||
|
panic("TODO: implement") |
||||||
|
} |
||||||
|
|
||||||
|
// TODO: the coverage of this index is rather spotty. Allowing users to set
|
||||||
|
// encodings would allow:
|
||||||
|
// - users to increase coverage
|
||||||
|
// - allow a partially loaded set of encodings in case the user doesn't need to
|
||||||
|
// them all.
|
||||||
|
// - write an OS-specific wrapper for supported encodings and set them.
|
||||||
|
// The exact definition of Set depends a bit on if and how we want to let users
|
||||||
|
// write their own Encoding implementations. Also, it is not possible yet to
|
||||||
|
// only partially load the encodings without doing some refactoring. Until this
|
||||||
|
// is solved, we might as well not support Set.
|
||||||
|
// // Set sets the e to be used for the encoding scheme identified by name. Only
|
||||||
|
// // canonical names may be used. An empty name assigns e to its internally
|
||||||
|
// // associated encoding scheme.
|
||||||
|
// func (x *Index) Set(name string, e encoding.Encoding) error {
|
||||||
|
// panic("TODO: implement")
|
||||||
|
// }
|
@ -0,0 +1,137 @@ |
|||||||
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"bytes" |
||||||
|
"encoding/xml" |
||||||
|
"fmt" |
||||||
|
"io" |
||||||
|
"log" |
||||||
|
"strings" |
||||||
|
|
||||||
|
"golang.org/x/text/internal/gen" |
||||||
|
) |
||||||
|
|
||||||
|
type registry struct { |
||||||
|
XMLName xml.Name `xml:"registry"` |
||||||
|
Updated string `xml:"updated"` |
||||||
|
Registry []struct { |
||||||
|
ID string `xml:"id,attr"` |
||||||
|
Record []struct { |
||||||
|
Name string `xml:"name"` |
||||||
|
Xref []struct { |
||||||
|
Type string `xml:"type,attr"` |
||||||
|
Data string `xml:"data,attr"` |
||||||
|
} `xml:"xref"` |
||||||
|
Desc struct { |
||||||
|
Data string `xml:",innerxml"` |
||||||
|
// Any []struct {
|
||||||
|
// Data string `xml:",chardata"`
|
||||||
|
// } `xml:",any"`
|
||||||
|
// Data string `xml:",chardata"`
|
||||||
|
} `xml:"description,"` |
||||||
|
MIB string `xml:"value"` |
||||||
|
Alias []string `xml:"alias"` |
||||||
|
MIME string `xml:"preferred_alias"` |
||||||
|
} `xml:"record"` |
||||||
|
} `xml:"registry"` |
||||||
|
} |
||||||
|
|
||||||
|
func main() { |
||||||
|
r := gen.OpenIANAFile("assignments/character-sets/character-sets.xml") |
||||||
|
reg := ®istry{} |
||||||
|
if err := xml.NewDecoder(r).Decode(®); err != nil && err != io.EOF { |
||||||
|
log.Fatalf("Error decoding charset registry: %v", err) |
||||||
|
} |
||||||
|
if len(reg.Registry) == 0 || reg.Registry[0].ID != "character-sets-1" { |
||||||
|
log.Fatalf("Unexpected ID %s", reg.Registry[0].ID) |
||||||
|
} |
||||||
|
|
||||||
|
w := &bytes.Buffer{} |
||||||
|
fmt.Fprintf(w, "const (\n") |
||||||
|
for _, rec := range reg.Registry[0].Record { |
||||||
|
constName := "" |
||||||
|
for _, a := range rec.Alias { |
||||||
|
if strings.HasPrefix(a, "cs") && strings.IndexByte(a, '-') == -1 { |
||||||
|
// Some of the constant definitions have comments in them. Strip those.
|
||||||
|
constName = strings.Title(strings.SplitN(a[2:], "\n", 2)[0]) |
||||||
|
} |
||||||
|
} |
||||||
|
if constName == "" { |
||||||
|
switch rec.MIB { |
||||||
|
case "2085": |
||||||
|
constName = "HZGB2312" // Not listed as alias for some reason.
|
||||||
|
default: |
||||||
|
log.Fatalf("No cs alias defined for %s.", rec.MIB) |
||||||
|
} |
||||||
|
} |
||||||
|
if rec.MIME != "" { |
||||||
|
rec.MIME = fmt.Sprintf(" (MIME: %s)", rec.MIME) |
||||||
|
} |
||||||
|
fmt.Fprintf(w, "// %s is the MIB identifier with IANA name %s%s.\n//\n", constName, rec.Name, rec.MIME) |
||||||
|
if len(rec.Desc.Data) > 0 { |
||||||
|
fmt.Fprint(w, "// ") |
||||||
|
d := xml.NewDecoder(strings.NewReader(rec.Desc.Data)) |
||||||
|
inElem := true |
||||||
|
attr := "" |
||||||
|
for { |
||||||
|
t, err := d.Token() |
||||||
|
if err != nil { |
||||||
|
if err != io.EOF { |
||||||
|
log.Fatal(err) |
||||||
|
} |
||||||
|
break |
||||||
|
} |
||||||
|
switch x := t.(type) { |
||||||
|
case xml.CharData: |
||||||
|
attr = "" // Don't need attribute info.
|
||||||
|
a := bytes.Split([]byte(x), []byte("\n")) |
||||||
|
for i, b := range a { |
||||||
|
if b = bytes.TrimSpace(b); len(b) != 0 { |
||||||
|
if !inElem && i > 0 { |
||||||
|
fmt.Fprint(w, "\n// ") |
||||||
|
} |
||||||
|
inElem = false |
||||||
|
fmt.Fprintf(w, "%s ", string(b)) |
||||||
|
} |
||||||
|
} |
||||||
|
case xml.StartElement: |
||||||
|
if x.Name.Local == "xref" { |
||||||
|
inElem = true |
||||||
|
use := false |
||||||
|
for _, a := range x.Attr { |
||||||
|
if a.Name.Local == "type" { |
||||||
|
use = use || a.Value != "person" |
||||||
|
} |
||||||
|
if a.Name.Local == "data" && use { |
||||||
|
attr = a.Value + " " |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case xml.EndElement: |
||||||
|
inElem = false |
||||||
|
fmt.Fprint(w, attr) |
||||||
|
} |
||||||
|
} |
||||||
|
fmt.Fprint(w, "\n") |
||||||
|
} |
||||||
|
for _, x := range rec.Xref { |
||||||
|
switch x.Type { |
||||||
|
case "rfc": |
||||||
|
fmt.Fprintf(w, "// Reference: %s\n", strings.ToUpper(x.Data)) |
||||||
|
case "uri": |
||||||
|
fmt.Fprintf(w, "// Reference: %s\n", x.Data) |
||||||
|
} |
||||||
|
} |
||||||
|
fmt.Fprintf(w, "%s MIB = %s\n", constName, rec.MIB) |
||||||
|
fmt.Fprintln(w) |
||||||
|
} |
||||||
|
fmt.Fprintln(w, ")") |
||||||
|
|
||||||
|
gen.WriteGoFile("mib.go", "identifier", w.Bytes()) |
||||||
|
} |
80
Godeps/_workspace/src/golang.org/x/text/encoding/internal/identifier/identifier.go
generated
vendored
80
Godeps/_workspace/src/golang.org/x/text/encoding/internal/identifier/identifier.go
generated
vendored
@ -0,0 +1,80 @@ |
|||||||
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:generate go run gen.go
|
||||||
|
|
||||||
|
// Package identifier defines the contract between implementations of Encoding
|
||||||
|
// and Index by defining identifiers that uniquely identify standardized coded
|
||||||
|
// character sets (CCS) and character encoding schemes (CES), which we will
|
||||||
|
// together refer to as encodings, for which Encoding implementations provide
|
||||||
|
// converters to and from UTF-8. This package is typically only of concern to
|
||||||
|
// implementers of Indexes and Encodings.
|
||||||
|
//
|
||||||
|
// One part of the identifier is the MIB code, which is defined by IANA and
|
||||||
|
// uniquely identifies a CCS or CES. Each code is associated with data that
|
||||||
|
// references authorities, official documentation as well as aliases and MIME
|
||||||
|
// names.
|
||||||
|
//
|
||||||
|
// Not all CESs are covered by the IANA registry. The "other" string that is
|
||||||
|
// returned by ID can be used to identify other character sets or versions of
|
||||||
|
// existing ones.
|
||||||
|
//
|
||||||
|
// It is recommended that each package that provides a set of Encodings provide
|
||||||
|
// the All and Common variables to reference all supported encodings and
|
||||||
|
// commonly used subset. This allows Index implementations to include all
|
||||||
|
// available encodings without explicitly referencing or knowing about them.
|
||||||
|
package identifier |
||||||
|
|
||||||
|
// Note: this package is internal, but could be made public if there is a need
|
||||||
|
// for writing third-party Indexes and Encodings.
|
||||||
|
|
||||||
|
// References:
|
||||||
|
// - http://source.icu-project.org/repos/icu/icu/trunk/source/data/mappings/convrtrs.txt
|
||||||
|
// - http://www.iana.org/assignments/character-sets/character-sets.xhtml
|
||||||
|
// - http://www.iana.org/assignments/ianacharset-mib/ianacharset-mib
|
||||||
|
// - http://www.ietf.org/rfc/rfc2978.txt
|
||||||
|
// - http://www.unicode.org/reports/tr22/
|
||||||
|
// - http://www.w3.org/TR/encoding/
|
||||||
|
// - http://www.w3.org/TR/encoding/indexes/encodings.json
|
||||||
|
// - https://encoding.spec.whatwg.org/
|
||||||
|
// - https://tools.ietf.org/html/rfc6657#section-5
|
||||||
|
|
||||||
|
// Interface can be implemented by Encodings to define the CCS or CES for which
|
||||||
|
// it implements conversions.
|
||||||
|
type Interface interface { |
||||||
|
// ID returns an encoding identifier. Exactly one of the mib and other
|
||||||
|
// values should be non-zero.
|
||||||
|
//
|
||||||
|
// In the usual case it is only necessary to indicate the MIB code. The
|
||||||
|
// other string can be used to specify encodings for which there is no MIB,
|
||||||
|
// such as "x-mac-dingbat".
|
||||||
|
//
|
||||||
|
// The other string may only contain the characters a-z, A-Z, 0-9, - and _.
|
||||||
|
ID() (mib MIB, other string) |
||||||
|
|
||||||
|
// NOTE: the restrictions on the encoding are to allow extending the syntax
|
||||||
|
// with additional information such as versions, vendors and other variants.
|
||||||
|
} |
||||||
|
|
||||||
|
// A MIB identifies an encoding. It is derived from the IANA MIB codes and adds
|
||||||
|
// some identifiers for some encodings that are not covered by the IANA
|
||||||
|
// standard.
|
||||||
|
//
|
||||||
|
// See http://www.iana.org/assignments/ianacharset-mib.
|
||||||
|
type MIB uint16 |
||||||
|
|
||||||
|
// These additional MIB types are not defined in IANA. They are added because
|
||||||
|
// they are common and defined within the text repo.
|
||||||
|
const ( |
||||||
|
// Unofficial marks the start of encodings not registered by IANA.
|
||||||
|
Unofficial MIB = 10000 + iota |
||||||
|
|
||||||
|
// TODO: add Replacement?
|
||||||
|
|
||||||
|
// XUserDefined is the code for x-user-defined.
|
||||||
|
XUserDefined |
||||||
|
|
||||||
|
// MacintoshCyrillic is the code for x-mac-cyrillic.
|
||||||
|
MacintoshCyrillic |
||||||
|
) |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue