package parser import ( "fmt" "github.com/a-h/parse" ) // TemplateExpression. // TemplateExpression. // templ Func(p Parameter) { // templ (data Data) Func(p Parameter) { // templ (data []string) Func(p Parameter) { type templateExpression struct { Expression Expression } var templateExpressionParser = parse.Func(func(pi *parse.Input) (r templateExpression, ok bool, err error) { start := pi.Index() if !peekPrefix(pi, "templ ") { return r, false, nil } // Once we have the prefix, everything to the brace is Go. // e.g. // templ (x []string) Test() { // becomes: // func (x []string) Test() templ.Component { if _, r.Expression, err = parseTemplFuncDecl(pi); err != nil { return r, false, err } // Eat " {\n". if _, ok, err = parse.All(openBraceWithOptionalPadding, parse.StringFrom(parse.Optional(parse.NewLine))).Parse(pi); err != nil || !ok { err = parse.Error("templ: malformed templ expression, expected `templ functionName() {`", pi.PositionAt(start)) return } return r, true, nil }) const ( unterminatedMissingCurly = `unterminated (missing closing '{\n') - https://templ.guide/syntax-and-usage/statements#incomplete-statements` unterminatedMissingEnd = `missing end (expected '}') - https://templ.guide/syntax-and-usage/statements#incomplete-statements` ) // Template node (element, call, if, switch, for, whitespace etc.) func newTemplateNodeParser[TUntil any](until parse.Parser[TUntil], untilName string) templateNodeParser[TUntil] { return templateNodeParser[TUntil]{ until: until, untilName: untilName, } } type templateNodeParser[TUntil any] struct { until parse.Parser[TUntil] untilName string } var rawElements = parse.Any(styleElement, scriptElement) var templateNodeSkipParsers = []parse.Parser[Node]{ voidElementCloser, //
, etc. - should be ignored. } var templateNodeParsers = []parse.Parser[Node]{ docType, // htmlComment, //