- if _, err = g.w.WriteIndent(indentLevel, fmt.Sprintf(`_, err = templBuffer.WriteString("<%s>")`+"\n", html.EscapeString(n.Name))); err != nil {
- return err
- }
- if err = g.writeErrorHandler(indentLevel); err != nil {
+ if _, err = g.w.WriteStringLiteral(indentLevel, fmt.Sprintf(`<%s>`, html.EscapeString(n.Name))); err != nil {
return err
}
} else {
@@ -849,20 +804,14 @@ func (g *generator) writeStandardElement(indentLevel int, n parser.Element) (err
return err
}
//
- if _, err = g.w.WriteIndent(indentLevel, `_, err = templBuffer.WriteString(">")`+"\n"); err != nil {
- return err
- }
- if err = g.writeErrorHandler(indentLevel); err != nil {
+ if _, err = g.w.WriteStringLiteral(indentLevel, `>`); err != nil {
return err
}
}
@@ -871,10 +820,7 @@ func (g *generator) writeStandardElement(indentLevel int, n parser.Element) (err
return err
}
//
- if _, err = g.w.WriteIndent(indentLevel, fmt.Sprintf(`_, err = templBuffer.WriteString("%s>")`+"\n", html.EscapeString(n.Name))); err != nil {
- return err
- }
- if err = g.writeErrorHandler(indentLevel); err != nil {
+ if _, err = g.w.WriteStringLiteral(indentLevel, fmt.Sprintf(`%s>`, html.EscapeString(n.Name))); err != nil {
return err
}
return err
@@ -887,9 +833,6 @@ func (g *generator) writeAttributeCSS(indentLevel int, attr parser.ExpressionAtt
ok = false
return
}
- if _, err = g.w.WriteIndent(indentLevel, "// Element CSS\n"); err != nil {
- return
- }
// Create a class name for the style.
// The expression can either be expecting a templ.Classes call, or an expression that returns
// var templCSSClassess = []any{
@@ -964,9 +907,6 @@ func (g *generator) writeElementScript(indentLevel int, n parser.Element) (err e
if len(scriptExpressions) == 0 {
return
}
- if _, err = g.w.WriteIndent(indentLevel, "// Element Script\n"); err != nil {
- return err
- }
// Render the scripts before the element if required.
// err = templ.RenderScriptItems(ctx, templBuffer, a, b, c)
if _, err = g.w.WriteIndent(indentLevel, "err = templ.RenderScriptItems(ctx, templBuffer, "+strings.Join(scriptExpressions, ", ")+")\n"); err != nil {
@@ -980,10 +920,7 @@ func (g *generator) writeElementScript(indentLevel int, n parser.Element) (err e
func (g *generator) writeBoolConstantAttribute(indentLevel int, attr parser.BoolConstantAttribute) (err error) {
name := html.EscapeString(attr.Name)
- if _, err = g.w.WriteIndent(indentLevel, fmt.Sprintf(`_, err = templBuffer.WriteString(" %s")`+"\n", name)); err != nil {
- return err
- }
- if err = g.writeErrorHandler(indentLevel); err != nil {
+ if _, err = g.w.WriteStringLiteral(indentLevel, fmt.Sprintf(` %s`, name)); err != nil {
return err
}
return nil
@@ -992,10 +929,7 @@ func (g *generator) writeBoolConstantAttribute(indentLevel int, attr parser.Bool
func (g *generator) writeConstantAttribute(indentLevel int, attr parser.ConstantAttribute) (err error) {
name := html.EscapeString(attr.Name)
value := html.EscapeString(attr.Value)
- if _, err = g.w.WriteIndent(indentLevel, fmt.Sprintf(`_, err = templBuffer.WriteString(" %s=\"%s\"")`+"\n", name, value)); err != nil {
- return err
- }
- if err = g.writeErrorHandler(indentLevel); err != nil {
+ if _, err = g.w.WriteStringLiteral(indentLevel, fmt.Sprintf(` %s=\"%s\"`, name, value)); err != nil {
return err
}
return nil
@@ -1019,10 +953,7 @@ func (g *generator) writeBoolExpressionAttribute(indentLevel int, attr parser.Bo
}
{
indentLevel++
- if _, err = g.w.WriteIndent(indentLevel, fmt.Sprintf(`_, err = templBuffer.WriteString(" %s")`+"\n", name)); err != nil {
- return err
- }
- if err = g.writeErrorHandler(indentLevel); err != nil {
+ if _, err = g.w.WriteStringLiteral(indentLevel, fmt.Sprintf(` %s`, name)); err != nil {
return err
}
indentLevel--
@@ -1037,18 +968,12 @@ func (g *generator) writeBoolExpressionAttribute(indentLevel int, attr parser.Bo
func (g *generator) writeExpressionAttribute(indentLevel int, elementName string, attr parser.ExpressionAttribute) (err error) {
attrName := html.EscapeString(attr.Name)
// Name
- if _, err = g.w.WriteIndent(indentLevel, fmt.Sprintf(`_, err = templBuffer.WriteString(" %s=")`+"\n", attrName)); err != nil {
- return err
- }
- if err = g.writeErrorHandler(indentLevel); err != nil {
+ if _, err = g.w.WriteStringLiteral(indentLevel, fmt.Sprintf(` %s=`, attrName)); err != nil {
return err
}
// Value.
// Open quote.
- if _, err = g.w.WriteIndent(indentLevel, `_, err = templBuffer.WriteString("\"")`+"\n"); err != nil {
- return err
- }
- if err = g.writeErrorHandler(indentLevel); err != nil {
+ if _, err = g.w.WriteStringLiteral(indentLevel, `\"`); err != nil {
return err
}
if elementName == "a" && attr.Name == "href" {
@@ -1116,10 +1041,7 @@ func (g *generator) writeExpressionAttribute(indentLevel int, elementName string
}
}
// Close quote.
- if _, err = g.w.WriteIndent(indentLevel, `_, err = templBuffer.WriteString("\"")`+"\n"); err != nil {
- return err
- }
- if err = g.writeErrorHandler(indentLevel); err != nil {
+ if _, err = g.w.WriteStringLiteral(indentLevel, `\"`); err != nil {
return err
}
return nil
@@ -1168,9 +1090,6 @@ func (g *generator) writeConditionalAttribute(indentLevel int, elementName strin
}
func (g *generator) writeElementAttributes(indentLevel int, name string, attrs []parser.Attribute) (err error) {
- if _, err = g.w.WriteIndent(indentLevel, "// Element Attributes\n"); err != nil {
- return err
- }
for i := 0; i < len(attrs); i++ {
switch attr := attrs[i].(type) {
case parser.BoolConstantAttribute:
@@ -1191,33 +1110,21 @@ func (g *generator) writeElementAttributes(indentLevel int, name string, attrs [
}
func (g *generator) writeRawElement(indentLevel int, n parser.RawElement) (err error) {
- if _, err = g.w.WriteIndent(indentLevel, "// RawElement\n"); err != nil {
- return err
- }
if len(n.Attributes) == 0 {
//
- if _, err = g.w.WriteIndent(indentLevel, fmt.Sprintf(`_, err = templBuffer.WriteString("<%s>")`+"\n", html.EscapeString(n.Name))); err != nil {
- return err
- }
- if err = g.writeErrorHandler(indentLevel); err != nil {
+ if _, err = g.w.WriteStringLiteral(indentLevel, fmt.Sprintf(`<%s>`, html.EscapeString(n.Name))); err != nil {
return err
}
} else {
//
- if _, err = g.w.WriteIndent(indentLevel, `_, err = templBuffer.WriteString(">")`+"\n"); err != nil {
- return err
- }
- if err = g.writeErrorHandler(indentLevel); err != nil {
+ if _, err = g.w.WriteStringLiteral(indentLevel, `>`); err != nil {
return err
}
}
@@ -1226,10 +1133,7 @@ func (g *generator) writeRawElement(indentLevel int, n parser.RawElement) (err e
return err
}
//
- if _, err = g.w.WriteIndent(indentLevel, fmt.Sprintf(`_, err = templBuffer.WriteString("%s>")`+"\n", html.EscapeString(n.Name))); err != nil {
- return err
- }
- if err = g.writeErrorHandler(indentLevel); err != nil {
+ if _, err = g.w.WriteStringLiteral(indentLevel, fmt.Sprintf(`%s>`, html.EscapeString(n.Name))); err != nil {
return err
}
return err
@@ -1244,9 +1148,6 @@ func (g *generator) writeStringExpression(indentLevel int, e parser.Expression)
if strings.TrimSpace(e.Value) == "" {
return
}
- if _, err = g.w.WriteIndent(indentLevel, "// StringExpression\n"); err != nil {
- return err
- }
var r parser.Range
vn := g.createVariableName()
// var vn string = sExpr
@@ -1272,23 +1173,14 @@ func (g *generator) writeWhitespace(indentLevel int, n parser.Whitespace) (err e
if len(n.Value) == 0 {
return
}
- if _, err = g.w.WriteIndent(indentLevel, "// Whitespace (normalised)\n"); err != nil {
- return err
- }
// _, err = templBuffer.WriteString(` `)
- if _, err = g.w.WriteIndent(indentLevel, "_, err = templBuffer.WriteString(` `)\n"); err != nil {
- return err
- }
- if err = g.writeErrorHandler(indentLevel); err != nil {
+ if _, err = g.w.WriteStringLiteral(indentLevel, " "); err != nil {
return err
}
return nil
}
func (g *generator) writeText(indentLevel int, n parser.Text) (err error) {
- if _, err = g.w.WriteIndent(indentLevel, "// Text\n"); err != nil {
- return err
- }
vn := g.createVariableName()
// vn := sExpr
if _, err = g.w.WriteIndent(indentLevel, vn+" := "+createGoString(n.Value)+"\n"); err != nil {
diff --git a/generator/generator_test.go b/generator/generator_test.go
index f430ebb6d..c2e85874d 100644
--- a/generator/generator_test.go
+++ b/generator/generator_test.go
@@ -23,9 +23,7 @@ func TestGeneratorSourceMap(t *testing.T) {
if err != nil {
t.Fatalf("failed to write Go expression: %v", err)
}
- // The from value is (16, 1, 0) because the generator prefixes the
- // expression with a "// GoExpression" comment.
- expected := parser.NewPosition(16, 1, 0)
+ expected := parser.NewPosition(0, 0, 0)
actual, ok := g.sourceMap.TargetPositionFromSource(0, 0)
if !ok {
diff --git a/generator/rangewriter.go b/generator/rangewriter.go
index c1a648d76..2a3f974a8 100644
--- a/generator/rangewriter.go
+++ b/generator/rangewriter.go
@@ -14,19 +14,62 @@ func NewRangeWriter(w io.Writer) *RangeWriter {
}
type RangeWriter struct {
- Current parser.Position
- w io.Writer
+ Current parser.Position
+ inLiteral bool
+ w io.Writer
+}
+
+func (rw *RangeWriter) closeLiteral(indent int) (r parser.Range, err error) {
+ rw.inLiteral = false
+ _, err = rw.write("\")\n")
+ if err != nil {
+ return
+ }
+ err = rw.writeErrorHandler(indent)
+ return
}
func (rw *RangeWriter) WriteIndent(level int, s string) (r parser.Range, err error) {
- _, err = rw.Write(strings.Repeat("\t", level))
+ if rw.inLiteral {
+ if _, err = rw.closeLiteral(level); err != nil {
+ return
+ }
+ }
+ _, err = rw.write(strings.Repeat("\t", level))
+ if err != nil {
+ return
+ }
+ return rw.write(s)
+}
+
+func (rw *RangeWriter) WriteStringLiteral(level int, s string) (r parser.Range, err error) {
+ if !rw.inLiteral {
+ _, err = rw.write(strings.Repeat("\t", level))
+ if err != nil {
+ return
+ }
+ if _, err = rw.WriteIndent(level, `_, err = templBuffer.WriteString("`); err != nil {
+ return
+ }
+ }
+ _, err = rw.write(s)
if err != nil {
return
}
- return rw.Write(s)
+ rw.inLiteral = true
+ return
}
func (rw *RangeWriter) Write(s string) (r parser.Range, err error) {
+ if rw.inLiteral {
+ if _, err = rw.closeLiteral(0); err != nil {
+ return
+ }
+ }
+ return rw.write(s)
+}
+
+func (rw *RangeWriter) write(s string) (r parser.Range, err error) {
r.From = parser.Position{
Index: rw.Current.Index,
Line: rw.Current.Line,
@@ -48,3 +91,21 @@ func (rw *RangeWriter) Write(s string) (r parser.Range, err error) {
r.To = rw.Current
return r, err
}
+
+func (rw *RangeWriter) writeErrorHandler(indentLevel int) (err error) {
+ _, err = rw.WriteIndent(indentLevel, "if err != nil {\n")
+ if err != nil {
+ return err
+ }
+ indentLevel++
+ _, err = rw.WriteIndent(indentLevel, "return err\n")
+ if err != nil {
+ return err
+ }
+ indentLevel--
+ _, err = rw.WriteIndent(indentLevel, "}\n")
+ if err != nil {
+ return err
+ }
+ return err
+}
diff --git a/generator/test-a-href/template_templ.go b/generator/test-a-href/template_templ.go
index d421226a8..9a2544fff 100644
--- a/generator/test-a-href/template_templ.go
+++ b/generator/test-a-href/template_templ.go
@@ -22,41 +22,16 @@ func render() templ.Component {
var_1 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
- // Element (standard)
- _, err = templBuffer.WriteString("
")
if err != nil {
return err
}
- // Element Attributes
- _, err = templBuffer.WriteString(" href=\"javascript:alert('unaffected');\"")
- if err != nil {
- return err
- }
- _, err = templBuffer.WriteString(">")
- if err != nil {
- return err
- }
- // Text
var_2 := `Ignored`
_, err = templBuffer.WriteString(var_2)
if err != nil {
return err
}
- _, err = templBuffer.WriteString("")
- if err != nil {
- return err
- }
- // Element (standard)
- _, err = templBuffer.WriteString("
")
if err != nil {
return err
}
- _, err = templBuffer.WriteString(">")
- if err != nil {
- return err
- }
- // Text
var_4 := `Sanitized`
_, err = templBuffer.WriteString(var_4)
if err != nil {
return err
}
- _, err = templBuffer.WriteString("")
- if err != nil {
- return err
- }
- // Element (standard)
- _, err = templBuffer.WriteString("
")
+ _, err = templBuffer.WriteString("\">")
if err != nil {
return err
}
- // Text
var_6 := `Unsanitized`
_, err = templBuffer.WriteString(var_6)
if err != nil {
diff --git a/generator/test-attribute-escaping/template_templ.go b/generator/test-attribute-escaping/template_templ.go
index 38f7ce70e..8e6f2172f 100644
--- a/generator/test-attribute-escaping/template_templ.go
+++ b/generator/test-attribute-escaping/template_templ.go
@@ -22,22 +22,7 @@ func BasicTemplate(url string) templ.Component {
var_1 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
- // Element (standard)
- _, err = templBuffer.WriteString("")
+ _, err = templBuffer.WriteString("")
if err != nil {
return err
}
diff --git a/generator/test-call/template_templ.go b/generator/test-call/template_templ.go
index 9dce52fa1..a8d3e2202 100644
--- a/generator/test-call/template_templ.go
+++ b/generator/test-call/template_templ.go
@@ -22,45 +22,16 @@ func personTemplate(p person) templ.Component {
var_1 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
- // Element (standard)
- _, err = templBuffer.WriteString("
")
+ _, err = templBuffer.WriteString("
")
if err != nil {
return err
}
- // Element (standard)
- _, err = templBuffer.WriteString("")
- if err != nil {
- return err
- }
- // StringExpression
var var_2 string = p.name
_, err = templBuffer.WriteString(templ.EscapeString(var_2))
if err != nil {
return err
}
- _, err = templBuffer.WriteString("
")
- if err != nil {
- return err
- }
- // Element (standard)
- _, err = templBuffer.WriteString("")
if err != nil {
return err
}
- _, err = templBuffer.WriteString(">")
- if err != nil {
- return err
- }
- // CallTemplate
err = email(p.email).Render(ctx, templBuffer)
if err != nil {
return err
}
- _, err = templBuffer.WriteString("
")
- if err != nil {
- return err
- }
- _, err = templBuffer.WriteString("
")
+ _, err = templBuffer.WriteString("
")
if err != nil {
return err
}
@@ -109,28 +71,16 @@ func email(s string) templ.Component {
var_3 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
- // Element (standard)
_, err = templBuffer.WriteString("
")
+ _, err = templBuffer.WriteString("
")
if err != nil {
return err
}
diff --git a/generator/test-complex-attributes/template_templ.go b/generator/test-complex-attributes/template_templ.go
index e0363ba9c..d86d1067c 100644
--- a/generator/test-complex-attributes/template_templ.go
+++ b/generator/test-complex-attributes/template_templ.go
@@ -22,149 +22,25 @@ func ComplexAttributes() templ.Component {
var_1 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
- // Element (standard)
- _, err = templBuffer.WriteString("")
- if err != nil {
- return err
- }
- // Element (standard)
- _, err = templBuffer.WriteString("")
- if err != nil {
- return err
- }
- // Element (standard)
- _, err = templBuffer.WriteString("
")
- if err != nil {
- return err
- }
- // Element (standard)
- _, err = templBuffer.WriteString("")
- if err != nil {
- return err
- }
- // Element (standard)
- _, err = templBuffer.WriteString("")
- if err != nil {
- return err
- }
- _, err = templBuffer.WriteString("")
- if err != nil {
- return err
- }
- _, err = templBuffer.WriteString("
")
+ _, err = templBuffer.WriteString("