Fix HTML entities displaying incorrectly in PDF exports

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2025-10-24 09:13:51 +02:00
parent 5902ef512d
commit 4768410d10
3 changed files with 11 additions and 15 deletions

View File

@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
## Unreleased
### Fixed
- Fix HTML entities displaying incorrectly in PDF exports (e.g., "&" showing as "&amp;")
## [0.78.0] - 2025-10-23
### Added

View File

@@ -92,14 +92,6 @@ const (
)
func RenderHTML(data DocumentData) ([]byte, error) {
data.Title = html.EscapeString(data.Title)
data.Approver = html.EscapeString(data.Approver)
data.Description = html.EscapeString(data.Description)
for i := range data.Signatures {
data.Signatures[i].SignedBy = html.EscapeString(data.Signatures[i].SignedBy)
}
var buf bytes.Buffer
if err := documentTemplate.Execute(&buf, data); err != nil {
return nil, fmt.Errorf("failed to execute template: %w", err)

View File

@@ -77,9 +77,9 @@ func TestRenderHTML(t *testing.T) {
},
},
wantContains: []string{
"Test &amp;amp; &amp;lt;Script&amp;gt; Title",
"John &amp;lt;script&amp;gt;alert(&amp;#39;xss&amp;#39;)&amp;lt;/script&amp;gt; Doe",
"Alice &amp;amp; &amp;lt;Bob&amp;gt;",
"Test &amp; &lt;Script&gt; Title",
"John &lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt; Doe",
"Alice &amp; &lt;Bob&gt;",
},
wantNotContains: []string{
"<script>alert('xss')</script>",
@@ -266,12 +266,12 @@ func TestHTMLEscaping(t *testing.T) {
resultStr := string(result)
// Verify dangerous content is escaped
// Verify dangerous content is escaped
assert.NotContains(t, resultStr, "<script>alert('xss')</script>")
assert.NotContains(t, resultStr, "<malicious>tag")
assert.Contains(t, resultStr, "&amp;lt;script&amp;gt;")
assert.Contains(t, resultStr, "&amp;amp;")
assert.Contains(t, resultStr, "&amp;#39;")
assert.Contains(t, resultStr, "&lt;script&gt;")
assert.Contains(t, resultStr, "&amp;")
assert.Contains(t, resultStr, "&#39;")
}
func TestMarkdownRendering(t *testing.T) {