Merge pull request #696 from trheyi/main

SUI:  Support for passing children to components
This commit is contained in:
Max 2024-07-18 19:39:49 +08:00 committed by GitHub
commit 9190a380cd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 32 additions and 24 deletions

View file

@ -180,7 +180,8 @@ func (page *Page) BuildAsComponent(sel *goquery.Selection, ctx *BuildContext, op
first := body.Children().First() first := body.Children().First()
page.copyProps(ctx, sel, first, attrs...) page.copyProps(ctx, sel, first, attrs...)
page.copySlots(ctx, sel, first) page.copySlots(sel, first)
page.copyChildren(sel, first)
page.buildComponents(doc, ctx, &opt) page.buildComponents(doc, ctx, &opt)
data := Data{"$props": page.Attrs} data := Data{"$props": page.Attrs}
data.ReplaceSelectionUse(slotRe, first) data.ReplaceSelectionUse(slotRe, first)
@ -222,7 +223,7 @@ func (page *Page) BuildAsComponent(sel *goquery.Selection, ctx *BuildContext, op
return source, nil 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") slots := from.Find("slot")
if slots.Length() == 0 { if slots.Length() == 0 {
return nil return nil
@ -236,25 +237,27 @@ func (page *Page) copySlots(ctx *BuildContext, from *goquery.Selection, to *goqu
} }
// Get the slot // Get the slot
slotSel := to.Find(fmt.Sprintf("slot[name='%s']", name)) slotSel := to.Find(name)
if slotSel.Length() == 0 { if slotSel.Length() == 0 {
continue continue
} }
// Copy the slot slotSel.ReplaceWithSelection(slot.Contents())
html, err := slot.Html()
if err != nil {
ctx.warnings = append(ctx.warnings, err.Error())
setError(slotSel, err)
continue
}
slotSel.SetHtml(html)
} }
return nil 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 { func (page *Page) copyProps(ctx *BuildContext, from *goquery.Selection, to *goquery.Selection, extra ...html.Attribute) error {
attrs := from.Get(0).Attr attrs := from.Get(0).Attr
prefix := "s:prop" prefix := "s:prop"

View file

@ -48,14 +48,14 @@ func init() {
// parseComponent parse the component // parseComponent parse the component
func (parser *TemplateParser) parseComponent(sel *goquery.Selection) { func (parser *TemplateParser) parseComponent(sel *goquery.Selection) {
parser.parsed(sel) parser.parsed(sel)
comp, props, slots, err := parser.getComponent(sel) comp, props, slots, children, err := parser.getComponent(sel)
if err != nil { if err != nil {
parser.errors = append(parser.errors, err) parser.errors = append(parser.errors, err)
setError(sel, err) setError(sel, err)
return return
} }
html, _, err := parser.RenderComponent(comp, props, slots) html, _, err := parser.RenderComponent(comp, props, slots, children)
if err != nil { if err != nil {
parser.errors = append(parser.errors, err) parser.errors = append(parser.errors, err)
setError(sel, err) setError(sel, err)
@ -66,7 +66,7 @@ func (parser *TemplateParser) parseComponent(sel *goquery.Selection) {
} }
// RenderComponent render the component // 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 html := comp.html
randvar := fmt.Sprintf("__%s_$props", time.Now().Format("20060102150405")) randvar := fmt.Sprintf("__%s_$props", time.Now().Format("20060102150405"))
html = replaceRandVar(html, randvar) html = replaceRandVar(html, randvar)
@ -93,15 +93,19 @@ func (parser *TemplateParser) RenderComponent(comp *JitComponent, props map[stri
} }
// Find the slot // Find the slot
slotSel := root.Find(fmt.Sprintf("slot[name='%s']", name)) slotSel := root.Find(name)
if slotSel.Length() == 0 { if slotSel.Length() == 0 {
return return
} }
// Replace the slot // 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 := *parser.option
option.Route = comp.route option.Route = comp.route
compParser := NewTemplateParser(data, &option) 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") slots := sel.Find("slot")
children := sel.Contents()
props, err := parser.componentProps(sel) props, err := parser.componentProps(sel)
if err != nil { if err != nil {
return nil, nil, slots, err return nil, nil, slots, children, err
} }
file, route, err := parser.componentFile(sel, props) file, route, err := parser.componentFile(sel, props)
if err != nil { if err != nil {
return nil, props, slots, err return nil, props, slots, children, err
} }
comp, err := getComponent(route, file, parser.disableCache()) comp, err := getComponent(route, file, parser.disableCache())
if err != nil { 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 // isComponent check if the selection is a component

View file

@ -57,9 +57,9 @@ func TestGetTemplates(t *testing.T) {
assert.Equal(t, "default", webTmpls[0].(*Template).ID) assert.Equal(t, "default", webTmpls[0].(*Template).ID)
assert.Equal(t, "Yao Startup Webapp", webTmpls[0].(*Template).Name) assert.Equal(t, "Yao Startup Webapp", webTmpls[0].(*Template).Name)
assert.Len(t, webTmpls[0].Themes(), 2) 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.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) { func TestGetTemplate(t *testing.T) {