aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/golang.org/x/text/unicode/cldr/base.go
blob: 2382f4d6da1afb4d3d9c8692cfe7078f032810b0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// 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 ""
}

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