Source File
match.go
Belonging Package
golang.org/x/text/language
package language
import (
)
type MatchOption func(*matcher)
func ( bool) MatchOption {
return func( *matcher) { .preferSameScript = }
}
type Matcher interface {
Match(t ...Tag) (tag Tag, index int, c Confidence)
}
func (, Tag) Confidence {
, , := NewMatcher([]Tag{}).Match()
return
}
func ( []Tag, ...MatchOption) Matcher {
return newMatcher(, )
}
func ( *matcher) ( ...Tag) ( Tag, int, Confidence) {
var language.Tag
, , := .getBest(...)
if != nil {
, = .tag, .index
= .default_.tag
if .preferSameScript {
:
for , := range {
, := .Script()
, _ = .SetTypeForKey("rg", strings.ToLower()+"zzzz")
}
var ErrMissingLikelyTagsData = errors.New("missing likely tags data")
type matcher struct {
default_ *haveTag
supported []*haveTag
index map[language.Language]*matchHeader
passSettings bool
preferSameScript bool
}
type matchHeader struct {
haveTags []*haveTag
original bool
}
func ( *matchHeader) ( haveTag, bool) {
for , := range .haveTags {
if equalsRest(.tag, .tag) {
return
}
for , := range .haveTags {
if .maxScript == .maxScript &&
.maxRegion == .maxRegion &&
.tag.VariantOrPrivateUseTags() == .tag.VariantOrPrivateUseTags() {
for .haveTags[].nextMax != 0 {
= int(.haveTags[].nextMax)
}
.haveTags[].nextMax = uint16(len(.haveTags))
break
}
}
.haveTags = append(.haveTags, &)
}
func ( *matcher) ( language.Language) *matchHeader {
if := .index[]; != nil {
return
}
:= &matchHeader{}
.index[] =
return
}
func ( uint8) Confidence {
if <= 10 {
return High
}
if < 30 {
return Low
}
return No
}
func ( []Tag, []MatchOption) *matcher {
:= &matcher{
index: make(map[language.Language]*matchHeader),
preferSameScript: true,
}
for , := range {
()
}
if len() == 0 {
.default_ = &haveTag{}
return
:= func(, uint16, Confidence) {
if := .index[language.Language()]; != nil {
if !.original {
return
}
:= .header(language.Language())
for , := range .haveTags {
:= *
if < .conf {
.conf =
}
.nextMax = 0 // this value needs to be recomputed
if .altScript != 0 {
.altScript = altScript(language.Language(), .maxScript)
}
.addIfNew(, == Exact && .original)
}
}
}
, _ = .Maximize()
for := range .haveTags {
:= .haveTags[]
.update(, , .ScriptID, .RegionID, )
if .conf == Exact {
for .nextMax != 0 {
= .haveTags[.nextMax]
.update(, , .ScriptID, .RegionID, )
}
return .have, .want, .conf
}
}
}
if .conf <= No {
if len() != 0 {
return nil, [0].tag(), No
}
return nil, language.Tag{}, No
}
return .have, .want, .conf
}
type bestMatch struct {
have *haveTag
want language.Tag
conf Confidence
pinnedRegion language.Region
pinLanguage bool
if .pinLanguage && .LangID != .want.LangID {
return
if .LangID == .want.LangID && .sameRegionGroup {
, := regionGroupDist(.pinnedRegion, .maxRegion, .maxScript, .want.LangID)
if ! {
return
}
}
.pinLanguage =
}
if equalsRest(.tag, ) {
= High
}
}
:= .tag.RegionID == .RegionID && .RegionID != 0
if ! && .origReg != {
if .origReg {
return
}
= true
}
, := regionGroupDist(.maxRegion, , , .LangID)
if ! && .regGroupDist != {
if > .regGroupDist {
return
}
= true
}
:= isParadigmLocale(.LangID, .maxRegion)
if ! && .paradigmReg != {
if ! {
return
}
= true
}
:= .tag.ScriptID == .ScriptID && .ScriptID != 0
if ! && .origScript != {
if .origScript {
return
}
= true
}
if {
.have =
.want =
.conf =
.pinnedRegion =
.sameRegionGroup =
.origLang =
.origReg =
.paradigmReg =
.origScript =
.regGroupDist =
}
}
func ( language.Language, language.Region) bool {
for , := range paradigmLocales {
if language.Language([0]) == && ( == language.Region([1]) || == language.Region([2])) {
return true
}
}
return false
}
func (, language.Region, language.Script, language.Language) ( uint8, bool) {
const = 4
:= uint(regionToGroups[]) << 1
:= uint(regionToGroups[]) << 1
for , := range matchRegion {
if language.Language(.lang) == && (.script == 0 || language.Script(.script) == ) {
:= uint(1 << (.group &^ 0x80))
if 0x80&.group == 0 {
if && != 0 { // Both regions are in the group.
return .distance, .distance ==
}
} else {
if (|)& == 0 { // Both regions are not in the group.
return .distance, .distance ==
}
}
}
}
return , true
}
return .ScriptID == .ScriptID && .RegionID == .RegionID && .VariantOrPrivateUseTags() == .VariantOrPrivateUseTags()
}
func ( language.Language) bool {
for , := range notEquivalent {
if == {
return false
}
}
return true
}
var notEquivalent []language.Language
for , := range paradigmLocales {
:= language.Tag{LangID: language.Language([0])}
, := .Maximize()
if [1] == 0 {
paradigmLocales[][1] = uint16(.RegionID)
}
if [2] == 0 {
paradigmLocales[][2] = uint16(.RegionID)
}
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |