github.com/go-xe2/third@v1.0.3/golang.org/x/text/unicode/cldr/cldr.go (about)

     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.
    17  package cldr // import "github.com/go-xe2/third/golang.org/x/text/unicode/cldr"
    18  
    19  import (
    20  	"fmt"
    21  	"sort"
    22  )
    23  
    24  // CLDR provides access to parsed data of the Unicode Common Locale Data Repository.
    25  type 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  
    33  func 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.
    44  func (cldr *CLDR) BCP47() *LDMLBCP47 {
    45  	return nil
    46  }
    47  
    48  // Draft indicates the draft level of an element.
    49  type Draft int
    50  
    51  const (
    52  	Approved Draft = iota
    53  	Contributed
    54  	Provisional
    55  	Unconfirmed
    56  )
    57  
    58  var 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.
    62  func 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  
    74  func (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.
    84  func (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.
    91  func (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.
    97  func (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.
   103  func (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.
   110  func (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.
   128  func Get(e Elem, path string) (res Elem, err error) {
   129  	return walkXPath(e, path)
   130  }