54 lines
1.1 KiB
Go
54 lines
1.1 KiB
Go
package parser
|
|
|
|
import (
|
|
"unicode"
|
|
|
|
"github.com/a-h/parse"
|
|
)
|
|
|
|
var tagTemplOrNewLine = parse.Any(parse.Rune('<'), parse.Rune('{'), parse.Rune('}'), parse.String("\r\n"), parse.Rune('\n'))
|
|
|
|
var textParser = parse.Func(func(pi *parse.Input) (n Node, ok bool, err error) {
|
|
from := pi.Position()
|
|
|
|
// Read until a tag or templ expression opens.
|
|
var t Text
|
|
if t.Value, ok, err = parse.StringUntil(tagTemplOrNewLine).Parse(pi); err != nil || !ok {
|
|
return
|
|
}
|
|
if isWhitespace(t.Value) {
|
|
return t, false, nil
|
|
}
|
|
if _, ok = pi.Peek(1); !ok {
|
|
err = parse.Error("textParser: unterminated text, expected tag open, templ expression open, or newline", from)
|
|
return
|
|
}
|
|
t.Range = NewRange(from, pi.Position())
|
|
|
|
// Elide any void element closing tags.
|
|
if _, _, err = voidElementCloser.Parse(pi); err != nil {
|
|
return
|
|
}
|
|
|
|
// Parse trailing whitespace.
|
|
ws, _, err := parse.Whitespace.Parse(pi)
|
|
if err != nil {
|
|
return t, false, err
|
|
}
|
|
t.TrailingSpace, err = NewTrailingSpace(ws)
|
|
if err != nil {
|
|
return t, false, err
|
|
}
|
|
|
|
return t, true, nil
|
|
})
|
|
|
|
func isWhitespace(s string) bool {
|
|
for _, r := range s {
|
|
if !unicode.IsSpace(r) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|