diff --git a/.version b/.version index 4cce89fde..59d34e477 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -0.2.719 \ No newline at end of file +0.2.723 \ No newline at end of file diff --git a/parser/v2/cssparser.go b/parser/v2/cssparser.go index 4e20494f9..7d044dfb8 100644 --- a/parser/v2/cssparser.go +++ b/parser/v2/cssparser.go @@ -8,6 +8,8 @@ import ( // CSS Parser. var cssParser = parse.Func(func(pi *parse.Input) (r CSSTemplate, ok bool, err error) { + from := pi.Position() + r = CSSTemplate{ Properties: []CSSProperty{}, } @@ -56,6 +58,8 @@ var cssParser = parse.Func(func(pi *parse.Input) (r CSSTemplate, ok bool, err er return } + r.Range = NewRange(from, pi.Position()) + return r, true, nil } }) diff --git a/parser/v2/cssparser_test.go b/parser/v2/cssparser_test.go index 851608ff3..da758cf2d 100644 --- a/parser/v2/cssparser_test.go +++ b/parser/v2/cssparser_test.go @@ -133,6 +133,10 @@ func TestCSSParser(t *testing.T) { }`, expected: CSSTemplate{ Name: "Name", + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 14, Line: 1, Col: 1}, + }, Expression: Expression{ Value: "Name()", Range: Range{ @@ -157,6 +161,10 @@ func TestCSSParser(t *testing.T) { }`, expected: CSSTemplate{ Name: "Name", + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 14, Line: 1, Col: 1}, + }, Expression: Expression{ Value: "Name()", Range: Range{ @@ -182,6 +190,10 @@ background-color: #ffffff; }`, expected: CSSTemplate{ Name: "Name", + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 41, Line: 2, Col: 1}, + }, Expression: Expression{ Value: "Name()", Range: Range{ @@ -212,6 +224,10 @@ background-color: { constants.BackgroundColor }; }`, expected: CSSTemplate{ Name: "Name", + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 63, Line: 2, Col: 1}, + }, Expression: Expression{ Value: "Name()", Range: Range{ @@ -258,6 +274,10 @@ background-color: { prop }; }`, expected: CSSTemplate{ Name: "Name", + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 53, Line: 2, Col: 1}, + }, Expression: Expression{ Value: "Name(prop string)", Range: Range{ diff --git a/parser/v2/parser.go b/parser/v2/parser.go index ba0205cd1..6110e3569 100644 --- a/parser/v2/parser.go +++ b/parser/v2/parser.go @@ -10,6 +10,8 @@ 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 { @@ -42,5 +44,7 @@ var template = parse.Func(func(pi *parse.Input) (r HTMLTemplate, ok bool, err er return } + r.Range = NewRange(start, pi.Position()) + return r, true, nil }) diff --git a/parser/v2/scripttemplateparser.go b/parser/v2/scripttemplateparser.go index 0f4f1f35a..0770baf70 100644 --- a/parser/v2/scripttemplateparser.go +++ b/parser/v2/scripttemplateparser.go @@ -5,12 +5,12 @@ import ( ) var scriptTemplateParser = parse.Func(func(pi *parse.Input) (r ScriptTemplate, ok bool, err error) { - start := pi.Index() + start := pi.Position() // Parse the name. var se scriptExpression if se, ok, err = scriptExpressionParser.Parse(pi); err != nil || !ok { - pi.Seek(start) + pi.Seek(start.Index) return } r.Name = se.Name @@ -19,7 +19,7 @@ var scriptTemplateParser = parse.Func(func(pi *parse.Input) (r ScriptTemplate, o // Read code expression. var e Expression if e, ok, err = exp.Parse(pi); err != nil || !ok { - pi.Seek(start) + pi.Seek(start.Index) return } r.Value = e.Value @@ -30,6 +30,8 @@ var scriptTemplateParser = parse.Func(func(pi *parse.Input) (r ScriptTemplate, o return } + r.Range = NewRange(start, pi.Position()) + return r, true, nil }) diff --git a/parser/v2/scripttemplateparser_test.go b/parser/v2/scripttemplateparser_test.go index fae590f5d..d400eaf30 100644 --- a/parser/v2/scripttemplateparser_test.go +++ b/parser/v2/scripttemplateparser_test.go @@ -19,6 +19,10 @@ func TestScriptTemplateParser(t *testing.T) { input: `script Name() { }`, expected: ScriptTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 17, Line: 1, Col: 1}, + }, Name: Expression{ Value: "Name", Range: Range{ @@ -56,6 +60,10 @@ func TestScriptTemplateParser(t *testing.T) { input: `script Name(){ }`, expected: ScriptTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 16, Line: 1, Col: 1}, + }, Name: Expression{ Value: "Name", Range: Range{ @@ -94,6 +102,10 @@ func TestScriptTemplateParser(t *testing.T) { var x = "x"; }`, expected: ScriptTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 30, Line: 2, Col: 1}, + }, Name: Expression{ Value: "Name", Range: Range{ @@ -133,6 +145,10 @@ var x = "x"; console.log(value); }`, expected: ScriptTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 49, Line: 2, Col: 1}, + }, Name: Expression{ Value: "Name", Range: Range{ @@ -172,6 +188,10 @@ console.log(value); //' }`, expected: ScriptTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 22, Line: 2, Col: 1}, + }, Name: Expression{ Value: "Name", Range: Range{ @@ -211,6 +231,10 @@ console.log(value); let x = ''; }`, expected: ScriptTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 31, Line: 2, Col: 1}, + }, Name: Expression{ Value: "Name", Range: Range{ diff --git a/parser/v2/templateparser.go b/parser/v2/templateparser.go index 116024dff..a553ecae4 100644 --- a/parser/v2/templateparser.go +++ b/parser/v2/templateparser.go @@ -59,7 +59,7 @@ type templateNodeParser[TUntil any] struct { untilName string } -var rawElements = parse.Any[Node](styleElement, scriptElement) +var rawElements = parse.Any(styleElement, scriptElement) var templateNodeParsers = []parse.Parser[Node]{ docType, // diff --git a/parser/v2/templateparser_test.go b/parser/v2/templateparser_test.go index 56caec5a7..3c1b5de28 100644 --- a/parser/v2/templateparser_test.go +++ b/parser/v2/templateparser_test.go @@ -19,6 +19,10 @@ func TestTemplateParser(t *testing.T) { input: `templ Name() { }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 16, Line: 1, Col: 1}, + }, Expression: Expression{ Value: "Name()", Range: Range{ @@ -41,6 +45,10 @@ func TestTemplateParser(t *testing.T) { input: `templ (data Data) Name() { }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 28, Line: 1, Col: 1}, + }, Expression: Expression{ Value: "(data Data) Name()", Range: Range{ @@ -63,6 +71,10 @@ func TestTemplateParser(t *testing.T) { input: `templ Name(){ }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 15, Line: 1, Col: 1}, + }, Expression: Expression{ Value: "Name()", Range: Range{ @@ -85,6 +97,10 @@ func TestTemplateParser(t *testing.T) { input: `templ Name(p Parameter) { }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 27, Line: 1, Col: 1}, + }, Expression: Expression{ Value: "Name(p Parameter)", Range: Range{ @@ -109,6 +125,10 @@ func TestTemplateParser(t *testing.T) { ) { }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 39, Line: 3, Col: 1}, + }, Expression: Expression{ Value: "Multiline(\n\tparams expense,\n)", Range: Range{ @@ -132,6 +152,10 @@ func TestTemplateParser(t *testing.T) { { "span content" } }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 59, Line: 2, Col: 1}, + }, Expression: Expression{ Value: "Name(p Parameter)", Range: Range{ @@ -182,6 +206,10 @@ func TestTemplateParser(t *testing.T) { name: "template: containing element - no spacing", input: `templ Name(p Parameter) { { "span content" } }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 59, Line: 0, Col: 59}, + }, Expression: Expression{ Value: "Name(p Parameter)", Range: Range{ @@ -239,6 +267,10 @@ func TestTemplateParser(t *testing.T) { }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 99, Line: 7, Col: 1}, + }, Expression: Expression{ Value: "Name(p Parameter)", Range: Range{ @@ -328,6 +360,10 @@ func TestTemplateParser(t *testing.T) { } }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 84, Line: 6, Col: 1}, + }, Expression: Expression{ Value: "Name(p Parameter)", Range: Range{ @@ -408,6 +444,10 @@ func TestTemplateParser(t *testing.T) { }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 93, Line: 3, Col: 1}, + }, Expression: Expression{ Value: "Name(p Parameter)", Range: Range{ @@ -486,6 +526,10 @@ func TestTemplateParser(t *testing.T) { }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 32, Line: 2, Col: 1}, + }, Expression: Expression{ Value: "Name()", Range: Range{ @@ -525,6 +569,10 @@ func TestTemplateParser(t *testing.T) { @Icon("home", Inline) Home }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 58, Line: 2, Col: 1}, + }, Expression: Expression{ Value: "x()", Range: Range{ @@ -593,6 +641,10 @@ func TestTemplateParser(t *testing.T) { // Comment }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 25, Line: 2, Col: 1}, + }, Expression: Expression{ Value: "x()", Range: Range{ @@ -612,6 +664,10 @@ func TestTemplateParser(t *testing.T) { /* Comment */ }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 28, Line: 2, Col: 1}, + }, Expression: Expression{ Value: "x()", Range: Range{ @@ -634,6 +690,10 @@ func TestTemplateParser(t *testing.T) { */ }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 38, Line: 4, Col: 1}, + }, Expression: Expression{ Value: "x()", Range: Range{ @@ -657,6 +717,10 @@ func TestTemplateParser(t *testing.T) { --> }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 59, Line: 5, Col: 1}, + }, Expression: Expression{ Value: "x()", Range: Range{ @@ -681,6 +745,10 @@ func TestTemplateParser(t *testing.T) { }`, expected: HTMLTemplate{ + Range: Range{ + From: Position{Index: 0, Line: 0, Col: 0}, + To: Position{Index: 95, Line: 4, Col: 1}, + }, Expression: Expression{ Value: "Name(children templ.Attributes)", Range: Range{ diff --git a/parser/v2/types.go b/parser/v2/types.go index cacb6cb4b..9f6880bf2 100644 --- a/parser/v2/types.go +++ b/parser/v2/types.go @@ -250,6 +250,7 @@ func (ws Whitespace) Write(w io.Writer, indent int) error { // background-image: url('./somewhere.png'); // } type CSSTemplate struct { + Range Range Name string Expression Expression Properties []CSSProperty @@ -346,6 +347,7 @@ func (dt DocType) Write(w io.Writer, indent int) error { // } // } type HTMLTemplate struct { + Range Range Expression Expression Children []Node } @@ -424,6 +426,8 @@ var ( // Text node within the document. type Text struct { + // Range of the text within the templ file. + Range Range // Value is the raw HTML encoded value. Value string // TrailingSpace lists what happens after the text. @@ -1182,6 +1186,7 @@ func (se StringExpression) Write(w io.Writer, indent int) error { // ScriptTemplate is a script block. type ScriptTemplate struct { + Range Range Name Expression Parameters Expression Value string