Skip to content

Commit 09e79cc

Browse files
committed
fix: prevent HTML4 doctypes from causing generation errors
1 parent 1cd1a92 commit 09e79cc

File tree

6 files changed

+121
-6
lines changed

6 files changed

+121
-6
lines changed

.version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.3.836
1+
0.3.840

generator/generator.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -671,12 +671,17 @@ func (g *generator) writeWhitespaceTrailer(indentLevel int, n parser.TrailingSpa
671671
}
672672

673673
func (g *generator) writeDocType(indentLevel int, n parser.DocType) (err error) {
674-
if _, err = g.w.WriteStringLiteral(indentLevel, fmt.Sprintf("<!doctype %s>", n.Value)); err != nil {
674+
if _, err = g.w.WriteStringLiteral(indentLevel, fmt.Sprintf("<!doctype %s>", escapeQuotes(n.Value))); err != nil {
675675
return err
676676
}
677677
return nil
678678
}
679679

680+
func escapeQuotes(s string) string {
681+
quoted := strconv.Quote(s)
682+
return quoted[1 : len(quoted)-1]
683+
}
684+
680685
func (g *generator) writeIfExpression(indentLevel int, n parser.IfExpression, nextNode parser.Node) (err error) {
681686
var r parser.Range
682687
// if
@@ -1129,8 +1134,7 @@ func (g *generator) writeBoolConstantAttribute(indentLevel int, attr parser.Bool
11291134
func (g *generator) writeConstantAttribute(indentLevel int, attr parser.ConstantAttribute) (err error) {
11301135
name := html.EscapeString(attr.Name)
11311136
value := html.EscapeString(attr.Value)
1132-
value = strconv.Quote(value)
1133-
value = value[1 : len(value)-1]
1137+
value = escapeQuotes(value)
11341138
if _, err = g.w.WriteStringLiteral(indentLevel, fmt.Sprintf(` %s=\"%s\"`, name, value)); err != nil {
11351139
return err
11361140
}
@@ -1515,8 +1519,7 @@ func (g *generator) writeWhitespace(indentLevel int, n parser.Whitespace) (err e
15151519
}
15161520

15171521
func (g *generator) writeText(indentLevel int, n parser.Text) (err error) {
1518-
quoted := strconv.Quote(n.Value)
1519-
_, err = g.w.WriteStringLiteral(indentLevel, quoted[1:len(quoted)-1])
1522+
_, err = g.w.WriteStringLiteral(indentLevel, escapeQuotes(n.Value))
15201523
return err
15211524
}
15221525

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7+
<title>title</title>
8+
</head>
9+
<body>content</body>
10+
</html>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package testdoctype
2+
3+
import (
4+
_ "embed"
5+
"testing"
6+
7+
"github.com/a-h/templ/generator/htmldiff"
8+
)
9+
10+
//go:embed expected.html
11+
var expected string
12+
13+
func Test(t *testing.T) {
14+
component := Layout("title", "content")
15+
16+
diff, err := htmldiff.Diff(component, expected)
17+
if err != nil {
18+
t.Fatal(err)
19+
}
20+
if diff != "" {
21+
t.Error(diff)
22+
}
23+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package testdoctype
2+
3+
templ Layout(title, content string) {
4+
<!DOCTYPE HTML PUBLIC "http://www.w3.org/TR/html4/loose.dtd">
5+
<html lang="en">
6+
<head>
7+
<meta charset="UTF-8"/>
8+
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
9+
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
10+
<title>{ title }</title>
11+
</head>
12+
<body>{ content }</body>
13+
</html>
14+
}

generator/test-doctype-html4/template_templ.go

Lines changed: 65 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)