diff options
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.go | 74 |
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) +} |