142 lines
2.8 KiB
Go
142 lines
2.8 KiB
Go
package intfns
|
|
|
|
import (
|
|
"math"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/ChrisTrenkamp/goxpath/tree"
|
|
)
|
|
|
|
func _string(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
if len(args) == 1 {
|
|
return tree.String(args[0].String()), nil
|
|
}
|
|
|
|
return tree.String(c.NodeSet.String()), nil
|
|
}
|
|
|
|
func concat(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
ret := ""
|
|
|
|
for _, i := range args {
|
|
ret += i.String()
|
|
}
|
|
|
|
return tree.String(ret), nil
|
|
}
|
|
|
|
func startsWith(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
return tree.Bool(strings.Index(args[0].String(), args[1].String()) == 0), nil
|
|
}
|
|
|
|
func contains(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
return tree.Bool(strings.Contains(args[0].String(), args[1].String())), nil
|
|
}
|
|
|
|
func substringBefore(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
ind := strings.Index(args[0].String(), args[1].String())
|
|
if ind == -1 {
|
|
return tree.String(""), nil
|
|
}
|
|
|
|
return tree.String(args[0].String()[:ind]), nil
|
|
}
|
|
|
|
func substringAfter(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
ind := strings.Index(args[0].String(), args[1].String())
|
|
if ind == -1 {
|
|
return tree.String(""), nil
|
|
}
|
|
|
|
return tree.String(args[0].String()[ind+len(args[1].String()):]), nil
|
|
}
|
|
|
|
func substring(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
str := args[0].String()
|
|
|
|
bNum, bErr := round(c, args[1])
|
|
if bErr != nil {
|
|
return nil, bErr
|
|
}
|
|
|
|
b := bNum.(tree.Num).Num()
|
|
|
|
if float64(b-1) >= float64(len(str)) || math.IsNaN(float64(b)) {
|
|
return tree.String(""), nil
|
|
}
|
|
|
|
if len(args) == 2 {
|
|
if b <= 1 {
|
|
b = 1
|
|
}
|
|
|
|
return tree.String(str[int(b)-1:]), nil
|
|
}
|
|
|
|
eNum, eErr := round(c, args[2])
|
|
if eErr != nil {
|
|
return nil, eErr
|
|
}
|
|
|
|
e := eNum.(tree.Num).Num()
|
|
|
|
if e <= 0 || math.IsNaN(float64(e)) || (math.IsInf(float64(b), 0) && math.IsInf(float64(e), 0)) {
|
|
return tree.String(""), nil
|
|
}
|
|
|
|
if b <= 1 {
|
|
e = b + e - 1
|
|
b = 1
|
|
}
|
|
|
|
if float64(b+e-1) >= float64(len(str)) {
|
|
e = tree.Num(len(str)) - b + 1
|
|
}
|
|
|
|
return tree.String(str[int(b)-1 : int(b+e)-1]), nil
|
|
}
|
|
|
|
func stringLength(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
var str string
|
|
if len(args) == 1 {
|
|
str = args[0].String()
|
|
} else {
|
|
str = c.NodeSet.String()
|
|
}
|
|
|
|
return tree.Num(len(str)), nil
|
|
}
|
|
|
|
var spaceTrim = regexp.MustCompile(`\s+`)
|
|
|
|
func normalizeSpace(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
var str string
|
|
if len(args) == 1 {
|
|
str = args[0].String()
|
|
} else {
|
|
str = c.NodeSet.String()
|
|
}
|
|
|
|
str = strings.TrimSpace(str)
|
|
|
|
return tree.String(spaceTrim.ReplaceAllString(str, " ")), nil
|
|
}
|
|
|
|
func translate(c tree.Ctx, args ...tree.Result) (tree.Result, error) {
|
|
ret := args[0].String()
|
|
src := args[1].String()
|
|
repl := args[2].String()
|
|
|
|
for i := range src {
|
|
r := ""
|
|
if i < len(repl) {
|
|
r = string(repl[i])
|
|
}
|
|
|
|
ret = strings.Replace(ret, string(src[i]), r, -1)
|
|
}
|
|
|
|
return tree.String(ret), nil
|
|
}
|