diff --git a/models/repo/repo.go b/models/repo/repo.go index 4a12de9d98..8d211caf40 100644 --- a/models/repo/repo.go +++ b/models/repo/repo.go @@ -617,7 +617,7 @@ func (repo *Repository) CanEnableEditor() bool { // DescriptionHTML does special handles to description and return HTML string. func (repo *Repository) DescriptionHTML(ctx context.Context) template.HTML { - desc, err := markup.RenderDescriptionHTML(markup.NewRenderContext(ctx), repo.Description) + desc, err := markup.PostProcessDescriptionHTML(markup.NewRenderContext(ctx), repo.Description) if err != nil { log.Error("Failed to render description for %s (ID: %d): %v", repo.Name, repo.ID, err) return template.HTML(markup.SanitizeDescription(repo.Description)) diff --git a/modules/markup/html.go b/modules/markup/html.go index 04b768bb8e..25628db39e 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -159,9 +159,9 @@ func PostProcessDefault(ctx *RenderContext, input io.Reader, output io.Writer) e return postProcess(ctx, procs, input, output) } -// RenderCommitMessage will use the same logic as PostProcess, but will disable +// PostProcessCommitMessage will use the same logic as PostProcess, but will disable // the shortLinkProcessor. -func RenderCommitMessage(ctx *RenderContext, content string) (string, error) { +func PostProcessCommitMessage(ctx *RenderContext, content string) (string, error) { procs := []processor{ fullIssuePatternProcessor, comparePatternProcessor, @@ -183,11 +183,11 @@ var emojiProcessors = []processor{ emojiProcessor, } -// RenderCommitMessageSubject will use the same logic as PostProcess and -// RenderCommitMessage, but will disable the shortLinkProcessor and +// PostProcessCommitMessageSubject will use the same logic as PostProcess and +// PostProcessCommitMessage, but will disable the shortLinkProcessor and // emailAddressProcessor, will add a defaultLinkProcessor if defaultLink is set, // which changes every text node into a link to the passed default link. -func RenderCommitMessageSubject(ctx *RenderContext, defaultLink, content string) (string, error) { +func PostProcessCommitMessageSubject(ctx *RenderContext, defaultLink, content string) (string, error) { procs := []processor{ fullIssuePatternProcessor, comparePatternProcessor, @@ -211,15 +211,33 @@ func RenderCommitMessageSubject(ctx *RenderContext, defaultLink, content string) return postProcessString(ctx, procs, content) } -// RenderIssueTitle to process title on individual issue/pull page -func RenderIssueTitle(ctx *RenderContext, title string) (string, error) { - // do not render other issue/commit links in an issue's title - which in most cases is already a link. +// PostProcessIssueTitle to process title on individual issue/pull page +func PostProcessIssueTitle(ctx *RenderContext, title string) (string, error) { return postProcessString(ctx, []processor{ + issueIndexPatternProcessor, + commitCrossReferencePatternProcessor, + hashCurrentPatternProcessor, emojiShortCodeProcessor, emojiProcessor, }, title) } +// PostProcessDescriptionHTML will use similar logic as PostProcess, but will +// use a single special linkProcessor. +func PostProcessDescriptionHTML(ctx *RenderContext, content string) (string, error) { + return postProcessString(ctx, []processor{ + descriptionLinkProcessor, + emojiShortCodeProcessor, + emojiProcessor, + }, content) +} + +// PostProcessEmoji for when we want to just process emoji and shortcodes +// in various places it isn't already run through the normal markdown processor +func PostProcessEmoji(ctx *RenderContext, content string) (string, error) { + return postProcessString(ctx, emojiProcessors, content) +} + func postProcessString(ctx *RenderContext, procs []processor, content string) (string, error) { var buf strings.Builder if err := postProcess(ctx, procs, strings.NewReader(content), &buf); err != nil { @@ -228,23 +246,10 @@ func postProcessString(ctx *RenderContext, procs []processor, content string) (s return buf.String(), nil } -// RenderDescriptionHTML will use similar logic as PostProcess, but will -// use a single special linkProcessor. -func RenderDescriptionHTML(ctx *RenderContext, content string) (string, error) { - return postProcessString(ctx, []processor{ - descriptionLinkProcessor, - emojiShortCodeProcessor, - emojiProcessor, - }, content) -} - -// RenderEmoji for when we want to just process emoji and shortcodes -// in various places it isn't already run through the normal markdown processor -func RenderEmoji(ctx *RenderContext, content string) (string, error) { - return postProcessString(ctx, emojiProcessors, content) -} - func postProcess(ctx *RenderContext, procs []processor, input io.Reader, output io.Writer) error { + if !ctx.usedByRender && ctx.RenderHelper != nil { + defer ctx.RenderHelper.CleanUp() + } // FIXME: don't read all content to memory rawHTML, err := io.ReadAll(input) if err != nil { diff --git a/modules/markup/html_internal_test.go b/modules/markup/html_internal_test.go index 651e674108..9419350e61 100644 --- a/modules/markup/html_internal_test.go +++ b/modules/markup/html_internal_test.go @@ -252,7 +252,7 @@ func TestRender_IssueIndexPattern_NoShortPattern(t *testing.T) { testRenderIssueIndexPattern(t, "!1", "!1", NewTestRenderContext(metas)) } -func TestRender_RenderIssueTitle(t *testing.T) { +func TestRender_PostProcessIssueTitle(t *testing.T) { setting.AppURL = TestAppURL metas := map[string]string{ "format": "https://someurl.com/{user}/{repo}/{index}", @@ -260,7 +260,7 @@ func TestRender_RenderIssueTitle(t *testing.T) { "repo": "someRepo", "style": IssueNameStyleNumeric, } - actual, err := RenderIssueTitle(NewTestRenderContext(metas), "#1") + actual, err := PostProcessIssueTitle(NewTestRenderContext(metas), "#1") assert.NoError(t, err) assert.Equal(t, "#1", actual) } diff --git a/modules/markup/render.go b/modules/markup/render.go index 3b112b1a14..b239e59687 100644 --- a/modules/markup/render.go +++ b/modules/markup/render.go @@ -57,6 +57,9 @@ type RenderOptions struct { type RenderContext struct { ctx context.Context + // the context might be used by the "render" function, but it might also be used by "postProcess" function + usedByRender bool + SidebarTocNode ast.Node RenderHelper RenderHelper @@ -182,6 +185,7 @@ func pipes() (io.ReadCloser, io.WriteCloser, func()) { } func render(ctx *RenderContext, renderer Renderer, input io.Reader, output io.Writer) error { + ctx.usedByRender = true if ctx.RenderHelper != nil { defer ctx.RenderHelper.CleanUp() } diff --git a/modules/templates/util_render.go b/modules/templates/util_render.go index 3237de5ecb..1800747f48 100644 --- a/modules/templates/util_render.go +++ b/modules/templates/util_render.go @@ -38,9 +38,9 @@ func (ut *RenderUtils) RenderCommitMessage(msg string, metas map[string]string) cleanMsg := template.HTMLEscapeString(msg) // we can safely assume that it will not return any error, since there // shouldn't be any special HTML. - fullMessage, err := markup.RenderCommitMessage(markup.NewRenderContext(ut.ctx).WithMetas(metas), cleanMsg) + fullMessage, err := markup.PostProcessCommitMessage(markup.NewRenderContext(ut.ctx).WithMetas(metas), cleanMsg) if err != nil { - log.Error("RenderCommitMessage: %v", err) + log.Error("PostProcessCommitMessage: %v", err) return "" } msgLines := strings.Split(strings.TrimSpace(fullMessage), "\n") @@ -65,9 +65,9 @@ func (ut *RenderUtils) RenderCommitMessageLinkSubject(msg, urlDefault string, me // we can safely assume that it will not return any error, since there // shouldn't be any special HTML. - renderedMessage, err := markup.RenderCommitMessageSubject(markup.NewRenderContext(ut.ctx).WithMetas(metas), urlDefault, template.HTMLEscapeString(msgLine)) + renderedMessage, err := markup.PostProcessCommitMessageSubject(markup.NewRenderContext(ut.ctx).WithMetas(metas), urlDefault, template.HTMLEscapeString(msgLine)) if err != nil { - log.Error("RenderCommitMessageSubject: %v", err) + log.Error("PostProcessCommitMessageSubject: %v", err) return "" } return renderCodeBlock(template.HTML(renderedMessage)) @@ -87,9 +87,9 @@ func (ut *RenderUtils) RenderCommitBody(msg string, metas map[string]string) tem return "" } - renderedMessage, err := markup.RenderCommitMessage(markup.NewRenderContext(ut.ctx).WithMetas(metas), template.HTMLEscapeString(msgLine)) + renderedMessage, err := markup.PostProcessCommitMessage(markup.NewRenderContext(ut.ctx).WithMetas(metas), template.HTMLEscapeString(msgLine)) if err != nil { - log.Error("RenderCommitMessage: %v", err) + log.Error("PostProcessCommitMessage: %v", err) return "" } return template.HTML(renderedMessage) @@ -106,12 +106,19 @@ func renderCodeBlock(htmlEscapedTextToRender template.HTML) template.HTML { // RenderIssueTitle renders issue/pull title with defined post processors func (ut *RenderUtils) RenderIssueTitle(text string, metas map[string]string) template.HTML { - renderedText, err := markup.RenderIssueTitle(markup.NewRenderContext(ut.ctx).WithMetas(metas), template.HTMLEscapeString(text)) + renderedText, err := markup.PostProcessIssueTitle(markup.NewRenderContext(ut.ctx).WithMetas(metas), template.HTMLEscapeString(text)) if err != nil { - log.Error("RenderIssueTitle: %v", err) + log.Error("PostProcessIssueTitle: %v", err) return "" } - return template.HTML(renderedText) + return renderCodeBlock(template.HTML(renderedText)) +} + +// RenderIssueSimpleTitle only renders with emoji and inline code block +func (ut *RenderUtils) RenderIssueSimpleTitle(text string) template.HTML { + ret := ut.RenderEmoji(text) + ret = renderCodeBlock(ret) + return ret } // RenderLabel renders a label @@ -174,7 +181,7 @@ func (ut *RenderUtils) RenderLabel(label *issues_model.Label) template.HTML { // RenderEmoji renders html text with emoji post processors func (ut *RenderUtils) RenderEmoji(text string) template.HTML { - renderedText, err := markup.RenderEmoji(markup.NewRenderContext(ut.ctx), template.HTMLEscapeString(text)) + renderedText, err := markup.PostProcessEmoji(markup.NewRenderContext(ut.ctx), template.HTMLEscapeString(text)) if err != nil { log.Error("RenderEmoji: %v", err) return "" diff --git a/modules/templates/util_render_test.go b/modules/templates/util_render_test.go index c0241c0a8c..80094ab26e 100644 --- a/modules/templates/util_render_test.go +++ b/modules/templates/util_render_test.go @@ -164,11 +164,11 @@ com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit ๐ mail@domain.com @mention-user test -#123 +#123 space ` expected = strings.ReplaceAll(expected, "", " ") - assert.EqualValues(t, expected, string(newTestRenderUtils().RenderIssueTitle(testInput(), nil))) + assert.EqualValues(t, expected, string(newTestRenderUtils().RenderIssueTitle(testInput(), testMetas))) } func TestRenderMarkdownToHtml(t *testing.T) { diff --git a/routers/web/repo/commit.go b/routers/web/repo/commit.go index 0be9689c3f..c5652784fa 100644 --- a/routers/web/repo/commit.go +++ b/routers/web/repo/commit.go @@ -394,9 +394,9 @@ func Diff(ctx *context.Context) { ctx.Data["NoteCommit"] = note.Commit ctx.Data["NoteAuthor"] = user_model.ValidateCommitWithEmail(ctx, note.Commit) rctx := renderhelper.NewRenderContextRepoComment(ctx, ctx.Repo.Repository, renderhelper.RepoCommentOptions{CurrentRefPath: path.Join("commit", util.PathEscapeSegments(commitID))}) - ctx.Data["NoteRendered"], err = markup.RenderCommitMessage(rctx, template.HTMLEscapeString(string(charset.ToUTF8WithFallback(note.Message, charset.ConvertOpts{})))) + ctx.Data["NoteRendered"], err = markup.PostProcessCommitMessage(rctx, template.HTMLEscapeString(string(charset.ToUTF8WithFallback(note.Message, charset.ConvertOpts{})))) if err != nil { - ctx.ServerError("RenderCommitMessage", err) + ctx.ServerError("PostProcessCommitMessage", err) return } } diff --git a/templates/repo/diff/compare.tmpl b/templates/repo/diff/compare.tmpl index 28419a3462..118d6478d1 100644 --- a/templates/repo/diff/compare.tmpl +++ b/templates/repo/diff/compare.tmpl @@ -187,7 +187,7 @@ {{template "shared/issueicon" .}} - {{ctx.RenderUtils.RenderIssueTitle .PullRequest.Issue.Title ($.Repository.ComposeMetas ctx) | RenderCodeBlock}} + {{ctx.RenderUtils.RenderIssueTitle .PullRequest.Issue.Title ($.Repository.ComposeMetas ctx)}} #{{.PullRequest.Issue.Index}} diff --git a/templates/repo/issue/card.tmpl b/templates/repo/issue/card.tmpl index 6c24419b46..2e19e86d7a 100644 --- a/templates/repo/issue/card.tmpl +++ b/templates/repo/issue/card.tmpl @@ -14,7 +14,7 @@ {{template "shared/issueicon" .}} - {{.Title | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + {{.Title | ctx.RenderUtils.RenderIssueSimpleTitle}} {{if and $.isPinnedIssueCard $.Page.IsRepoAdmin}} {{svg "octicon-x" 16}} diff --git a/templates/repo/issue/view_title.tmpl b/templates/repo/issue/view_title.tmpl index cf775f22b5..bf2ede58e4 100644 --- a/templates/repo/issue/view_title.tmpl +++ b/templates/repo/issue/view_title.tmpl @@ -13,7 +13,7 @@ {{$canEditIssueTitle := and (or .HasIssuesOrPullsWritePermission .IsIssuePoster) (not .Repository.IsArchived)}} - {{ctx.RenderUtils.RenderIssueTitle .Issue.Title ($.Repository.ComposeMetas ctx) | RenderCodeBlock}} + {{ctx.RenderUtils.RenderIssueTitle .Issue.Title ($.Repository.ComposeMetas ctx)}} #{{.Issue.Index}} diff --git a/templates/repo/pulse.tmpl b/templates/repo/pulse.tmpl index 1d7923b2f2..5222633507 100644 --- a/templates/repo/pulse.tmpl +++ b/templates/repo/pulse.tmpl @@ -125,7 +125,7 @@ {{ctx.Locale.Tr "repo.activity.published_release_label"}} {{.TagName}} {{if not .IsTag}} - {{.Title | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + {{.Title | ctx.RenderUtils.RenderIssueSimpleTitle}} {{end}} {{DateUtils.TimeSince .CreatedUnix}} @@ -145,7 +145,7 @@ {{range .Activity.MergedPRs}} {{ctx.Locale.Tr "repo.activity.merged_prs_label"}} - #{{.Index}} {{.Issue.Title | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + #{{.Index}} {{.Issue.Title | ctx.RenderUtils.RenderIssueSimpleTitle}} {{DateUtils.TimeSince .MergedUnix}} {{end}} @@ -164,7 +164,7 @@ {{range .Activity.OpenedPRs}} {{ctx.Locale.Tr "repo.activity.opened_prs_label"}} - #{{.Index}} {{.Issue.Title | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + #{{.Index}} {{.Issue.Title | ctx.RenderUtils.RenderIssueSimpleTitle}} {{DateUtils.TimeSince .Issue.CreatedUnix}} {{end}} @@ -183,7 +183,7 @@ {{range .Activity.ClosedIssues}} {{ctx.Locale.Tr "repo.activity.closed_issue_label"}} - #{{.Index}} {{.Title | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + #{{.Index}} {{.Title | ctx.RenderUtils.RenderIssueSimpleTitle}} {{DateUtils.TimeSince .ClosedUnix}} {{end}} @@ -202,7 +202,7 @@ {{range .Activity.OpenedIssues}} {{ctx.Locale.Tr "repo.activity.new_issue_label"}} - #{{.Index}} {{.Title | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + #{{.Index}} {{.Title | ctx.RenderUtils.RenderIssueSimpleTitle}} {{DateUtils.TimeSince .CreatedUnix}} {{end}} @@ -220,9 +220,9 @@ {{ctx.Locale.Tr "repo.activity.unresolved_conv_label"}} #{{.Index}} {{if .IsPull}} - {{.Title | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + {{.Title | ctx.RenderUtils.RenderIssueSimpleTitle}} {{else}} - {{.Title | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + {{.Title | ctx.RenderUtils.RenderIssueSimpleTitle}} {{end}} {{DateUtils.TimeSince .UpdatedUnix}} diff --git a/templates/shared/issuelist.tmpl b/templates/shared/issuelist.tmpl index ef2352665d..fe5184e7d2 100644 --- a/templates/shared/issuelist.tmpl +++ b/templates/shared/issuelist.tmpl @@ -13,7 +13,7 @@ - {{ctx.RenderUtils.RenderEmoji .Title | RenderCodeBlock}} + {{.Title | ctx.RenderUtils.RenderIssueSimpleTitle}} {{if .IsPull}} {{if (index $.CommitStatuses .PullRequest.ID)}} {{template "repo/commit_statuses" dict "Status" (index $.CommitLastStatus .PullRequest.ID) "Statuses" (index $.CommitStatuses .PullRequest.ID)}} diff --git a/templates/user/dashboard/feeds.tmpl b/templates/user/dashboard/feeds.tmpl index d3e2f7a06c..1c1ba5566f 100644 --- a/templates/user/dashboard/feeds.tmpl +++ b/templates/user/dashboard/feeds.tmpl @@ -100,11 +100,11 @@ {{ctx.Locale.Tr "action.compare_commits" $push.Len}} ยป {{end}} {{else if .GetOpType.InActions "create_issue"}} - {{index .GetIssueInfos 1 | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + {{index .GetIssueInfos 1 | ctx.RenderUtils.RenderIssueSimpleTitle}} {{else if .GetOpType.InActions "create_pull_request"}} - {{index .GetIssueInfos 1 | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + {{index .GetIssueInfos 1 | ctx.RenderUtils.RenderIssueSimpleTitle}} {{else if .GetOpType.InActions "comment_issue" "approve_pull_request" "reject_pull_request" "comment_pull"}} - {{(.GetIssueTitle ctx) | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + {{(.GetIssueTitle ctx) | ctx.RenderUtils.RenderIssueSimpleTitle}} {{$comment := index .GetIssueInfos 1}} {{if $comment}} {{ctx.RenderUtils.MarkdownToHtml $comment}} @@ -112,7 +112,7 @@ {{else if .GetOpType.InActions "merge_pull_request"}} {{index .GetIssueInfos 1}} {{else if .GetOpType.InActions "close_issue" "reopen_issue" "close_pull_request" "reopen_pull_request"}} - {{(.GetIssueTitle ctx) | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + {{(.GetIssueTitle ctx) | ctx.RenderUtils.RenderIssueSimpleTitle}} {{else if .GetOpType.InActions "pull_review_dismissed"}} {{ctx.Locale.Tr "action.review_dismissed_reason"}} {{index .GetIssueInfos 2 | ctx.RenderUtils.RenderEmoji}} diff --git a/templates/user/notification/notification_div.tmpl b/templates/user/notification/notification_div.tmpl index c2bb4e2e87..0d2371a358 100644 --- a/templates/user/notification/notification_div.tmpl +++ b/templates/user/notification/notification_div.tmpl @@ -53,7 +53,7 @@ {{if .Issue}} - {{.Issue.Title | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + {{.Issue.Title | ctx.RenderUtils.RenderIssueSimpleTitle}} {{else}} {{.Repository.FullName}} {{end}}
{{ctx.Locale.Tr "repo.activity.merged_prs_label"}} - #{{.Index}} {{.Issue.Title | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + #{{.Index}} {{.Issue.Title | ctx.RenderUtils.RenderIssueSimpleTitle}} {{DateUtils.TimeSince .MergedUnix}}
{{ctx.Locale.Tr "repo.activity.opened_prs_label"}} - #{{.Index}} {{.Issue.Title | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + #{{.Index}} {{.Issue.Title | ctx.RenderUtils.RenderIssueSimpleTitle}} {{DateUtils.TimeSince .Issue.CreatedUnix}}
{{ctx.Locale.Tr "repo.activity.closed_issue_label"}} - #{{.Index}} {{.Title | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + #{{.Index}} {{.Title | ctx.RenderUtils.RenderIssueSimpleTitle}} {{DateUtils.TimeSince .ClosedUnix}}
{{ctx.Locale.Tr "repo.activity.new_issue_label"}} - #{{.Index}} {{.Title | ctx.RenderUtils.RenderEmoji | RenderCodeBlock}} + #{{.Index}} {{.Title | ctx.RenderUtils.RenderIssueSimpleTitle}} {{DateUtils.TimeSince .CreatedUnix}}