summaryrefslogtreecommitdiff
path: root/vendor/github.com/mitchellh/packer/vendor/github.com/ChrisTrenkamp/goxpath/internal/parser/intfns/boolfns.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/mitchellh/packer/vendor/github.com/ChrisTrenkamp/goxpath/internal/parser/intfns/boolfns.go')
-rw-r--r--vendor/github.com/mitchellh/packer/vendor/github.com/ChrisTrenkamp/goxpath/internal/parser/intfns/boolfns.go74
1 files changed, 74 insertions, 0 deletions
diff --git a/vendor/github.com/mitchellh/packer/vendor/github.com/ChrisTrenkamp/goxpath/internal/parser/intfns/boolfns.go b/vendor/github.com/mitchellh/packer/vendor/github.com/ChrisTrenkamp/goxpath/internal/parser/intfns/boolfns.go
new file mode 100644
index 00000000..5480ebcc
--- /dev/null
+++ b/vendor/github.com/mitchellh/packer/vendor/github.com/ChrisTrenkamp/goxpath/internal/parser/intfns/boolfns.go
@@ -0,0 +1,74 @@
+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)
+}