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