123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- // 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 cldr
- import (
- "encoding/xml"
- "regexp"
- "strconv"
- )
- // Elem is implemented by every XML element.
- type Elem interface {
- setEnclosing(Elem)
- setName(string)
- enclosing() Elem
- GetCommon() *Common
- }
- type hidden struct {
- CharData string `xml:",chardata"`
- Alias *struct {
- Common
- Source string `xml:"source,attr"`
- Path string `xml:"path,attr"`
- } `xml:"alias"`
- Def *struct {
- Common
- Choice string `xml:"choice,attr,omitempty"`
- Type string `xml:"type,attr,omitempty"`
- } `xml:"default"`
- }
- // Common holds several of the most common attributes and sub elements
- // of an XML element.
- type Common struct {
- XMLName xml.Name
- name string
- enclElem Elem
- Type string `xml:"type,attr,omitempty"`
- Reference string `xml:"reference,attr,omitempty"`
- Alt string `xml:"alt,attr,omitempty"`
- ValidSubLocales string `xml:"validSubLocales,attr,omitempty"`
- Draft string `xml:"draft,attr,omitempty"`
- hidden
- }
- // Default returns the default type to select from the enclosed list
- // or "" if no default value is specified.
- func (e *Common) Default() string {
- if e.Def == nil {
- return ""
- }
- if e.Def.Choice != "" {
- return e.Def.Choice
- } else if e.Def.Type != "" {
- // Type is still used by the default element in collation.
- return e.Def.Type
- }
- return ""
- }
- // Element returns the XML element name.
- func (e *Common) Element() string {
- return e.name
- }
- // GetCommon returns e. It is provided such that Common implements Elem.
- func (e *Common) GetCommon() *Common {
- return e
- }
- // Data returns the character data accumulated for this element.
- func (e *Common) Data() string {
- e.CharData = charRe.ReplaceAllStringFunc(e.CharData, replaceUnicode)
- return e.CharData
- }
- func (e *Common) setName(s string) {
- e.name = s
- }
- func (e *Common) enclosing() Elem {
- return e.enclElem
- }
- func (e *Common) setEnclosing(en Elem) {
- e.enclElem = en
- }
- // Escape characters that can be escaped without further escaping the string.
- var charRe = regexp.MustCompile(`&#x[0-9a-fA-F]*;|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|\\x[0-9a-fA-F]{2}|\\[0-7]{3}|\\[abtnvfr]`)
- // replaceUnicode converts hexadecimal Unicode codepoint notations to a one-rune string.
- // It assumes the input string is correctly formatted.
- func replaceUnicode(s string) string {
- if s[1] == '#' {
- r, _ := strconv.ParseInt(s[3:len(s)-1], 16, 32)
- return string(r)
- }
- r, _, _, _ := strconv.UnquoteChar(s, 0)
- return string(r)
- }
|