diff --git a/tests/html.xgo b/tests/html.xgo
index 8d52e75..a9699b5 100644
--- a/tests/html.xgo
+++ b/tests/html.xgo
@@ -1,15 +1,26 @@
fmt := import("fmt")
html := import("html").new_render()
+added := html.ul()
+for i in [1, 2, 3, 4, 5] {
+ added.add(html.li().body(i))
+}
+
fmt.println(
html.html({
lang: "en"
}).body(
- html.head(),
+ html.head().body(
+ html.link({
+ rel: "stylesheet",
+ href: "/web/main.css"
+ }).final()
+ ),
html.body().body(
html.p().body(
">>>shit"
)
- )
+ ),
+ added
)
)
diff --git a/xmodules/htmlx/element.go b/xmodules/htmlx/element.go
index 8f437ae..1544de3 100644
--- a/xmodules/htmlx/element.go
+++ b/xmodules/htmlx/element.go
@@ -19,6 +19,7 @@ type Element struct {
// The value makes sense only if
// the tag is the "raw"
Content string
+ Final bool
}
func (el *Element) TypeName() string {
@@ -40,6 +41,10 @@ func (el *Element) String() string {
}
fmt.Fprint(&b, ">")
+ if el.Final {
+ return b.String()
+ }
+
for _, child := range el.Children {
if child == nil {
continue
@@ -51,9 +56,56 @@ func (el *Element) String() string {
return b.String()
}
-func (el *Element) Body(els ...*Element) *Element {
+func MakeElements(args ...tengo.Object) ([]*Element, error) {
+ s := []*Element{}
+ for _, arg := range args {
+ el, ok := arg.(*Element)
+ if !ok {
+ str, ok := tengo.ToString(arg)
+ if !ok {
+ return nil, tengo.ErrInvalidArgumentType{
+ }
+ }
+ s = append(s, &Element{
+ Tag: RawTag,
+ Content: str,
+ })
+ }
+ s = append(s, el)
+ }
+ return s, nil
+}
+
+func (el *Element) SetBody(
+ args ...tengo.Object,
+) (tengo.Object, error) {
+ els, err := MakeElements(args...)
+ if err != nil {
+ return nil, err
+ }
el.Children = els
- return el
+ return el, nil
+}
+
+func (el *Element) Add(
+ args ...tengo.Object,
+) (tengo.Object, error) {
+ s, err := MakeElements(args...)
+ if err != nil {
+ return nil, err
+ }
+ el.Children = append(el.Children, s...)
+ return el, nil
+}
+
+func (el *Element) SetFinal(
+ args ...tengo.Object,
+) (tengo.Object, error) {
+ if len(args) > 0 {
+ return nil, tengo.ErrWrongNumArguments
+ }
+ el.Final = true
+ return el, nil
}
func (el *Element) IndexGet(
@@ -67,27 +119,18 @@ func (el *Element) IndexGet(
switch arg {
case "body" :
return &tengo.UserFunction{
- Name: "Element.Body",
- Value: func(
- args ...tengo.Object,
- ) (tengo.Object, error) {
- s := []*Element{}
- for _, arg := range args {
- el, ok := arg.(*Element)
- if !ok {
- str, ok := tengo.ToString(arg)
- if ok {
- s = append(s, &Element{
- Tag: RawTag,
- Content: str,
- })
- }
- continue
- }
- s = append(s, el)
- }
- return el.Body(s...), nil
- },
+ Name: "element.body",
+ Value: el.SetBody,
+ }, nil
+ case "final" :
+ return &tengo.UserFunction{
+ Name: "element.final",
+ Value: el.SetFinal,
+ }, nil
+ case "add" :
+ return &tengo.UserFunction{
+ Name: "element.add",
+ Value: el.Add,
}, nil
}
return nil, nil