package language
import
type scriptRegionFlags uint8
const (
isList = 1 << iota
scriptInFrom
regionInFrom
)
func ( *Tag) ( Language) {
if .LangID == 0 {
.LangID =
}
}
func ( *Tag) ( Script) {
if .ScriptID == 0 {
.ScriptID =
}
}
func ( *Tag) ( Region) {
if .RegionID == 0 || .RegionID.Contains() {
.RegionID =
}
}
var ErrMissingLikelyTagsData = errors.New("missing likely tags data")
func ( Tag) () (Tag, error) {
, := addTags()
if != nil {
return ,
} else if .equalTags() {
return , nil
}
.RemakeString()
return , nil
}
func ( *Tag) bool {
if := regionInclusion[.RegionID]; < nRegionGroups {
:= likelyRegionGroup[]
if Language(.lang) == .LangID && Script(.script) == .ScriptID {
.RegionID = Region(.region)
}
return true
}
return false
}
func ( Tag) () (Tag, error) {
return addTags()
}
func ( Tag) (Tag, error) {
if .IsPrivateUse() {
return , nil
}
if .ScriptID != 0 && .RegionID != 0 {
if .LangID != 0 {
specializeRegion(&)
return , nil
}
:= likelyRegion[.RegionID : .RegionID+1]
if := [0]; .flags&isList != 0 {
= likelyRegionList[.lang : .lang+uint16(.script)]
}
for , := range {
if Script(.script) == .ScriptID {
.setUndefinedLang(Language(.lang))
return , nil
}
}
}
if .LangID != 0 {
if .LangID < langNoIndexOffset {
:= likelyLang[.LangID]
if .flags&isList != 0 {
:= likelyLangList[.region : .region+uint16(.script)]
if .ScriptID != 0 {
for , := range {
if Script(.script) == .ScriptID && .flags&scriptInFrom != 0 {
.setUndefinedRegion(Region(.region))
return , nil
}
}
} else if .RegionID != 0 {
:= 0
:= true
:=
for , := range {
if .flags&scriptInFrom == 0 && .RegionID.Contains(Region(.region)) {
.RegionID = Region(.region)
.setUndefinedScript(Script(.script))
= && .ScriptID == Script(.script)
++
}
}
if == 1 {
return , nil
}
if {
.ScriptID = .ScriptID
}
}
}
}
} else {
if .ScriptID != 0 {
:= likelyScript[.ScriptID]
if .region != 0 {
.setUndefinedRegion(Region(.region))
.setUndefinedLang(Language(.lang))
return , nil
}
}
if .RegionID != 0 {
if := regionInclusion[.RegionID]; < nRegionGroups {
:= likelyRegionGroup[]
if .region != 0 {
.setUndefinedLang(Language(.lang))
.setUndefinedScript(Script(.script))
.RegionID = Region(.region)
}
} else {
:= likelyRegion[.RegionID]
if .flags&isList != 0 {
= likelyRegionList[.lang]
}
if .script != 0 && .flags != scriptInFrom {
.setUndefinedLang(Language(.lang))
.setUndefinedScript(Script(.script))
return , nil
}
}
}
}
if .LangID < langNoIndexOffset {
:= likelyLang[.LangID]
if .flags&isList != 0 {
= likelyLangList[.region]
}
if .region != 0 {
.setUndefinedScript(Script(.script))
.setUndefinedRegion(Region(.region))
}
specializeRegion(&)
if .LangID == 0 {
.LangID = _en
}
return , nil
}
return , ErrMissingLikelyTagsData
}
func ( *Tag) ( Tag) {
.LangID = .LangID
.ScriptID = .ScriptID
.RegionID = .RegionID
}
func ( Tag) () (Tag, error) {
, := minimizeTags()
if != nil {
return ,
}
.RemakeString()
return , nil
}
func ( Tag) (Tag, error) {
if .equalTags(Und) {
return , nil
}
, := addTags()
if != nil {
return ,
}
for , := range [...]Tag{
{LangID: .LangID},
{LangID: .LangID, RegionID: .RegionID},
{LangID: .LangID, ScriptID: .ScriptID},
} {
if , := addTags(); == nil && .equalTags() {
.setTagsFrom()
break
}
}
return , nil
}