mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
Output from 'dep status': PROJECT CONSTRAINT VERSION REVISION LATEST PKGS USED cloud.google.com/go v0.23.0 v0.23.0 0fd7230 v0.23.0 1 github.com/briandowns/openweathermap ^0.11.0 0.11 1b87579 0.11 1 github.com/gdamore/encoding branch master branch master b23993c b23993c 1 github.com/gdamore/tcell ^1.0.0 v1.0.0 061d51a v1.0.0 2 github.com/go-test/deep ^1.0.1 v1.0.1 6592d9c v1.0.1 1 github.com/golang/protobuf v1.1.0 v1.1.0 b4deda0 v1.1.0 1 github.com/google/go-github branch master branch master 2ae5df7 2ae5df7 1 github.com/google/go-querystring branch master branch master 53e6ce1 53e6ce1 1 github.com/jessevdk/go-flags ^1.4.0 v1.4.0 c6ca198 v1.4.0 1 github.com/lucasb-eyer/go-colorful v1.0 v1.0 345fbb3 v1.0 1 github.com/mattn/go-runewidth v0.0.2 v0.0.2 9e777a8 v0.0.2 1 github.com/olebedev/config branch master branch master 9a10d05 9a10d05 1 github.com/radovskyb/watcher ^1.0.2 v1.0.2 6145e14 v1.0.2 1 github.com/rivo/tview branch master branch master 71ecf1f 71ecf1f 1 github.com/yfronto/newrelic branch master branch master f7fa0c6 f7fa0c6 1 golang.org/x/net branch master branch master 1e49130 1e49130 2 golang.org/x/oauth2 branch master branch master 1e0a3fa 1e0a3fa 5 golang.org/x/text v0.3.0 v0.3.0 f21a4df v0.3.0 5 google.golang.org/api branch master branch master 00e3bb8 00e3bb8 4 google.golang.org/appengine v1.0.0 v1.0.0 150dc57 v1.0.0 10 gopkg.in/yaml.v2 ^2.2.1 v2.2.1 5420a8b v2.2.1 1 See https://golang.github.io/dep/docs/daily-dep.html
172 lines
3.9 KiB
Go
172 lines
3.9 KiB
Go
// 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 (
|
|
"archive/zip"
|
|
"bytes"
|
|
"encoding/xml"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
)
|
|
|
|
// A Decoder loads an archive of CLDR data.
|
|
type Decoder struct {
|
|
dirFilter []string
|
|
sectionFilter []string
|
|
loader Loader
|
|
cldr *CLDR
|
|
curLocale string
|
|
}
|
|
|
|
// SetSectionFilter takes a list top-level LDML element names to which
|
|
// evaluation of LDML should be limited. It automatically calls SetDirFilter.
|
|
func (d *Decoder) SetSectionFilter(filter ...string) {
|
|
d.sectionFilter = filter
|
|
// TODO: automatically set dir filter
|
|
}
|
|
|
|
// SetDirFilter limits the loading of LDML XML files of the specied directories.
|
|
// Note that sections may be split across directories differently for different CLDR versions.
|
|
// For more robust code, use SetSectionFilter.
|
|
func (d *Decoder) SetDirFilter(dir ...string) {
|
|
d.dirFilter = dir
|
|
}
|
|
|
|
// A Loader provides access to the files of a CLDR archive.
|
|
type Loader interface {
|
|
Len() int
|
|
Path(i int) string
|
|
Reader(i int) (io.ReadCloser, error)
|
|
}
|
|
|
|
var fileRe = regexp.MustCompile(`.*[/\\](.*)[/\\](.*)\.xml`)
|
|
|
|
// Decode loads and decodes the files represented by l.
|
|
func (d *Decoder) Decode(l Loader) (cldr *CLDR, err error) {
|
|
d.cldr = makeCLDR()
|
|
for i := 0; i < l.Len(); i++ {
|
|
fname := l.Path(i)
|
|
if m := fileRe.FindStringSubmatch(fname); m != nil {
|
|
if len(d.dirFilter) > 0 && !in(d.dirFilter, m[1]) {
|
|
continue
|
|
}
|
|
var r io.Reader
|
|
if r, err = l.Reader(i); err == nil {
|
|
err = d.decode(m[1], m[2], r)
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
}
|
|
d.cldr.finalize(d.sectionFilter)
|
|
return d.cldr, nil
|
|
}
|
|
|
|
func (d *Decoder) decode(dir, id string, r io.Reader) error {
|
|
var v interface{}
|
|
var l *LDML
|
|
cldr := d.cldr
|
|
switch {
|
|
case dir == "supplemental":
|
|
v = cldr.supp
|
|
case dir == "transforms":
|
|
return nil
|
|
case dir == "bcp47":
|
|
v = cldr.bcp47
|
|
case dir == "validity":
|
|
return nil
|
|
default:
|
|
ok := false
|
|
if v, ok = cldr.locale[id]; !ok {
|
|
l = &LDML{}
|
|
v, cldr.locale[id] = l, l
|
|
}
|
|
}
|
|
x := xml.NewDecoder(r)
|
|
if err := x.Decode(v); err != nil {
|
|
log.Printf("%s/%s: %v", dir, id, err)
|
|
return err
|
|
}
|
|
if l != nil {
|
|
if l.Identity == nil {
|
|
return fmt.Errorf("%s/%s: missing identity element", dir, id)
|
|
}
|
|
// TODO: verify when CLDR bug http://unicode.org/cldr/trac/ticket/8970
|
|
// is resolved.
|
|
// path := strings.Split(id, "_")
|
|
// if lang := l.Identity.Language.Type; lang != path[0] {
|
|
// return fmt.Errorf("%s/%s: language was %s; want %s", dir, id, lang, path[0])
|
|
// }
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type pathLoader []string
|
|
|
|
func makePathLoader(path string) (pl pathLoader, err error) {
|
|
err = filepath.Walk(path, func(path string, _ os.FileInfo, err error) error {
|
|
pl = append(pl, path)
|
|
return err
|
|
})
|
|
return pl, err
|
|
}
|
|
|
|
func (pl pathLoader) Len() int {
|
|
return len(pl)
|
|
}
|
|
|
|
func (pl pathLoader) Path(i int) string {
|
|
return pl[i]
|
|
}
|
|
|
|
func (pl pathLoader) Reader(i int) (io.ReadCloser, error) {
|
|
return os.Open(pl[i])
|
|
}
|
|
|
|
// DecodePath loads CLDR data from the given path.
|
|
func (d *Decoder) DecodePath(path string) (cldr *CLDR, err error) {
|
|
loader, err := makePathLoader(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return d.Decode(loader)
|
|
}
|
|
|
|
type zipLoader struct {
|
|
r *zip.Reader
|
|
}
|
|
|
|
func (zl zipLoader) Len() int {
|
|
return len(zl.r.File)
|
|
}
|
|
|
|
func (zl zipLoader) Path(i int) string {
|
|
return zl.r.File[i].Name
|
|
}
|
|
|
|
func (zl zipLoader) Reader(i int) (io.ReadCloser, error) {
|
|
return zl.r.File[i].Open()
|
|
}
|
|
|
|
// DecodeZip loads CLDR data from the zip archive for which r is the source.
|
|
func (d *Decoder) DecodeZip(r io.Reader) (cldr *CLDR, err error) {
|
|
buffer, err := ioutil.ReadAll(r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
archive, err := zip.NewReader(bytes.NewReader(buffer), int64(len(buffer)))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return d.Decode(zipLoader{archive})
|
|
}
|