updated qrz
This commit is contained in:
parent
e0fe5ade68
commit
118f387a7e
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +1,2 @@
|
|||||||
qrz
|
/qrz
|
||||||
*.ini
|
*.ini
|
19
Makefile
Normal file
19
Makefile
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# qrz Makefile
|
||||||
|
|
||||||
|
GOCMD=go
|
||||||
|
GOBUILDCMD=${GOCMD} build
|
||||||
|
GOOPTIONS=-mod=vendor
|
||||||
|
PACKRCMD=${GOPATH}/bin/packr2
|
||||||
|
|
||||||
|
RMCMD=rm
|
||||||
|
BINNAME=qrz
|
||||||
|
|
||||||
|
SRCFILES=cmd/qrz/*.go
|
||||||
|
|
||||||
|
all: build
|
||||||
|
|
||||||
|
build:
|
||||||
|
${GOBUILDCMD} ${GOOPTIONS} ${SRCFILES}
|
||||||
|
|
||||||
|
clean:
|
||||||
|
${RMCMD} -f ${BINNAME}
|
@ -4,12 +4,14 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
|
"git.paulbsd.com/paulbsd/qrz/src/config"
|
||||||
|
"git.paulbsd.com/paulbsd/qrz/src/qrz"
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
"github.com/jmoiron/sqlx"
|
"github.com/jmoiron/sqlx"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var config Config
|
var config config.Config
|
||||||
|
|
||||||
config.GetConfig()
|
config.GetConfig()
|
||||||
|
|
||||||
@ -23,12 +25,12 @@ func main() {
|
|||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
bodyString, err := GetBody(config)
|
bodyString, err := qrz.GetBody(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
frsPeople, err := GetFrsEntries(config, bodyString)
|
frsPeople, err := qrz.GetFrsEntries(config, bodyString)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
@ -38,7 +40,7 @@ func main() {
|
|||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = InsertFrsEntryToDB(config, *db, frsPeople)
|
err = qrz.InsertFrsEntryToDB(config, *db, frsPeople)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
1
go.sum
1
go.sum
@ -12,6 +12,7 @@ github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA=
|
|||||||
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
|
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
|
||||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
|
github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
|
||||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
github.com/mattn/go-sqlite3 v1.9.0 h1:pDRiWfl+++eC2FEFRy6jXmQlvp4Yh3z1MJKg4UeYM/4=
|
github.com/mattn/go-sqlite3 v1.9.0 h1:pDRiWfl+++eC2FEFRy6jXmQlvp4Yh3z1MJKg4UeYM/4=
|
||||||
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||||
|
53
src/config/main.go
Normal file
53
src/config/main.go
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
|
||||||
|
"git.paulbsd.com/paulbsd/qrz/src/utils"
|
||||||
|
"gopkg.in/ini.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetConfig fetch configuration
|
||||||
|
func (config *Config) GetConfig() error {
|
||||||
|
var configfile string
|
||||||
|
|
||||||
|
flag.Usage = utils.Usage
|
||||||
|
|
||||||
|
flag.StringVar(&configfile, "configfile", "qrz.ini", "config file to use with qrz section")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
cfg, err := ini.Load(configfile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
qrzsection := cfg.Section("qrz")
|
||||||
|
|
||||||
|
config.DbHostname = qrzsection.Key("db_hostname").MustString("localhost")
|
||||||
|
config.DbName = qrzsection.Key("db_name").MustString("database")
|
||||||
|
config.DbUsername = qrzsection.Key("db_username").MustString("username")
|
||||||
|
config.DbPassword = qrzsection.Key("db_password").MustString("password")
|
||||||
|
config.DbSchema = qrzsection.Key("db_schema").MustString("")
|
||||||
|
config.DbTable = qrzsection.Key("db_table").MustString("qrz")
|
||||||
|
config.FrsConfig.URL = qrzsection.Key("frs_url").MustString("")
|
||||||
|
config.FrsConfig.XPath = qrzsection.Key("frs_xpath").MustString("//tr")
|
||||||
|
config.FrsConfig.Regex = qrzsection.Key("frs_regex").MustString(".*")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Config is the global config of g2g
|
||||||
|
type Config struct {
|
||||||
|
DbHostname string
|
||||||
|
DbName string
|
||||||
|
DbUsername string
|
||||||
|
DbPassword string
|
||||||
|
DbSchema string
|
||||||
|
DbTable string
|
||||||
|
DbInsertStatement string
|
||||||
|
FrsConfig struct {
|
||||||
|
URL string
|
||||||
|
XPath string
|
||||||
|
Regex string
|
||||||
|
}
|
||||||
|
}
|
@ -1,51 +1,20 @@
|
|||||||
package main
|
package qrz
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"flag"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"git.paulbsd.com/paulbsd/qrz/src/config"
|
||||||
"github.com/antchfx/htmlquery"
|
"github.com/antchfx/htmlquery"
|
||||||
"github.com/jmoiron/sqlx"
|
"github.com/jmoiron/sqlx"
|
||||||
"golang.org/x/text/encoding/charmap"
|
"golang.org/x/text/encoding/charmap"
|
||||||
"gopkg.in/ini.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetConfig fetch configuration
|
|
||||||
func (config *Config) GetConfig() error {
|
|
||||||
var configfile string
|
|
||||||
|
|
||||||
flag.Usage = Usage
|
|
||||||
|
|
||||||
flag.StringVar(&configfile, "configfile", "qrz.ini", "config file to use with qrz section")
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
cfg, err := ini.Load(configfile)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
qrzsection := cfg.Section("qrz")
|
|
||||||
|
|
||||||
config.DbHostname = qrzsection.Key("db_hostname").MustString("localhost")
|
|
||||||
config.DbName = qrzsection.Key("db_name").MustString("database")
|
|
||||||
config.DbUsername = qrzsection.Key("db_username").MustString("username")
|
|
||||||
config.DbPassword = qrzsection.Key("db_password").MustString("password")
|
|
||||||
config.DbSchema = qrzsection.Key("db_schema").MustString("")
|
|
||||||
config.DbTable = qrzsection.Key("db_table").MustString("qrz")
|
|
||||||
config.FrsConfig.URL = qrzsection.Key("frs_url").MustString("")
|
|
||||||
config.FrsConfig.XPath = qrzsection.Key("frs_xpath").MustString("//tr")
|
|
||||||
config.FrsConfig.Regex = qrzsection.Key("frs_regex").MustString(".*")
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetBody fetch html page
|
// GetBody fetch html page
|
||||||
func GetBody(config Config) (string, error) {
|
func GetBody(config config.Config) (string, error) {
|
||||||
var client http.Client
|
var client http.Client
|
||||||
|
|
||||||
resp, err := client.Get(config.FrsConfig.URL)
|
resp, err := client.Get(config.FrsConfig.URL)
|
||||||
@ -67,7 +36,7 @@ func GetBody(config Config) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetFrsEntries get FRS entries from html body
|
// GetFrsEntries get FRS entries from html body
|
||||||
func GetFrsEntries(config Config, body string) ([]FrsEntry, error) {
|
func GetFrsEntries(config config.Config, body string) ([]FrsEntry, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
var frsentries []FrsEntry
|
var frsentries []FrsEntry
|
||||||
@ -95,7 +64,7 @@ func GetFrsEntries(config Config, body string) ([]FrsEntry, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// InsertFrsEntryToDB inserts frs entries to database
|
// InsertFrsEntryToDB inserts frs entries to database
|
||||||
func InsertFrsEntryToDB(config Config, db sqlx.DB, frsPeople []FrsEntry) error {
|
func InsertFrsEntryToDB(config config.Config, db sqlx.DB, frsPeople []FrsEntry) error {
|
||||||
var err error
|
var err error
|
||||||
tx := db.MustBegin()
|
tx := db.MustBegin()
|
||||||
var qrzNum int
|
var qrzNum int
|
||||||
@ -117,8 +86,11 @@ func InsertFrsEntryToDB(config Config, db sqlx.DB, frsPeople []FrsEntry) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Usage displays possible arguments
|
// FrsEntry describe FRS people
|
||||||
func Usage() {
|
type FrsEntry struct {
|
||||||
flag.PrintDefaults()
|
QRZ string `db:"qrz"`
|
||||||
os.Exit(1)
|
Name string `db:"name"`
|
||||||
|
City string `db:"city"`
|
||||||
|
Dept string `db:"dept"`
|
||||||
|
Country string `db:"country"`
|
||||||
}
|
}
|
12
src/utils/main.go
Normal file
12
src/utils/main.go
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Usage displays possible arguments
|
||||||
|
func Usage() {
|
||||||
|
flag.PrintDefaults()
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
26
types.go
26
types.go
@ -1,26 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
// Config is the global config of g2g
|
|
||||||
type Config struct {
|
|
||||||
DbHostname string
|
|
||||||
DbName string
|
|
||||||
DbUsername string
|
|
||||||
DbPassword string
|
|
||||||
DbSchema string
|
|
||||||
DbTable string
|
|
||||||
DbInsertStatement string
|
|
||||||
FrsConfig struct {
|
|
||||||
URL string
|
|
||||||
XPath string
|
|
||||||
Regex string
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FrsEntry describe FRS people
|
|
||||||
type FrsEntry struct {
|
|
||||||
QRZ string `db:"qrz"`
|
|
||||||
Name string `db:"name"`
|
|
||||||
City string `db:"city"`
|
|
||||||
Dept string `db:"dept"`
|
|
||||||
Country string `db:"country"`
|
|
||||||
}
|
|
712
vendor/golang.org/x/net/html/atom/gen.go
generated
vendored
712
vendor/golang.org/x/net/html/atom/gen.go
generated
vendored
@ -1,712 +0,0 @@
|
|||||||
// Copyright 2012 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
//go:generate go run gen.go
|
|
||||||
//go:generate go run gen.go -test
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"go/format"
|
|
||||||
"io/ioutil"
|
|
||||||
"math/rand"
|
|
||||||
"os"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// identifier converts s to a Go exported identifier.
|
|
||||||
// It converts "div" to "Div" and "accept-charset" to "AcceptCharset".
|
|
||||||
func identifier(s string) string {
|
|
||||||
b := make([]byte, 0, len(s))
|
|
||||||
cap := true
|
|
||||||
for _, c := range s {
|
|
||||||
if c == '-' {
|
|
||||||
cap = true
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if cap && 'a' <= c && c <= 'z' {
|
|
||||||
c -= 'a' - 'A'
|
|
||||||
}
|
|
||||||
cap = false
|
|
||||||
b = append(b, byte(c))
|
|
||||||
}
|
|
||||||
return string(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
var test = flag.Bool("test", false, "generate table_test.go")
|
|
||||||
|
|
||||||
func genFile(name string, buf *bytes.Buffer) {
|
|
||||||
b, err := format.Source(buf.Bytes())
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
if err := ioutil.WriteFile(name, b, 0644); err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
var all []string
|
|
||||||
all = append(all, elements...)
|
|
||||||
all = append(all, attributes...)
|
|
||||||
all = append(all, eventHandlers...)
|
|
||||||
all = append(all, extra...)
|
|
||||||
sort.Strings(all)
|
|
||||||
|
|
||||||
// uniq - lists have dups
|
|
||||||
w := 0
|
|
||||||
for _, s := range all {
|
|
||||||
if w == 0 || all[w-1] != s {
|
|
||||||
all[w] = s
|
|
||||||
w++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
all = all[:w]
|
|
||||||
|
|
||||||
if *test {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
fmt.Fprintln(&buf, "// Code generated by go generate gen.go; DO NOT EDIT.\n")
|
|
||||||
fmt.Fprintln(&buf, "//go:generate go run gen.go -test\n")
|
|
||||||
fmt.Fprintln(&buf, "package atom\n")
|
|
||||||
fmt.Fprintln(&buf, "var testAtomList = []string{")
|
|
||||||
for _, s := range all {
|
|
||||||
fmt.Fprintf(&buf, "\t%q,\n", s)
|
|
||||||
}
|
|
||||||
fmt.Fprintln(&buf, "}")
|
|
||||||
|
|
||||||
genFile("table_test.go", &buf)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find hash that minimizes table size.
|
|
||||||
var best *table
|
|
||||||
for i := 0; i < 1000000; i++ {
|
|
||||||
if best != nil && 1<<(best.k-1) < len(all) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
h := rand.Uint32()
|
|
||||||
for k := uint(0); k <= 16; k++ {
|
|
||||||
if best != nil && k >= best.k {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
var t table
|
|
||||||
if t.init(h, k, all) {
|
|
||||||
best = &t
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if best == nil {
|
|
||||||
fmt.Fprintf(os.Stderr, "failed to construct string table\n")
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lay out strings, using overlaps when possible.
|
|
||||||
layout := append([]string{}, all...)
|
|
||||||
|
|
||||||
// Remove strings that are substrings of other strings
|
|
||||||
for changed := true; changed; {
|
|
||||||
changed = false
|
|
||||||
for i, s := range layout {
|
|
||||||
if s == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for j, t := range layout {
|
|
||||||
if i != j && t != "" && strings.Contains(s, t) {
|
|
||||||
changed = true
|
|
||||||
layout[j] = ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Join strings where one suffix matches another prefix.
|
|
||||||
for {
|
|
||||||
// Find best i, j, k such that layout[i][len-k:] == layout[j][:k],
|
|
||||||
// maximizing overlap length k.
|
|
||||||
besti := -1
|
|
||||||
bestj := -1
|
|
||||||
bestk := 0
|
|
||||||
for i, s := range layout {
|
|
||||||
if s == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for j, t := range layout {
|
|
||||||
if i == j {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for k := bestk + 1; k <= len(s) && k <= len(t); k++ {
|
|
||||||
if s[len(s)-k:] == t[:k] {
|
|
||||||
besti = i
|
|
||||||
bestj = j
|
|
||||||
bestk = k
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if bestk > 0 {
|
|
||||||
layout[besti] += layout[bestj][bestk:]
|
|
||||||
layout[bestj] = ""
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
text := strings.Join(layout, "")
|
|
||||||
|
|
||||||
atom := map[string]uint32{}
|
|
||||||
for _, s := range all {
|
|
||||||
off := strings.Index(text, s)
|
|
||||||
if off < 0 {
|
|
||||||
panic("lost string " + s)
|
|
||||||
}
|
|
||||||
atom[s] = uint32(off<<8 | len(s))
|
|
||||||
}
|
|
||||||
|
|
||||||
var buf bytes.Buffer
|
|
||||||
// Generate the Go code.
|
|
||||||
fmt.Fprintln(&buf, "// Code generated by go generate gen.go; DO NOT EDIT.\n")
|
|
||||||
fmt.Fprintln(&buf, "//go:generate go run gen.go\n")
|
|
||||||
fmt.Fprintln(&buf, "package atom\n\nconst (")
|
|
||||||
|
|
||||||
// compute max len
|
|
||||||
maxLen := 0
|
|
||||||
for _, s := range all {
|
|
||||||
if maxLen < len(s) {
|
|
||||||
maxLen = len(s)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(&buf, "\t%s Atom = %#x\n", identifier(s), atom[s])
|
|
||||||
}
|
|
||||||
fmt.Fprintln(&buf, ")\n")
|
|
||||||
|
|
||||||
fmt.Fprintf(&buf, "const hash0 = %#x\n\n", best.h0)
|
|
||||||
fmt.Fprintf(&buf, "const maxAtomLen = %d\n\n", maxLen)
|
|
||||||
|
|
||||||
fmt.Fprintf(&buf, "var table = [1<<%d]Atom{\n", best.k)
|
|
||||||
for i, s := range best.tab {
|
|
||||||
if s == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Fprintf(&buf, "\t%#x: %#x, // %s\n", i, atom[s], s)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(&buf, "}\n")
|
|
||||||
datasize := (1 << best.k) * 4
|
|
||||||
|
|
||||||
fmt.Fprintln(&buf, "const atomText =")
|
|
||||||
textsize := len(text)
|
|
||||||
for len(text) > 60 {
|
|
||||||
fmt.Fprintf(&buf, "\t%q +\n", text[:60])
|
|
||||||
text = text[60:]
|
|
||||||
}
|
|
||||||
fmt.Fprintf(&buf, "\t%q\n\n", text)
|
|
||||||
|
|
||||||
genFile("table.go", &buf)
|
|
||||||
|
|
||||||
fmt.Fprintf(os.Stdout, "%d atoms; %d string bytes + %d tables = %d total data\n", len(all), textsize, datasize, textsize+datasize)
|
|
||||||
}
|
|
||||||
|
|
||||||
type byLen []string
|
|
||||||
|
|
||||||
func (x byLen) Less(i, j int) bool { return len(x[i]) > len(x[j]) }
|
|
||||||
func (x byLen) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
|
|
||||||
func (x byLen) Len() int { return len(x) }
|
|
||||||
|
|
||||||
// fnv computes the FNV hash with an arbitrary starting value h.
|
|
||||||
func fnv(h uint32, s string) uint32 {
|
|
||||||
for i := 0; i < len(s); i++ {
|
|
||||||
h ^= uint32(s[i])
|
|
||||||
h *= 16777619
|
|
||||||
}
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// A table represents an attempt at constructing the lookup table.
|
|
||||||
// The lookup table uses cuckoo hashing, meaning that each string
|
|
||||||
// can be found in one of two positions.
|
|
||||||
type table struct {
|
|
||||||
h0 uint32
|
|
||||||
k uint
|
|
||||||
mask uint32
|
|
||||||
tab []string
|
|
||||||
}
|
|
||||||
|
|
||||||
// hash returns the two hashes for s.
|
|
||||||
func (t *table) hash(s string) (h1, h2 uint32) {
|
|
||||||
h := fnv(t.h0, s)
|
|
||||||
h1 = h & t.mask
|
|
||||||
h2 = (h >> 16) & t.mask
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// init initializes the table with the given parameters.
|
|
||||||
// h0 is the initial hash value,
|
|
||||||
// k is the number of bits of hash value to use, and
|
|
||||||
// x is the list of strings to store in the table.
|
|
||||||
// init returns false if the table cannot be constructed.
|
|
||||||
func (t *table) init(h0 uint32, k uint, x []string) bool {
|
|
||||||
t.h0 = h0
|
|
||||||
t.k = k
|
|
||||||
t.tab = make([]string, 1<<k)
|
|
||||||
t.mask = 1<<k - 1
|
|
||||||
for _, s := range x {
|
|
||||||
if !t.insert(s) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// insert inserts s in the table.
|
|
||||||
func (t *table) insert(s string) bool {
|
|
||||||
h1, h2 := t.hash(s)
|
|
||||||
if t.tab[h1] == "" {
|
|
||||||
t.tab[h1] = s
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
if t.tab[h2] == "" {
|
|
||||||
t.tab[h2] = s
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
if t.push(h1, 0) {
|
|
||||||
t.tab[h1] = s
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
if t.push(h2, 0) {
|
|
||||||
t.tab[h2] = s
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// push attempts to push aside the entry in slot i.
|
|
||||||
func (t *table) push(i uint32, depth int) bool {
|
|
||||||
if depth > len(t.tab) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
s := t.tab[i]
|
|
||||||
h1, h2 := t.hash(s)
|
|
||||||
j := h1 + h2 - i
|
|
||||||
if t.tab[j] != "" && !t.push(j, depth+1) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
t.tab[j] = s
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// The lists of element names and attribute keys were taken from
|
|
||||||
// https://html.spec.whatwg.org/multipage/indices.html#index
|
|
||||||
// as of the "HTML Living Standard - Last Updated 16 April 2018" version.
|
|
||||||
|
|
||||||
// "command", "keygen" and "menuitem" have been removed from the spec,
|
|
||||||
// but are kept here for backwards compatibility.
|
|
||||||
var elements = []string{
|
|
||||||
"a",
|
|
||||||
"abbr",
|
|
||||||
"address",
|
|
||||||
"area",
|
|
||||||
"article",
|
|
||||||
"aside",
|
|
||||||
"audio",
|
|
||||||
"b",
|
|
||||||
"base",
|
|
||||||
"bdi",
|
|
||||||
"bdo",
|
|
||||||
"blockquote",
|
|
||||||
"body",
|
|
||||||
"br",
|
|
||||||
"button",
|
|
||||||
"canvas",
|
|
||||||
"caption",
|
|
||||||
"cite",
|
|
||||||
"code",
|
|
||||||
"col",
|
|
||||||
"colgroup",
|
|
||||||
"command",
|
|
||||||
"data",
|
|
||||||
"datalist",
|
|
||||||
"dd",
|
|
||||||
"del",
|
|
||||||
"details",
|
|
||||||
"dfn",
|
|
||||||
"dialog",
|
|
||||||
"div",
|
|
||||||
"dl",
|
|
||||||
"dt",
|
|
||||||
"em",
|
|
||||||
"embed",
|
|
||||||
"fieldset",
|
|
||||||
"figcaption",
|
|
||||||
"figure",
|
|
||||||
"footer",
|
|
||||||
"form",
|
|
||||||
"h1",
|
|
||||||
"h2",
|
|
||||||
"h3",
|
|
||||||
"h4",
|
|
||||||
"h5",
|
|
||||||
"h6",
|
|
||||||
"head",
|
|
||||||
"header",
|
|
||||||
"hgroup",
|
|
||||||
"hr",
|
|
||||||
"html",
|
|
||||||
"i",
|
|
||||||
"iframe",
|
|
||||||
"img",
|
|
||||||
"input",
|
|
||||||
"ins",
|
|
||||||
"kbd",
|
|
||||||
"keygen",
|
|
||||||
"label",
|
|
||||||
"legend",
|
|
||||||
"li",
|
|
||||||
"link",
|
|
||||||
"main",
|
|
||||||
"map",
|
|
||||||
"mark",
|
|
||||||
"menu",
|
|
||||||
"menuitem",
|
|
||||||
"meta",
|
|
||||||
"meter",
|
|
||||||
"nav",
|
|
||||||
"noscript",
|
|
||||||
"object",
|
|
||||||
"ol",
|
|
||||||
"optgroup",
|
|
||||||
"option",
|
|
||||||
"output",
|
|
||||||
"p",
|
|
||||||
"param",
|
|
||||||
"picture",
|
|
||||||
"pre",
|
|
||||||
"progress",
|
|
||||||
"q",
|
|
||||||
"rp",
|
|
||||||
"rt",
|
|
||||||
"ruby",
|
|
||||||
"s",
|
|
||||||
"samp",
|
|
||||||
"script",
|
|
||||||
"section",
|
|
||||||
"select",
|
|
||||||
"slot",
|
|
||||||
"small",
|
|
||||||
"source",
|
|
||||||
"span",
|
|
||||||
"strong",
|
|
||||||
"style",
|
|
||||||
"sub",
|
|
||||||
"summary",
|
|
||||||
"sup",
|
|
||||||
"table",
|
|
||||||
"tbody",
|
|
||||||
"td",
|
|
||||||
"template",
|
|
||||||
"textarea",
|
|
||||||
"tfoot",
|
|
||||||
"th",
|
|
||||||
"thead",
|
|
||||||
"time",
|
|
||||||
"title",
|
|
||||||
"tr",
|
|
||||||
"track",
|
|
||||||
"u",
|
|
||||||
"ul",
|
|
||||||
"var",
|
|
||||||
"video",
|
|
||||||
"wbr",
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/indices.html#attributes-3
|
|
||||||
//
|
|
||||||
// "challenge", "command", "contextmenu", "dropzone", "icon", "keytype", "mediagroup",
|
|
||||||
// "radiogroup", "spellcheck", "scoped", "seamless", "sortable" and "sorted" have been removed from the spec,
|
|
||||||
// but are kept here for backwards compatibility.
|
|
||||||
var attributes = []string{
|
|
||||||
"abbr",
|
|
||||||
"accept",
|
|
||||||
"accept-charset",
|
|
||||||
"accesskey",
|
|
||||||
"action",
|
|
||||||
"allowfullscreen",
|
|
||||||
"allowpaymentrequest",
|
|
||||||
"allowusermedia",
|
|
||||||
"alt",
|
|
||||||
"as",
|
|
||||||
"async",
|
|
||||||
"autocomplete",
|
|
||||||
"autofocus",
|
|
||||||
"autoplay",
|
|
||||||
"challenge",
|
|
||||||
"charset",
|
|
||||||
"checked",
|
|
||||||
"cite",
|
|
||||||
"class",
|
|
||||||
"color",
|
|
||||||
"cols",
|
|
||||||
"colspan",
|
|
||||||
"command",
|
|
||||||
"content",
|
|
||||||
"contenteditable",
|
|
||||||
"contextmenu",
|
|
||||||
"controls",
|
|
||||||
"coords",
|
|
||||||
"crossorigin",
|
|
||||||
"data",
|
|
||||||
"datetime",
|
|
||||||
"default",
|
|
||||||
"defer",
|
|
||||||
"dir",
|
|
||||||
"dirname",
|
|
||||||
"disabled",
|
|
||||||
"download",
|
|
||||||
"draggable",
|
|
||||||
"dropzone",
|
|
||||||
"enctype",
|
|
||||||
"for",
|
|
||||||
"form",
|
|
||||||
"formaction",
|
|
||||||
"formenctype",
|
|
||||||
"formmethod",
|
|
||||||
"formnovalidate",
|
|
||||||
"formtarget",
|
|
||||||
"headers",
|
|
||||||
"height",
|
|
||||||
"hidden",
|
|
||||||
"high",
|
|
||||||
"href",
|
|
||||||
"hreflang",
|
|
||||||
"http-equiv",
|
|
||||||
"icon",
|
|
||||||
"id",
|
|
||||||
"inputmode",
|
|
||||||
"integrity",
|
|
||||||
"is",
|
|
||||||
"ismap",
|
|
||||||
"itemid",
|
|
||||||
"itemprop",
|
|
||||||
"itemref",
|
|
||||||
"itemscope",
|
|
||||||
"itemtype",
|
|
||||||
"keytype",
|
|
||||||
"kind",
|
|
||||||
"label",
|
|
||||||
"lang",
|
|
||||||
"list",
|
|
||||||
"loop",
|
|
||||||
"low",
|
|
||||||
"manifest",
|
|
||||||
"max",
|
|
||||||
"maxlength",
|
|
||||||
"media",
|
|
||||||
"mediagroup",
|
|
||||||
"method",
|
|
||||||
"min",
|
|
||||||
"minlength",
|
|
||||||
"multiple",
|
|
||||||
"muted",
|
|
||||||
"name",
|
|
||||||
"nomodule",
|
|
||||||
"nonce",
|
|
||||||
"novalidate",
|
|
||||||
"open",
|
|
||||||
"optimum",
|
|
||||||
"pattern",
|
|
||||||
"ping",
|
|
||||||
"placeholder",
|
|
||||||
"playsinline",
|
|
||||||
"poster",
|
|
||||||
"preload",
|
|
||||||
"radiogroup",
|
|
||||||
"readonly",
|
|
||||||
"referrerpolicy",
|
|
||||||
"rel",
|
|
||||||
"required",
|
|
||||||
"reversed",
|
|
||||||
"rows",
|
|
||||||
"rowspan",
|
|
||||||
"sandbox",
|
|
||||||
"spellcheck",
|
|
||||||
"scope",
|
|
||||||
"scoped",
|
|
||||||
"seamless",
|
|
||||||
"selected",
|
|
||||||
"shape",
|
|
||||||
"size",
|
|
||||||
"sizes",
|
|
||||||
"sortable",
|
|
||||||
"sorted",
|
|
||||||
"slot",
|
|
||||||
"span",
|
|
||||||
"spellcheck",
|
|
||||||
"src",
|
|
||||||
"srcdoc",
|
|
||||||
"srclang",
|
|
||||||
"srcset",
|
|
||||||
"start",
|
|
||||||
"step",
|
|
||||||
"style",
|
|
||||||
"tabindex",
|
|
||||||
"target",
|
|
||||||
"title",
|
|
||||||
"translate",
|
|
||||||
"type",
|
|
||||||
"typemustmatch",
|
|
||||||
"updateviacache",
|
|
||||||
"usemap",
|
|
||||||
"value",
|
|
||||||
"width",
|
|
||||||
"workertype",
|
|
||||||
"wrap",
|
|
||||||
}
|
|
||||||
|
|
||||||
// "onautocomplete", "onautocompleteerror", "onmousewheel",
|
|
||||||
// "onshow" and "onsort" have been removed from the spec,
|
|
||||||
// but are kept here for backwards compatibility.
|
|
||||||
var eventHandlers = []string{
|
|
||||||
"onabort",
|
|
||||||
"onautocomplete",
|
|
||||||
"onautocompleteerror",
|
|
||||||
"onauxclick",
|
|
||||||
"onafterprint",
|
|
||||||
"onbeforeprint",
|
|
||||||
"onbeforeunload",
|
|
||||||
"onblur",
|
|
||||||
"oncancel",
|
|
||||||
"oncanplay",
|
|
||||||
"oncanplaythrough",
|
|
||||||
"onchange",
|
|
||||||
"onclick",
|
|
||||||
"onclose",
|
|
||||||
"oncontextmenu",
|
|
||||||
"oncopy",
|
|
||||||
"oncuechange",
|
|
||||||
"oncut",
|
|
||||||
"ondblclick",
|
|
||||||
"ondrag",
|
|
||||||
"ondragend",
|
|
||||||
"ondragenter",
|
|
||||||
"ondragexit",
|
|
||||||
"ondragleave",
|
|
||||||
"ondragover",
|
|
||||||
"ondragstart",
|
|
||||||
"ondrop",
|
|
||||||
"ondurationchange",
|
|
||||||
"onemptied",
|
|
||||||
"onended",
|
|
||||||
"onerror",
|
|
||||||
"onfocus",
|
|
||||||
"onhashchange",
|
|
||||||
"oninput",
|
|
||||||
"oninvalid",
|
|
||||||
"onkeydown",
|
|
||||||
"onkeypress",
|
|
||||||
"onkeyup",
|
|
||||||
"onlanguagechange",
|
|
||||||
"onload",
|
|
||||||
"onloadeddata",
|
|
||||||
"onloadedmetadata",
|
|
||||||
"onloadend",
|
|
||||||
"onloadstart",
|
|
||||||
"onmessage",
|
|
||||||
"onmessageerror",
|
|
||||||
"onmousedown",
|
|
||||||
"onmouseenter",
|
|
||||||
"onmouseleave",
|
|
||||||
"onmousemove",
|
|
||||||
"onmouseout",
|
|
||||||
"onmouseover",
|
|
||||||
"onmouseup",
|
|
||||||
"onmousewheel",
|
|
||||||
"onwheel",
|
|
||||||
"onoffline",
|
|
||||||
"ononline",
|
|
||||||
"onpagehide",
|
|
||||||
"onpageshow",
|
|
||||||
"onpaste",
|
|
||||||
"onpause",
|
|
||||||
"onplay",
|
|
||||||
"onplaying",
|
|
||||||
"onpopstate",
|
|
||||||
"onprogress",
|
|
||||||
"onratechange",
|
|
||||||
"onreset",
|
|
||||||
"onresize",
|
|
||||||
"onrejectionhandled",
|
|
||||||
"onscroll",
|
|
||||||
"onsecuritypolicyviolation",
|
|
||||||
"onseeked",
|
|
||||||
"onseeking",
|
|
||||||
"onselect",
|
|
||||||
"onshow",
|
|
||||||
"onsort",
|
|
||||||
"onstalled",
|
|
||||||
"onstorage",
|
|
||||||
"onsubmit",
|
|
||||||
"onsuspend",
|
|
||||||
"ontimeupdate",
|
|
||||||
"ontoggle",
|
|
||||||
"onunhandledrejection",
|
|
||||||
"onunload",
|
|
||||||
"onvolumechange",
|
|
||||||
"onwaiting",
|
|
||||||
}
|
|
||||||
|
|
||||||
// extra are ad-hoc values not covered by any of the lists above.
|
|
||||||
var extra = []string{
|
|
||||||
"acronym",
|
|
||||||
"align",
|
|
||||||
"annotation",
|
|
||||||
"annotation-xml",
|
|
||||||
"applet",
|
|
||||||
"basefont",
|
|
||||||
"bgsound",
|
|
||||||
"big",
|
|
||||||
"blink",
|
|
||||||
"center",
|
|
||||||
"color",
|
|
||||||
"desc",
|
|
||||||
"face",
|
|
||||||
"font",
|
|
||||||
"foreignObject", // HTML is case-insensitive, but SVG-embedded-in-HTML is case-sensitive.
|
|
||||||
"foreignobject",
|
|
||||||
"frame",
|
|
||||||
"frameset",
|
|
||||||
"image",
|
|
||||||
"isindex",
|
|
||||||
"listing",
|
|
||||||
"malignmark",
|
|
||||||
"marquee",
|
|
||||||
"math",
|
|
||||||
"mglyph",
|
|
||||||
"mi",
|
|
||||||
"mn",
|
|
||||||
"mo",
|
|
||||||
"ms",
|
|
||||||
"mtext",
|
|
||||||
"nobr",
|
|
||||||
"noembed",
|
|
||||||
"noframes",
|
|
||||||
"plaintext",
|
|
||||||
"prompt",
|
|
||||||
"public",
|
|
||||||
"rb",
|
|
||||||
"rtc",
|
|
||||||
"spacer",
|
|
||||||
"strike",
|
|
||||||
"svg",
|
|
||||||
"system",
|
|
||||||
"tt",
|
|
||||||
"xmp",
|
|
||||||
}
|
|
556
vendor/golang.org/x/text/encoding/charmap/maketables.go
generated
vendored
556
vendor/golang.org/x/text/encoding/charmap/maketables.go
generated
vendored
@ -1,556 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
"unicode/utf8"
|
|
||||||
|
|
||||||
"golang.org/x/text/encoding"
|
|
||||||
"golang.org/x/text/internal/gen"
|
|
||||||
)
|
|
||||||
|
|
||||||
const ascii = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" +
|
|
||||||
"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
|
|
||||||
` !"#$%&'()*+,-./0123456789:;<=>?` +
|
|
||||||
`@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` +
|
|
||||||
"`abcdefghijklmnopqrstuvwxyz{|}~\u007f"
|
|
||||||
|
|
||||||
var encodings = []struct {
|
|
||||||
name string
|
|
||||||
mib string
|
|
||||||
comment string
|
|
||||||
varName string
|
|
||||||
replacement byte
|
|
||||||
mapping string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
"IBM Code Page 037",
|
|
||||||
"IBM037",
|
|
||||||
"",
|
|
||||||
"CodePage037",
|
|
||||||
0x3f,
|
|
||||||
"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM037-2.1.2.ucm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"IBM Code Page 437",
|
|
||||||
"PC8CodePage437",
|
|
||||||
"",
|
|
||||||
"CodePage437",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM437-2.1.2.ucm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"IBM Code Page 850",
|
|
||||||
"PC850Multilingual",
|
|
||||||
"",
|
|
||||||
"CodePage850",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM850-2.1.2.ucm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"IBM Code Page 852",
|
|
||||||
"PCp852",
|
|
||||||
"",
|
|
||||||
"CodePage852",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM852-2.1.2.ucm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"IBM Code Page 855",
|
|
||||||
"IBM855",
|
|
||||||
"",
|
|
||||||
"CodePage855",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM855-2.1.2.ucm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Windows Code Page 858", // PC latin1 with Euro
|
|
||||||
"IBM00858",
|
|
||||||
"",
|
|
||||||
"CodePage858",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/windows-858-2000.ucm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"IBM Code Page 860",
|
|
||||||
"IBM860",
|
|
||||||
"",
|
|
||||||
"CodePage860",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM860-2.1.2.ucm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"IBM Code Page 862",
|
|
||||||
"PC862LatinHebrew",
|
|
||||||
"",
|
|
||||||
"CodePage862",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM862-2.1.2.ucm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"IBM Code Page 863",
|
|
||||||
"IBM863",
|
|
||||||
"",
|
|
||||||
"CodePage863",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM863-2.1.2.ucm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"IBM Code Page 865",
|
|
||||||
"IBM865",
|
|
||||||
"",
|
|
||||||
"CodePage865",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM865-2.1.2.ucm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"IBM Code Page 866",
|
|
||||||
"IBM866",
|
|
||||||
"",
|
|
||||||
"CodePage866",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-ibm866.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"IBM Code Page 1047",
|
|
||||||
"IBM1047",
|
|
||||||
"",
|
|
||||||
"CodePage1047",
|
|
||||||
0x3f,
|
|
||||||
"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM1047-2.1.2.ucm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"IBM Code Page 1140",
|
|
||||||
"IBM01140",
|
|
||||||
"",
|
|
||||||
"CodePage1140",
|
|
||||||
0x3f,
|
|
||||||
"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/ibm-1140_P100-1997.ucm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ISO 8859-1",
|
|
||||||
"ISOLatin1",
|
|
||||||
"",
|
|
||||||
"ISO8859_1",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/iso-8859_1-1998.ucm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ISO 8859-2",
|
|
||||||
"ISOLatin2",
|
|
||||||
"",
|
|
||||||
"ISO8859_2",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-iso-8859-2.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ISO 8859-3",
|
|
||||||
"ISOLatin3",
|
|
||||||
"",
|
|
||||||
"ISO8859_3",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-iso-8859-3.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ISO 8859-4",
|
|
||||||
"ISOLatin4",
|
|
||||||
"",
|
|
||||||
"ISO8859_4",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-iso-8859-4.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ISO 8859-5",
|
|
||||||
"ISOLatinCyrillic",
|
|
||||||
"",
|
|
||||||
"ISO8859_5",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-iso-8859-5.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ISO 8859-6",
|
|
||||||
"ISOLatinArabic",
|
|
||||||
"",
|
|
||||||
"ISO8859_6,ISO8859_6E,ISO8859_6I",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-iso-8859-6.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ISO 8859-7",
|
|
||||||
"ISOLatinGreek",
|
|
||||||
"",
|
|
||||||
"ISO8859_7",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-iso-8859-7.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ISO 8859-8",
|
|
||||||
"ISOLatinHebrew",
|
|
||||||
"",
|
|
||||||
"ISO8859_8,ISO8859_8E,ISO8859_8I",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-iso-8859-8.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ISO 8859-9",
|
|
||||||
"ISOLatin5",
|
|
||||||
"",
|
|
||||||
"ISO8859_9",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/iso-8859_9-1999.ucm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ISO 8859-10",
|
|
||||||
"ISOLatin6",
|
|
||||||
"",
|
|
||||||
"ISO8859_10",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-iso-8859-10.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ISO 8859-13",
|
|
||||||
"ISO885913",
|
|
||||||
"",
|
|
||||||
"ISO8859_13",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-iso-8859-13.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ISO 8859-14",
|
|
||||||
"ISO885914",
|
|
||||||
"",
|
|
||||||
"ISO8859_14",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-iso-8859-14.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ISO 8859-15",
|
|
||||||
"ISO885915",
|
|
||||||
"",
|
|
||||||
"ISO8859_15",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-iso-8859-15.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ISO 8859-16",
|
|
||||||
"ISO885916",
|
|
||||||
"",
|
|
||||||
"ISO8859_16",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-iso-8859-16.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"KOI8-R",
|
|
||||||
"KOI8R",
|
|
||||||
"",
|
|
||||||
"KOI8R",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-koi8-r.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"KOI8-U",
|
|
||||||
"KOI8U",
|
|
||||||
"",
|
|
||||||
"KOI8U",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-koi8-u.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Macintosh",
|
|
||||||
"Macintosh",
|
|
||||||
"",
|
|
||||||
"Macintosh",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-macintosh.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Macintosh Cyrillic",
|
|
||||||
"MacintoshCyrillic",
|
|
||||||
"",
|
|
||||||
"MacintoshCyrillic",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-x-mac-cyrillic.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Windows 874",
|
|
||||||
"Windows874",
|
|
||||||
"",
|
|
||||||
"Windows874",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-windows-874.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Windows 1250",
|
|
||||||
"Windows1250",
|
|
||||||
"",
|
|
||||||
"Windows1250",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-windows-1250.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Windows 1251",
|
|
||||||
"Windows1251",
|
|
||||||
"",
|
|
||||||
"Windows1251",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-windows-1251.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Windows 1252",
|
|
||||||
"Windows1252",
|
|
||||||
"",
|
|
||||||
"Windows1252",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-windows-1252.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Windows 1253",
|
|
||||||
"Windows1253",
|
|
||||||
"",
|
|
||||||
"Windows1253",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-windows-1253.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Windows 1254",
|
|
||||||
"Windows1254",
|
|
||||||
"",
|
|
||||||
"Windows1254",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-windows-1254.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Windows 1255",
|
|
||||||
"Windows1255",
|
|
||||||
"",
|
|
||||||
"Windows1255",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-windows-1255.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Windows 1256",
|
|
||||||
"Windows1256",
|
|
||||||
"",
|
|
||||||
"Windows1256",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-windows-1256.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Windows 1257",
|
|
||||||
"Windows1257",
|
|
||||||
"",
|
|
||||||
"Windows1257",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-windows-1257.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Windows 1258",
|
|
||||||
"Windows1258",
|
|
||||||
"",
|
|
||||||
"Windows1258",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
"http://encoding.spec.whatwg.org/index-windows-1258.txt",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"X-User-Defined",
|
|
||||||
"XUserDefined",
|
|
||||||
"It is defined at http://encoding.spec.whatwg.org/#x-user-defined",
|
|
||||||
"XUserDefined",
|
|
||||||
encoding.ASCIISub,
|
|
||||||
ascii +
|
|
||||||
"\uf780\uf781\uf782\uf783\uf784\uf785\uf786\uf787" +
|
|
||||||
"\uf788\uf789\uf78a\uf78b\uf78c\uf78d\uf78e\uf78f" +
|
|
||||||
"\uf790\uf791\uf792\uf793\uf794\uf795\uf796\uf797" +
|
|
||||||
"\uf798\uf799\uf79a\uf79b\uf79c\uf79d\uf79e\uf79f" +
|
|
||||||
"\uf7a0\uf7a1\uf7a2\uf7a3\uf7a4\uf7a5\uf7a6\uf7a7" +
|
|
||||||
"\uf7a8\uf7a9\uf7aa\uf7ab\uf7ac\uf7ad\uf7ae\uf7af" +
|
|
||||||
"\uf7b0\uf7b1\uf7b2\uf7b3\uf7b4\uf7b5\uf7b6\uf7b7" +
|
|
||||||
"\uf7b8\uf7b9\uf7ba\uf7bb\uf7bc\uf7bd\uf7be\uf7bf" +
|
|
||||||
"\uf7c0\uf7c1\uf7c2\uf7c3\uf7c4\uf7c5\uf7c6\uf7c7" +
|
|
||||||
"\uf7c8\uf7c9\uf7ca\uf7cb\uf7cc\uf7cd\uf7ce\uf7cf" +
|
|
||||||
"\uf7d0\uf7d1\uf7d2\uf7d3\uf7d4\uf7d5\uf7d6\uf7d7" +
|
|
||||||
"\uf7d8\uf7d9\uf7da\uf7db\uf7dc\uf7dd\uf7de\uf7df" +
|
|
||||||
"\uf7e0\uf7e1\uf7e2\uf7e3\uf7e4\uf7e5\uf7e6\uf7e7" +
|
|
||||||
"\uf7e8\uf7e9\uf7ea\uf7eb\uf7ec\uf7ed\uf7ee\uf7ef" +
|
|
||||||
"\uf7f0\uf7f1\uf7f2\uf7f3\uf7f4\uf7f5\uf7f6\uf7f7" +
|
|
||||||
"\uf7f8\uf7f9\uf7fa\uf7fb\uf7fc\uf7fd\uf7fe\uf7ff",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func getWHATWG(url string) string {
|
|
||||||
res, err := http.Get(url)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("%q: Get: %v", url, err)
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
|
|
||||||
mapping := make([]rune, 128)
|
|
||||||
for i := range mapping {
|
|
||||||
mapping[i] = '\ufffd'
|
|
||||||
}
|
|
||||||
|
|
||||||
scanner := bufio.NewScanner(res.Body)
|
|
||||||
for scanner.Scan() {
|
|
||||||
s := strings.TrimSpace(scanner.Text())
|
|
||||||
if s == "" || s[0] == '#' {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
x, y := 0, 0
|
|
||||||
if _, err := fmt.Sscanf(s, "%d\t0x%x", &x, &y); err != nil {
|
|
||||||
log.Fatalf("could not parse %q", s)
|
|
||||||
}
|
|
||||||
if x < 0 || 128 <= x {
|
|
||||||
log.Fatalf("code %d is out of range", x)
|
|
||||||
}
|
|
||||||
if 0x80 <= y && y < 0xa0 {
|
|
||||||
// We diverge from the WHATWG spec by mapping control characters
|
|
||||||
// in the range [0x80, 0xa0) to U+FFFD.
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
mapping[x] = rune(y)
|
|
||||||
}
|
|
||||||
return ascii + string(mapping)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getUCM(url string) string {
|
|
||||||
res, err := http.Get(url)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("%q: Get: %v", url, err)
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
|
|
||||||
mapping := make([]rune, 256)
|
|
||||||
for i := range mapping {
|
|
||||||
mapping[i] = '\ufffd'
|
|
||||||
}
|
|
||||||
|
|
||||||
charsFound := 0
|
|
||||||
scanner := bufio.NewScanner(res.Body)
|
|
||||||
for scanner.Scan() {
|
|
||||||
s := strings.TrimSpace(scanner.Text())
|
|
||||||
if s == "" || s[0] == '#' {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
var c byte
|
|
||||||
var r rune
|
|
||||||
if _, err := fmt.Sscanf(s, `<U%x> \x%x |0`, &r, &c); err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
mapping[c] = r
|
|
||||||
charsFound++
|
|
||||||
}
|
|
||||||
|
|
||||||
if charsFound < 200 {
|
|
||||||
log.Fatalf("%q: only %d characters found (wrong page format?)", url, charsFound)
|
|
||||||
}
|
|
||||||
|
|
||||||
return string(mapping)
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
mibs := map[string]bool{}
|
|
||||||
all := []string{}
|
|
||||||
|
|
||||||
w := gen.NewCodeWriter()
|
|
||||||
defer w.WriteGoFile("tables.go", "charmap")
|
|
||||||
|
|
||||||
printf := func(s string, a ...interface{}) { fmt.Fprintf(w, s, a...) }
|
|
||||||
|
|
||||||
printf("import (\n")
|
|
||||||
printf("\t\"golang.org/x/text/encoding\"\n")
|
|
||||||
printf("\t\"golang.org/x/text/encoding/internal/identifier\"\n")
|
|
||||||
printf(")\n\n")
|
|
||||||
for _, e := range encodings {
|
|
||||||
varNames := strings.Split(e.varName, ",")
|
|
||||||
all = append(all, varNames...)
|
|
||||||
varName := varNames[0]
|
|
||||||
switch {
|
|
||||||
case strings.HasPrefix(e.mapping, "http://encoding.spec.whatwg.org/"):
|
|
||||||
e.mapping = getWHATWG(e.mapping)
|
|
||||||
case strings.HasPrefix(e.mapping, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/"):
|
|
||||||
e.mapping = getUCM(e.mapping)
|
|
||||||
}
|
|
||||||
|
|
||||||
asciiSuperset, low := strings.HasPrefix(e.mapping, ascii), 0x00
|
|
||||||
if asciiSuperset {
|
|
||||||
low = 0x80
|
|
||||||
}
|
|
||||||
lvn := 1
|
|
||||||
if strings.HasPrefix(varName, "ISO") || strings.HasPrefix(varName, "KOI") {
|
|
||||||
lvn = 3
|
|
||||||
}
|
|
||||||
lowerVarName := strings.ToLower(varName[:lvn]) + varName[lvn:]
|
|
||||||
printf("// %s is the %s encoding.\n", varName, e.name)
|
|
||||||
if e.comment != "" {
|
|
||||||
printf("//\n// %s\n", e.comment)
|
|
||||||
}
|
|
||||||
printf("var %s *Charmap = &%s\n\nvar %s = Charmap{\nname: %q,\n",
|
|
||||||
varName, lowerVarName, lowerVarName, e.name)
|
|
||||||
if mibs[e.mib] {
|
|
||||||
log.Fatalf("MIB type %q declared multiple times.", e.mib)
|
|
||||||
}
|
|
||||||
printf("mib: identifier.%s,\n", e.mib)
|
|
||||||
printf("asciiSuperset: %t,\n", asciiSuperset)
|
|
||||||
printf("low: 0x%02x,\n", low)
|
|
||||||
printf("replacement: 0x%02x,\n", e.replacement)
|
|
||||||
|
|
||||||
printf("decode: [256]utf8Enc{\n")
|
|
||||||
i, backMapping := 0, map[rune]byte{}
|
|
||||||
for _, c := range e.mapping {
|
|
||||||
if _, ok := backMapping[c]; !ok && c != utf8.RuneError {
|
|
||||||
backMapping[c] = byte(i)
|
|
||||||
}
|
|
||||||
var buf [8]byte
|
|
||||||
n := utf8.EncodeRune(buf[:], c)
|
|
||||||
if n > 3 {
|
|
||||||
panic(fmt.Sprintf("rune %q (%U) is too long", c, c))
|
|
||||||
}
|
|
||||||
printf("{%d,[3]byte{0x%02x,0x%02x,0x%02x}},", n, buf[0], buf[1], buf[2])
|
|
||||||
if i%2 == 1 {
|
|
||||||
printf("\n")
|
|
||||||
}
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
printf("},\n")
|
|
||||||
|
|
||||||
printf("encode: [256]uint32{\n")
|
|
||||||
encode := make([]uint32, 0, 256)
|
|
||||||
for c, i := range backMapping {
|
|
||||||
encode = append(encode, uint32(i)<<24|uint32(c))
|
|
||||||
}
|
|
||||||
sort.Sort(byRune(encode))
|
|
||||||
for len(encode) < cap(encode) {
|
|
||||||
encode = append(encode, encode[len(encode)-1])
|
|
||||||
}
|
|
||||||
for i, enc := range encode {
|
|
||||||
printf("0x%08x,", enc)
|
|
||||||
if i%8 == 7 {
|
|
||||||
printf("\n")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printf("},\n}\n")
|
|
||||||
|
|
||||||
// Add an estimate of the size of a single Charmap{} struct value, which
|
|
||||||
// includes two 256 elem arrays of 4 bytes and some extra fields, which
|
|
||||||
// align to 3 uint64s on 64-bit architectures.
|
|
||||||
w.Size += 2*4*256 + 3*8
|
|
||||||
}
|
|
||||||
// TODO: add proper line breaking.
|
|
||||||
printf("var listAll = []encoding.Encoding{\n%s,\n}\n\n", strings.Join(all, ",\n"))
|
|
||||||
}
|
|
||||||
|
|
||||||
type byRune []uint32
|
|
||||||
|
|
||||||
func (b byRune) Len() int { return len(b) }
|
|
||||||
func (b byRune) Less(i, j int) bool { return b[i]&0xffffff < b[j]&0xffffff }
|
|
||||||
func (b byRune) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
|
|
173
vendor/golang.org/x/text/encoding/htmlindex/gen.go
generated
vendored
173
vendor/golang.org/x/text/encoding/htmlindex/gen.go
generated
vendored
@ -1,173 +0,0 @@
|
|||||||
// Copyright 2015 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"golang.org/x/text/internal/gen"
|
|
||||||
)
|
|
||||||
|
|
||||||
type group struct {
|
|
||||||
Encodings []struct {
|
|
||||||
Labels []string
|
|
||||||
Name string
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
gen.Init()
|
|
||||||
|
|
||||||
r := gen.Open("https://encoding.spec.whatwg.org", "whatwg", "encodings.json")
|
|
||||||
var groups []group
|
|
||||||
if err := json.NewDecoder(r).Decode(&groups); err != nil {
|
|
||||||
log.Fatalf("Error reading encodings.json: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
w := &bytes.Buffer{}
|
|
||||||
fmt.Fprintln(w, "type htmlEncoding byte")
|
|
||||||
fmt.Fprintln(w, "const (")
|
|
||||||
for i, g := range groups {
|
|
||||||
for _, e := range g.Encodings {
|
|
||||||
key := strings.ToLower(e.Name)
|
|
||||||
name := consts[key]
|
|
||||||
if name == "" {
|
|
||||||
log.Fatalf("No const defined for %s.", key)
|
|
||||||
}
|
|
||||||
if i == 0 {
|
|
||||||
fmt.Fprintf(w, "%s htmlEncoding = iota\n", name)
|
|
||||||
} else {
|
|
||||||
fmt.Fprintf(w, "%s\n", name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Fprintln(w, "numEncodings")
|
|
||||||
fmt.Fprint(w, ")\n\n")
|
|
||||||
|
|
||||||
fmt.Fprintln(w, "var canonical = [numEncodings]string{")
|
|
||||||
for _, g := range groups {
|
|
||||||
for _, e := range g.Encodings {
|
|
||||||
fmt.Fprintf(w, "%q,\n", strings.ToLower(e.Name))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Fprint(w, "}\n\n")
|
|
||||||
|
|
||||||
fmt.Fprintln(w, "var nameMap = map[string]htmlEncoding{")
|
|
||||||
for _, g := range groups {
|
|
||||||
for _, e := range g.Encodings {
|
|
||||||
for _, l := range e.Labels {
|
|
||||||
key := strings.ToLower(e.Name)
|
|
||||||
name := consts[key]
|
|
||||||
fmt.Fprintf(w, "%q: %s,\n", l, name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Fprint(w, "}\n\n")
|
|
||||||
|
|
||||||
var tags []string
|
|
||||||
fmt.Fprintln(w, "var localeMap = []htmlEncoding{")
|
|
||||||
for _, loc := range locales {
|
|
||||||
tags = append(tags, loc.tag)
|
|
||||||
fmt.Fprintf(w, "%s, // %s \n", consts[loc.name], loc.tag)
|
|
||||||
}
|
|
||||||
fmt.Fprint(w, "}\n\n")
|
|
||||||
|
|
||||||
fmt.Fprintf(w, "const locales = %q\n", strings.Join(tags, " "))
|
|
||||||
|
|
||||||
gen.WriteGoFile("tables.go", "htmlindex", w.Bytes())
|
|
||||||
}
|
|
||||||
|
|
||||||
// consts maps canonical encoding name to internal constant.
|
|
||||||
var consts = map[string]string{
|
|
||||||
"utf-8": "utf8",
|
|
||||||
"ibm866": "ibm866",
|
|
||||||
"iso-8859-2": "iso8859_2",
|
|
||||||
"iso-8859-3": "iso8859_3",
|
|
||||||
"iso-8859-4": "iso8859_4",
|
|
||||||
"iso-8859-5": "iso8859_5",
|
|
||||||
"iso-8859-6": "iso8859_6",
|
|
||||||
"iso-8859-7": "iso8859_7",
|
|
||||||
"iso-8859-8": "iso8859_8",
|
|
||||||
"iso-8859-8-i": "iso8859_8I",
|
|
||||||
"iso-8859-10": "iso8859_10",
|
|
||||||
"iso-8859-13": "iso8859_13",
|
|
||||||
"iso-8859-14": "iso8859_14",
|
|
||||||
"iso-8859-15": "iso8859_15",
|
|
||||||
"iso-8859-16": "iso8859_16",
|
|
||||||
"koi8-r": "koi8r",
|
|
||||||
"koi8-u": "koi8u",
|
|
||||||
"macintosh": "macintosh",
|
|
||||||
"windows-874": "windows874",
|
|
||||||
"windows-1250": "windows1250",
|
|
||||||
"windows-1251": "windows1251",
|
|
||||||
"windows-1252": "windows1252",
|
|
||||||
"windows-1253": "windows1253",
|
|
||||||
"windows-1254": "windows1254",
|
|
||||||
"windows-1255": "windows1255",
|
|
||||||
"windows-1256": "windows1256",
|
|
||||||
"windows-1257": "windows1257",
|
|
||||||
"windows-1258": "windows1258",
|
|
||||||
"x-mac-cyrillic": "macintoshCyrillic",
|
|
||||||
"gbk": "gbk",
|
|
||||||
"gb18030": "gb18030",
|
|
||||||
// "hz-gb-2312": "hzgb2312", // Was removed from WhatWG
|
|
||||||
"big5": "big5",
|
|
||||||
"euc-jp": "eucjp",
|
|
||||||
"iso-2022-jp": "iso2022jp",
|
|
||||||
"shift_jis": "shiftJIS",
|
|
||||||
"euc-kr": "euckr",
|
|
||||||
"replacement": "replacement",
|
|
||||||
"utf-16be": "utf16be",
|
|
||||||
"utf-16le": "utf16le",
|
|
||||||
"x-user-defined": "xUserDefined",
|
|
||||||
}
|
|
||||||
|
|
||||||
// locales is taken from
|
|
||||||
// https://html.spec.whatwg.org/multipage/syntax.html#encoding-sniffing-algorithm.
|
|
||||||
var locales = []struct{ tag, name string }{
|
|
||||||
// The default value. Explicitly state latin to benefit from the exact
|
|
||||||
// script option, while still making 1252 the default encoding for languages
|
|
||||||
// written in Latin script.
|
|
||||||
{"und_Latn", "windows-1252"},
|
|
||||||
{"ar", "windows-1256"},
|
|
||||||
{"ba", "windows-1251"},
|
|
||||||
{"be", "windows-1251"},
|
|
||||||
{"bg", "windows-1251"},
|
|
||||||
{"cs", "windows-1250"},
|
|
||||||
{"el", "iso-8859-7"},
|
|
||||||
{"et", "windows-1257"},
|
|
||||||
{"fa", "windows-1256"},
|
|
||||||
{"he", "windows-1255"},
|
|
||||||
{"hr", "windows-1250"},
|
|
||||||
{"hu", "iso-8859-2"},
|
|
||||||
{"ja", "shift_jis"},
|
|
||||||
{"kk", "windows-1251"},
|
|
||||||
{"ko", "euc-kr"},
|
|
||||||
{"ku", "windows-1254"},
|
|
||||||
{"ky", "windows-1251"},
|
|
||||||
{"lt", "windows-1257"},
|
|
||||||
{"lv", "windows-1257"},
|
|
||||||
{"mk", "windows-1251"},
|
|
||||||
{"pl", "iso-8859-2"},
|
|
||||||
{"ru", "windows-1251"},
|
|
||||||
{"sah", "windows-1251"},
|
|
||||||
{"sk", "windows-1250"},
|
|
||||||
{"sl", "iso-8859-2"},
|
|
||||||
{"sr", "windows-1251"},
|
|
||||||
{"tg", "windows-1251"},
|
|
||||||
{"th", "windows-874"},
|
|
||||||
{"tr", "windows-1254"},
|
|
||||||
{"tt", "windows-1251"},
|
|
||||||
{"uk", "windows-1251"},
|
|
||||||
{"vi", "windows-1258"},
|
|
||||||
{"zh-hans", "gb18030"},
|
|
||||||
{"zh-hant", "big5"},
|
|
||||||
}
|
|
142
vendor/golang.org/x/text/encoding/internal/identifier/gen.go
generated
vendored
142
vendor/golang.org/x/text/encoding/internal/identifier/gen.go
generated
vendored
@ -1,142 +0,0 @@
|
|||||||
// Copyright 2015 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/xml"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"log"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"golang.org/x/text/internal/gen"
|
|
||||||
)
|
|
||||||
|
|
||||||
type registry struct {
|
|
||||||
XMLName xml.Name `xml:"registry"`
|
|
||||||
Updated string `xml:"updated"`
|
|
||||||
Registry []struct {
|
|
||||||
ID string `xml:"id,attr"`
|
|
||||||
Record []struct {
|
|
||||||
Name string `xml:"name"`
|
|
||||||
Xref []struct {
|
|
||||||
Type string `xml:"type,attr"`
|
|
||||||
Data string `xml:"data,attr"`
|
|
||||||
} `xml:"xref"`
|
|
||||||
Desc struct {
|
|
||||||
Data string `xml:",innerxml"`
|
|
||||||
// Any []struct {
|
|
||||||
// Data string `xml:",chardata"`
|
|
||||||
// } `xml:",any"`
|
|
||||||
// Data string `xml:",chardata"`
|
|
||||||
} `xml:"description,"`
|
|
||||||
MIB string `xml:"value"`
|
|
||||||
Alias []string `xml:"alias"`
|
|
||||||
MIME string `xml:"preferred_alias"`
|
|
||||||
} `xml:"record"`
|
|
||||||
} `xml:"registry"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
r := gen.OpenIANAFile("assignments/character-sets/character-sets.xml")
|
|
||||||
reg := ®istry{}
|
|
||||||
if err := xml.NewDecoder(r).Decode(®); err != nil && err != io.EOF {
|
|
||||||
log.Fatalf("Error decoding charset registry: %v", err)
|
|
||||||
}
|
|
||||||
if len(reg.Registry) == 0 || reg.Registry[0].ID != "character-sets-1" {
|
|
||||||
log.Fatalf("Unexpected ID %s", reg.Registry[0].ID)
|
|
||||||
}
|
|
||||||
|
|
||||||
w := &bytes.Buffer{}
|
|
||||||
fmt.Fprintf(w, "const (\n")
|
|
||||||
for _, rec := range reg.Registry[0].Record {
|
|
||||||
constName := ""
|
|
||||||
for _, a := range rec.Alias {
|
|
||||||
if strings.HasPrefix(a, "cs") && strings.IndexByte(a, '-') == -1 {
|
|
||||||
// Some of the constant definitions have comments in them. Strip those.
|
|
||||||
constName = strings.Title(strings.SplitN(a[2:], "\n", 2)[0])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if constName == "" {
|
|
||||||
switch rec.MIB {
|
|
||||||
case "2085":
|
|
||||||
constName = "HZGB2312" // Not listed as alias for some reason.
|
|
||||||
default:
|
|
||||||
log.Fatalf("No cs alias defined for %s.", rec.MIB)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if rec.MIME != "" {
|
|
||||||
rec.MIME = fmt.Sprintf(" (MIME: %s)", rec.MIME)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, "// %s is the MIB identifier with IANA name %s%s.\n//\n", constName, rec.Name, rec.MIME)
|
|
||||||
if len(rec.Desc.Data) > 0 {
|
|
||||||
fmt.Fprint(w, "// ")
|
|
||||||
d := xml.NewDecoder(strings.NewReader(rec.Desc.Data))
|
|
||||||
inElem := true
|
|
||||||
attr := ""
|
|
||||||
for {
|
|
||||||
t, err := d.Token()
|
|
||||||
if err != nil {
|
|
||||||
if err != io.EOF {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
switch x := t.(type) {
|
|
||||||
case xml.CharData:
|
|
||||||
attr = "" // Don't need attribute info.
|
|
||||||
a := bytes.Split([]byte(x), []byte("\n"))
|
|
||||||
for i, b := range a {
|
|
||||||
if b = bytes.TrimSpace(b); len(b) != 0 {
|
|
||||||
if !inElem && i > 0 {
|
|
||||||
fmt.Fprint(w, "\n// ")
|
|
||||||
}
|
|
||||||
inElem = false
|
|
||||||
fmt.Fprintf(w, "%s ", string(b))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case xml.StartElement:
|
|
||||||
if x.Name.Local == "xref" {
|
|
||||||
inElem = true
|
|
||||||
use := false
|
|
||||||
for _, a := range x.Attr {
|
|
||||||
if a.Name.Local == "type" {
|
|
||||||
use = use || a.Value != "person"
|
|
||||||
}
|
|
||||||
if a.Name.Local == "data" && use {
|
|
||||||
// Patch up URLs to use https. From some links, the
|
|
||||||
// https version is different from the http one.
|
|
||||||
s := a.Value
|
|
||||||
s = strings.Replace(s, "http://", "https://", -1)
|
|
||||||
s = strings.Replace(s, "/unicode/", "/", -1)
|
|
||||||
attr = s + " "
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case xml.EndElement:
|
|
||||||
inElem = false
|
|
||||||
fmt.Fprint(w, attr)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Fprint(w, "\n")
|
|
||||||
}
|
|
||||||
for _, x := range rec.Xref {
|
|
||||||
switch x.Type {
|
|
||||||
case "rfc":
|
|
||||||
fmt.Fprintf(w, "// Reference: %s\n", strings.ToUpper(x.Data))
|
|
||||||
case "uri":
|
|
||||||
fmt.Fprintf(w, "// Reference: %s\n", x.Data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, "%s MIB = %s\n", constName, rec.MIB)
|
|
||||||
fmt.Fprintln(w)
|
|
||||||
}
|
|
||||||
fmt.Fprintln(w, ")")
|
|
||||||
|
|
||||||
gen.WriteGoFile("mib.go", "identifier", w.Bytes())
|
|
||||||
}
|
|
161
vendor/golang.org/x/text/encoding/japanese/maketables.go
generated
vendored
161
vendor/golang.org/x/text/encoding/japanese/maketables.go
generated
vendored
@ -1,161 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
// This program generates tables.go:
|
|
||||||
// go run maketables.go | gofmt > tables.go
|
|
||||||
|
|
||||||
// TODO: Emoji extensions?
|
|
||||||
// https://www.unicode.org/faq/emoji_dingbats.html
|
|
||||||
// https://www.unicode.org/Public/UNIDATA/EmojiSources.txt
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type entry struct {
|
|
||||||
jisCode, table int
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n")
|
|
||||||
fmt.Printf("// Package japanese provides Japanese encodings such as EUC-JP and Shift JIS.\n")
|
|
||||||
fmt.Printf(`package japanese // import "golang.org/x/text/encoding/japanese"` + "\n\n")
|
|
||||||
|
|
||||||
reverse := [65536]entry{}
|
|
||||||
for i := range reverse {
|
|
||||||
reverse[i].table = -1
|
|
||||||
}
|
|
||||||
|
|
||||||
tables := []struct {
|
|
||||||
url string
|
|
||||||
name string
|
|
||||||
}{
|
|
||||||
{"http://encoding.spec.whatwg.org/index-jis0208.txt", "0208"},
|
|
||||||
{"http://encoding.spec.whatwg.org/index-jis0212.txt", "0212"},
|
|
||||||
}
|
|
||||||
for i, table := range tables {
|
|
||||||
res, err := http.Get(table.url)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("%q: Get: %v", table.url, err)
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
|
|
||||||
mapping := [65536]uint16{}
|
|
||||||
|
|
||||||
scanner := bufio.NewScanner(res.Body)
|
|
||||||
for scanner.Scan() {
|
|
||||||
s := strings.TrimSpace(scanner.Text())
|
|
||||||
if s == "" || s[0] == '#' {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
x, y := 0, uint16(0)
|
|
||||||
if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil {
|
|
||||||
log.Fatalf("%q: could not parse %q", table.url, s)
|
|
||||||
}
|
|
||||||
if x < 0 || 120*94 <= x {
|
|
||||||
log.Fatalf("%q: JIS code %d is out of range", table.url, x)
|
|
||||||
}
|
|
||||||
mapping[x] = y
|
|
||||||
if reverse[y].table == -1 {
|
|
||||||
reverse[y] = entry{jisCode: x, table: i}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err := scanner.Err(); err != nil {
|
|
||||||
log.Fatalf("%q: scanner error: %v", table.url, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("// jis%sDecode is the decoding table from JIS %s code to Unicode.\n// It is defined at %s\n",
|
|
||||||
table.name, table.name, table.url)
|
|
||||||
fmt.Printf("var jis%sDecode = [...]uint16{\n", table.name)
|
|
||||||
for i, m := range mapping {
|
|
||||||
if m != 0 {
|
|
||||||
fmt.Printf("\t%d: 0x%04X,\n", i, m)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Printf("}\n\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Any run of at least separation continuous zero entries in the reverse map will
|
|
||||||
// be a separate encode table.
|
|
||||||
const separation = 1024
|
|
||||||
|
|
||||||
intervals := []interval(nil)
|
|
||||||
low, high := -1, -1
|
|
||||||
for i, v := range reverse {
|
|
||||||
if v.table == -1 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if low < 0 {
|
|
||||||
low = i
|
|
||||||
} else if i-high >= separation {
|
|
||||||
if high >= 0 {
|
|
||||||
intervals = append(intervals, interval{low, high})
|
|
||||||
}
|
|
||||||
low = i
|
|
||||||
}
|
|
||||||
high = i + 1
|
|
||||||
}
|
|
||||||
if high >= 0 {
|
|
||||||
intervals = append(intervals, interval{low, high})
|
|
||||||
}
|
|
||||||
sort.Sort(byDecreasingLength(intervals))
|
|
||||||
|
|
||||||
fmt.Printf("const (\n")
|
|
||||||
fmt.Printf("\tjis0208 = 1\n")
|
|
||||||
fmt.Printf("\tjis0212 = 2\n")
|
|
||||||
fmt.Printf("\tcodeMask = 0x7f\n")
|
|
||||||
fmt.Printf("\tcodeShift = 7\n")
|
|
||||||
fmt.Printf("\ttableShift = 14\n")
|
|
||||||
fmt.Printf(")\n\n")
|
|
||||||
|
|
||||||
fmt.Printf("const numEncodeTables = %d\n\n", len(intervals))
|
|
||||||
fmt.Printf("// encodeX are the encoding tables from Unicode to JIS code,\n")
|
|
||||||
fmt.Printf("// sorted by decreasing length.\n")
|
|
||||||
for i, v := range intervals {
|
|
||||||
fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high)
|
|
||||||
}
|
|
||||||
fmt.Printf("//\n")
|
|
||||||
fmt.Printf("// The high two bits of the value record whether the JIS code comes from the\n")
|
|
||||||
fmt.Printf("// JIS0208 table (high bits == 1) or the JIS0212 table (high bits == 2).\n")
|
|
||||||
fmt.Printf("// The low 14 bits are two 7-bit unsigned integers j1 and j2 that form the\n")
|
|
||||||
fmt.Printf("// JIS code (94*j1 + j2) within that table.\n")
|
|
||||||
fmt.Printf("\n")
|
|
||||||
|
|
||||||
for i, v := range intervals {
|
|
||||||
fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high)
|
|
||||||
fmt.Printf("var encode%d = [...]uint16{\n", i)
|
|
||||||
for j := v.low; j < v.high; j++ {
|
|
||||||
x := reverse[j]
|
|
||||||
if x.table == -1 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Printf("\t%d - %d: jis%s<<14 | 0x%02X<<7 | 0x%02X,\n",
|
|
||||||
j, v.low, tables[x.table].name, x.jisCode/94, x.jisCode%94)
|
|
||||||
}
|
|
||||||
fmt.Printf("}\n\n")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// interval is a half-open interval [low, high).
|
|
||||||
type interval struct {
|
|
||||||
low, high int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i interval) len() int { return i.high - i.low }
|
|
||||||
|
|
||||||
// byDecreasingLength sorts intervals by decreasing length.
|
|
||||||
type byDecreasingLength []interval
|
|
||||||
|
|
||||||
func (b byDecreasingLength) Len() int { return len(b) }
|
|
||||||
func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() }
|
|
||||||
func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
|
|
143
vendor/golang.org/x/text/encoding/korean/maketables.go
generated
vendored
143
vendor/golang.org/x/text/encoding/korean/maketables.go
generated
vendored
@ -1,143 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
// This program generates tables.go:
|
|
||||||
// go run maketables.go | gofmt > tables.go
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n")
|
|
||||||
fmt.Printf("// Package korean provides Korean encodings such as EUC-KR.\n")
|
|
||||||
fmt.Printf(`package korean // import "golang.org/x/text/encoding/korean"` + "\n\n")
|
|
||||||
|
|
||||||
res, err := http.Get("http://encoding.spec.whatwg.org/index-euc-kr.txt")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Get: %v", err)
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
|
|
||||||
mapping := [65536]uint16{}
|
|
||||||
reverse := [65536]uint16{}
|
|
||||||
|
|
||||||
scanner := bufio.NewScanner(res.Body)
|
|
||||||
for scanner.Scan() {
|
|
||||||
s := strings.TrimSpace(scanner.Text())
|
|
||||||
if s == "" || s[0] == '#' {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
x, y := uint16(0), uint16(0)
|
|
||||||
if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil {
|
|
||||||
log.Fatalf("could not parse %q", s)
|
|
||||||
}
|
|
||||||
if x < 0 || 178*(0xc7-0x81)+(0xfe-0xc7)*94+(0xff-0xa1) <= x {
|
|
||||||
log.Fatalf("EUC-KR code %d is out of range", x)
|
|
||||||
}
|
|
||||||
mapping[x] = y
|
|
||||||
if reverse[y] == 0 {
|
|
||||||
c0, c1 := uint16(0), uint16(0)
|
|
||||||
if x < 178*(0xc7-0x81) {
|
|
||||||
c0 = uint16(x/178) + 0x81
|
|
||||||
c1 = uint16(x % 178)
|
|
||||||
switch {
|
|
||||||
case c1 < 1*26:
|
|
||||||
c1 += 0x41
|
|
||||||
case c1 < 2*26:
|
|
||||||
c1 += 0x47
|
|
||||||
default:
|
|
||||||
c1 += 0x4d
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
x -= 178 * (0xc7 - 0x81)
|
|
||||||
c0 = uint16(x/94) + 0xc7
|
|
||||||
c1 = uint16(x%94) + 0xa1
|
|
||||||
}
|
|
||||||
reverse[y] = c0<<8 | c1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err := scanner.Err(); err != nil {
|
|
||||||
log.Fatalf("scanner error: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("// decode is the decoding table from EUC-KR code to Unicode.\n")
|
|
||||||
fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-euc-kr.txt\n")
|
|
||||||
fmt.Printf("var decode = [...]uint16{\n")
|
|
||||||
for i, v := range mapping {
|
|
||||||
if v != 0 {
|
|
||||||
fmt.Printf("\t%d: 0x%04X,\n", i, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Printf("}\n\n")
|
|
||||||
|
|
||||||
// Any run of at least separation continuous zero entries in the reverse map will
|
|
||||||
// be a separate encode table.
|
|
||||||
const separation = 1024
|
|
||||||
|
|
||||||
intervals := []interval(nil)
|
|
||||||
low, high := -1, -1
|
|
||||||
for i, v := range reverse {
|
|
||||||
if v == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if low < 0 {
|
|
||||||
low = i
|
|
||||||
} else if i-high >= separation {
|
|
||||||
if high >= 0 {
|
|
||||||
intervals = append(intervals, interval{low, high})
|
|
||||||
}
|
|
||||||
low = i
|
|
||||||
}
|
|
||||||
high = i + 1
|
|
||||||
}
|
|
||||||
if high >= 0 {
|
|
||||||
intervals = append(intervals, interval{low, high})
|
|
||||||
}
|
|
||||||
sort.Sort(byDecreasingLength(intervals))
|
|
||||||
|
|
||||||
fmt.Printf("const numEncodeTables = %d\n\n", len(intervals))
|
|
||||||
fmt.Printf("// encodeX are the encoding tables from Unicode to EUC-KR code,\n")
|
|
||||||
fmt.Printf("// sorted by decreasing length.\n")
|
|
||||||
for i, v := range intervals {
|
|
||||||
fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high)
|
|
||||||
}
|
|
||||||
fmt.Printf("\n")
|
|
||||||
|
|
||||||
for i, v := range intervals {
|
|
||||||
fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high)
|
|
||||||
fmt.Printf("var encode%d = [...]uint16{\n", i)
|
|
||||||
for j := v.low; j < v.high; j++ {
|
|
||||||
x := reverse[j]
|
|
||||||
if x == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x)
|
|
||||||
}
|
|
||||||
fmt.Printf("}\n\n")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// interval is a half-open interval [low, high).
|
|
||||||
type interval struct {
|
|
||||||
low, high int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i interval) len() int { return i.high - i.low }
|
|
||||||
|
|
||||||
// byDecreasingLength sorts intervals by decreasing length.
|
|
||||||
type byDecreasingLength []interval
|
|
||||||
|
|
||||||
func (b byDecreasingLength) Len() int { return len(b) }
|
|
||||||
func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() }
|
|
||||||
func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
|
|
161
vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go
generated
vendored
161
vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go
generated
vendored
@ -1,161 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
// This program generates tables.go:
|
|
||||||
// go run maketables.go | gofmt > tables.go
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n")
|
|
||||||
fmt.Printf("// Package simplifiedchinese provides Simplified Chinese encodings such as GBK.\n")
|
|
||||||
fmt.Printf(`package simplifiedchinese // import "golang.org/x/text/encoding/simplifiedchinese"` + "\n\n")
|
|
||||||
|
|
||||||
printGB18030()
|
|
||||||
printGBK()
|
|
||||||
}
|
|
||||||
|
|
||||||
func printGB18030() {
|
|
||||||
res, err := http.Get("http://encoding.spec.whatwg.org/index-gb18030.txt")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Get: %v", err)
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
|
|
||||||
fmt.Printf("// gb18030 is the table from http://encoding.spec.whatwg.org/index-gb18030.txt\n")
|
|
||||||
fmt.Printf("var gb18030 = [...][2]uint16{\n")
|
|
||||||
scanner := bufio.NewScanner(res.Body)
|
|
||||||
for scanner.Scan() {
|
|
||||||
s := strings.TrimSpace(scanner.Text())
|
|
||||||
if s == "" || s[0] == '#' {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
x, y := uint32(0), uint32(0)
|
|
||||||
if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil {
|
|
||||||
log.Fatalf("could not parse %q", s)
|
|
||||||
}
|
|
||||||
if x < 0x10000 && y < 0x10000 {
|
|
||||||
fmt.Printf("\t{0x%04x, 0x%04x},\n", x, y)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Printf("}\n\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
func printGBK() {
|
|
||||||
res, err := http.Get("http://encoding.spec.whatwg.org/index-gbk.txt")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Get: %v", err)
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
|
|
||||||
mapping := [65536]uint16{}
|
|
||||||
reverse := [65536]uint16{}
|
|
||||||
|
|
||||||
scanner := bufio.NewScanner(res.Body)
|
|
||||||
for scanner.Scan() {
|
|
||||||
s := strings.TrimSpace(scanner.Text())
|
|
||||||
if s == "" || s[0] == '#' {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
x, y := uint16(0), uint16(0)
|
|
||||||
if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil {
|
|
||||||
log.Fatalf("could not parse %q", s)
|
|
||||||
}
|
|
||||||
if x < 0 || 126*190 <= x {
|
|
||||||
log.Fatalf("GBK code %d is out of range", x)
|
|
||||||
}
|
|
||||||
mapping[x] = y
|
|
||||||
if reverse[y] == 0 {
|
|
||||||
c0, c1 := x/190, x%190
|
|
||||||
if c1 >= 0x3f {
|
|
||||||
c1++
|
|
||||||
}
|
|
||||||
reverse[y] = (0x81+c0)<<8 | (0x40 + c1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err := scanner.Err(); err != nil {
|
|
||||||
log.Fatalf("scanner error: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("// decode is the decoding table from GBK code to Unicode.\n")
|
|
||||||
fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-gbk.txt\n")
|
|
||||||
fmt.Printf("var decode = [...]uint16{\n")
|
|
||||||
for i, v := range mapping {
|
|
||||||
if v != 0 {
|
|
||||||
fmt.Printf("\t%d: 0x%04X,\n", i, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Printf("}\n\n")
|
|
||||||
|
|
||||||
// Any run of at least separation continuous zero entries in the reverse map will
|
|
||||||
// be a separate encode table.
|
|
||||||
const separation = 1024
|
|
||||||
|
|
||||||
intervals := []interval(nil)
|
|
||||||
low, high := -1, -1
|
|
||||||
for i, v := range reverse {
|
|
||||||
if v == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if low < 0 {
|
|
||||||
low = i
|
|
||||||
} else if i-high >= separation {
|
|
||||||
if high >= 0 {
|
|
||||||
intervals = append(intervals, interval{low, high})
|
|
||||||
}
|
|
||||||
low = i
|
|
||||||
}
|
|
||||||
high = i + 1
|
|
||||||
}
|
|
||||||
if high >= 0 {
|
|
||||||
intervals = append(intervals, interval{low, high})
|
|
||||||
}
|
|
||||||
sort.Sort(byDecreasingLength(intervals))
|
|
||||||
|
|
||||||
fmt.Printf("const numEncodeTables = %d\n\n", len(intervals))
|
|
||||||
fmt.Printf("// encodeX are the encoding tables from Unicode to GBK code,\n")
|
|
||||||
fmt.Printf("// sorted by decreasing length.\n")
|
|
||||||
for i, v := range intervals {
|
|
||||||
fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high)
|
|
||||||
}
|
|
||||||
fmt.Printf("\n")
|
|
||||||
|
|
||||||
for i, v := range intervals {
|
|
||||||
fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high)
|
|
||||||
fmt.Printf("var encode%d = [...]uint16{\n", i)
|
|
||||||
for j := v.low; j < v.high; j++ {
|
|
||||||
x := reverse[j]
|
|
||||||
if x == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x)
|
|
||||||
}
|
|
||||||
fmt.Printf("}\n\n")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// interval is a half-open interval [low, high).
|
|
||||||
type interval struct {
|
|
||||||
low, high int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i interval) len() int { return i.high - i.low }
|
|
||||||
|
|
||||||
// byDecreasingLength sorts intervals by decreasing length.
|
|
||||||
type byDecreasingLength []interval
|
|
||||||
|
|
||||||
func (b byDecreasingLength) Len() int { return len(b) }
|
|
||||||
func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() }
|
|
||||||
func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
|
|
140
vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go
generated
vendored
140
vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go
generated
vendored
@ -1,140 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
// This program generates tables.go:
|
|
||||||
// go run maketables.go | gofmt > tables.go
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n")
|
|
||||||
fmt.Printf("// Package traditionalchinese provides Traditional Chinese encodings such as Big5.\n")
|
|
||||||
fmt.Printf(`package traditionalchinese // import "golang.org/x/text/encoding/traditionalchinese"` + "\n\n")
|
|
||||||
|
|
||||||
res, err := http.Get("http://encoding.spec.whatwg.org/index-big5.txt")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Get: %v", err)
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
|
|
||||||
mapping := [65536]uint32{}
|
|
||||||
reverse := [65536 * 4]uint16{}
|
|
||||||
|
|
||||||
scanner := bufio.NewScanner(res.Body)
|
|
||||||
for scanner.Scan() {
|
|
||||||
s := strings.TrimSpace(scanner.Text())
|
|
||||||
if s == "" || s[0] == '#' {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
x, y := uint16(0), uint32(0)
|
|
||||||
if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil {
|
|
||||||
log.Fatalf("could not parse %q", s)
|
|
||||||
}
|
|
||||||
if x < 0 || 126*157 <= x {
|
|
||||||
log.Fatalf("Big5 code %d is out of range", x)
|
|
||||||
}
|
|
||||||
mapping[x] = y
|
|
||||||
|
|
||||||
// The WHATWG spec http://encoding.spec.whatwg.org/#indexes says that
|
|
||||||
// "The index pointer for code point in index is the first pointer
|
|
||||||
// corresponding to code point in index", which would normally mean
|
|
||||||
// that the code below should be guarded by "if reverse[y] == 0", but
|
|
||||||
// last instead of first seems to match the behavior of
|
|
||||||
// "iconv -f UTF-8 -t BIG5". For example, U+8005 者 occurs twice in
|
|
||||||
// http://encoding.spec.whatwg.org/index-big5.txt, as index 2148
|
|
||||||
// (encoded as "\x8e\xcd") and index 6543 (encoded as "\xaa\xcc")
|
|
||||||
// and "echo 者 | iconv -f UTF-8 -t BIG5 | xxd" gives "\xaa\xcc".
|
|
||||||
c0, c1 := x/157, x%157
|
|
||||||
if c1 < 0x3f {
|
|
||||||
c1 += 0x40
|
|
||||||
} else {
|
|
||||||
c1 += 0x62
|
|
||||||
}
|
|
||||||
reverse[y] = (0x81+c0)<<8 | c1
|
|
||||||
}
|
|
||||||
if err := scanner.Err(); err != nil {
|
|
||||||
log.Fatalf("scanner error: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("// decode is the decoding table from Big5 code to Unicode.\n")
|
|
||||||
fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-big5.txt\n")
|
|
||||||
fmt.Printf("var decode = [...]uint32{\n")
|
|
||||||
for i, v := range mapping {
|
|
||||||
if v != 0 {
|
|
||||||
fmt.Printf("\t%d: 0x%08X,\n", i, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Printf("}\n\n")
|
|
||||||
|
|
||||||
// Any run of at least separation continuous zero entries in the reverse map will
|
|
||||||
// be a separate encode table.
|
|
||||||
const separation = 1024
|
|
||||||
|
|
||||||
intervals := []interval(nil)
|
|
||||||
low, high := -1, -1
|
|
||||||
for i, v := range reverse {
|
|
||||||
if v == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if low < 0 {
|
|
||||||
low = i
|
|
||||||
} else if i-high >= separation {
|
|
||||||
if high >= 0 {
|
|
||||||
intervals = append(intervals, interval{low, high})
|
|
||||||
}
|
|
||||||
low = i
|
|
||||||
}
|
|
||||||
high = i + 1
|
|
||||||
}
|
|
||||||
if high >= 0 {
|
|
||||||
intervals = append(intervals, interval{low, high})
|
|
||||||
}
|
|
||||||
sort.Sort(byDecreasingLength(intervals))
|
|
||||||
|
|
||||||
fmt.Printf("const numEncodeTables = %d\n\n", len(intervals))
|
|
||||||
fmt.Printf("// encodeX are the encoding tables from Unicode to Big5 code,\n")
|
|
||||||
fmt.Printf("// sorted by decreasing length.\n")
|
|
||||||
for i, v := range intervals {
|
|
||||||
fmt.Printf("// encode%d: %5d entries for runes in [%6d, %6d).\n", i, v.len(), v.low, v.high)
|
|
||||||
}
|
|
||||||
fmt.Printf("\n")
|
|
||||||
|
|
||||||
for i, v := range intervals {
|
|
||||||
fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high)
|
|
||||||
fmt.Printf("var encode%d = [...]uint16{\n", i)
|
|
||||||
for j := v.low; j < v.high; j++ {
|
|
||||||
x := reverse[j]
|
|
||||||
if x == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x)
|
|
||||||
}
|
|
||||||
fmt.Printf("}\n\n")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// interval is a half-open interval [low, high).
|
|
||||||
type interval struct {
|
|
||||||
low, high int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i interval) len() int { return i.high - i.low }
|
|
||||||
|
|
||||||
// byDecreasingLength sorts intervals by decreasing length.
|
|
||||||
type byDecreasingLength []interval
|
|
||||||
|
|
||||||
func (b byDecreasingLength) Len() int { return len(b) }
|
|
||||||
func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() }
|
|
||||||
func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
|
|
64
vendor/golang.org/x/text/internal/language/compact/gen.go
generated
vendored
64
vendor/golang.org/x/text/internal/language/compact/gen.go
generated
vendored
@ -1,64 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// Language tag table generator.
|
|
||||||
// Data read from the web.
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"golang.org/x/text/internal/gen"
|
|
||||||
"golang.org/x/text/unicode/cldr"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
test = flag.Bool("test",
|
|
||||||
false,
|
|
||||||
"test existing tables; can be used to compare web data with package data.")
|
|
||||||
outputFile = flag.String("output",
|
|
||||||
"tables.go",
|
|
||||||
"output file for generated tables")
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
gen.Init()
|
|
||||||
|
|
||||||
w := gen.NewCodeWriter()
|
|
||||||
defer w.WriteGoFile("tables.go", "compact")
|
|
||||||
|
|
||||||
fmt.Fprintln(w, `import "golang.org/x/text/internal/language"`)
|
|
||||||
|
|
||||||
b := newBuilder(w)
|
|
||||||
gen.WriteCLDRVersion(w)
|
|
||||||
|
|
||||||
b.writeCompactIndex()
|
|
||||||
}
|
|
||||||
|
|
||||||
type builder struct {
|
|
||||||
w *gen.CodeWriter
|
|
||||||
data *cldr.CLDR
|
|
||||||
supp *cldr.SupplementalData
|
|
||||||
}
|
|
||||||
|
|
||||||
func newBuilder(w *gen.CodeWriter) *builder {
|
|
||||||
r := gen.OpenCLDRCoreZip()
|
|
||||||
defer r.Close()
|
|
||||||
d := &cldr.Decoder{}
|
|
||||||
data, err := d.DecodeZip(r)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
b := builder{
|
|
||||||
w: w,
|
|
||||||
data: data,
|
|
||||||
supp: data.Supplemental(),
|
|
||||||
}
|
|
||||||
return &b
|
|
||||||
}
|
|
113
vendor/golang.org/x/text/internal/language/compact/gen_index.go
generated
vendored
113
vendor/golang.org/x/text/internal/language/compact/gen_index.go
generated
vendored
@ -1,113 +0,0 @@
|
|||||||
// Copyright 2015 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
// This file generates derivative tables based on the language package itself.
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"golang.org/x/text/internal/language"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Compact indices:
|
|
||||||
// Note -va-X variants only apply to localization variants.
|
|
||||||
// BCP variants only ever apply to language.
|
|
||||||
// The only ambiguity between tags is with regions.
|
|
||||||
|
|
||||||
func (b *builder) writeCompactIndex() {
|
|
||||||
// Collect all language tags for which we have any data in CLDR.
|
|
||||||
m := map[language.Tag]bool{}
|
|
||||||
for _, lang := range b.data.Locales() {
|
|
||||||
// We include all locales unconditionally to be consistent with en_US.
|
|
||||||
// We want en_US, even though it has no data associated with it.
|
|
||||||
|
|
||||||
// TODO: put any of the languages for which no data exists at the end
|
|
||||||
// of the index. This allows all components based on ICU to use that
|
|
||||||
// as the cutoff point.
|
|
||||||
// if x := data.RawLDML(lang); false ||
|
|
||||||
// x.LocaleDisplayNames != nil ||
|
|
||||||
// x.Characters != nil ||
|
|
||||||
// x.Delimiters != nil ||
|
|
||||||
// x.Measurement != nil ||
|
|
||||||
// x.Dates != nil ||
|
|
||||||
// x.Numbers != nil ||
|
|
||||||
// x.Units != nil ||
|
|
||||||
// x.ListPatterns != nil ||
|
|
||||||
// x.Collations != nil ||
|
|
||||||
// x.Segmentations != nil ||
|
|
||||||
// x.Rbnf != nil ||
|
|
||||||
// x.Annotations != nil ||
|
|
||||||
// x.Metadata != nil {
|
|
||||||
|
|
||||||
// TODO: support POSIX natively, albeit non-standard.
|
|
||||||
tag := language.Make(strings.Replace(lang, "_POSIX", "-u-va-posix", 1))
|
|
||||||
m[tag] = true
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: plural rules are also defined for the deprecated tags:
|
|
||||||
// iw mo sh tl
|
|
||||||
// Consider removing these as compact tags.
|
|
||||||
|
|
||||||
// Include locales for plural rules, which uses a different structure.
|
|
||||||
for _, plurals := range b.supp.Plurals {
|
|
||||||
for _, rules := range plurals.PluralRules {
|
|
||||||
for _, lang := range strings.Split(rules.Locales, " ") {
|
|
||||||
m[language.Make(lang)] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var coreTags []language.CompactCoreInfo
|
|
||||||
var special []string
|
|
||||||
|
|
||||||
for t := range m {
|
|
||||||
if x := t.Extensions(); len(x) != 0 && fmt.Sprint(x) != "[u-va-posix]" {
|
|
||||||
log.Fatalf("Unexpected extension %v in %v", x, t)
|
|
||||||
}
|
|
||||||
if len(t.Variants()) == 0 && len(t.Extensions()) == 0 {
|
|
||||||
cci, ok := language.GetCompactCore(t)
|
|
||||||
if !ok {
|
|
||||||
log.Fatalf("Locale for non-basic language %q", t)
|
|
||||||
}
|
|
||||||
coreTags = append(coreTags, cci)
|
|
||||||
} else {
|
|
||||||
special = append(special, t.String())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
w := b.w
|
|
||||||
|
|
||||||
sort.Slice(coreTags, func(i, j int) bool { return coreTags[i] < coreTags[j] })
|
|
||||||
sort.Strings(special)
|
|
||||||
|
|
||||||
w.WriteComment(`
|
|
||||||
NumCompactTags is the number of common tags. The maximum tag is
|
|
||||||
NumCompactTags-1.`)
|
|
||||||
w.WriteConst("NumCompactTags", len(m))
|
|
||||||
|
|
||||||
fmt.Fprintln(w, "const (")
|
|
||||||
for i, t := range coreTags {
|
|
||||||
fmt.Fprintf(w, "%s ID = %d\n", ident(t.Tag().String()), i)
|
|
||||||
}
|
|
||||||
for i, t := range special {
|
|
||||||
fmt.Fprintf(w, "%s ID = %d\n", ident(t), i+len(coreTags))
|
|
||||||
}
|
|
||||||
fmt.Fprintln(w, ")")
|
|
||||||
|
|
||||||
w.WriteVar("coreTags", coreTags)
|
|
||||||
|
|
||||||
w.WriteConst("specialTagsStr", strings.Join(special, " "))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ident(s string) string {
|
|
||||||
return strings.Replace(s, "-", "", -1) + "Index"
|
|
||||||
}
|
|
54
vendor/golang.org/x/text/internal/language/compact/gen_parents.go
generated
vendored
54
vendor/golang.org/x/text/internal/language/compact/gen_parents.go
generated
vendored
@ -1,54 +0,0 @@
|
|||||||
// Copyright 2018 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"golang.org/x/text/internal/gen"
|
|
||||||
"golang.org/x/text/internal/language"
|
|
||||||
"golang.org/x/text/internal/language/compact"
|
|
||||||
"golang.org/x/text/unicode/cldr"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
r := gen.OpenCLDRCoreZip()
|
|
||||||
defer r.Close()
|
|
||||||
|
|
||||||
d := &cldr.Decoder{}
|
|
||||||
data, err := d.DecodeZip(r)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("DecodeZip: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
w := gen.NewCodeWriter()
|
|
||||||
defer w.WriteGoFile("parents.go", "compact")
|
|
||||||
|
|
||||||
// Create parents table.
|
|
||||||
type ID uint16
|
|
||||||
parents := make([]ID, compact.NumCompactTags)
|
|
||||||
for _, loc := range data.Locales() {
|
|
||||||
tag := language.MustParse(loc)
|
|
||||||
index, ok := compact.FromTag(tag)
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
parentIndex := compact.ID(0) // und
|
|
||||||
for p := tag.Parent(); p != language.Und; p = p.Parent() {
|
|
||||||
if x, ok := compact.FromTag(p); ok {
|
|
||||||
parentIndex = x
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
parents[index] = ID(parentIndex)
|
|
||||||
}
|
|
||||||
|
|
||||||
w.WriteComment(`
|
|
||||||
parents maps a compact index of a tag to the compact index of the parent of
|
|
||||||
this tag.`)
|
|
||||||
w.WriteVar("parents", parents)
|
|
||||||
}
|
|
1520
vendor/golang.org/x/text/internal/language/gen.go
generated
vendored
1520
vendor/golang.org/x/text/internal/language/gen.go
generated
vendored
File diff suppressed because it is too large
Load Diff
20
vendor/golang.org/x/text/internal/language/gen_common.go
generated
vendored
20
vendor/golang.org/x/text/internal/language/gen_common.go
generated
vendored
@ -1,20 +0,0 @@
|
|||||||
// Copyright 2014 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
// This file contains code common to the maketables.go and the package code.
|
|
||||||
|
|
||||||
// AliasType is the type of an alias in AliasMap.
|
|
||||||
type AliasType int8
|
|
||||||
|
|
||||||
const (
|
|
||||||
Deprecated AliasType = iota
|
|
||||||
Macro
|
|
||||||
Legacy
|
|
||||||
|
|
||||||
AliasTypeUnknown AliasType = -1
|
|
||||||
)
|
|
305
vendor/golang.org/x/text/language/gen.go
generated
vendored
305
vendor/golang.org/x/text/language/gen.go
generated
vendored
@ -1,305 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// Language tag table generator.
|
|
||||||
// Data read from the web.
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"log"
|
|
||||||
"sort"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"golang.org/x/text/internal/gen"
|
|
||||||
"golang.org/x/text/internal/language"
|
|
||||||
"golang.org/x/text/unicode/cldr"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
test = flag.Bool("test",
|
|
||||||
false,
|
|
||||||
"test existing tables; can be used to compare web data with package data.")
|
|
||||||
outputFile = flag.String("output",
|
|
||||||
"tables.go",
|
|
||||||
"output file for generated tables")
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
gen.Init()
|
|
||||||
|
|
||||||
w := gen.NewCodeWriter()
|
|
||||||
defer w.WriteGoFile("tables.go", "language")
|
|
||||||
|
|
||||||
b := newBuilder(w)
|
|
||||||
gen.WriteCLDRVersion(w)
|
|
||||||
|
|
||||||
b.writeConstants()
|
|
||||||
b.writeMatchData()
|
|
||||||
}
|
|
||||||
|
|
||||||
type builder struct {
|
|
||||||
w *gen.CodeWriter
|
|
||||||
hw io.Writer // MultiWriter for w and w.Hash
|
|
||||||
data *cldr.CLDR
|
|
||||||
supp *cldr.SupplementalData
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *builder) langIndex(s string) uint16 {
|
|
||||||
return uint16(language.MustParseBase(s))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *builder) regionIndex(s string) int {
|
|
||||||
return int(language.MustParseRegion(s))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *builder) scriptIndex(s string) int {
|
|
||||||
return int(language.MustParseScript(s))
|
|
||||||
}
|
|
||||||
|
|
||||||
func newBuilder(w *gen.CodeWriter) *builder {
|
|
||||||
r := gen.OpenCLDRCoreZip()
|
|
||||||
defer r.Close()
|
|
||||||
d := &cldr.Decoder{}
|
|
||||||
data, err := d.DecodeZip(r)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
b := builder{
|
|
||||||
w: w,
|
|
||||||
hw: io.MultiWriter(w, w.Hash),
|
|
||||||
data: data,
|
|
||||||
supp: data.Supplemental(),
|
|
||||||
}
|
|
||||||
return &b
|
|
||||||
}
|
|
||||||
|
|
||||||
// writeConsts computes f(v) for all v in values and writes the results
|
|
||||||
// as constants named _v to a single constant block.
|
|
||||||
func (b *builder) writeConsts(f func(string) int, values ...string) {
|
|
||||||
fmt.Fprintln(b.w, "const (")
|
|
||||||
for _, v := range values {
|
|
||||||
fmt.Fprintf(b.w, "\t_%s = %v\n", v, f(v))
|
|
||||||
}
|
|
||||||
fmt.Fprintln(b.w, ")")
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: region inclusion data will probably not be use used in future matchers.
|
|
||||||
|
|
||||||
var langConsts = []string{
|
|
||||||
"de", "en", "fr", "it", "mo", "no", "nb", "pt", "sh", "mul", "und",
|
|
||||||
}
|
|
||||||
|
|
||||||
var scriptConsts = []string{
|
|
||||||
"Latn", "Hani", "Hans", "Hant", "Qaaa", "Qaai", "Qabx", "Zinh", "Zyyy",
|
|
||||||
"Zzzz",
|
|
||||||
}
|
|
||||||
|
|
||||||
var regionConsts = []string{
|
|
||||||
"001", "419", "BR", "CA", "ES", "GB", "MD", "PT", "UK", "US",
|
|
||||||
"ZZ", "XA", "XC", "XK", // Unofficial tag for Kosovo.
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *builder) writeConstants() {
|
|
||||||
b.writeConsts(func(s string) int { return int(b.langIndex(s)) }, langConsts...)
|
|
||||||
b.writeConsts(b.regionIndex, regionConsts...)
|
|
||||||
b.writeConsts(b.scriptIndex, scriptConsts...)
|
|
||||||
}
|
|
||||||
|
|
||||||
type mutualIntelligibility struct {
|
|
||||||
want, have uint16
|
|
||||||
distance uint8
|
|
||||||
oneway bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type scriptIntelligibility struct {
|
|
||||||
wantLang, haveLang uint16
|
|
||||||
wantScript, haveScript uint8
|
|
||||||
distance uint8
|
|
||||||
// Always oneway
|
|
||||||
}
|
|
||||||
|
|
||||||
type regionIntelligibility struct {
|
|
||||||
lang uint16 // compact language id
|
|
||||||
script uint8 // 0 means any
|
|
||||||
group uint8 // 0 means any; if bit 7 is set it means inverse
|
|
||||||
distance uint8
|
|
||||||
// Always twoway.
|
|
||||||
}
|
|
||||||
|
|
||||||
// writeMatchData writes tables with languages and scripts for which there is
|
|
||||||
// mutual intelligibility. The data is based on CLDR's languageMatching data.
|
|
||||||
// Note that we use a different algorithm than the one defined by CLDR and that
|
|
||||||
// we slightly modify the data. For example, we convert scores to confidence levels.
|
|
||||||
// We also drop all region-related data as we use a different algorithm to
|
|
||||||
// determine region equivalence.
|
|
||||||
func (b *builder) writeMatchData() {
|
|
||||||
lm := b.supp.LanguageMatching.LanguageMatches
|
|
||||||
cldr.MakeSlice(&lm).SelectAnyOf("type", "written_new")
|
|
||||||
|
|
||||||
regionHierarchy := map[string][]string{}
|
|
||||||
for _, g := range b.supp.TerritoryContainment.Group {
|
|
||||||
regions := strings.Split(g.Contains, " ")
|
|
||||||
regionHierarchy[g.Type] = append(regionHierarchy[g.Type], regions...)
|
|
||||||
}
|
|
||||||
regionToGroups := make([]uint8, language.NumRegions)
|
|
||||||
|
|
||||||
idToIndex := map[string]uint8{}
|
|
||||||
for i, mv := range lm[0].MatchVariable {
|
|
||||||
if i > 6 {
|
|
||||||
log.Fatalf("Too many groups: %d", i)
|
|
||||||
}
|
|
||||||
idToIndex[mv.Id] = uint8(i + 1)
|
|
||||||
// TODO: also handle '-'
|
|
||||||
for _, r := range strings.Split(mv.Value, "+") {
|
|
||||||
todo := []string{r}
|
|
||||||
for k := 0; k < len(todo); k++ {
|
|
||||||
r := todo[k]
|
|
||||||
regionToGroups[b.regionIndex(r)] |= 1 << uint8(i)
|
|
||||||
todo = append(todo, regionHierarchy[r]...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
b.w.WriteVar("regionToGroups", regionToGroups)
|
|
||||||
|
|
||||||
// maps language id to in- and out-of-group region.
|
|
||||||
paradigmLocales := [][3]uint16{}
|
|
||||||
locales := strings.Split(lm[0].ParadigmLocales[0].Locales, " ")
|
|
||||||
for i := 0; i < len(locales); i += 2 {
|
|
||||||
x := [3]uint16{}
|
|
||||||
for j := 0; j < 2; j++ {
|
|
||||||
pc := strings.SplitN(locales[i+j], "-", 2)
|
|
||||||
x[0] = b.langIndex(pc[0])
|
|
||||||
if len(pc) == 2 {
|
|
||||||
x[1+j] = uint16(b.regionIndex(pc[1]))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
paradigmLocales = append(paradigmLocales, x)
|
|
||||||
}
|
|
||||||
b.w.WriteVar("paradigmLocales", paradigmLocales)
|
|
||||||
|
|
||||||
b.w.WriteType(mutualIntelligibility{})
|
|
||||||
b.w.WriteType(scriptIntelligibility{})
|
|
||||||
b.w.WriteType(regionIntelligibility{})
|
|
||||||
|
|
||||||
matchLang := []mutualIntelligibility{}
|
|
||||||
matchScript := []scriptIntelligibility{}
|
|
||||||
matchRegion := []regionIntelligibility{}
|
|
||||||
// Convert the languageMatch entries in lists keyed by desired language.
|
|
||||||
for _, m := range lm[0].LanguageMatch {
|
|
||||||
// Different versions of CLDR use different separators.
|
|
||||||
desired := strings.Replace(m.Desired, "-", "_", -1)
|
|
||||||
supported := strings.Replace(m.Supported, "-", "_", -1)
|
|
||||||
d := strings.Split(desired, "_")
|
|
||||||
s := strings.Split(supported, "_")
|
|
||||||
if len(d) != len(s) {
|
|
||||||
log.Fatalf("not supported: desired=%q; supported=%q", desired, supported)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
distance, _ := strconv.ParseInt(m.Distance, 10, 8)
|
|
||||||
switch len(d) {
|
|
||||||
case 2:
|
|
||||||
if desired == supported && desired == "*_*" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// language-script pair.
|
|
||||||
matchScript = append(matchScript, scriptIntelligibility{
|
|
||||||
wantLang: uint16(b.langIndex(d[0])),
|
|
||||||
haveLang: uint16(b.langIndex(s[0])),
|
|
||||||
wantScript: uint8(b.scriptIndex(d[1])),
|
|
||||||
haveScript: uint8(b.scriptIndex(s[1])),
|
|
||||||
distance: uint8(distance),
|
|
||||||
})
|
|
||||||
if m.Oneway != "true" {
|
|
||||||
matchScript = append(matchScript, scriptIntelligibility{
|
|
||||||
wantLang: uint16(b.langIndex(s[0])),
|
|
||||||
haveLang: uint16(b.langIndex(d[0])),
|
|
||||||
wantScript: uint8(b.scriptIndex(s[1])),
|
|
||||||
haveScript: uint8(b.scriptIndex(d[1])),
|
|
||||||
distance: uint8(distance),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
if desired == supported && desired == "*" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if distance == 1 {
|
|
||||||
// nb == no is already handled by macro mapping. Check there
|
|
||||||
// really is only this case.
|
|
||||||
if d[0] != "no" || s[0] != "nb" {
|
|
||||||
log.Fatalf("unhandled equivalence %s == %s", s[0], d[0])
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// TODO: consider dropping oneway field and just doubling the entry.
|
|
||||||
matchLang = append(matchLang, mutualIntelligibility{
|
|
||||||
want: uint16(b.langIndex(d[0])),
|
|
||||||
have: uint16(b.langIndex(s[0])),
|
|
||||||
distance: uint8(distance),
|
|
||||||
oneway: m.Oneway == "true",
|
|
||||||
})
|
|
||||||
case 3:
|
|
||||||
if desired == supported && desired == "*_*_*" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if desired != supported {
|
|
||||||
// This is now supported by CLDR, but only one case, which
|
|
||||||
// should already be covered by paradigm locales. For instance,
|
|
||||||
// test case "und, en, en-GU, en-IN, en-GB ; en-ZA ; en-GB" in
|
|
||||||
// testdata/CLDRLocaleMatcherTest.txt tests this.
|
|
||||||
if supported != "en_*_GB" {
|
|
||||||
log.Fatalf("not supported: desired=%q; supported=%q", desired, supported)
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
ri := regionIntelligibility{
|
|
||||||
lang: b.langIndex(d[0]),
|
|
||||||
distance: uint8(distance),
|
|
||||||
}
|
|
||||||
if d[1] != "*" {
|
|
||||||
ri.script = uint8(b.scriptIndex(d[1]))
|
|
||||||
}
|
|
||||||
switch {
|
|
||||||
case d[2] == "*":
|
|
||||||
ri.group = 0x80 // not contained in anything
|
|
||||||
case strings.HasPrefix(d[2], "$!"):
|
|
||||||
ri.group = 0x80
|
|
||||||
d[2] = "$" + d[2][len("$!"):]
|
|
||||||
fallthrough
|
|
||||||
case strings.HasPrefix(d[2], "$"):
|
|
||||||
ri.group |= idToIndex[d[2]]
|
|
||||||
}
|
|
||||||
matchRegion = append(matchRegion, ri)
|
|
||||||
default:
|
|
||||||
log.Fatalf("not supported: desired=%q; supported=%q", desired, supported)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sort.SliceStable(matchLang, func(i, j int) bool {
|
|
||||||
return matchLang[i].distance < matchLang[j].distance
|
|
||||||
})
|
|
||||||
b.w.WriteComment(`
|
|
||||||
matchLang holds pairs of langIDs of base languages that are typically
|
|
||||||
mutually intelligible. Each pair is associated with a confidence and
|
|
||||||
whether the intelligibility goes one or both ways.`)
|
|
||||||
b.w.WriteVar("matchLang", matchLang)
|
|
||||||
|
|
||||||
b.w.WriteComment(`
|
|
||||||
matchScript holds pairs of scriptIDs where readers of one script
|
|
||||||
can typically also read the other. Each is associated with a confidence.`)
|
|
||||||
sort.SliceStable(matchScript, func(i, j int) bool {
|
|
||||||
return matchScript[i].distance < matchScript[j].distance
|
|
||||||
})
|
|
||||||
b.w.WriteVar("matchScript", matchScript)
|
|
||||||
|
|
||||||
sort.SliceStable(matchRegion, func(i, j int) bool {
|
|
||||||
return matchRegion[i].distance < matchRegion[j].distance
|
|
||||||
})
|
|
||||||
b.w.WriteVar("matchRegion", matchRegion)
|
|
||||||
}
|
|
14
vendor/modules.txt
vendored
14
vendor/modules.txt
vendored
@ -9,26 +9,26 @@ github.com/jmoiron/sqlx
|
|||||||
github.com/jmoiron/sqlx/reflectx
|
github.com/jmoiron/sqlx/reflectx
|
||||||
# golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297
|
# golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297
|
||||||
golang.org/x/net/html
|
golang.org/x/net/html
|
||||||
golang.org/x/net/html/charset
|
|
||||||
golang.org/x/net/html/atom
|
golang.org/x/net/html/atom
|
||||||
|
golang.org/x/net/html/charset
|
||||||
# golang.org/x/text v0.3.2
|
# golang.org/x/text v0.3.2
|
||||||
golang.org/x/text/encoding/charmap
|
|
||||||
golang.org/x/text/encoding
|
golang.org/x/text/encoding
|
||||||
|
golang.org/x/text/encoding/charmap
|
||||||
|
golang.org/x/text/encoding/htmlindex
|
||||||
golang.org/x/text/encoding/internal
|
golang.org/x/text/encoding/internal
|
||||||
golang.org/x/text/encoding/internal/identifier
|
golang.org/x/text/encoding/internal/identifier
|
||||||
golang.org/x/text/transform
|
|
||||||
golang.org/x/text/encoding/htmlindex
|
|
||||||
golang.org/x/text/encoding/japanese
|
golang.org/x/text/encoding/japanese
|
||||||
golang.org/x/text/encoding/korean
|
golang.org/x/text/encoding/korean
|
||||||
golang.org/x/text/encoding/simplifiedchinese
|
golang.org/x/text/encoding/simplifiedchinese
|
||||||
golang.org/x/text/encoding/traditionalchinese
|
golang.org/x/text/encoding/traditionalchinese
|
||||||
golang.org/x/text/encoding/unicode
|
golang.org/x/text/encoding/unicode
|
||||||
golang.org/x/text/language
|
|
||||||
golang.org/x/text/internal/utf8internal
|
|
||||||
golang.org/x/text/runes
|
|
||||||
golang.org/x/text/internal/language
|
golang.org/x/text/internal/language
|
||||||
golang.org/x/text/internal/language/compact
|
golang.org/x/text/internal/language/compact
|
||||||
golang.org/x/text/internal/tag
|
golang.org/x/text/internal/tag
|
||||||
|
golang.org/x/text/internal/utf8internal
|
||||||
|
golang.org/x/text/language
|
||||||
|
golang.org/x/text/runes
|
||||||
|
golang.org/x/text/transform
|
||||||
# google.golang.org/appengine v1.6.2
|
# google.golang.org/appengine v1.6.2
|
||||||
google.golang.org/appengine/cloudsql
|
google.golang.org/appengine/cloudsql
|
||||||
# gopkg.in/ini.v1 v1.46.0
|
# gopkg.in/ini.v1 v1.46.0
|
||||||
|
Loading…
Reference in New Issue
Block a user