Merge pull request #696 from trheyi/main
SUI: Support for passing children to components
This commit is contained in:
commit
9190a380cd
3 changed files with 32 additions and 24 deletions
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue