46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
package parser
|
|
|
|
import (
|
|
"github.com/a-h/parse"
|
|
"github.com/a-h/templ/parser/v2/goexpression"
|
|
)
|
|
|
|
var goCode = parse.Func(func(pi *parse.Input) (n Node, ok bool, err error) {
|
|
// Check the prefix first.
|
|
if _, ok, err = parse.Or(parse.String("{{ "), parse.String("{{")).Parse(pi); err != nil || !ok {
|
|
return
|
|
}
|
|
|
|
// Once we have a prefix, we must have an expression that returns a string, with optional err.
|
|
l := pi.Position().Line
|
|
var r GoCode
|
|
if r.Expression, err = parseGo("go code", pi, goexpression.Expression); err != nil {
|
|
return r, false, err
|
|
}
|
|
|
|
if l != pi.Position().Line {
|
|
r.Multiline = true
|
|
}
|
|
|
|
// Clear any optional whitespace.
|
|
_, _, _ = parse.OptionalWhitespace.Parse(pi)
|
|
|
|
// }}
|
|
if _, ok, err = dblCloseBraceWithOptionalPadding.Parse(pi); err != nil || !ok {
|
|
err = parse.Error("go code: missing close braces", pi.Position())
|
|
return
|
|
}
|
|
|
|
// Parse trailing whitespace.
|
|
ws, _, err := parse.Whitespace.Parse(pi)
|
|
if err != nil {
|
|
return r, false, err
|
|
}
|
|
r.TrailingSpace, err = NewTrailingSpace(ws)
|
|
if err != nil {
|
|
return r, false, err
|
|
}
|
|
|
|
return r, true, nil
|
|
})
|