Places: Improve state name normalization #1664
This commit is contained in:
parent
4fb00198d2
commit
6c02ee2512
4
go.mod
4
go.mod
|
@ -21,7 +21,7 @@ require (
|
||||||
github.com/go-playground/validator/v10 v10.9.0 // indirect
|
github.com/go-playground/validator/v10 v10.9.0 // indirect
|
||||||
github.com/golang/geo v0.0.0-20210211234256-740aa86cb551
|
github.com/golang/geo v0.0.0-20210211234256-740aa86cb551
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
github.com/google/open-location-code/go v0.0.0-20211109014933-06433367679b
|
github.com/google/open-location-code/go v0.0.0-20211110234603-604ed00fe9d8
|
||||||
github.com/gorilla/websocket v1.4.2
|
github.com/gorilla/websocket v1.4.2
|
||||||
github.com/gosimple/slug v1.11.2
|
github.com/gosimple/slug v1.11.2
|
||||||
github.com/h2non/filetype v1.1.1
|
github.com/h2non/filetype v1.1.1
|
||||||
|
@ -57,7 +57,7 @@ require (
|
||||||
go4.org v0.0.0-20201209231011-d4a079459e60 // indirect
|
go4.org v0.0.0-20201209231011-d4a079459e60 // indirect
|
||||||
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa
|
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa
|
||||||
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d // indirect
|
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d // indirect
|
||||||
golang.org/x/net v0.0.0-20211108170745-6635138e15ea
|
golang.org/x/net v0.0.0-20211111083644-e5c967477495
|
||||||
golang.org/x/sys v0.0.0-20211109065445-02f5c0300f6e // indirect
|
golang.org/x/sys v0.0.0-20211109065445-02f5c0300f6e // indirect
|
||||||
golang.org/x/text v0.3.7 // indirect
|
golang.org/x/text v0.3.7 // indirect
|
||||||
gonum.org/v1/gonum v0.9.3
|
gonum.org/v1/gonum v0.9.3
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -153,6 +153,8 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
github.com/google/open-location-code/go v0.0.0-20211109014933-06433367679b h1:6rfkSqY/nWZGdgpfCLumEAh3Remb/v1eyrGnFt5dCIs=
|
github.com/google/open-location-code/go v0.0.0-20211109014933-06433367679b h1:6rfkSqY/nWZGdgpfCLumEAh3Remb/v1eyrGnFt5dCIs=
|
||||||
github.com/google/open-location-code/go v0.0.0-20211109014933-06433367679b/go.mod h1:eJfRN6aj+kR/rnua/rw9jAgYhqoMHldQkdTi+sePRKk=
|
github.com/google/open-location-code/go v0.0.0-20211109014933-06433367679b/go.mod h1:eJfRN6aj+kR/rnua/rw9jAgYhqoMHldQkdTi+sePRKk=
|
||||||
|
github.com/google/open-location-code/go v0.0.0-20211110234603-604ed00fe9d8 h1:+C1yt4bGEM1u3akLWEDqtNhRV28xyCrPscLEgE3NGYc=
|
||||||
|
github.com/google/open-location-code/go v0.0.0-20211110234603-604ed00fe9d8/go.mod h1:eJfRN6aj+kR/rnua/rw9jAgYhqoMHldQkdTi+sePRKk=
|
||||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
@ -377,6 +379,8 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20211108170745-6635138e15ea h1:FosBMXtOc8Tp9Hbo4ltl1WJSrTVewZU8MPnTPY2HdH8=
|
golang.org/x/net v0.0.0-20211108170745-6635138e15ea h1:FosBMXtOc8Tp9Hbo4ltl1WJSrTVewZU8MPnTPY2HdH8=
|
||||||
golang.org/x/net v0.0.0-20211108170745-6635138e15ea/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211108170745-6635138e15ea/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
|
golang.org/x/net v0.0.0-20211111083644-e5c967477495 h1:cjxxlQm6d4kYbhpZ2ghvmI8xnq0AG+jXmzrhzfkyu5A=
|
||||||
|
golang.org/x/net v0.0.0-20211111083644-e5c967477495/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
|
|
@ -135,10 +135,6 @@ func (l Location) Label() (result string) {
|
||||||
return l.Place.LocLabel
|
return l.Place.LocLabel
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l Location) State() (result string) {
|
|
||||||
return txt.NormalizeState(l.Place.LocState)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l Location) City() (result string) {
|
func (l Location) City() (result string) {
|
||||||
return l.Place.LocCity
|
return l.Place.LocCity
|
||||||
}
|
}
|
||||||
|
@ -147,6 +143,10 @@ func (l Location) CountryCode() (result string) {
|
||||||
return l.Place.LocCountry
|
return l.Place.LocCountry
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l Location) State() (result string) {
|
||||||
|
return txt.NormalizeState(l.Place.LocState, l.CountryCode())
|
||||||
|
}
|
||||||
|
|
||||||
func (l Location) Latitude() (result float64) {
|
func (l Location) Latitude() (result float64) {
|
||||||
return l.LocLat
|
return l.LocLat
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,8 +41,8 @@ func NewLocation(id, name, category, label, city, state, country, source string,
|
||||||
LocCategory: category,
|
LocCategory: category,
|
||||||
LocLabel: label,
|
LocLabel: label,
|
||||||
LocCity: city,
|
LocCity: city,
|
||||||
LocState: txt.NormalizeState(state),
|
|
||||||
LocCountry: country,
|
LocCountry: country,
|
||||||
|
LocState: txt.NormalizeState(state, country),
|
||||||
LocSource: source,
|
LocSource: source,
|
||||||
LocKeywords: keywords,
|
LocKeywords: keywords,
|
||||||
}
|
}
|
||||||
|
@ -129,7 +129,7 @@ func (l *Location) label() string {
|
||||||
loc = append(loc, l.LocCity)
|
loc = append(loc, l.LocCity)
|
||||||
}
|
}
|
||||||
|
|
||||||
if shortCountry && l.LocState != "" && l.LocCity != l.LocState {
|
if shortCountry && l.LocState != "" && !strings.EqualFold(l.LocState, l.LocCity) && !strings.EqualFold(l.LocState, l.LocCountry) {
|
||||||
loc = append(loc, l.LocState)
|
loc = append(loc, l.LocState)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,14 +164,14 @@ func (l Location) City() string {
|
||||||
return l.LocCity
|
return l.LocCity
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l Location) State() string {
|
|
||||||
return txt.NormalizeState(l.LocState)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l Location) CountryCode() string {
|
func (l Location) CountryCode() string {
|
||||||
return l.LocCountry
|
return l.LocCountry
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l Location) State() string {
|
||||||
|
return txt.NormalizeState(l.LocState, l.CountryCode())
|
||||||
|
}
|
||||||
|
|
||||||
func (l Location) CountryName() string {
|
func (l Location) CountryName() string {
|
||||||
return CountryNames[l.LocCountry]
|
return CountryNames[l.LocCountry]
|
||||||
}
|
}
|
||||||
|
|
|
@ -235,6 +235,26 @@ func TestLocation_place(t *testing.T) {
|
||||||
|
|
||||||
assert.Equal(t, "Unknown", l.label())
|
assert.Equal(t, "Unknown", l.label())
|
||||||
})
|
})
|
||||||
|
t.Run("Freiburg im Breisgau, BW, Germany", func(t *testing.T) {
|
||||||
|
l := NewLocation("47911b1a4f84", "", "", "Freiburg im Breisgau, BW, Germany", "Freiburg im Breisgau", "BW", "de", "", []string{})
|
||||||
|
|
||||||
|
assert.Equal(t, "Freiburg im Breisgau, Baden-Württemberg, Germany", l.label())
|
||||||
|
})
|
||||||
|
t.Run("Sevilla, ES, Spain", func(t *testing.T) {
|
||||||
|
l := NewLocation("0d126c12219c", "", "", "Sevilla, ES, Spain", "Sevilla", "ES", "es", "", []string{})
|
||||||
|
|
||||||
|
assert.Equal(t, "Sevilla, Spain", l.label())
|
||||||
|
})
|
||||||
|
t.Run("Guarapari, ES, Brazil", func(t *testing.T) {
|
||||||
|
l := NewLocation("00b85797fdbc", "", "", "Guarapari, ES, Brazil", "Guarapari", "ES", "br", "", []string{})
|
||||||
|
|
||||||
|
assert.Equal(t, "Guarapari, Espírito Santo, Brazil", l.label())
|
||||||
|
})
|
||||||
|
t.Run("Porto Novo, PT, Portugal", func(t *testing.T) {
|
||||||
|
l := NewLocation("0d1f30bb5564", "", "", "", "Porto Novo", "PT", "pt", "", []string{})
|
||||||
|
|
||||||
|
assert.Equal(t, "Porto Novo, Portugal", l.label())
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLocation_S2Token(t *testing.T) {
|
func TestLocation_S2Token(t *testing.T) {
|
||||||
|
|
|
@ -86,7 +86,7 @@ func (l Location) CellID() (result string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l Location) State() (result string) {
|
func (l Location) State() (result string) {
|
||||||
return txt.NormalizeState(l.Address.State)
|
return txt.NormalizeState(l.Address.State, l.CountryCode())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l Location) City() (result string) {
|
func (l Location) City() (result string) {
|
||||||
|
|
|
@ -79,7 +79,7 @@ func (m Moment) Slug() string {
|
||||||
|
|
||||||
// Title returns an english title for the moment.
|
// Title returns an english title for the moment.
|
||||||
func (m Moment) Title() string {
|
func (m Moment) Title() string {
|
||||||
state := txt.NormalizeState(m.State)
|
state := txt.NormalizeState(m.State, m.Country)
|
||||||
|
|
||||||
if m.Year == 0 && m.Month == 0 {
|
if m.Year == 0 && m.Month == 0 {
|
||||||
if m.Label != "" {
|
if m.Label != "" {
|
||||||
|
|
|
@ -1,66 +0,0 @@
|
||||||
//go:build ignore
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// This generates states.go by running "go generate"
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
"text/template"
|
|
||||||
|
|
||||||
"github.com/photoprism/photoprism/pkg/txt"
|
|
||||||
)
|
|
||||||
|
|
||||||
type State struct {
|
|
||||||
Code string
|
|
||||||
Name string
|
|
||||||
}
|
|
||||||
|
|
||||||
var states []State
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
file, err := os.Open("./resources/states.txt")
|
|
||||||
defer file.Close()
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
scanner := bufio.NewScanner(file)
|
|
||||||
scanner.Split(bufio.ScanLines)
|
|
||||||
|
|
||||||
for scanner.Scan() {
|
|
||||||
parts := strings.Split(scanner.Text(), ":")
|
|
||||||
|
|
||||||
if len(parts) < 2 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
states = append(states, State{Code: strings.ToUpper(parts[0]), Name: txt.Title(parts[1])})
|
|
||||||
}
|
|
||||||
|
|
||||||
f, err := os.Create("states.go")
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
packageTemplate.Execute(f, struct {
|
|
||||||
States []State
|
|
||||||
}{
|
|
||||||
States: states,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var packageTemplate = template.Must(template.New("").Parse(`// Code generated by go generate; DO NOT EDIT.
|
|
||||||
package txt
|
|
||||||
|
|
||||||
var States = map[string]string{
|
|
||||||
{{- range .States }}
|
|
||||||
{{ printf "%q" .Code }}: {{ printf "%q" .Name }},
|
|
||||||
{{- end }}
|
|
||||||
}`))
|
|
7
pkg/txt/lookuptable.go
Normal file
7
pkg/txt/lookuptable.go
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package txt
|
||||||
|
|
||||||
|
// LookupTable represents a string lookup table.
|
||||||
|
type LookupTable map[string]string
|
||||||
|
|
||||||
|
// LookupTableMap represents a map of string lookup tables.
|
||||||
|
type LookupTableMap map[string]LookupTable
|
|
@ -28,18 +28,31 @@ func NormalizeName(name string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NormalizeState returns the full, normalized state name.
|
// NormalizeState returns the full, normalized state name.
|
||||||
func NormalizeState(s string) string {
|
func NormalizeState(stateName, countryCode string) string {
|
||||||
s = strings.TrimSpace(s)
|
// Remove whitespace from name.
|
||||||
|
stateName = strings.TrimSpace(stateName)
|
||||||
|
|
||||||
if s == "" || s == UnknownStateCode {
|
// Empty?
|
||||||
|
if stateName == "" || stateName == UnknownStateCode {
|
||||||
|
// State doesn't have a name.
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
if expanded, ok := States[s]; ok {
|
// Normalize country code.
|
||||||
return expanded
|
countryCode = strings.ToLower(strings.TrimSpace(countryCode))
|
||||||
|
|
||||||
|
// Is the name an abbreviation that should be normalized?
|
||||||
|
if states, found := StatesByCountry[countryCode]; !found {
|
||||||
|
// Unknown country.
|
||||||
|
} else if normalized, found := states[stateName]; !found {
|
||||||
|
// Unknown abbreviation.
|
||||||
|
} else if normalized != "" {
|
||||||
|
// Yes, use normalized name.
|
||||||
|
stateName = normalized
|
||||||
}
|
}
|
||||||
|
|
||||||
return s
|
// Return normalized state name.
|
||||||
|
return stateName
|
||||||
}
|
}
|
||||||
|
|
||||||
// NormalizeQuery replaces search operator with default symbols.
|
// NormalizeQuery replaces search operator with default symbols.
|
||||||
|
|
|
@ -32,42 +32,57 @@ func TestNormalizeName(t *testing.T) {
|
||||||
|
|
||||||
func TestNormalizeState(t *testing.T) {
|
func TestNormalizeState(t *testing.T) {
|
||||||
t.Run("Berlin", func(t *testing.T) {
|
t.Run("Berlin", func(t *testing.T) {
|
||||||
result := NormalizeState("Berlin")
|
result := NormalizeState("Berlin", "de")
|
||||||
assert.Equal(t, "Berlin", result)
|
assert.Equal(t, "Berlin", result)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("WA", func(t *testing.T) {
|
t.Run("WA", func(t *testing.T) {
|
||||||
result := NormalizeState("WA")
|
result := NormalizeState("WA", "us")
|
||||||
assert.Equal(t, "Washington", result)
|
assert.Equal(t, "Washington", result)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("QCUnknownCountry", func(t *testing.T) {
|
||||||
|
result := NormalizeState("QC", "")
|
||||||
|
assert.Equal(t, "QC", result)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("QCCanada", func(t *testing.T) {
|
||||||
|
result := NormalizeState("QC", "ca")
|
||||||
|
assert.Equal(t, "Quebec", result)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("QCUnitedStates", func(t *testing.T) {
|
||||||
|
result := NormalizeState("QC", "us")
|
||||||
|
assert.Equal(t, "QC", result)
|
||||||
|
})
|
||||||
|
|
||||||
t.Run("Wa", func(t *testing.T) {
|
t.Run("Wa", func(t *testing.T) {
|
||||||
result := NormalizeState("Wa")
|
result := NormalizeState("Wa", "us")
|
||||||
assert.Equal(t, "Wa", result)
|
assert.Equal(t, "Wa", result)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Washington", func(t *testing.T) {
|
t.Run("Washington", func(t *testing.T) {
|
||||||
result := NormalizeState("Washington")
|
result := NormalizeState("Washington", "us")
|
||||||
assert.Equal(t, "Washington", result)
|
assert.Equal(t, "Washington", result)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Never mind Nirvana", func(t *testing.T) {
|
t.Run("Never mind Nirvana", func(t *testing.T) {
|
||||||
result := NormalizeState("Never mind Nirvana.")
|
result := NormalizeState("Never mind Nirvana.", "us")
|
||||||
assert.Equal(t, "Never mind Nirvana.", result)
|
assert.Equal(t, "Never mind Nirvana.", result)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Empty", func(t *testing.T) {
|
t.Run("Empty", func(t *testing.T) {
|
||||||
result := NormalizeState("")
|
result := NormalizeState("", "us")
|
||||||
assert.Equal(t, "", result)
|
assert.Equal(t, "", result)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Unknown", func(t *testing.T) {
|
t.Run("Unknown", func(t *testing.T) {
|
||||||
result := NormalizeState("zz")
|
result := NormalizeState("zz", "us")
|
||||||
assert.Equal(t, "", result)
|
assert.Equal(t, "", result)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Space", func(t *testing.T) {
|
t.Run("Space", func(t *testing.T) {
|
||||||
result := NormalizeState(" ")
|
result := NormalizeState(" ", "us")
|
||||||
assert.Equal(t, "", result)
|
assert.Equal(t, "", result)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -1,72 +0,0 @@
|
||||||
AB:Alberta
|
|
||||||
AL:Alabama
|
|
||||||
AK:Alaska
|
|
||||||
AS:American Samoa
|
|
||||||
AZ:Arizona
|
|
||||||
AR:Arkansas
|
|
||||||
BC:British Columbia
|
|
||||||
CA:California
|
|
||||||
CO:Colorado
|
|
||||||
CT:Connecticut
|
|
||||||
DE:Delaware
|
|
||||||
DC:District of Columbia
|
|
||||||
FM:Federated States of Micronesia
|
|
||||||
FL:Florida
|
|
||||||
GA:Georgia
|
|
||||||
GU:Guam
|
|
||||||
HI:Hawaii
|
|
||||||
ID:Idaho
|
|
||||||
IL:Illinois
|
|
||||||
IN:Indiana
|
|
||||||
IA:Iowa
|
|
||||||
KS:Kansas
|
|
||||||
KY:Kentucky
|
|
||||||
LA:Louisiana
|
|
||||||
MB:Manitoba
|
|
||||||
ME:Maine
|
|
||||||
MH:Marshall Islands
|
|
||||||
MD:Maryland
|
|
||||||
MA:Massachusetts
|
|
||||||
MI:Michigan
|
|
||||||
MN:Minnesota
|
|
||||||
MS:Mississippi
|
|
||||||
MO:Missouri
|
|
||||||
MT:Montana
|
|
||||||
NE:Nebraska
|
|
||||||
NL:Newfoundland and Labrador
|
|
||||||
NU:Nunavut
|
|
||||||
NV:Nevada
|
|
||||||
NB:New Brunswick
|
|
||||||
NH:New Hampshire
|
|
||||||
NJ:New Jersey
|
|
||||||
NM:New Mexico
|
|
||||||
NY:New York
|
|
||||||
NC:North Carolina
|
|
||||||
ND:North Dakota
|
|
||||||
NT:Northwest Territories
|
|
||||||
NS:Nova Scotia
|
|
||||||
MP:Northern Mariana Islands
|
|
||||||
OH:Ohio
|
|
||||||
OK:Oklahoma
|
|
||||||
ON:Ontario
|
|
||||||
OR:Oregon
|
|
||||||
PE:Prince Edward Island
|
|
||||||
PW:Palau
|
|
||||||
PA:Pennsylvania
|
|
||||||
PR:Puerto Rico
|
|
||||||
QC:Quebec
|
|
||||||
RI:Rhode Island
|
|
||||||
SK:Saskatchewan
|
|
||||||
SC:South Carolina
|
|
||||||
SD:South Dakota
|
|
||||||
TN:Tennessee
|
|
||||||
TX:Texas
|
|
||||||
UT:Utah
|
|
||||||
VT:Vermont
|
|
||||||
VI:Virgin Islands
|
|
||||||
VA:Virginia
|
|
||||||
WA:Washington
|
|
||||||
WV:West Virginia
|
|
||||||
WI:Wisconsin
|
|
||||||
WY:Wyoming
|
|
||||||
YT:Yukon
|
|
|
@ -1,14 +1,88 @@
|
||||||
// Code generated by go generate; DO NOT EDIT.
|
|
||||||
package txt
|
package txt
|
||||||
|
|
||||||
var States = map[string]string{
|
// StatesByCountry maps state names by country code.
|
||||||
|
var StatesByCountry = LookupTableMap{
|
||||||
|
"br": StatesBR,
|
||||||
|
"ca": StatesCA,
|
||||||
|
"de": StatesDE,
|
||||||
|
"us": StatesUS,
|
||||||
|
}
|
||||||
|
|
||||||
|
// StatesBR maps common abbreviations for Brazilian states.
|
||||||
|
var StatesBR = LookupTable{
|
||||||
|
"AC": "Acre",
|
||||||
|
"AL": "Alagoas",
|
||||||
|
"AM": "Amazonas",
|
||||||
|
"AP": "Amapá",
|
||||||
|
"BA": "Bahia",
|
||||||
|
"CE": "Ceará",
|
||||||
|
"DF": "Distrito Federal",
|
||||||
|
"ES": "Espírito Santo",
|
||||||
|
"GO": "Goiás",
|
||||||
|
"MA": "Maranhão",
|
||||||
|
"MG": "Minas Gerais",
|
||||||
|
"MS": "Mato Grosso do Sul",
|
||||||
|
"MT": "Mato Grosso",
|
||||||
|
"PA": "Pará",
|
||||||
|
"PB": "Paraíba",
|
||||||
|
"PE": "Pernambuco",
|
||||||
|
"PI": "Piauí",
|
||||||
|
"PR": "Paraná",
|
||||||
|
"RJ": "Rio de Janeiro",
|
||||||
|
"RN": "Rio Grande do Norte",
|
||||||
|
"RO": "Rondônia",
|
||||||
|
"RR": "Roraima",
|
||||||
|
"RS": "Rio Grande do Sul",
|
||||||
|
"SC": "Santa Catarina",
|
||||||
|
"SE": "Sergipe",
|
||||||
|
"SP": "São Paulo",
|
||||||
|
"TO": "Tocantins",
|
||||||
|
}
|
||||||
|
|
||||||
|
// StatesCA maps common abbreviations for Canadian provinces and territories.
|
||||||
|
var StatesCA = LookupTable{
|
||||||
"AB": "Alberta",
|
"AB": "Alberta",
|
||||||
|
"BC": "British Columbia",
|
||||||
|
"NB": "New Brunswick",
|
||||||
|
"NL": "Newfoundland and Labrador",
|
||||||
|
"NS": "Nova Scotia",
|
||||||
|
"NT": "Northwest Territories",
|
||||||
|
"NU": "Nunavut",
|
||||||
|
"MB": "Manitoba",
|
||||||
|
"ON": "Ontario",
|
||||||
|
"PE": "Prince Edward Island",
|
||||||
|
"QC": "Quebec",
|
||||||
|
"SK": "Saskatchewan",
|
||||||
|
"YT": "Yukon",
|
||||||
|
}
|
||||||
|
|
||||||
|
// StatesDE maps common abbreviations for German states.
|
||||||
|
var StatesDE = LookupTable{
|
||||||
|
"BW": "Baden-Württemberg",
|
||||||
|
"BY": "Bayern",
|
||||||
|
"BE": "Berlin",
|
||||||
|
"BB": "Brandenburg",
|
||||||
|
"HB": "Bremen",
|
||||||
|
"HH": "Hamburg",
|
||||||
|
"HE": "Hessen",
|
||||||
|
"NI": "Niedersachsen",
|
||||||
|
"MV": "Mecklenburg-Vorpommern",
|
||||||
|
"NW": "Nordrhein-Westfalen",
|
||||||
|
"RP": "Rheinland-Pfalz",
|
||||||
|
"SL": "Saarland",
|
||||||
|
"SN": "Sachsen",
|
||||||
|
"ST": "Sachsen-Anhalt",
|
||||||
|
"SH": "Schleswig-Holstein",
|
||||||
|
"TH": "Thüringen",
|
||||||
|
}
|
||||||
|
|
||||||
|
// StatesUS maps common abbreviations for US states.
|
||||||
|
var StatesUS = LookupTable{
|
||||||
"AL": "Alabama",
|
"AL": "Alabama",
|
||||||
"AK": "Alaska",
|
"AK": "Alaska",
|
||||||
"AS": "American Samoa",
|
"AS": "American Samoa",
|
||||||
"AZ": "Arizona",
|
"AZ": "Arizona",
|
||||||
"AR": "Arkansas",
|
"AR": "Arkansas",
|
||||||
"BC": "British Columbia",
|
|
||||||
"CA": "California",
|
"CA": "California",
|
||||||
"CO": "Colorado",
|
"CO": "Colorado",
|
||||||
"CT": "Connecticut",
|
"CT": "Connecticut",
|
||||||
|
@ -37,28 +111,21 @@ var States = map[string]string{
|
||||||
"MO": "Missouri",
|
"MO": "Missouri",
|
||||||
"MT": "Montana",
|
"MT": "Montana",
|
||||||
"NE": "Nebraska",
|
"NE": "Nebraska",
|
||||||
"NL": "Newfoundland and Labrador",
|
|
||||||
"NU": "Nunavut",
|
|
||||||
"NV": "Nevada",
|
"NV": "Nevada",
|
||||||
"NB": "New Brunswick",
|
|
||||||
"NH": "New Hampshire",
|
"NH": "New Hampshire",
|
||||||
"NJ": "New Jersey",
|
"NJ": "New Jersey",
|
||||||
"NM": "New Mexico",
|
"NM": "New Mexico",
|
||||||
"NY": "New York",
|
"NY": "New York",
|
||||||
"NC": "North Carolina",
|
"NC": "North Carolina",
|
||||||
"ND": "North Dakota",
|
"ND": "North Dakota",
|
||||||
"NT": "Northwest Territories",
|
|
||||||
"NS": "Nova Scotia",
|
"NS": "Nova Scotia",
|
||||||
"MP": "Northern Mariana Islands",
|
"MP": "Northern Mariana Islands",
|
||||||
"OH": "Ohio",
|
"OH": "Ohio",
|
||||||
"OK": "Oklahoma",
|
"OK": "Oklahoma",
|
||||||
"ON": "Ontario",
|
|
||||||
"OR": "Oregon",
|
"OR": "Oregon",
|
||||||
"PE": "Prince Edward Island",
|
|
||||||
"PW": "Palau",
|
"PW": "Palau",
|
||||||
"PA": "Pennsylvania",
|
"PA": "Pennsylvania",
|
||||||
"PR": "Puerto Rico",
|
"PR": "Puerto Rico",
|
||||||
"QC": "Quebec",
|
|
||||||
"RI": "Rhode Island",
|
"RI": "Rhode Island",
|
||||||
"SK": "Saskatchewan",
|
"SK": "Saskatchewan",
|
||||||
"SC": "South Carolina",
|
"SC": "South Carolina",
|
||||||
|
@ -73,5 +140,4 @@ var States = map[string]string{
|
||||||
"WV": "West Virginia",
|
"WV": "West Virginia",
|
||||||
"WI": "Wisconsin",
|
"WI": "Wisconsin",
|
||||||
"WY": "Wyoming",
|
"WY": "Wyoming",
|
||||||
"YT": "Yukon",
|
|
||||||
}
|
}
|
||||||
|
|
24
pkg/txt/states_test.go
Normal file
24
pkg/txt/states_test.go
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
package txt
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStatesByCountry(t *testing.T) {
|
||||||
|
t.Run("QCUnknownCountry", func(t *testing.T) {
|
||||||
|
result := StatesByCountry[""]["QC"]
|
||||||
|
assert.Equal(t, "", result)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("QCCanada", func(t *testing.T) {
|
||||||
|
result := StatesByCountry["ca"]["QC"]
|
||||||
|
assert.Equal(t, "Quebec", result)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("QCUnitedStates", func(t *testing.T) {
|
||||||
|
result := StatesByCountry["us"]["QC"]
|
||||||
|
assert.Equal(t, "", result)
|
||||||
|
})
|
||||||
|
}
|
|
@ -32,6 +32,5 @@ https://docs.photoprism.org/developer-guide/
|
||||||
package txt
|
package txt
|
||||||
|
|
||||||
//go:generate go run gen_countries.go
|
//go:generate go run gen_countries.go
|
||||||
//go:generate go run gen_states.go
|
|
||||||
//go:generate go run gen_stopwords.go
|
//go:generate go run gen_stopwords.go
|
||||||
//go:generate go fmt .
|
//go:generate go fmt .
|
||||||
|
|
Loading…
Reference in a new issue