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()
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"

View file

@ -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

View file

@ -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) {