mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Added all required dependencies
This commit is contained in:
		
							
								
								
									
										78
									
								
								vendor/golang.org/x/net/html/atom/atom.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								vendor/golang.org/x/net/html/atom/atom.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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 // import "golang.org/x/net/html/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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										648
									
								
								vendor/golang.org/x/net/html/atom/gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										648
									
								
								vendor/golang.org/x/net/html/atom/gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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",
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										713
									
								
								vendor/golang.org/x/net/html/atom/table.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										713
									
								
								vendor/golang.org/x/net/html/atom/table.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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"
 | 
			
		||||
							
								
								
									
										257
									
								
								vendor/golang.org/x/net/html/charset/charset.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										257
									
								
								vendor/golang.org/x/net/html/charset/charset.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,257 @@
 | 
			
		||||
// 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 "golang.org/x/net/html/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/encoding/htmlindex"
 | 
			
		||||
	"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. Encoders will use HTML escape sequences for
 | 
			
		||||
// runes that are not supported by the character set.
 | 
			
		||||
func Lookup(label string) (e encoding.Encoding, name string) {
 | 
			
		||||
	e, err := htmlindex.Get(label)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, ""
 | 
			
		||||
	}
 | 
			
		||||
	name, _ = htmlindex.Name(e)
 | 
			
		||||
	return &htmlEncoding{e}, name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type htmlEncoding struct{ encoding.Encoding }
 | 
			
		||||
 | 
			
		||||
func (h *htmlEncoding) NewEncoder() *encoding.Encoder {
 | 
			
		||||
	// HTML requires a non-terminating legacy encoder. We use HTML escapes to
 | 
			
		||||
	// substitute unsupported code points.
 | 
			
		||||
	return encoding.HTMLEscapeUnsupported(h.Encoding.NewEncoder())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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"},
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										102
									
								
								vendor/golang.org/x/net/html/const.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								vendor/golang.org/x/net/html/const.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										106
									
								
								vendor/golang.org/x/net/html/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								vendor/golang.org/x/net/html/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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 // import "golang.org/x/net/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?
 | 
			
		||||
							
								
								
									
										156
									
								
								vendor/golang.org/x/net/html/doctype.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								vendor/golang.org/x/net/html/doctype.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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//",
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2253
									
								
								vendor/golang.org/x/net/html/entity.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2253
									
								
								vendor/golang.org/x/net/html/entity.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										258
									
								
								vendor/golang.org/x/net/html/escape.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										258
									
								
								vendor/golang.org/x/net/html/escape.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										226
									
								
								vendor/golang.org/x/net/html/foreign.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								vendor/golang.org/x/net/html/foreign.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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",
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										193
									
								
								vendor/golang.org/x/net/html/node.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								vendor/golang.org/x/net/html/node.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2094
									
								
								vendor/golang.org/x/net/html/parse.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2094
									
								
								vendor/golang.org/x/net/html/parse.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										271
									
								
								vendor/golang.org/x/net/html/render.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										271
									
								
								vendor/golang.org/x/net/html/render.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
	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,
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1219
									
								
								vendor/golang.org/x/net/html/token.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1219
									
								
								vendor/golang.org/x/net/html/token.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user