Skip to content

Commit

Permalink
Merge pull request #696 from trheyi/main
Browse files Browse the repository at this point in the history
SUI:  Support for passing children to components
  • Loading branch information
trheyi authored Jul 18, 2024
2 parents 5c25859 + 3014d6f commit 9190a38
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 24 deletions.
27 changes: 15 additions & 12 deletions sui/core/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand All @@ -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"
Expand Down
25 changes: 15 additions & 10 deletions sui/core/jit.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions sui/storages/local/local_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 9190a38

Please sign in to comment.