diff --git a/sui/core/build.go b/sui/core/build.go index f1efafaa..bccfc5df 100644 --- a/sui/core/build.go +++ b/sui/core/build.go @@ -180,7 +180,8 @@ func (page *Page) BuildAsComponent(sel *goquery.Selection, ctx *BuildContext, op first := body.Children().First() page.copyProps(ctx, sel, first, attrs...) - page.copySlots(ctx, sel, first) + page.copySlots(sel, first) + page.copyChildren(sel, first) page.buildComponents(doc, ctx, &opt) data := Data{"$props": page.Attrs} data.ReplaceSelectionUse(slotRe, first) @@ -222,7 +223,7 @@ func (page *Page) BuildAsComponent(sel *goquery.Selection, ctx *BuildContext, op return source, nil } -func (page *Page) copySlots(ctx *BuildContext, from *goquery.Selection, to *goquery.Selection) error { +func (page *Page) copySlots(from *goquery.Selection, to *goquery.Selection) error { slots := from.Find("slot") if slots.Length() == 0 { return nil @@ -236,25 +237,27 @@ func (page *Page) copySlots(ctx *BuildContext, from *goquery.Selection, to *goqu } // Get the slot - slotSel := to.Find(fmt.Sprintf("slot[name='%s']", name)) - + slotSel := to.Find(name) if slotSel.Length() == 0 { continue } - // Copy the slot - html, err := slot.Html() - if err != nil { - ctx.warnings = append(ctx.warnings, err.Error()) - setError(slotSel, err) - continue - } - slotSel.SetHtml(html) + slotSel.ReplaceWithSelection(slot.Contents()) } return nil } +func (page *Page) copyChildren(from *goquery.Selection, to *goquery.Selection) error { + children := from.Contents() + if children.Length() == 0 { + return nil + } + children.Find("slot").Remove() + to.Find("children").ReplaceWithSelection(children) + return nil +} + func (page *Page) copyProps(ctx *BuildContext, from *goquery.Selection, to *goquery.Selection, extra ...html.Attribute) error { attrs := from.Get(0).Attr prefix := "s:prop" diff --git a/sui/core/jit.go b/sui/core/jit.go index add3dd9f..73d8e7b6 100644 --- a/sui/core/jit.go +++ b/sui/core/jit.go @@ -48,14 +48,14 @@ func init() { // parseComponent parse the component func (parser *TemplateParser) parseComponent(sel *goquery.Selection) { parser.parsed(sel) - comp, props, slots, err := parser.getComponent(sel) + comp, props, slots, children, err := parser.getComponent(sel) if err != nil { parser.errors = append(parser.errors, err) setError(sel, err) return } - html, _, err := parser.RenderComponent(comp, props, slots) + html, _, err := parser.RenderComponent(comp, props, slots, children) if err != nil { parser.errors = append(parser.errors, err) setError(sel, err) @@ -66,7 +66,7 @@ func (parser *TemplateParser) parseComponent(sel *goquery.Selection) { } // RenderComponent render the component -func (parser *TemplateParser) RenderComponent(comp *JitComponent, props map[string]interface{}, slots *goquery.Selection) (string, string, error) { +func (parser *TemplateParser) RenderComponent(comp *JitComponent, props map[string]interface{}, slots *goquery.Selection, children *goquery.Selection) (string, string, error) { html := comp.html randvar := fmt.Sprintf("__%s_$props", time.Now().Format("20060102150405")) html = replaceRandVar(html, randvar) @@ -93,15 +93,19 @@ func (parser *TemplateParser) RenderComponent(comp *JitComponent, props map[stri } // Find the slot - slotSel := root.Find(fmt.Sprintf("slot[name='%s']", name)) + slotSel := root.Find(name) if slotSel.Length() == 0 { return } // Replace the slot - slotSel.ReplaceWithNodes(s.Contents().Nodes...) + slotSel.ReplaceWithSelection(s.Contents()) }) + // Replace the children + children.Find("slot").Remove() + root.Find("children").ReplaceWithSelection(children) + option := *parser.option option.Route = comp.route compParser := NewTemplateParser(data, &option) @@ -173,26 +177,27 @@ func (parser *TemplateParser) addStyles(sel *goquery.Selection, styles []StyleNo } } -func (parser *TemplateParser) getComponent(sel *goquery.Selection) (*JitComponent, map[string]interface{}, *goquery.Selection, error) { +func (parser *TemplateParser) getComponent(sel *goquery.Selection) (*JitComponent, map[string]interface{}, *goquery.Selection, *goquery.Selection, error) { slots := sel.Find("slot") + children := sel.Contents() props, err := parser.componentProps(sel) if err != nil { - return nil, nil, slots, err + return nil, nil, slots, children, err } file, route, err := parser.componentFile(sel, props) if err != nil { - return nil, props, slots, err + return nil, props, slots, children, err } comp, err := getComponent(route, file, parser.disableCache()) if err != nil { - return nil, props, slots, err + return nil, props, slots, children, err } - return comp, props, slots, nil + return comp, props, slots, children, nil } // isComponent check if the selection is a component diff --git a/sui/storages/local/local_test.go b/sui/storages/local/local_test.go index 68d90110..fa669f4b 100644 --- a/sui/storages/local/local_test.go +++ b/sui/storages/local/local_test.go @@ -57,9 +57,9 @@ func TestGetTemplates(t *testing.T) { assert.Equal(t, "default", webTmpls[0].(*Template).ID) assert.Equal(t, "Yao Startup Webapp", webTmpls[0].(*Template).Name) assert.Len(t, webTmpls[0].Themes(), 2) - assert.Len(t, webTmpls[0].Locales(), 4) + assert.Len(t, webTmpls[0].Locales(), 5) assert.Len(t, webTmpls[0].(*Template).Template.Themes, 2) - assert.Len(t, webTmpls[0].(*Template).Template.Locales, 4) + assert.Len(t, webTmpls[0].(*Template).Template.Locales, 5) } func TestGetTemplate(t *testing.T) {