114 lines
1.9 KiB
Go
114 lines
1.9 KiB
Go
package htmlx
|
|
|
|
import "github.com/d5/tengo/v2"
|
|
import "log"
|
|
|
|
var Module = map[string] tengo.Object{
|
|
"new_render" : &tengo.UserFunction{
|
|
Name: "new_render",
|
|
Value: func(args ...tengo.Object) (tengo.Object, error){
|
|
ret := &HTML{}
|
|
return ret, nil
|
|
},
|
|
},
|
|
}
|
|
|
|
type HTML struct{
|
|
tengo.ObjectImpl
|
|
}
|
|
|
|
func (html *HTML) Import(moduleName string) (any, error) {
|
|
log.Println("import:", moduleName)
|
|
switch moduleName {
|
|
case "html":
|
|
return html, nil
|
|
}
|
|
return nil, nil
|
|
}
|
|
|
|
func (html *HTML) TypeName() string {
|
|
return "blablabla"
|
|
}
|
|
|
|
func (html *HTML) String() (string) {
|
|
return "HTML{...}"
|
|
}
|
|
|
|
/*
|
|
|
|
html.div({
|
|
id: "some-el-id",
|
|
value: "shit value"
|
|
}).body(
|
|
html.raw("cock "),
|
|
html.strong("something")
|
|
)
|
|
|
|
*/
|
|
|
|
func (html *HTML) IndexGet(
|
|
index tengo.Object,
|
|
) (tengo.Object, error) {
|
|
str, ok := tengo.ToString(index)
|
|
if !ok {
|
|
return nil, tengo.ErrInvalidIndexValueType
|
|
}
|
|
|
|
fn := func(args ...tengo.Object) (tengo.Object, error) {
|
|
if len(args) > 1 {
|
|
return nil, tengo.ErrWrongNumArguments
|
|
}
|
|
var arg tengo.Object
|
|
if len(args) == 1 {
|
|
arg = args[0]
|
|
}
|
|
|
|
if arg == nil {
|
|
return &Element{
|
|
Tag: str,
|
|
}, nil
|
|
}
|
|
|
|
if can := arg.CanIterate() ; !can {
|
|
return nil, tengo.ErrInvalidArgumentType{
|
|
Name: "first",
|
|
Expected: "iterable",
|
|
Found: arg.TypeName(),
|
|
}
|
|
}
|
|
attr := map[string] string{}
|
|
iter := arg.Iterate()
|
|
for iter.Next() {
|
|
key, val := iter.Key(), iter.Value()
|
|
skey, ok := tengo.ToString(key)
|
|
if !ok {
|
|
return nil, tengo.ErrInvalidArgumentType{
|
|
Name: "attribute(key)",
|
|
Expected: "stringer",
|
|
Found: key.TypeName(),
|
|
}
|
|
}
|
|
sval, ok := tengo.ToString(val)
|
|
if !ok {
|
|
return nil, tengo.ErrInvalidArgumentType{
|
|
Name: "attribute(value)",
|
|
Expected: "stringer",
|
|
Found: val.TypeName(),
|
|
}
|
|
}
|
|
attr[skey] = sval
|
|
}
|
|
return &Element{
|
|
Tag: str,
|
|
Attr: attr,
|
|
}, nil
|
|
}
|
|
|
|
return &tengo.UserFunction{
|
|
Name: str,
|
|
Value: fn,
|
|
}, nil
|
|
}
|
|
|
|
|
|
|