diff --git a/sui/core/build.go b/sui/core/build.go index 7d7d6851..e92bade0 100644 --- a/sui/core/build.go +++ b/sui/core/build.go @@ -52,13 +52,25 @@ func (page *Page) Build(option *BuildOption) (*goquery.Document, []string, error } // BuildForImport build the page for import -func (page *Page) BuildForImport(option *BuildOption, slots map[string]interface{}) (string, string, string, []string, error) { +func (page *Page) BuildForImport(option *BuildOption, slots map[string]interface{}, attrs map[string]string) (string, string, string, []string, error) { warnings := []string{} html, err := page.BuildHTML(option) if err != nil { warnings = append(warnings, err.Error()) } + data := map[string]interface{}{} + if slots != nil { + for k, v := range slots { + data[k] = v + } + } + + if attrs != nil { + data["$prop"] = attrs + page.Attrs = attrs + } + // Add Style & Script & Warning doc, err := NewDocument([]byte(html)) if err != nil { @@ -83,7 +95,6 @@ func (page *Page) BuildForImport(option *BuildOption, slots map[string]interface } body := doc.Selection.Find("body") - if body.Length() > 1 { body.SetHtml("
" + html + "
") } @@ -96,7 +107,7 @@ func (page *Page) BuildForImport(option *BuildOption, slots map[string]interface } // Replace the slots - html, _ = Data(slots).ReplaceUse(slotRe, html) + html, _ = Data(data).ReplaceUse(slotRe, html) return html, style, script, warnings, nil } @@ -122,6 +133,7 @@ func (page *Page) parse(doc *goquery.Document, option *BuildOption, warnings []s continue } + sel.SetAttr("parsed", "true") ipage, err := tmpl.Page(name) if err != nil { sel.ReplaceWith(fmt.Sprintf("", err.Error())) @@ -136,6 +148,7 @@ func (page *Page) parse(doc *goquery.Document, option *BuildOption, warnings []s continue } + // Set the parent slots := map[string]interface{}{} for _, slot := range sel.Find("slot").Nodes { slotSel := goquery.NewDocumentFromNode(slot) @@ -150,15 +163,37 @@ func (page *Page) parse(doc *goquery.Document, option *BuildOption, warnings []s slots[slotName] = strings.TrimSpace(slotHTML) } + // Set Attrs + attrs := map[string]string{} + if sel.Length() > 0 { + if page.Attrs != nil { + parentProps := Data{"$prop": page.Attrs} + for k, v := range page.Attrs { + if k == "is" { + continue + } + attrs[k], _ = parentProps.ReplaceUse(slotRe, v) + } + } else { + for _, attr := range sel.Nodes[0].Attr { + if attr.Key == "is" { + continue + } + attrs[attr.Key] = attr.Val + } + } + } + + p := ipage.Get() namespace := fmt.Sprintf("__page_%s_%d", strings.ReplaceAll(name, "/", "_"), idx) - html, style, script, warns, err := ipage.Get().BuildForImport(&BuildOption{ + html, style, script, warns, err := p.BuildForImport(&BuildOption{ SSR: option.SSR, AssetRoot: option.AssetRoot, IgnoreAssetRoot: option.IgnoreAssetRoot, KeepPageTag: option.KeepPageTag, IgnoreDocument: true, Namespace: namespace, - }, slots) + }, slots, attrs) if err != nil { sel.ReplaceWith(fmt.Sprintf("", err.Error())) @@ -184,6 +219,11 @@ func (page *Page) parse(doc *goquery.Document, option *BuildOption, warnings []s } sel.SetAttr("s:slots", slotsAttr) + + // Set Attrs + for k, v := range attrs { + sel.SetAttr(k, v) + } continue } sel.ReplaceWithHtml(fmt.Sprintf("\n%s\n%s\n%s\n", style, html, script)) diff --git a/sui/core/data.go b/sui/core/data.go index e94359d8..e7cc67d0 100644 --- a/sui/core/data.go +++ b/sui/core/data.go @@ -28,6 +28,9 @@ var options = []expr.Option{ func (data Data) New(stmt string) (*vm.Program, error) { stmt = strings.TrimSpace(strings.TrimRight(strings.TrimLeft(stmt, "{{ "), "}}")) stmt = strings.TrimSpace(strings.TrimRight(strings.TrimLeft(stmt, "[{ "), "}]")) + // ' => ' " => " + stmt = strings.ReplaceAll(stmt, "'", "'") + stmt = strings.ReplaceAll(stmt, """, "\"") return expr.Compile(stmt, append([]expr.Option{expr.Env(data)}, options...)...) } diff --git a/sui/core/types.go b/sui/core/types.go index 3e779c29..3f0ecd34 100644 --- a/sui/core/types.go +++ b/sui/core/types.go @@ -25,15 +25,16 @@ type Setting struct { // Page is the struct for the page type Page struct { - Route string `json:"route"` - Name string `json:"name,omitempty"` - TemplateID string `json:"-"` - SuiID string `json:"-"` - Config *PageConfig `json:"-"` - Path string `json:"-"` - Codes SourceCodes `json:"-"` - Document []byte `json:"-"` - GlobalData []byte `json:"-"` + Route string `json:"route"` + Name string `json:"name,omitempty"` + TemplateID string `json:"-"` + SuiID string `json:"-"` + Config *PageConfig `json:"-"` + Path string `json:"-"` + Codes SourceCodes `json:"-"` + Document []byte `json:"-"` + GlobalData []byte `json:"-"` + Attrs map[string]string `json:"-"` } // PageTreeNode is the struct for the page tree node