before post-processing so code-span content stays literal, like comment bodies
- htmlWithCode := renderCodeBlock(template.HTML(template.HTMLEscapeString(text)))
- renderedText, err := markup.PostProcessIssueTitle(renderhelper.NewRenderContextRepoComment(ut.ctx, repo), string(htmlWithCode))
- if err != nil {
- log.Error("PostProcessIssueTitle: %v", err)
- return ""
- }
- return template.HTML(renderedText)
+ htmlWithCode := renderCodeBlock(htmlutil.EscapeString(text))
+ return markup.PostProcessIssueTitle(renderhelper.NewRenderContextRepoComment(ut.ctx, repo), htmlWithCode)
}
// RenderIssueSimpleTitle only renders with emoji and inline code block
func (ut *RenderUtils) RenderIssueSimpleTitle(text string) template.HTML {
// see RenderIssueTitle: wrap code spans before processing emoji
- htmlWithCode := renderCodeBlock(template.HTML(template.HTMLEscapeString(text)))
- renderedText, err := markup.PostProcessEmoji(markup.NewRenderContext(ut.ctx), string(htmlWithCode))
- if err != nil {
- log.Error("RenderIssueSimpleTitle: %v", err)
- return ""
- }
- return template.HTML(renderedText)
+ htmlWithCode := renderCodeBlock(htmlutil.EscapeString(text))
+ return markup.PostProcessEmoji(markup.NewRenderContext(ut.ctx), htmlWithCode)
}
func (ut *RenderUtils) RenderLabel(label *issues_model.Label) template.HTML {
@@ -202,12 +166,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.PostProcessEmoji(markup.NewRenderContext(ut.ctx), template.HTMLEscapeString(text))
- if err != nil {
- log.Error("RenderEmoji: %v", err)
- return ""
- }
- return template.HTML(renderedText)
+ return markup.PostProcessEmoji(markup.NewRenderContext(ut.ctx), htmlutil.EscapeString(text))
}
// reactionToEmoji renders emoji for use in reactions
diff --git a/modules/templates/util_render_test.go b/modules/templates/util_render_test.go
index 50a443c7468..5a28a1feba8 100644
--- a/modules/templates/util_render_test.go
+++ b/modules/templates/util_render_test.go
@@ -131,24 +131,24 @@ com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb mit
})
t.Run("RenderCommitMessage", func(t *testing.T) {
- expected := `space @mention-user `
+ expected := `space @mention-user`
assert.EqualValues(t, expected, newTestRenderUtils(t).RenderCommitMessage(testInput(), mockRepo))
})
t.Run("RenderCommitMessageLinkSubject", func(t *testing.T) {
- expected := `space @mention-user`
+ expected := `space @mention-user`
assert.EqualValues(t, expected, newTestRenderUtils(t).RenderCommitMessageLinkSubject(testInput(), "https://example.com/link", mockRepo))
})
t.Run("RenderCommitMessageLinkSubjectURLOnly", func(t *testing.T) {
// a bare URL in the subject must not hijack the default link
- expected := `https://example.com/file.bin`
+ expected := `https://example.com/file.bin`
assert.EqualValues(t, expected, newTestRenderUtils(t).RenderCommitMessageLinkSubject("https://example.com/file.bin", "https://example.com/link", mockRepo))
})
t.Run("RenderCommitMessageLinkSubjectPartialURL", func(t *testing.T) {
// a URL embedded in larger subject text still becomes its own link
- expected := `see https://example.com/x here`
+ expected := `see https://example.com/x here`
assert.EqualValues(t, expected, newTestRenderUtils(t).RenderCommitMessageLinkSubject("see https://example.com/x here", "https://example.com/link", mockRepo))
})
diff --git a/routers/web/repo/commit.go b/routers/web/repo/commit.go
index 7cb2f82a903..ff3496629fa 100644
--- a/routers/web/repo/commit.go
+++ b/routers/web/repo/commit.go
@@ -414,11 +414,7 @@ func Diff(ctx *context.Context) {
ctx.Data["NoteAuthor"] = user_model.ValidateCommitWithEmail(ctx, note.Commit)
rctx := renderhelper.NewRenderContextRepoComment(ctx, ctx.Repo.Repository, renderhelper.RepoCommentOptions{CurrentRefSubURL: "commit/" + util.PathEscapeSegments(commitID)})
htmlMessage := template.HTML(template.HTMLEscapeString(string(charset.ToUTF8WithFallback(note.Message, charset.ConvertOpts{}))))
- ctx.Data["NoteRendered"], err = markup.PostProcessCommitMessage(rctx, htmlMessage)
- if err != nil {
- ctx.ServerError("PostProcessCommitMessage", err)
- return
- }
+ ctx.Data["NoteRendered"] = markup.PostProcessCommitMessage(rctx, htmlMessage)
} else if !git.IsErrNotExist(err) {
log.Error("GetNote: %v", err)
}
diff --git a/templates/repo/actions/runs_list.tmpl b/templates/repo/actions/runs_list.tmpl
index edc167e706b..58dc222cf5b 100644
--- a/templates/repo/actions/runs_list.tmpl
+++ b/templates/repo/actions/runs_list.tmpl
@@ -13,13 +13,10 @@
-
- {{if $run.Title}}
- {{ctx.RenderUtils.RenderCommitMessageLinkSubject $run.Title $run.Link $.Repository}}
- {{else}}
- {{ctx.Locale.Tr "actions.runs.empty_commit_message"}}
- {{end}}
-
+
+ {{$title := or $run.Title (ctx.Locale.Tr "actions.runs.empty_commit_message")}}
+ {{ctx.RenderUtils.RenderCommitMessageLinkSubject $title $run.Link $.Repository}}
+
{{$workflowName := index $.WorkflowNames $run.WorkflowID}}
{{if not $.CurWorkflow}}{{if $workflowName}}{{$workflowName}}{{else}}{{$run.WorkflowID}}{{end}} {{end}}#{{$run.Index}}:
diff --git a/web_src/css/repo/issue-list.css b/web_src/css/repo/issue-list.css
index 1a635f20199..cecf9920acd 100644
--- a/web_src/css/repo/issue-list.css
+++ b/web_src/css/repo/issue-list.css
@@ -92,3 +92,17 @@
margin-right: 8px;
text-align: left;
}
+
+/* for "title (#123)":
+
+ title (
+ #123
+ )
+
+ * hover on "title": also highlight the right parentheses
+ * hover on "#123": don't highlight other parts
+ */
+.title-full-link-hover:not(:has(:not(.title-full-link):hover)):hover > a.title-full-link {
+ color: var(--color-primary);
+ text-decoration: underline;
+}