-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathstring.go
91 lines (74 loc) · 1.58 KB
/
string.go
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package main
import (
"strings"
"github.com/yuin/gopher-lua"
)
func decorateStringLib(L *lua.LState) {
mt := L.GetMetatable(lua.LString("")).(*lua.LTable)
mt.RawSetString("split", L.NewClosure(split))
mt.RawSetString("c", L.NewClosure(word))
mt.RawSetString("trim", L.NewClosure(trim))
mt.RawSetString("fields", L.NewFunction(fields))
}
func split(L *lua.LState) int {
s := L.CheckString(1)
sep := L.CheckString(2)
parts := strings.Split(s, sep)
if L.GetTop() == 3 {
fn := L.CheckFunction(3)
p := lua.P{Fn: fn, NRet: 0, Protect: true}
for i, str := range parts {
if err := L.CallByParam(p, lua.LString(str), lua.LNumber(i)); err != nil {
emitFatal("%v", err)
}
}
}
i := 0
iterator := func(L *lua.LState) int {
if i == len(parts) {
return 0
}
L.Push(lua.LString(parts[i]))
L.Push(lua.LNumber(i))
i++
return 2
}
L.Push(L.NewClosure(iterator))
return 1
}
func word(L *lua.LState) int {
s := L.CheckString(1)
i := L.CheckInt(2)
if int(i) <= 0 {
L.RaiseError("Index mus be greater then 0")
}
parts := strings.Fields(s)
if int(i) > len(parts) {
L.Push(lua.LString(""))
return 1
}
L.Push(lua.LString(parts[i-1]))
return 1
}
func fields(L *lua.LState) int {
s := L.CheckString(1)
i := 0
parts := strings.Fields(s)
iterator := func(L *lua.LState) int {
if i == len(parts) {
return 0
}
L.Push(lua.LString(parts[i]))
i++
return 1
}
L.Push(L.NewFunction(iterator))
return 1
}
func trim(L *lua.LState) int {
s := L.CheckString(1)
cutset := L.OptString(2, "\n ")
s = strings.Trim(s, cutset)
L.Push(lua.LString(s))
return 1
}