learnlytics-go/templ/parser/v2/parser.go

51 lines
1.2 KiB
Go
Raw Normal View History

2025-03-20 12:35:13 +01:00
package parser
import (
"github.com/a-h/parse"
)
// ) {
var expressionFuncEnd = parse.All(parse.Rune(')'), openBraceWithOptionalPadding)
// Template
var template = parse.Func(func(pi *parse.Input) (r HTMLTemplate, ok bool, err error) {
start := pi.Position()
// templ FuncName(p Person, other Other) {
var te templateExpression
if te, ok, err = templateExpressionParser.Parse(pi); err != nil || !ok {
return
}
r.Expression = te.Expression
// Once we're in a template, we should expect some template whitespace, if/switch/for,
// or node string expressions etc.
var nodes Nodes
nodes, ok, err = newTemplateNodeParser(closeBraceWithOptionalPadding, "template closing brace").Parse(pi)
if err != nil {
return
}
if !ok {
err = parse.Error("templ: expected nodes in templ body, but found none", pi.Position())
return
}
r.Children = nodes.Nodes
// Eat any whitespace.
_, _, err = parse.OptionalWhitespace.Parse(pi)
if err != nil {
return
}
// Try for }
if _, ok, err = closeBraceWithOptionalPadding.Parse(pi); err != nil || !ok {
err = parse.Error("template: missing closing brace", pi.Position())
return
}
r.Range = NewRange(start, pi.Position())
return r, true, nil
})