https://github.com/go-gitea/gitea/pull/29395tags/v1.22.0-rc0
@@ -259,14 +259,14 @@ This template produces something along these lines: | |||
The template system contains several functions that can be used to further process and format | |||
the messages. Here's a list of some of them: | |||
| Name | Parameters | Available | Usage | | |||
| ---------------- | ----------- | --------- |-----------------------------------------------------------------------------| | |||
| `AppUrl` | - | Any | Gitea's URL | | |||
| `AppName` | - | Any | Set from `app.ini`, usually "Gitea" | | |||
| `AppDomain` | - | Any | Gitea's host name | | |||
| `EllipsisString` | string, int | Any | Truncates a string to the specified length; adds ellipsis as needed | | |||
| `SanitizeHTML` | string | Body only | Sanitizes text by removing any dangerous HTML tags from it. | | |||
| `SafeHTML` | string | Body only | Takes the input as HTML; can be used for `.ReviewComments.RenderedContent`. | | |||
| Name | Parameters | Available | Usage | | |||
| ---------------- | ----------- | --------- | ------------------------------------------------------------------- | | |||
| `AppUrl` | - | Any | Gitea's URL | | |||
| `AppName` | - | Any | Set from `app.ini`, usually "Gitea" | | |||
| `AppDomain` | - | Any | Gitea's host name | | |||
| `EllipsisString` | string, int | Any | Truncates a string to the specified length; adds ellipsis as needed | | |||
| `SanitizeHTML` | string | Body only | Sanitizes text by removing any dangerous HTML tags from it | | |||
| `SafeHTML` | string | Body only | Takes the input as HTML, can be used for outputing raw HTML content | | |||
These are _functions_, not metadata, so they have to be used: | |||
@@ -242,14 +242,14 @@ _主题_ 和 _邮件正文_ 由 [Golang的模板引擎](https://go.dev/pkg/text/ | |||
模板系统包含一些函数,可用于进一步处理和格式化消息。以下是其中一些函数的列表: | |||
| 函数名 | 参数 | 可用于 | 用法 | | |||
|------------------| ----------- | ------------ |---------------------------------------------------------| | |||
| `AppUrl` | - | 任何地方 | Gitea 的 URL | | |||
| `AppName` | - | 任何地方 | 从 `app.ini` 中设置,通常为 "Gitea" | | |||
| `AppDomain` | - | 任何地方 | Gitea 的主机名 | | |||
| `EllipsisString` | string, int | 任何地方 | 将字符串截断为指定长度;根据需要添加省略号 | | |||
| `SanitizeHTML` | string | 仅正文部分 | 通过删除其中的危险 HTML 标签对文本进行清理 | | |||
| `SafeHTML` | string | 仅正文部分 | 将输入作为 HTML 处理;可用于 `.ReviewComments.RenderedContent` 等字段 | | |||
| 函数名 | 参数 | 可用于 | 用法 | | |||
|------------------| ----------- | ------------ | ------------------------------ | | |||
| `AppUrl` | - | 任何地方 | Gitea 的 URL | | |||
| `AppName` | - | 任何地方 | 从 `app.ini` 中设置,通常为 "Gitea" | | |||
| `AppDomain` | - | 任何地方 | Gitea 的主机名 | | |||
| `EllipsisString` | string, int | 任何地方 | 将字符串截断为指定长度;根据需要添加省略号 | | |||
| `SanitizeHTML` | string | 仅正文部分 | 通过删除其中的危险 HTML 标签对文本进行清理 | | |||
| `SafeHTML` | string | 仅正文部分 | 将输入作为 HTML 处理;可用于输出原始的 HTML 内容 | | |||
这些都是 _函数_,而不是元数据,因此必须按以下方式使用: | |||
@@ -5,6 +5,7 @@ package templates | |||
import ( | |||
"context" | |||
"fmt" | |||
"html/template" | |||
"regexp" | |||
"strings" | |||
@@ -33,7 +34,7 @@ func mailSubjectTextFuncMap() texttmpl.FuncMap { | |||
} | |||
} | |||
func buildSubjectBodyTemplate(stpl *texttmpl.Template, btpl *template.Template, name string, content []byte) { | |||
func buildSubjectBodyTemplate(stpl *texttmpl.Template, btpl *template.Template, name string, content []byte) error { | |||
// Split template into subject and body | |||
var subjectContent []byte | |||
bodyContent := content | |||
@@ -42,20 +43,13 @@ func buildSubjectBodyTemplate(stpl *texttmpl.Template, btpl *template.Template, | |||
subjectContent = content[0:loc[0]] | |||
bodyContent = content[loc[1]:] | |||
} | |||
if _, err := stpl.New(name). | |||
Parse(string(subjectContent)); err != nil { | |||
log.Error("Failed to parse template [%s/subject]: %v", name, err) | |||
if !setting.IsProd { | |||
log.Fatal("Please fix the mail template error") | |||
} | |||
if _, err := stpl.New(name).Parse(string(subjectContent)); err != nil { | |||
return fmt.Errorf("failed to parse template [%s/subject]: %w", name, err) | |||
} | |||
if _, err := btpl.New(name). | |||
Parse(string(bodyContent)); err != nil { | |||
log.Error("Failed to parse template [%s/body]: %v", name, err) | |||
if !setting.IsProd { | |||
log.Fatal("Please fix the mail template error") | |||
} | |||
if _, err := btpl.New(name).Parse(string(bodyContent)); err != nil { | |||
return fmt.Errorf("failed to parse template [%s/body]: %w", name, err) | |||
} | |||
return nil | |||
} | |||
// Mailer provides the templates required for sending notification mails. | |||
@@ -87,7 +81,13 @@ func Mailer(ctx context.Context) (*texttmpl.Template, *template.Template) { | |||
if firstRun { | |||
log.Trace("Adding mail template %s: %s by %s", tmplName, assetPath, layerName) | |||
} | |||
buildSubjectBodyTemplate(subjectTemplates, bodyTemplates, tmplName, content) | |||
if err = buildSubjectBodyTemplate(subjectTemplates, bodyTemplates, tmplName, content); err != nil { | |||
if firstRun { | |||
log.Fatal("Failed to parse mail template, err: %v", err) | |||
} else { | |||
log.Error("Failed to parse mail template, err: %v", err) | |||
} | |||
} | |||
} | |||
} | |||
@@ -65,7 +65,7 @@ | |||
{{$.locale.Tr "mail.issue.in_tree_path" .TreePath}} | |||
<div class="review"> | |||
<pre>{{.Patch}}</pre> | |||
<div>{{.RenderedContent | SafeHTML}}</div> | |||
<div>{{.RenderedContent}}</div> | |||
</div> | |||
{{end -}} | |||
{{if eq .ActionName "push"}} |