75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
package intfns
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/ChrisTrenkamp/goxpath/tree"
|
|
"golang.org/x/text/language"
|
|
)
|
|
|
|
func boolean(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
if b, ok := args[0].(tree.IsBool); ok {
|
|
return b.Bool(), nil
|
|
}
|
|
|
|
return nil, fmt.Errorf("Cannot convert object to a boolean")
|
|
}
|
|
|
|
func not(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
b, ok := args[0].(tree.IsBool)
|
|
if !ok {
|
|
return nil, fmt.Errorf("Cannot convert object to a boolean")
|
|
}
|
|
return !b.Bool(), nil
|
|
}
|
|
|
|
func _true(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
return tree.Bool(true), nil
|
|
}
|
|
|
|
func _false(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
return tree.Bool(false), nil
|
|
}
|
|
|
|
func lang(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
lStr := args[0].String()
|
|
|
|
var n tree.Elem
|
|
|
|
for _, i := range c.NodeSet {
|
|
if i.GetNodeType() == tree.NtElem {
|
|
n = i.(tree.Elem)
|
|
} else {
|
|
n = i.GetParent()
|
|
}
|
|
|
|
for n.GetNodeType() != tree.NtRoot {
|
|
if attr, ok := tree.GetAttribute(n, "lang", tree.XMLSpace); ok {
|
|
return checkLang(lStr, attr.Value), nil
|
|
}
|
|
n = n.GetParent()
|
|
}
|
|
}
|
|
|
|
return tree.Bool(false), nil
|
|
}
|
|
|
|
func checkLang(srcStr, targStr string) tree.Bool {
|
|
srcLang := language.Make(srcStr)
|
|
srcRegion, srcRegionConf := srcLang.Region()
|
|
|
|
targLang := language.Make(targStr)
|
|
targRegion, targRegionConf := targLang.Region()
|
|
|
|
if srcRegionConf == language.Exact && targRegionConf != language.Exact {
|
|
return tree.Bool(false)
|
|
}
|
|
|
|
if srcRegion != targRegion && srcRegionConf == language.Exact && targRegionConf == language.Exact {
|
|
return tree.Bool(false)
|
|
}
|
|
|
|
_, _, conf := language.NewMatcher([]language.Tag{srcLang}).Match(targLang)
|
|
return tree.Bool(conf >= language.High)
|
|
}
|