-
Notifications
You must be signed in to change notification settings - Fork 0
/
url.go
53 lines (50 loc) · 1.83 KB
/
url.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
package builtin_libs
import (
"net/url"
"reflect"
. "github.com/zgg-lang/zgg-go/runtime"
)
func libUrl(c *Context) ValueObject {
lib := NewObject()
lib.SetMember("encodeURIComponent", NewNativeFunction("encodeURIComponent", func(c *Context, this Value, args []Value) Value {
var value Value
EnsureFuncParams(c, "decodeURIComponent", args, ArgRuleRequired{"value", TypeAny, &value})
return NewStr(url.QueryEscape(value.ToString(c)))
}, "value"), c)
lib.SetMember("decodeURIComponent", NewNativeFunction("decodeURIComponent", func(c *Context, this Value, args []Value) Value {
var encoded ValueStr
EnsureFuncParams(c, "decodeURIComponent", args, ArgRuleRequired{"encoded", TypeStr, &encoded})
ev := encoded.Value()
r, err := url.QueryUnescape(ev)
if err != nil {
c.OnRuntimeError("decodeURIComponent: decode error! input \"%s\", error: %s", ev, err)
}
return NewStr(r)
}, "encoded"), c)
lib.SetMember("encodeForm", NewNativeFunction("encodeForm", func(c *Context, this Value, args []Value) Value {
var form = url.Values{}
var formValue ValueObject
EnsureFuncParams(c, "encodeForm", args, ArgRuleRequired{"form", TypeObject, &formValue})
formValue.Iterate(func(k string, v Value) {
if varr, ok := v.(ValueArray); ok {
n := varr.Len()
for i := 0; i < n; i++ {
form.Add(k, varr.GetIndex(i, c).ToString(c))
}
} else {
form.Set(k, v.ToString(c))
}
})
return NewStr(form.Encode())
}), c)
lib.SetMember("decodeForm", NewNativeFunction("decodeForm", func(c *Context, this Value, args []Value) Value {
var formStr ValueStr
EnsureFuncParams(c, "decodeForm", args, ArgRuleRequired{"form", TypeStr, &formStr})
form, err := url.ParseQuery(formStr.Value())
if err != nil {
c.OnRuntimeError("decodeForm parse error: %s", err)
}
return FromGoValue(reflect.ValueOf(form), c)
}), c)
return lib
}