// 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.
//	Expose parser line number in errors.

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

// A SyntaxError represents a syntax error in the XML input stream.
type SyntaxError string

func (e SyntaxError) String() string { return "XML syntax error: " + string(e) }

// 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
}

// 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)) }

type readByter interface {
	ReadByte() (b byte, err os.Error)
}

// 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": "&",
	//	"pos": "'",
	//	"quot": `"`,
	//
	Entity map[string]string

	r         readByter
	buf       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.(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 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
}

// 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 = 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 = SyntaxError("element <" + s.name.Local + "> closed by </" + name.Local + ">")
		return false
	case s.name.Space != name.Space:
		p.err = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 b == '\n' {
		p.line++
	}
	return b, true
}

// 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 = 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.mustgetc()
		if !ok {
			return nil
		}

		// <![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 = SyntaxError("unescaped ]]> not in CDATA section")
			return nil
		}

		// Stop reading text if we see a <.
		if b == '<' && !cdata {
			if quote >= 0 {
				p.err = SyntaxError("unescaped < inside quoted string")
				return nil
			}
			p.ungetc('<')
			break Input
		}
		if quote >= 0 && b == byte(quote) {
			break Input
		}
		if b == '&' {
			// 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++ {
				p.tmp[i], p.err = p.r.ReadByte()
				if p.err != nil {
					if p.err == os.EOF {
						p.err = 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 = 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 = 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 = 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:])
}
