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