Skip to content

Commit

Permalink
feat: templ component enhancement
Browse files Browse the repository at this point in the history
  • Loading branch information
joerdav committed Jun 9, 2022
1 parent f9339cc commit a7f821f
Show file tree
Hide file tree
Showing 29 changed files with 345 additions and 244 deletions.
58 changes: 35 additions & 23 deletions generator/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,11 @@ func Generate(template parser.TemplateFile, w io.Writer) (sm *parser.SourceMap,
}

type generator struct {
tf parser.TemplateFile
w *RangeWriter
sourceMap *parser.SourceMap
variableID int
tf parser.TemplateFile
w *RangeWriter
sourceMap *parser.SourceMap
variableID int
childrenVar string
}

func (g *generator) generate() (err error) {
Expand Down Expand Up @@ -282,6 +283,15 @@ func (g *generator) writeTemplate(t parser.HTMLTemplate) error {
if _, err = g.w.WriteIndent(indentLevel, "ctx, _ = templ.RenderedScriptsFromContext(ctx)\n"); err != nil {
return err
}
g.childrenVar = g.createVariableName()
// children := ctx
// ctx = templ.ClearChildren(children)
if _, err = g.w.WriteIndent(indentLevel, fmt.Sprintf("%s := ctx\n", g.childrenVar)); err != nil {
return err
}
if _, err = g.w.WriteIndent(indentLevel, fmt.Sprintf("ctx = templ.ClearChildren(%s)\n", g.childrenVar)); err != nil {
return err
}
// Nodes.
if err = g.writeNodes(indentLevel, nil, stripWhitespace(t.Children)); err != nil {
return err
Expand Down Expand Up @@ -390,6 +400,8 @@ func (g *generator) writeNode(indentLevel int, current parser.Node) error {
g.writeDocType(indentLevel, n)
case parser.Element:
g.writeElement(indentLevel, n)
case parser.ChildrenExpression:
g.writeChildrenExpression(indentLevel)
case parser.RawElement:
g.writeRawElement(indentLevel, n)
case parser.ForExpression:
Expand Down Expand Up @@ -503,6 +515,19 @@ func (g *generator) writeSwitchExpression(indentLevel int, n parser.SwitchExpres
return nil
}

func (g *generator) writeChildrenExpression(indentLevel int) (err error) {
if _, err = g.w.WriteIndent(indentLevel, "// Children\n"); err != nil {
return err
}
if _, err = g.w.WriteIndent(indentLevel, fmt.Sprintf("err = templ.GetChildren(%s).Render(ctx, w)\n", g.childrenVar)); err != nil {
return err
}
if err = g.writeErrorHandler(indentLevel); err != nil {
return err
}
return nil
}

func (g *generator) writeTemplElementExpression(indentLevel int, n parser.TemplElementExpression) (err error) {
if _, err = g.w.WriteIndent(indentLevel, "// TemplElement\n"); err != nil {
return err
Expand All @@ -514,7 +539,7 @@ func (g *generator) writeTemplElementExpression(indentLevel int, n parser.TemplE
}

func (g *generator) writeBlockTemplElementExpression(indentLevel int, n parser.TemplElementExpression) (err error) {
//var r parser.Range
var r parser.Range
childrenName := g.createVariableName()
if _, err = g.w.WriteIndent(indentLevel, childrenName+" := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) {\n"); err != nil {
return err
Expand All @@ -532,25 +557,12 @@ func (g *generator) writeBlockTemplElementExpression(indentLevel int, n parser.T
if _, err = g.w.WriteIndent(indentLevel, `err = `); err != nil {
return err
}
if !strings.HasSuffix(n.Expression.Value, ")") {
return fmt.Errorf("block components must be function calls")
}
if strings.HasSuffix(n.Expression.Value, "()") {
if _, err = g.w.Write(strings.ReplaceAll(n.Expression.Value, "()", "")); err != nil {
return err
}
if _, err = g.w.Write("(" + childrenName + ")"); err != nil {
return err
}
} else {
if _, err = g.w.Write(strings.ReplaceAll(n.Expression.Value,
")",
", "+childrenName+")")); err != nil {
return err
}
if r, err = g.w.Write(n.Expression.Value); err != nil {
return err
}
// .Render(ctx w)
if _, err = g.w.Write(".Render(ctx, w)\n"); err != nil {
g.sourceMap.Add(n.Expression, r)
// .Render(templ.WithChildren(ctx, children), w)
if _, err = g.w.Write(".Render(templ.WithChildren(ctx, " + childrenName + "), w)\n"); err != nil {
return err
}
if err = g.writeErrorHandler(indentLevel); err != nil {
Expand Down
22 changes: 12 additions & 10 deletions generator/test-a-href/template_templ.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 6 additions & 4 deletions generator/test-attribute-escaping/template_templ.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 8 additions & 4 deletions generator/test-call/template_templ.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 10 additions & 6 deletions generator/test-css-usage/template_templ.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions generator/test-doctype/template_templ.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions generator/test-for/template_templ.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 6 additions & 4 deletions generator/test-html/template_templ.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions generator/test-if/template_templ.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions generator/test-ifelse/template_templ.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit a7f821f

Please sign in to comment.