// Copyright 2009 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 xml implements a simple XML 1.0 parser that
// understands XML name spaces.
package xml

// References:
//    Annotated XML spec: http://www.xml.com/axml/testaxml.htm
//    XML name spaces: http://www.w3.org/TR/REC-xml-names/

// TODO(rsc):
//	Test error handling.

import (
	"bufio"
	"bytes"
	"io"
	"os"
	"strconv"
	"strings"
	"unicode"
	"utf8"
)

// A SyntaxError represents a syntax error in the XML input stream.
type SyntaxError struct {
	Msg  string
	Line int
}

func (e *SyntaxError) String() string {
	return "XML syntax error on line " + strconv.Itoa(e.Line) + ": " + e.Msg
}

// A Name represents an XML name (Local) annotated
// with a name space identifier (Space).
// In tokens returned by Parser.Token, the Space identifier
// is given as a canonical URL, not the short prefix used
// in the document being parsed.
type Name struct {
	Space, Local string
}

// An Attr represents an attribute in an XML element (Name=Value).
type Attr struct {
	Name  Name
	Value string
}

// A Token is an interface holding one of the token types:
// StartElement, EndElement, CharData, Comment, ProcInst, or Directive.
type Token interface{}

// A StartElement represents an XML start element.
type StartElement struct {
	Name Name
	Attr []Attr
}

func (e StartElement) Copy() StartElement {
	attrs := make([]Attr, len(e.Attr))
	copy(e.Attr, attrs)
	e.Attr = attrs
	return e
}

// An EndElement represents an XML end element.
type EndElement struct {
	Name Name
}

// A CharData represents XML character data (raw text),
// in which XML escape sequences have been replaced by
// the characters they represent.
type CharData []byte

func makeCopy(b []byte) []byte {
	b1 := make([]byte, len(b))
	copy(b1, b)
	return b1
}

func (c CharData) Copy() CharData { return CharData(makeCopy(c)) }

// A Comment represents an XML comment of the form <!--comment-->.
// The bytes do not include the <!-- and --> comment markers.
type Comment []byte

func (c Comment) Copy() Comment { return Comment(makeCopy(c)) }

// A ProcInst represents an XML processing instruction of the form <?target inst?>
type ProcInst struct {
	Target string
	Inst   []byte
}

func (p ProcInst) Copy() ProcInst {
	p.Inst = makeCopy(p.Inst)
	return p
}

// A Directive represents an XML directive of the form <!text>.
// The bytes do not include the <! and > markers.
type Directive []byte

func (d Directive) Copy() Directive { return Directive(makeCopy(d)) }

// CopyToken returns a copy of a Token.
func CopyToken(t Token) Token {
	switch v := t.(type) {
	case CharData:
		return v.Copy()
	case Comment:
		return v.Copy()
	case Directive:
		return v.Copy()
	case ProcInst:
		return v.Copy()
	case StartElement:
		return v.Copy()
	}
	return t
}

// A Parser represents an XML parser reading a particular input stream.
// The parser assumes that its input is encoded in UTF-8.
type Parser struct {
	// Strict defaults to true, enforcing the requirements
	// of the XML specification.
	// If set to false, the parser allows input containing common
	// mistakes:
	//	* If an element is missing an end tag, the parser invents
	//	  end tags as necessary to keep the return values from Token
	//	  properly balanced.
	//	* In attribute values and character data, unknown or malformed
	//	  character entities (sequences beginning with &) are left alone.
	//
	// Setting:
	//
	//	p.Strict = false;
	//	p.AutoClose = HTMLAutoClose;
	//	p.Entity = HTMLEntity
	//
	// creates a parser that can handle typical HTML.
	Strict bool

	// When Strict == false, AutoClose indicates a set of elements to
	// consider closed immediately after they are opened, regardless
	// of whether an end element is present.
	AutoClose []string

	// Entity can be used to map non-standard entity names to string replacements.
	// The parser behaves as if these standard mappings are present in the map,
	// regardless of the actual map content:
	//
	//	"lt": "<",
	//	"gt": ">",
	//	"amp": "&",
	//	"apos": "'",
	//	"quot": `"`,
	Entity map[string]string

	r         io.ReadByter
	buf       bytes.Buffer
	saved     *bytes.Buffer
	stk       *stack
	free      *stack
	needClose bool
	toClose   Name
	nextToken Token
	nextByte  int
	ns        map[string]string
	err       os.Error
	line      int
	tmp       [32]byte
}

// NewParser creates a new XML parser reading from r.
func NewParser(r io.Reader) *Parser {
	p := &Parser{
		ns:       make(map[string]string),
		nextByte: -1,
		line:     1,
		Strict:   true,
	}

	// Get efficient byte at a time reader.
	// Assume that if reader has its own
	// ReadByte, it's efficient enough.
	// Otherwise, use bufio.
	if rb, ok := r.(io.ReadByter); ok {
		p.r = rb
	} else {
		p.r = bufio.NewReader(r)
	}

	return p
}

// Token returns the next XML token in the input stream.
// At the end of the input stream, Token returns nil, os.EOF.
//
// Slices of bytes in the returned token data refer to the
// parser's internal buffer and remain valid only until the next
// call to Token.  To acquire a copy of the bytes, call CopyToken
// or the token's Copy method.
//
// Token expands self-closing elements such as <br/>
// into separate start and end elements returned by successive calls.
//
// Token guarantees that the StartElement and EndElement
// tokens it returns are properly nested and matched:
// if Token encounters an unexpected end element,
// it will return an error.
//
// Token implements XML name spaces as described by
// http://www.w3.org/TR/REC-xml-names/.  Each of the
// Name structures contained in the Token has the Space
// set to the URL identifying its name space when known.
// If Token encounters an unrecognized name space prefix,
// it uses the prefix as the Space rather than report an error.
func (p *Parser) Token() (t Token, err os.Error) {
	if p.nextToken != nil {
		t = p.nextToken
		p.nextToken = nil
	} else if t, err = p.RawToken(); err != nil {
		return
	}

	if !p.Strict {
		if t1, ok := p.autoClose(t); ok {
			p.nextToken = t
			t = t1
		}
	}
	switch t1 := t.(type) {
	case StartElement:
		// In XML name spaces, the translations listed in the
		// attributes apply to the element name and
		// to the other attribute names, so process
		// the translations first.
		for _, a := range t1.Attr {
			if a.Name.Space == "xmlns" {
				v, ok := p.ns[a.Name.Local]
				p.pushNs(a.Name.Local, v, ok)
				p.ns[a.Name.Local] = a.Value
			}
			if a.Name.Space == "" && a.Name.Local == "xmlns" {
				// Default space for untagged names
				v, ok := p.ns[""]
				p.pushNs("", v, ok)
				p.ns[""] = a.Value
			}
		}

		p.translate(&t1.Name, true)
		for i := range t1.Attr {
			p.translate(&t1.Attr[i].Name, false)
		}
		p.pushElement(t1.Name)
		t = t1

	case EndElement:
		p.translate(&t1.Name, true)
		if !p.popElement(&t1) {
			return nil, p.err
		}
		t = t1
	}
	return
}

// Apply name space translation to name n.
// The default name space (for Space=="")
// applies only to element names, not to attribute names.
func (p *Parser) translate(n *Name, isElementName bool) {
	switch {
	case n.Space == "xmlns":
		return
	case n.Space == "" && !isElementName:
		return
	case n.Space == "" && n.Local == "xmlns":
		return
	}
	if v, ok := p.ns[n.Space]; ok {
		n.Space = v
	}
}

// Parsing state - stack holds old name space translations
// and the current set of open elements.  The translations to pop when
// ending a given tag are *below* it on the stack, which is
// more work but forced on us by XML.
type stack struct {
	next *stack
	kind int
	name Name
	ok   bool
}

const (
	stkStart = iota
	stkNs
)

func (p *Parser) push(kind int) *stack {
	s := p.free
	if s != nil {
		p.free = s.next
	} else {
		s = new(stack)
	}
	s.next = p.stk
	s.kind = kind
	p.stk = s
	return s
}

func (p *Parser) pop() *stack {
	s := p.stk
	if s != nil {
		p.stk = s.next
		s.next = p.free
		p.free = s
	}
	return s
}

// Record that we are starting an element with the given name.
func (p *Parser) pushElement(name Name) {
	s := p.push(stkStart)
	s.name = name
}

// Record that we are changing the value of ns[local].
// The old value is url, ok.
func (p *Parser) pushNs(local string, url string, ok bool) {
	s := p.push(stkNs)
	s.name.Local = local
	s.name.Space = url
	s.ok = ok
}

// Creates a SyntaxError with the current line number.
func (p *Parser) syntaxError(msg string) os.Error {
	return &SyntaxError{Msg: msg, Line: p.line}
}

// Record that we are ending an element with the given name.
// The name must match the record at the top of the stack,
// which must be a pushElement record.
// After popping the element, apply any undo records from
// the stack to restore the name translations that existed
// before we saw this element.
func (p *Parser) popElement(t *EndElement) bool {
	s := p.pop()
	name := t.Name
	switch {
	case s == nil || s.kind != stkStart:
		p.err = p.syntaxError("unexpected end element </" + name.Local + ">")
		return false
	case s.name.Local != name.Local:
		if !p.Strict {
			p.needClose = true
			p.toClose = t.Name
			t.Name = s.name
			return true
		}
		p.err = p.syntaxError("element <" + s.name.Local + "> closed by </" + name.Local + ">")
		return false
	case s.name.Space != name.Space:
		p.err = p.syntaxError("element <" + s.name.Local + "> in space " + s.name.Space +
			"closed by </" + name.Local + "> in space " + name.Space)
		return false
	}

	// Pop stack until a Start is on the top, undoing the
	// translations that were associated with the element we just closed.
	for p.stk != nil && p.stk.kind != stkStart {
		s := p.pop()
		p.ns[s.name.Local] = s.name.Space, s.ok
	}

	return true
}

// If the top element on the stack is autoclosing and
// t is not the end tag, invent the end tag.
func (p *Parser) autoClose(t Token) (Token, bool) {
	if p.stk == nil || p.stk.kind != stkStart {
		return nil, false
	}
	name := strings.ToLower(p.stk.name.Local)
	for _, s := range p.AutoClose {
		if strings.ToLower(s) == name {
			// This one should be auto closed if t doesn't close it.
			et, ok := t.(EndElement)
			if !ok || et.Name.Local != name {
				return EndElement{p.stk.name}, true
			}
			break
		}
	}
	return nil, false
}


// RawToken is like Token but does not verify that
// start and end elements match and does not translate
// name space prefixes to their corresponding URLs.
func (p *Parser) RawToken() (Token, os.Error) {
	if p.err != nil {
		return nil, p.err
	}
	if p.needClose {
		// The last element we read was self-closing and
		// we returned just the StartElement half.
		// Return the EndElement half now.
		p.needClose = false
		return EndElement{p.toClose}, nil
	}

	b, ok := p.getc()
	if !ok {
		return nil, p.err
	}

	if b != '<' {
		// Text section.
		p.ungetc(b)
		data := p.text(-1, false)
		if data == nil {
			return nil, p.err
		}
		return CharData(data), nil
	}

	if b, ok = p.mustgetc(); !ok {
		return nil, p.err
	}
	switch b {
	case '/':
		// </: End element
		var name Name
		if name, ok = p.nsname(); !ok {
			if p.err == nil {
				p.err = p.syntaxError("expected element name after </")
			}
			return nil, p.err
		}
		p.space()
		if b, ok = p.mustgetc(); !ok {
			return nil, p.err
		}
		if b != '>' {
			p.err = p.syntaxError("invalid characters between </" + name.Local + " and >")
			return nil, p.err
		}
		return EndElement{name}, nil

	case '?':
		// <?: Processing instruction.
		// TODO(rsc): Should parse the <?xml declaration to make sure
		// the version is 1.0 and the encoding is UTF-8.
		var target string
		if target, ok = p.name(); !ok {
			if p.err == nil {
				p.err = p.syntaxError("expected target name after <?")
			}
			return nil, p.err
		}
		p.space()
		p.buf.Reset()
		var b0 byte
		for {
			if b, ok = p.mustgetc(); !ok {
				return nil, p.err
			}
			p.buf.WriteByte(b)
			if b0 == '?' && b == '>' {
				break
			}
			b0 = b
		}
		data := p.buf.Bytes()
		data = data[0 : len(data)-2] // chop ?>
		return ProcInst{target, data}, nil

	case '!':
		// <!: Maybe comment, maybe CDATA.
		if b, ok = p.mustgetc(); !ok {
			return nil, p.err
		}
		switch b {
		case '-': // <!-
			// Probably <!-- for a comment.
			if b, ok = p.mustgetc(); !ok {
				return nil, p.err
			}
			if b != '-' {
				p.err = p.syntaxError("invalid sequence <!- not part of <!--")
				return nil, p.err
			}
			// Look for terminator.
			p.buf.Reset()
			var b0, b1 byte
			for {
				if b, ok = p.mustgetc(); !ok {
					return nil, p.err
				}
				p.buf.WriteByte(b)
				if b0 == '-' && b1 == '-' && b == '>' {
					break
				}
				b0, b1 = b1, b
			}
			data := p.buf.Bytes()
			data = data[0 : len(data)-3] // chop -->
			return Comment(data), nil

		case '[': // <![
			// Probably <![CDATA[.
			for i := 0; i < 6; i++ {
				if b, ok = p.mustgetc(); !ok {
					return nil, p.err
				}
				if b != "CDATA["[i] {
					p.err = p.syntaxError("invalid <![ sequence")
					return nil, p.err
				}
			}
			// Have <![CDATA[.  Read text until ]]>.
			data := p.text(-1, true)
			if data == nil {
				return nil, p.err
			}
			return CharData(data), nil
		}

		// Probably a directive: <!DOCTYPE ...>, <!ENTITY ...>, etc.
		// We don't care, but accumulate for caller.
		p.buf.Reset()
		p.buf.WriteByte(b)
		for {
			if b, ok = p.mustgetc(); !ok {
				return nil, p.err
			}
			if b == '>' {
				break
			}
			p.buf.WriteByte(b)
		}
		return Directive(p.buf.Bytes()), nil
	}

	// Must be an open element like <a href="foo">
	p.ungetc(b)

	var (
		name  Name
		empty bool
		attr  []Attr
	)
	if name, ok = p.nsname(); !ok {
		if p.err == nil {
			p.err = p.syntaxError("expected element name after <")
		}
		return nil, p.err
	}

	attr = make([]Attr, 0, 4)
	for {
		p.space()
		if b, ok = p.mustgetc(); !ok {
			return nil, p.err
		}
		if b == '/' {
			empty = true
			if b, ok = p.mustgetc(); !ok {
				return nil, p.err
			}
			if b != '>' {
				p.err = p.syntaxError("expected /> in element")
				return nil, p.err
			}
			break
		}
		if b == '>' {
			break
		}
		p.ungetc(b)

		n := len(attr)
		if n >= cap(attr) {
			nattr := make([]Attr, n, 2*cap(attr))
			for i, a := range attr {
				nattr[i] = a
			}
			attr = nattr
		}
		attr = attr[0 : n+1]
		a := &attr[n]
		if a.Name, ok = p.nsname(); !ok {
			if p.err == nil {
				p.err = p.syntaxError("expected attribute name in element")
			}
			return nil, p.err
		}
		p.space()
		if b, ok = p.mustgetc(); !ok {
			return nil, p.err
		}
		if b != '=' {
			p.err = p.syntaxError("attribute name without = in element")
			return nil, p.err
		}
		p.space()
		data := p.attrval()
		if data == nil {
			return nil, p.err
		}
		a.Value = string(data)
	}

	if empty {
		p.needClose = true
		p.toClose = name
	}
	return StartElement{name, attr}, nil
}

func (p *Parser) attrval() []byte {
	b, ok := p.mustgetc()
	if !ok {
		return nil
	}
	// Handle quoted attribute values
	if b == '"' || b == '\'' {
		return p.text(int(b), false)
	}
	// Handle unquoted attribute values for strict parsers
	if p.Strict {
		p.err = p.syntaxError("unquoted or missing attribute value in element")
		return nil
	}
	// Handle unquoted attribute values for unstrict parsers
	p.ungetc(b)
	p.buf.Reset()
	for {
		b, ok = p.mustgetc()
		if !ok {
			return nil
		}
		// http://www.w3.org/TR/REC-html40/intro/sgmltut.html#h-3.2.2
		if 'a' <= b && b <= 'z' || 'A' <= b && b <= 'Z' ||
			'0' <= b && b <= '9' || b == '_' || b == ':' || b == '-' {
			p.buf.WriteByte(b)
		} else {
			p.ungetc(b)
			break
		}
	}
	return p.buf.Bytes()
}

// Skip spaces if any
func (p *Parser) space() {
	for {
		b, ok := p.getc()
		if !ok {
			return
		}
		switch b {
		case ' ', '\r', '\n', '\t':
		default:
			p.ungetc(b)
			return
		}
	}
}

// Read a single byte.
// If there is no byte to read, return ok==false
// and leave the error in p.err.
// Maintain line number.
func (p *Parser) getc() (b byte, ok bool) {
	if p.err != nil {
		return 0, false
	}
	if p.nextByte >= 0 {
		b = byte(p.nextByte)
		p.nextByte = -1
	} else {
		b, p.err = p.r.ReadByte()
		if p.err != nil {
			return 0, false
		}
		if p.saved != nil {
			p.saved.WriteByte(b)
		}
	}
	if b == '\n' {
		p.line++
	}
	return b, true
}

// Return saved offset.
// If we did ungetc (nextByte >= 0), have to back up one.
func (p *Parser) savedOffset() int {
	n := p.saved.Len()
	if p.nextByte >= 0 {
		n--
	}
	return n
}

// Must read a single byte.
// If there is no byte to read,
// set p.err to SyntaxError("unexpected EOF")
// and return ok==false
func (p *Parser) mustgetc() (b byte, ok bool) {
	if b, ok = p.getc(); !ok {
		if p.err == os.EOF {
			p.err = p.syntaxError("unexpected EOF")
		}
	}
	return
}

// Unread a single byte.
func (p *Parser) ungetc(b byte) {
	if b == '\n' {
		p.line--
	}
	p.nextByte = int(b)
}

var entity = map[string]int{
	"lt":   '<',
	"gt":   '>',
	"amp":  '&',
	"apos": '\'',
	"quot": '"',
}

// Read plain text section (XML calls it character data).
// If quote >= 0, we are in a quoted string and need to find the matching quote.
// If cdata == true, we are in a <![CDATA[ section and need to find ]]>.
// On failure return nil and leave the error in p.err.
func (p *Parser) text(quote int, cdata bool) []byte {
	var b0, b1 byte
	var trunc int
	p.buf.Reset()
Input:
	for {
		b, ok := p.getc()
		if !ok {
			if cdata {
				if p.err == os.EOF {
					p.err = p.syntaxError("unexpected EOF in CDATA section")
				}
				return nil
			}
			break Input
		}

		// <![CDATA[ section ends with ]]>.
		// It is an error for ]]> to appear in ordinary text.
		if b0 == ']' && b1 == ']' && b == '>' {
			if cdata {
				trunc = 2
				break Input
			}
			p.err = p.syntaxError("unescaped ]]> not in CDATA section")
			return nil
		}

		// Stop reading text if we see a <.
		if b == '<' && !cdata {
			if quote >= 0 {
				p.err = p.syntaxError("unescaped < inside quoted string")
				return nil
			}
			p.ungetc('<')
			break Input
		}
		if quote >= 0 && b == byte(quote) {
			break Input
		}
		if b == '&' && !cdata {
			// Read escaped character expression up to semicolon.
			// XML in all its glory allows a document to define and use
			// its own character names with <!ENTITY ...> directives.
			// Parsers are required to recognize lt, gt, amp, apos, and quot
			// even if they have not been declared.  That's all we allow.
			var i int
		CharLoop:
			for i = 0; i < len(p.tmp); i++ {
				var ok bool
				p.tmp[i], ok = p.getc()
				if !ok {
					if p.err == os.EOF {
						p.err = p.syntaxError("unexpected EOF")
					}
					return nil
				}
				c := p.tmp[i]
				if c == ';' {
					break
				}
				if 'a' <= c && c <= 'z' ||
					'A' <= c && c <= 'Z' ||
					'0' <= c && c <= '9' ||
					c == '_' || c == '#' {
					continue
				}
				p.ungetc(c)
				break
			}
			s := string(p.tmp[0:i])
			if i >= len(p.tmp) {
				if !p.Strict {
					b0, b1 = 0, 0
					p.buf.WriteByte('&')
					p.buf.Write(p.tmp[0:i])
					continue Input
				}
				p.err = p.syntaxError("character entity expression &" + s + "... too long")
				return nil
			}
			var haveText bool
			var text string
			if i >= 2 && s[0] == '#' {
				var n uint64
				var err os.Error
				if i >= 3 && s[1] == 'x' {
					n, err = strconv.Btoui64(s[2:], 16)
				} else {
					n, err = strconv.Btoui64(s[1:], 10)
				}
				if err == nil && n <= unicode.MaxRune {
					text = string(n)
					haveText = true
				}
			} else {
				if r, ok := entity[s]; ok {
					text = string(r)
					haveText = true
				} else if p.Entity != nil {
					text, haveText = p.Entity[s]
				}
			}
			if !haveText {
				if !p.Strict {
					b0, b1 = 0, 0
					p.buf.WriteByte('&')
					p.buf.Write(p.tmp[0:i])
					continue Input
				}
				p.err = p.syntaxError("invalid character entity &" + s + ";")
				return nil
			}
			p.buf.Write([]byte(text))
			b0, b1 = 0, 0
			continue Input
		}
		p.buf.WriteByte(b)
		b0, b1 = b1, b
	}
	data := p.buf.Bytes()
	data = data[0 : len(data)-trunc]

	// Must rewrite \r and \r\n into \n.
	w := 0
	for r := 0; r < len(data); r++ {
		b := data[r]
		if b == '\r' {
			if r+1 < len(data) && data[r+1] == '\n' {
				continue
			}
			b = '\n'
		}
		data[w] = b
		w++
	}
	return data[0:w]
}

// Get name space name: name with a : stuck in the middle.
// The part before the : is the name space identifier.
func (p *Parser) nsname() (name Name, ok bool) {
	s, ok := p.name()
	if !ok {
		return
	}
	i := strings.Index(s, ":")
	if i < 0 {
		name.Local = s
	} else {
		name.Space = s[0:i]
		name.Local = s[i+1:]
	}
	return name, true
}

// Get name: /first(first|second)*/
// Do not set p.err if the name is missing (unless unexpected EOF is received):
// let the caller provide better context.
func (p *Parser) name() (s string, ok bool) {
	var b byte
	if b, ok = p.mustgetc(); !ok {
		return
	}

	// As a first approximation, we gather the bytes [A-Za-z_:.-\x80-\xFF]*
	if b < utf8.RuneSelf && !isNameByte(b) {
		p.ungetc(b)
		return "", false
	}
	p.buf.Reset()
	p.buf.WriteByte(b)
	for {
		if b, ok = p.mustgetc(); !ok {
			return
		}
		if b < utf8.RuneSelf && !isNameByte(b) {
			p.ungetc(b)
			break
		}
		p.buf.WriteByte(b)
	}

	// Then we check the characters.
	s = p.buf.String()
	for i, c := range s {
		if !unicode.Is(first, c) && (i == 0 || !unicode.Is(second, c)) {
			p.err = p.syntaxError("invalid XML name: " + s)
			return "", false
		}
	}
	return s, true
}

func isNameByte(c byte) bool {
	return 'A' <= c && c <= 'Z' ||
		'a' <= c && c <= 'z' ||
		'0' <= c && c <= '9' ||
		c == '_' || c == ':' || c == '.' || c == '-'
}

// These tables were generated by cut and paste from Appendix B of
// the XML spec at http://www.xml.com/axml/testaxml.htm
// and then reformatting.  First corresponds to (Letter | '_' | ':')
// and second corresponds to NameChar.

var first = []unicode.Range{
	unicode.Range{0x003A, 0x003A, 1},
	unicode.Range{0x0041, 0x005A, 1},
	unicode.Range{0x005F, 0x005F, 1},
	unicode.Range{0x0061, 0x007A, 1},
	unicode.Range{0x00C0, 0x00D6, 1},
	unicode.Range{0x00D8, 0x00F6, 1},
	unicode.Range{0x00F8, 0x00FF, 1},
	unicode.Range{0x0100, 0x0131, 1},
	unicode.Range{0x0134, 0x013E, 1},
	unicode.Range{0x0141, 0x0148, 1},
	unicode.Range{0x014A, 0x017E, 1},
	unicode.Range{0x0180, 0x01C3, 1},
	unicode.Range{0x01CD, 0x01F0, 1},
	unicode.Range{0x01F4, 0x01F5, 1},
	unicode.Range{0x01FA, 0x0217, 1},
	unicode.Range{0x0250, 0x02A8, 1},
	unicode.Range{0x02BB, 0x02C1, 1},
	unicode.Range{0x0386, 0x0386, 1},
	unicode.Range{0x0388, 0x038A, 1},
	unicode.Range{0x038C, 0x038C, 1},
	unicode.Range{0x038E, 0x03A1, 1},
	unicode.Range{0x03A3, 0x03CE, 1},
	unicode.Range{0x03D0, 0x03D6, 1},
	unicode.Range{0x03DA, 0x03E0, 2},
	unicode.Range{0x03E2, 0x03F3, 1},
	unicode.Range{0x0401, 0x040C, 1},
	unicode.Range{0x040E, 0x044F, 1},
	unicode.Range{0x0451, 0x045C, 1},
	unicode.Range{0x045E, 0x0481, 1},
	unicode.Range{0x0490, 0x04C4, 1},
	unicode.Range{0x04C7, 0x04C8, 1},
	unicode.Range{0x04CB, 0x04CC, 1},
	unicode.Range{0x04D0, 0x04EB, 1},
	unicode.Range{0x04EE, 0x04F5, 1},
	unicode.Range{0x04F8, 0x04F9, 1},
	unicode.Range{0x0531, 0x0556, 1},
	unicode.Range{0x0559, 0x0559, 1},
	unicode.Range{0x0561, 0x0586, 1},
	unicode.Range{0x05D0, 0x05EA, 1},
	unicode.Range{0x05F0, 0x05F2, 1},
	unicode.Range{0x0621, 0x063A, 1},
	unicode.Range{0x0641, 0x064A, 1},
	unicode.Range{0x0671, 0x06B7, 1},
	unicode.Range{0x06BA, 0x06BE, 1},
	unicode.Range{0x06C0, 0x06CE, 1},
	unicode.Range{0x06D0, 0x06D3, 1},
	unicode.Range{0x06D5, 0x06D5, 1},
	unicode.Range{0x06E5, 0x06E6, 1},
	unicode.Range{0x0905, 0x0939, 1},
	unicode.Range{0x093D, 0x093D, 1},
	unicode.Range{0x0958, 0x0961, 1},
	unicode.Range{0x0985, 0x098C, 1},
	unicode.Range{0x098F, 0x0990, 1},
	unicode.Range{0x0993, 0x09A8, 1},
	unicode.Range{0x09AA, 0x09B0, 1},
	unicode.Range{0x09B2, 0x09B2, 1},
	unicode.Range{0x09B6, 0x09B9, 1},
	unicode.Range{0x09DC, 0x09DD, 1},
	unicode.Range{0x09DF, 0x09E1, 1},
	unicode.Range{0x09F0, 0x09F1, 1},
	unicode.Range{0x0A05, 0x0A0A, 1},
	unicode.Range{0x0A0F, 0x0A10, 1},
	unicode.Range{0x0A13, 0x0A28, 1},
	unicode.Range{0x0A2A, 0x0A30, 1},
	unicode.Range{0x0A32, 0x0A33, 1},
	unicode.Range{0x0A35, 0x0A36, 1},
	unicode.Range{0x0A38, 0x0A39, 1},
	unicode.Range{0x0A59, 0x0A5C, 1},
	unicode.Range{0x0A5E, 0x0A5E, 1},
	unicode.Range{0x0A72, 0x0A74, 1},
	unicode.Range{0x0A85, 0x0A8B, 1},
	unicode.Range{0x0A8D, 0x0A8D, 1},
	unicode.Range{0x0A8F, 0x0A91, 1},
	unicode.Range{0x0A93, 0x0AA8, 1},
	unicode.Range{0x0AAA, 0x0AB0, 1},
	unicode.Range{0x0AB2, 0x0AB3, 1},
	unicode.Range{0x0AB5, 0x0AB9, 1},
	unicode.Range{0x0ABD, 0x0AE0, 0x23},
	unicode.Range{0x0B05, 0x0B0C, 1},
	unicode.Range{0x0B0F, 0x0B10, 1},
	unicode.Range{0x0B13, 0x0B28, 1},
	unicode.Range{0x0B2A, 0x0B30, 1},
	unicode.Range{0x0B32, 0x0B33, 1},
	unicode.Range{0x0B36, 0x0B39, 1},
	unicode.Range{0x0B3D, 0x0B3D, 1},
	unicode.Range{0x0B5C, 0x0B5D, 1},
	unicode.Range{0x0B5F, 0x0B61, 1},
	unicode.Range{0x0B85, 0x0B8A, 1},
	unicode.Range{0x0B8E, 0x0B90, 1},
	unicode.Range{0x0B92, 0x0B95, 1},
	unicode.Range{0x0B99, 0x0B9A, 1},
	unicode.Range{0x0B9C, 0x0B9C, 1},
	unicode.Range{0x0B9E, 0x0B9F, 1},
	unicode.Range{0x0BA3, 0x0BA4, 1},
	unicode.Range{0x0BA8, 0x0BAA, 1},
	unicode.Range{0x0BAE, 0x0BB5, 1},
	unicode.Range{0x0BB7, 0x0BB9, 1},
	unicode.Range{0x0C05, 0x0C0C, 1},
	unicode.Range{0x0C0E, 0x0C10, 1},
	unicode.Range{0x0C12, 0x0C28, 1},
	unicode.Range{0x0C2A, 0x0C33, 1},
	unicode.Range{0x0C35, 0x0C39, 1},
	unicode.Range{0x0C60, 0x0C61, 1},
	unicode.Range{0x0C85, 0x0C8C, 1},
	unicode.Range{0x0C8E, 0x0C90, 1},
	unicode.Range{0x0C92, 0x0CA8, 1},
	unicode.Range{0x0CAA, 0x0CB3, 1},
	unicode.Range{0x0CB5, 0x0CB9, 1},
	unicode.Range{0x0CDE, 0x0CDE, 1},
	unicode.Range{0x0CE0, 0x0CE1, 1},
	unicode.Range{0x0D05, 0x0D0C, 1},
	unicode.Range{0x0D0E, 0x0D10, 1},
	unicode.Range{0x0D12, 0x0D28, 1},
	unicode.Range{0x0D2A, 0x0D39, 1},
	unicode.Range{0x0D60, 0x0D61, 1},
	unicode.Range{0x0E01, 0x0E2E, 1},
	unicode.Range{0x0E30, 0x0E30, 1},
	unicode.Range{0x0E32, 0x0E33, 1},
	unicode.Range{0x0E40, 0x0E45, 1},
	unicode.Range{0x0E81, 0x0E82, 1},
	unicode.Range{0x0E84, 0x0E84, 1},
	unicode.Range{0x0E87, 0x0E88, 1},
	unicode.Range{0x0E8A, 0x0E8D, 3},
	unicode.Range{0x0E94, 0x0E97, 1},
	unicode.Range{0x0E99, 0x0E9F, 1},
	unicode.Range{0x0EA1, 0x0EA3, 1},
	unicode.Range{0x0EA5, 0x0EA7, 2},
	unicode.Range{0x0EAA, 0x0EAB, 1},
	unicode.Range{0x0EAD, 0x0EAE, 1},
	unicode.Range{0x0EB0, 0x0EB0, 1},
	unicode.Range{0x0EB2, 0x0EB3, 1},
	unicode.Range{0x0EBD, 0x0EBD, 1},
	unicode.Range{0x0EC0, 0x0EC4, 1},
	unicode.Range{0x0F40, 0x0F47, 1},
	unicode.Range{0x0F49, 0x0F69, 1},
	unicode.Range{0x10A0, 0x10C5, 1},
	unicode.Range{0x10D0, 0x10F6, 1},
	unicode.Range{0x1100, 0x1100, 1},
	unicode.Range{0x1102, 0x1103, 1},
	unicode.Range{0x1105, 0x1107, 1},
	unicode.Range{0x1109, 0x1109, 1},
	unicode.Range{0x110B, 0x110C, 1},
	unicode.Range{0x110E, 0x1112, 1},
	unicode.Range{0x113C, 0x1140, 2},
	unicode.Range{0x114C, 0x1150, 2},
	unicode.Range{0x1154, 0x1155, 1},
	unicode.Range{0x1159, 0x1159, 1},
	unicode.Range{0x115F, 0x1161, 1},
	unicode.Range{0x1163, 0x1169, 2},
	unicode.Range{0x116D, 0x116E, 1},
	unicode.Range{0x1172, 0x1173, 1},
	unicode.Range{0x1175, 0x119E, 0x119E - 0x1175},
	unicode.Range{0x11A8, 0x11AB, 0x11AB - 0x11A8},
	unicode.Range{0x11AE, 0x11AF, 1},
	unicode.Range{0x11B7, 0x11B8, 1},
	unicode.Range{0x11BA, 0x11BA, 1},
	unicode.Range{0x11BC, 0x11C2, 1},
	unicode.Range{0x11EB, 0x11F0, 0x11F0 - 0x11EB},
	unicode.Range{0x11F9, 0x11F9, 1},
	unicode.Range{0x1E00, 0x1E9B, 1},
	unicode.Range{0x1EA0, 0x1EF9, 1},
	unicode.Range{0x1F00, 0x1F15, 1},
	unicode.Range{0x1F18, 0x1F1D, 1},
	unicode.Range{0x1F20, 0x1F45, 1},
	unicode.Range{0x1F48, 0x1F4D, 1},
	unicode.Range{0x1F50, 0x1F57, 1},
	unicode.Range{0x1F59, 0x1F5B, 0x1F5B - 0x1F59},
	unicode.Range{0x1F5D, 0x1F5D, 1},
	unicode.Range{0x1F5F, 0x1F7D, 1},
	unicode.Range{0x1F80, 0x1FB4, 1},
	unicode.Range{0x1FB6, 0x1FBC, 1},
	unicode.Range{0x1FBE, 0x1FBE, 1},
	unicode.Range{0x1FC2, 0x1FC4, 1},
	unicode.Range{0x1FC6, 0x1FCC, 1},
	unicode.Range{0x1FD0, 0x1FD3, 1},
	unicode.Range{0x1FD6, 0x1FDB, 1},
	unicode.Range{0x1FE0, 0x1FEC, 1},
	unicode.Range{0x1FF2, 0x1FF4, 1},
	unicode.Range{0x1FF6, 0x1FFC, 1},
	unicode.Range{0x2126, 0x2126, 1},
	unicode.Range{0x212A, 0x212B, 1},
	unicode.Range{0x212E, 0x212E, 1},
	unicode.Range{0x2180, 0x2182, 1},
	unicode.Range{0x3007, 0x3007, 1},
	unicode.Range{0x3021, 0x3029, 1},
	unicode.Range{0x3041, 0x3094, 1},
	unicode.Range{0x30A1, 0x30FA, 1},
	unicode.Range{0x3105, 0x312C, 1},
	unicode.Range{0x4E00, 0x9FA5, 1},
	unicode.Range{0xAC00, 0xD7A3, 1},
}

var second = []unicode.Range{
	unicode.Range{0x002D, 0x002E, 1},
	unicode.Range{0x0030, 0x0039, 1},
	unicode.Range{0x00B7, 0x00B7, 1},
	unicode.Range{0x02D0, 0x02D1, 1},
	unicode.Range{0x0300, 0x0345, 1},
	unicode.Range{0x0360, 0x0361, 1},
	unicode.Range{0x0387, 0x0387, 1},
	unicode.Range{0x0483, 0x0486, 1},
	unicode.Range{0x0591, 0x05A1, 1},
	unicode.Range{0x05A3, 0x05B9, 1},
	unicode.Range{0x05BB, 0x05BD, 1},
	unicode.Range{0x05BF, 0x05BF, 1},
	unicode.Range{0x05C1, 0x05C2, 1},
	unicode.Range{0x05C4, 0x0640, 0x0640 - 0x05C4},
	unicode.Range{0x064B, 0x0652, 1},
	unicode.Range{0x0660, 0x0669, 1},
	unicode.Range{0x0670, 0x0670, 1},
	unicode.Range{0x06D6, 0x06DC, 1},
	unicode.Range{0x06DD, 0x06DF, 1},
	unicode.Range{0x06E0, 0x06E4, 1},
	unicode.Range{0x06E7, 0x06E8, 1},
	unicode.Range{0x06EA, 0x06ED, 1},
	unicode.Range{0x06F0, 0x06F9, 1},
	unicode.Range{0x0901, 0x0903, 1},
	unicode.Range{0x093C, 0x093C, 1},
	unicode.Range{0x093E, 0x094C, 1},
	unicode.Range{0x094D, 0x094D, 1},
	unicode.Range{0x0951, 0x0954, 1},
	unicode.Range{0x0962, 0x0963, 1},
	unicode.Range{0x0966, 0x096F, 1},
	unicode.Range{0x0981, 0x0983, 1},
	unicode.Range{0x09BC, 0x09BC, 1},
	unicode.Range{0x09BE, 0x09BF, 1},
	unicode.Range{0x09C0, 0x09C4, 1},
	unicode.Range{0x09C7, 0x09C8, 1},
	unicode.Range{0x09CB, 0x09CD, 1},
	unicode.Range{0x09D7, 0x09D7, 1},
	unicode.Range{0x09E2, 0x09E3, 1},
	unicode.Range{0x09E6, 0x09EF, 1},
	unicode.Range{0x0A02, 0x0A3C, 0x3A},
	unicode.Range{0x0A3E, 0x0A3F, 1},
	unicode.Range{0x0A40, 0x0A42, 1},
	unicode.Range{0x0A47, 0x0A48, 1},
	unicode.Range{0x0A4B, 0x0A4D, 1},
	unicode.Range{0x0A66, 0x0A6F, 1},
	unicode.Range{0x0A70, 0x0A71, 1},
	unicode.Range{0x0A81, 0x0A83, 1},
	unicode.Range{0x0ABC, 0x0ABC, 1},
	unicode.Range{0x0ABE, 0x0AC5, 1},
	unicode.Range{0x0AC7, 0x0AC9, 1},
	unicode.Range{0x0ACB, 0x0ACD, 1},
	unicode.Range{0x0AE6, 0x0AEF, 1},
	unicode.Range{0x0B01, 0x0B03, 1},
	unicode.Range{0x0B3C, 0x0B3C, 1},
	unicode.Range{0x0B3E, 0x0B43, 1},
	unicode.Range{0x0B47, 0x0B48, 1},
	unicode.Range{0x0B4B, 0x0B4D, 1},
	unicode.Range{0x0B56, 0x0B57, 1},
	unicode.Range{0x0B66, 0x0B6F, 1},
	unicode.Range{0x0B82, 0x0B83, 1},
	unicode.Range{0x0BBE, 0x0BC2, 1},
	unicode.Range{0x0BC6, 0x0BC8, 1},
	unicode.Range{0x0BCA, 0x0BCD, 1},
	unicode.Range{0x0BD7, 0x0BD7, 1},
	unicode.Range{0x0BE7, 0x0BEF, 1},
	unicode.Range{0x0C01, 0x0C03, 1},
	unicode.Range{0x0C3E, 0x0C44, 1},
	unicode.Range{0x0C46, 0x0C48, 1},
	unicode.Range{0x0C4A, 0x0C4D, 1},
	unicode.Range{0x0C55, 0x0C56, 1},
	unicode.Range{0x0C66, 0x0C6F, 1},
	unicode.Range{0x0C82, 0x0C83, 1},
	unicode.Range{0x0CBE, 0x0CC4, 1},
	unicode.Range{0x0CC6, 0x0CC8, 1},
	unicode.Range{0x0CCA, 0x0CCD, 1},
	unicode.Range{0x0CD5, 0x0CD6, 1},
	unicode.Range{0x0CE6, 0x0CEF, 1},
	unicode.Range{0x0D02, 0x0D03, 1},
	unicode.Range{0x0D3E, 0x0D43, 1},
	unicode.Range{0x0D46, 0x0D48, 1},
	unicode.Range{0x0D4A, 0x0D4D, 1},
	unicode.Range{0x0D57, 0x0D57, 1},
	unicode.Range{0x0D66, 0x0D6F, 1},
	unicode.Range{0x0E31, 0x0E31, 1},
	unicode.Range{0x0E34, 0x0E3A, 1},
	unicode.Range{0x0E46, 0x0E46, 1},
	unicode.Range{0x0E47, 0x0E4E, 1},
	unicode.Range{0x0E50, 0x0E59, 1},
	unicode.Range{0x0EB1, 0x0EB1, 1},
	unicode.Range{0x0EB4, 0x0EB9, 1},
	unicode.Range{0x0EBB, 0x0EBC, 1},
	unicode.Range{0x0EC6, 0x0EC6, 1},
	unicode.Range{0x0EC8, 0x0ECD, 1},
	unicode.Range{0x0ED0, 0x0ED9, 1},
	unicode.Range{0x0F18, 0x0F19, 1},
	unicode.Range{0x0F20, 0x0F29, 1},
	unicode.Range{0x0F35, 0x0F39, 2},
	unicode.Range{0x0F3E, 0x0F3F, 1},
	unicode.Range{0x0F71, 0x0F84, 1},
	unicode.Range{0x0F86, 0x0F8B, 1},
	unicode.Range{0x0F90, 0x0F95, 1},
	unicode.Range{0x0F97, 0x0F97, 1},
	unicode.Range{0x0F99, 0x0FAD, 1},
	unicode.Range{0x0FB1, 0x0FB7, 1},
	unicode.Range{0x0FB9, 0x0FB9, 1},
	unicode.Range{0x20D0, 0x20DC, 1},
	unicode.Range{0x20E1, 0x3005, 0x3005 - 0x20E1},
	unicode.Range{0x302A, 0x302F, 1},
	unicode.Range{0x3031, 0x3035, 1},
	unicode.Range{0x3099, 0x309A, 1},
	unicode.Range{0x309D, 0x309E, 1},
	unicode.Range{0x30FC, 0x30FE, 1},
}

// HTMLEntity is an entity map containing translations for the
// standard HTML entity characters.
var HTMLEntity = htmlEntity

var htmlEntity = map[string]string{
	/*
		hget http://www.w3.org/TR/html4/sgml/entities.html |
		ssam '
			,y /\&gt;/ x/\&lt;(.|\n)+/ s/\n/ /g
			,x v/^\&lt;!ENTITY/d
			,s/\&lt;!ENTITY ([^ ]+) .*U\+([0-9A-F][0-9A-F][0-9A-F][0-9A-F]) .+/	"\1": "\\u\2",/g
		'
	*/
	"nbsp":     "\u00A0",
	"iexcl":    "\u00A1",
	"cent":     "\u00A2",
	"pound":    "\u00A3",
	"curren":   "\u00A4",
	"yen":      "\u00A5",
	"brvbar":   "\u00A6",
	"sect":     "\u00A7",
	"uml":      "\u00A8",
	"copy":     "\u00A9",
	"ordf":     "\u00AA",
	"laquo":    "\u00AB",
	"not":      "\u00AC",
	"shy":      "\u00AD",
	"reg":      "\u00AE",
	"macr":     "\u00AF",
	"deg":      "\u00B0",
	"plusmn":   "\u00B1",
	"sup2":     "\u00B2",
	"sup3":     "\u00B3",
	"acute":    "\u00B4",
	"micro":    "\u00B5",
	"para":     "\u00B6",
	"middot":   "\u00B7",
	"cedil":    "\u00B8",
	"sup1":     "\u00B9",
	"ordm":     "\u00BA",
	"raquo":    "\u00BB",
	"frac14":   "\u00BC",
	"frac12":   "\u00BD",
	"frac34":   "\u00BE",
	"iquest":   "\u00BF",
	"Agrave":   "\u00C0",
	"Aacute":   "\u00C1",
	"Acirc":    "\u00C2",
	"Atilde":   "\u00C3",
	"Auml":     "\u00C4",
	"Aring":    "\u00C5",
	"AElig":    "\u00C6",
	"Ccedil":   "\u00C7",
	"Egrave":   "\u00C8",
	"Eacute":   "\u00C9",
	"Ecirc":    "\u00CA",
	"Euml":     "\u00CB",
	"Igrave":   "\u00CC",
	"Iacute":   "\u00CD",
	"Icirc":    "\u00CE",
	"Iuml":     "\u00CF",
	"ETH":      "\u00D0",
	"Ntilde":   "\u00D1",
	"Ograve":   "\u00D2",
	"Oacute":   "\u00D3",
	"Ocirc":    "\u00D4",
	"Otilde":   "\u00D5",
	"Ouml":     "\u00D6",
	"times":    "\u00D7",
	"Oslash":   "\u00D8",
	"Ugrave":   "\u00D9",
	"Uacute":   "\u00DA",
	"Ucirc":    "\u00DB",
	"Uuml":     "\u00DC",
	"Yacute":   "\u00DD",
	"THORN":    "\u00DE",
	"szlig":    "\u00DF",
	"agrave":   "\u00E0",
	"aacute":   "\u00E1",
	"acirc":    "\u00E2",
	"atilde":   "\u00E3",
	"auml":     "\u00E4",
	"aring":    "\u00E5",
	"aelig":    "\u00E6",
	"ccedil":   "\u00E7",
	"egrave":   "\u00E8",
	"eacute":   "\u00E9",
	"ecirc":    "\u00EA",
	"euml":     "\u00EB",
	"igrave":   "\u00EC",
	"iacute":   "\u00ED",
	"icirc":    "\u00EE",
	"iuml":     "\u00EF",
	"eth":      "\u00F0",
	"ntilde":   "\u00F1",
	"ograve":   "\u00F2",
	"oacute":   "\u00F3",
	"ocirc":    "\u00F4",
	"otilde":   "\u00F5",
	"ouml":     "\u00F6",
	"divide":   "\u00F7",
	"oslash":   "\u00F8",
	"ugrave":   "\u00F9",
	"uacute":   "\u00FA",
	"ucirc":    "\u00FB",
	"uuml":     "\u00FC",
	"yacute":   "\u00FD",
	"thorn":    "\u00FE",
	"yuml":     "\u00FF",
	"fnof":     "\u0192",
	"Alpha":    "\u0391",
	"Beta":     "\u0392",
	"Gamma":    "\u0393",
	"Delta":    "\u0394",
	"Epsilon":  "\u0395",
	"Zeta":     "\u0396",
	"Eta":      "\u0397",
	"Theta":    "\u0398",
	"Iota":     "\u0399",
	"Kappa":    "\u039A",
	"Lambda":   "\u039B",
	"Mu":       "\u039C",
	"Nu":       "\u039D",
	"Xi":       "\u039E",
	"Omicron":  "\u039F",
	"Pi":       "\u03A0",
	"Rho":      "\u03A1",
	"Sigma":    "\u03A3",
	"Tau":      "\u03A4",
	"Upsilon":  "\u03A5",
	"Phi":      "\u03A6",
	"Chi":      "\u03A7",
	"Psi":      "\u03A8",
	"Omega":    "\u03A9",
	"alpha":    "\u03B1",
	"beta":     "\u03B2",
	"gamma":    "\u03B3",
	"delta":    "\u03B4",
	"epsilon":  "\u03B5",
	"zeta":     "\u03B6",
	"eta":      "\u03B7",
	"theta":    "\u03B8",
	"iota":     "\u03B9",
	"kappa":    "\u03BA",
	"lambda":   "\u03BB",
	"mu":       "\u03BC",
	"nu":       "\u03BD",
	"xi":       "\u03BE",
	"omicron":  "\u03BF",
	"pi":       "\u03C0",
	"rho":      "\u03C1",
	"sigmaf":   "\u03C2",
	"sigma":    "\u03C3",
	"tau":      "\u03C4",
	"upsilon":  "\u03C5",
	"phi":      "\u03C6",
	"chi":      "\u03C7",
	"psi":      "\u03C8",
	"omega":    "\u03C9",
	"thetasym": "\u03D1",
	"upsih":    "\u03D2",
	"piv":      "\u03D6",
	"bull":     "\u2022",
	"hellip":   "\u2026",
	"prime":    "\u2032",
	"Prime":    "\u2033",
	"oline":    "\u203E",
	"frasl":    "\u2044",
	"weierp":   "\u2118",
	"image":    "\u2111",
	"real":     "\u211C",
	"trade":    "\u2122",
	"alefsym":  "\u2135",
	"larr":     "\u2190",
	"uarr":     "\u2191",
	"rarr":     "\u2192",
	"darr":     "\u2193",
	"harr":     "\u2194",
	"crarr":    "\u21B5",
	"lArr":     "\u21D0",
	"uArr":     "\u21D1",
	"rArr":     "\u21D2",
	"dArr":     "\u21D3",
	"hArr":     "\u21D4",
	"forall":   "\u2200",
	"part":     "\u2202",
	"exist":    "\u2203",
	"empty":    "\u2205",
	"nabla":    "\u2207",
	"isin":     "\u2208",
	"notin":    "\u2209",
	"ni":       "\u220B",
	"prod":     "\u220F",
	"sum":      "\u2211",
	"minus":    "\u2212",
	"lowast":   "\u2217",
	"radic":    "\u221A",
	"prop":     "\u221D",
	"infin":    "\u221E",
	"ang":      "\u2220",
	"and":      "\u2227",
	"or":       "\u2228",
	"cap":      "\u2229",
	"cup":      "\u222A",
	"int":      "\u222B",
	"there4":   "\u2234",
	"sim":      "\u223C",
	"cong":     "\u2245",
	"asymp":    "\u2248",
	"ne":       "\u2260",
	"equiv":    "\u2261",
	"le":       "\u2264",
	"ge":       "\u2265",
	"sub":      "\u2282",
	"sup":      "\u2283",
	"nsub":     "\u2284",
	"sube":     "\u2286",
	"supe":     "\u2287",
	"oplus":    "\u2295",
	"otimes":   "\u2297",
	"perp":     "\u22A5",
	"sdot":     "\u22C5",
	"lceil":    "\u2308",
	"rceil":    "\u2309",
	"lfloor":   "\u230A",
	"rfloor":   "\u230B",
	"lang":     "\u2329",
	"rang":     "\u232A",
	"loz":      "\u25CA",
	"spades":   "\u2660",
	"clubs":    "\u2663",
	"hearts":   "\u2665",
	"diams":    "\u2666",
	"quot":     "\u0022",
	"amp":      "\u0026",
	"lt":       "\u003C",
	"gt":       "\u003E",
	"OElig":    "\u0152",
	"oelig":    "\u0153",
	"Scaron":   "\u0160",
	"scaron":   "\u0161",
	"Yuml":     "\u0178",
	"circ":     "\u02C6",
	"tilde":    "\u02DC",
	"ensp":     "\u2002",
	"emsp":     "\u2003",
	"thinsp":   "\u2009",
	"zwnj":     "\u200C",
	"zwj":      "\u200D",
	"lrm":      "\u200E",
	"rlm":      "\u200F",
	"ndash":    "\u2013",
	"mdash":    "\u2014",
	"lsquo":    "\u2018",
	"rsquo":    "\u2019",
	"sbquo":    "\u201A",
	"ldquo":    "\u201C",
	"rdquo":    "\u201D",
	"bdquo":    "\u201E",
	"dagger":   "\u2020",
	"Dagger":   "\u2021",
	"permil":   "\u2030",
	"lsaquo":   "\u2039",
	"rsaquo":   "\u203A",
	"euro":     "\u20AC",
}

// HTMLAutoClose is the set of HTML elements that
// should be considered to close automatically.
var HTMLAutoClose = htmlAutoClose

var htmlAutoClose = []string{
	/*
		hget http://www.w3.org/TR/html4/loose.dtd |
		9 sed -n 's/<!ELEMENT (.*) - O EMPTY.+/	"\1",/p' | tr A-Z a-z
	*/
	"basefont",
	"br",
	"area",
	"link",
	"img",
	"param",
	"hr",
	"input",
	"col     ",
	"frame",
	"isindex",
	"base",
	"meta",
}

var (
	esc_quot = []byte("&#34;") // shorter than "&quot;"
	esc_apos = []byte("&#39;") // shorter than "&apos;"
	esc_amp  = []byte("&amp;")
	esc_lt   = []byte("&lt;")
	esc_gt   = []byte("&gt;")
)

// Escape writes to w the properly escaped XML equivalent
// of the plain text data s.
func Escape(w io.Writer, s []byte) {
	var esc []byte
	last := 0
	for i, c := range s {
		switch c {
		case '"':
			esc = esc_quot
		case '\'':
			esc = esc_apos
		case '&':
			esc = esc_amp
		case '<':
			esc = esc_lt
		case '>':
			esc = esc_gt
		default:
			continue
		}
		w.Write(s[last:i])
		w.Write(esc)
		last = i + 1
	}
	w.Write(s[last:])
}
