blob: 2197f8ac268e3bcbbbb8792beb1ff61a6842f648 [file] [log] [blame]
William Kurkianea869482019-04-09 15:16:11 -04001// Copyright 2013 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5//go:generate go run makexml.go -output xml.go
6
7// Package cldr provides a parser for LDML and related XML formats.
8// This package is intended to be used by the table generation tools
9// for the various internationalization-related packages.
10// As the XML types are generated from the CLDR DTD, and as the CLDR standard
11// is periodically amended, this package may change considerably over time.
12// This mostly means that data may appear and disappear between versions.
13// That is, old code should keep compiling for newer versions, but data
14// may have moved or changed.
15// CLDR version 22 is the first version supported by this package.
16// Older versions may not work.
17package cldr // import "golang.org/x/text/unicode/cldr"
18
19import (
20 "fmt"
21 "sort"
22)
23
24// CLDR provides access to parsed data of the Unicode Common Locale Data Repository.
25type CLDR struct {
26 parent map[string][]string
27 locale map[string]*LDML
28 resolved map[string]*LDML
29 bcp47 *LDMLBCP47
30 supp *SupplementalData
31}
32
33func makeCLDR() *CLDR {
34 return &CLDR{
35 parent: make(map[string][]string),
36 locale: make(map[string]*LDML),
37 resolved: make(map[string]*LDML),
38 bcp47: &LDMLBCP47{},
39 supp: &SupplementalData{},
40 }
41}
42
43// BCP47 returns the parsed BCP47 LDML data. If no such data was parsed, nil is returned.
44func (cldr *CLDR) BCP47() *LDMLBCP47 {
45 return nil
46}
47
48// Draft indicates the draft level of an element.
49type Draft int
50
51const (
52 Approved Draft = iota
53 Contributed
54 Provisional
55 Unconfirmed
56)
57
58var drafts = []string{"unconfirmed", "provisional", "contributed", "approved", ""}
59
60// ParseDraft returns the Draft value corresponding to the given string. The
61// empty string corresponds to Approved.
62func ParseDraft(level string) (Draft, error) {
63 if level == "" {
64 return Approved, nil
65 }
66 for i, s := range drafts {
67 if level == s {
68 return Unconfirmed - Draft(i), nil
69 }
70 }
71 return Approved, fmt.Errorf("cldr: unknown draft level %q", level)
72}
73
74func (d Draft) String() string {
75 return drafts[len(drafts)-1-int(d)]
76}
77
78// SetDraftLevel sets which draft levels to include in the evaluated LDML.
79// Any draft element for which the draft level is higher than lev will be excluded.
80// If multiple draft levels are available for a single element, the one with the
81// lowest draft level will be selected, unless preferDraft is true, in which case
82// the highest draft will be chosen.
83// It is assumed that the underlying LDML is canonicalized.
84func (cldr *CLDR) SetDraftLevel(lev Draft, preferDraft bool) {
85 // TODO: implement
86 cldr.resolved = make(map[string]*LDML)
87}
88
89// RawLDML returns the LDML XML for id in unresolved form.
90// id must be one of the strings returned by Locales.
91func (cldr *CLDR) RawLDML(loc string) *LDML {
92 return cldr.locale[loc]
93}
94
95// LDML returns the fully resolved LDML XML for loc, which must be one of
96// the strings returned by Locales.
97func (cldr *CLDR) LDML(loc string) (*LDML, error) {
98 return cldr.resolve(loc)
99}
100
101// Supplemental returns the parsed supplemental data. If no such data was parsed,
102// nil is returned.
103func (cldr *CLDR) Supplemental() *SupplementalData {
104 return cldr.supp
105}
106
107// Locales returns the locales for which there exist files.
108// Valid sublocales for which there is no file are not included.
109// The root locale is always sorted first.
110func (cldr *CLDR) Locales() []string {
111 loc := []string{"root"}
112 hasRoot := false
113 for l, _ := range cldr.locale {
114 if l == "root" {
115 hasRoot = true
116 continue
117 }
118 loc = append(loc, l)
119 }
120 sort.Strings(loc[1:])
121 if !hasRoot {
122 return loc[1:]
123 }
124 return loc
125}
126
127// Get fills in the fields of x based on the XPath path.
128func Get(e Elem, path string) (res Elem, err error) {
129 return walkXPath(e, path)
130}