File: boolfns.go

package info (click to toggle)
golang-github-christrenkamp-goxpath 1.0~alpha3%2Bgit20170922.c385f95-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster
  • size: 308 kB
  • sloc: sh: 16; makefile: 3; xml: 3
file content (74 lines) | stat: -rw-r--r-- 1,736 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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)
}