From bab57d6e9d07c352ba0e6513e8f8f0e29c27fb01 Mon Sep 17 00:00:00 2001 From: HesterG Date: Fri, 24 Mar 2023 12:08:54 +0800 Subject: [PATCH 01/15] add comment to render and init tippy --- modules/markup/html.go | 8 ++++++-- web_src/js/features/contextpopup.js | 3 +++ web_src/js/features/repo-legacy.js | 5 +++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/modules/markup/html.go b/modules/markup/html.go index 76fc54cf465eb..5109fcde0ac36 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -803,6 +803,12 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { link := node.Data[m[0]:m[1]] id := "#" + node.Data[m[2]:m[3]] + // if m[4]:m[5] is not nil, then link is to a comment + // indicate that in the text by appending (comment) + if m[4] != -1 && m[5] != -1 { + id += " (comment)" + } + // extract repo and org name from matched link like // http://localhost:3000/gituser/myrepo/issues/1 linkParts := strings.Split(link, "/") @@ -810,8 +816,6 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { matchRepo := linkParts[len(linkParts)-3] if matchOrg == ctx.Metas["user"] && matchRepo == ctx.Metas["repo"] { - // TODO if m[4]:m[5] is not nil, then link is to a comment, - // and we should indicate that in the text somehow replaceContent(node, m[0], m[1], createLink(link, id, "ref-issue")) } else { orgRepoID := matchOrg + "/" + matchRepo + id diff --git a/web_src/js/features/contextpopup.js b/web_src/js/features/contextpopup.js index c685d93db04a3..c92df8b1d9f6c 100644 --- a/web_src/js/features/contextpopup.js +++ b/web_src/js/features/contextpopup.js @@ -7,7 +7,10 @@ import {createTippy} from '../modules/tippy.js'; export function initContextPopups() { const refIssues = $('.ref-issue'); if (!refIssues.length) return; + attachTippyToRefIssues(refIssues); +} +export function attachTippyToRefIssues(refIssues) { refIssues.each(function () { if ($(this).hasClass('ref-external-issue')) { return; diff --git a/web_src/js/features/repo-legacy.js b/web_src/js/features/repo-legacy.js index f7fc1aa4eb92d..19a00a1c0b971 100644 --- a/web_src/js/features/repo-legacy.js +++ b/web_src/js/features/repo-legacy.js @@ -26,6 +26,7 @@ import {initCompReactionSelector} from './comp/ReactionSelector.js'; import {initRepoSettingBranches} from './repo-settings.js'; import {initRepoPullRequestMergeForm} from './repo-issue-pr-form.js'; import {hideElem, showElem} from '../utils/dom.js'; +import {attachTippyToRefIssues} from './contextpopup.js'; const {csrfToken} = window.config; @@ -439,6 +440,10 @@ async function onEditContent(event) { } else { $renderContent.html(data.content); $rawContent.text($textarea.val()); + const refIssues = $renderContent.find('p .ref-issue'); + if (refIssues) { + attachTippyToRefIssues(refIssues); + } } const $content = $segment; if (!$content.find('.dropzone-attachments').length) { From 895d34dd7011e157254f6b7fb013472f80bb1d10 Mon Sep 17 00:00:00 2001 From: HesterG Date: Fri, 24 Mar 2023 14:33:31 +0800 Subject: [PATCH 02/15] skip files changed hash comment --- modules/markup/html.go | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/modules/markup/html.go b/modules/markup/html.go index 5109fcde0ac36..b5d6d7d477fa8 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -97,6 +97,12 @@ var issueFullPattern *regexp.Regexp // Once for to prevent races var issueFullPatternOnce sync.Once +// regexp for full links to hash comment in pull request +var filesChangedFullPattern *regexp.Regexp + +// Once for to prevent races +var filesChangedFullPatternOnce sync.Once + func getIssueFullPattern() *regexp.Regexp { issueFullPatternOnce.Do(func() { issueFullPattern = regexp.MustCompile(regexp.QuoteMeta(setting.AppURL) + @@ -105,6 +111,14 @@ func getIssueFullPattern() *regexp.Regexp { return issueFullPattern } +func getFilesChangedFullPattern() *regexp.Regexp { + filesChangedFullPatternOnce.Do(func() { + filesChangedFullPattern = regexp.MustCompile(regexp.QuoteMeta(setting.AppURL) + + `[\w_.-]+/[\w_.-]+/pulls/((?:\w{1,10}-)?[1-9][0-9]*)/files([\?|#](\S+)?)?\b`) + }) + return filesChangedFullPattern +} + // CustomLinkURLSchemes allows for additional schemes to be detected when parsing links within text func CustomLinkURLSchemes(schemes []string) { schemes = append(schemes, "http", "https") @@ -797,13 +811,17 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { next := node.NextSibling for node != nil && node != next { m := getIssueFullPattern().FindStringSubmatchIndex(node.Data) + filesChangedm := getFilesChangedFullPattern().FindStringSubmatchIndex(node.Data) if m == nil { return } + if filesChangedm != nil { + return + } link := node.Data[m[0]:m[1]] id := "#" + node.Data[m[2]:m[3]] - // if m[4]:m[5] is not nil, then link is to a comment + // if m[4] m[5] is not -1, then link is to a comment // indicate that in the text by appending (comment) if m[4] != -1 && m[5] != -1 { id += " (comment)" From ea920681020d5e56f304108b0ae1a73b5ea97814 Mon Sep 17 00:00:00 2001 From: HesterG Date: Fri, 24 Mar 2023 15:31:30 +0800 Subject: [PATCH 03/15] add new line --- modules/markup/html.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/markup/html.go b/modules/markup/html.go index b5d6d7d477fa8..9c4cc6cbbd292 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -97,7 +97,7 @@ var issueFullPattern *regexp.Regexp // Once for to prevent races var issueFullPatternOnce sync.Once -// regexp for full links to hash comment in pull request +// regexp for full links to hash comment in pull request files changed tab var filesChangedFullPattern *regexp.Regexp // Once for to prevent races @@ -815,9 +815,12 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { if m == nil { return } + + // if the link is from files changed tab in pull requests, leave it as it is if filesChangedm != nil { return } + link := node.Data[m[0]:m[1]] id := "#" + node.Data[m[2]:m[3]] From 43563af70cb5a25478512295bb11822c8b05ff93 Mon Sep 17 00:00:00 2001 From: HesterG Date: Fri, 24 Mar 2023 15:34:13 +0800 Subject: [PATCH 04/15] comments --- modules/markup/html.go | 2 +- web_src/js/features/repo-legacy.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/markup/html.go b/modules/markup/html.go index 9c4cc6cbbd292..01734759af063 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -824,7 +824,7 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { link := node.Data[m[0]:m[1]] id := "#" + node.Data[m[2]:m[3]] - // if m[4] m[5] is not -1, then link is to a comment + // if m[4] and m[5] is not -1, then link is to a comment // indicate that in the text by appending (comment) if m[4] != -1 && m[5] != -1 { id += " (comment)" diff --git a/web_src/js/features/repo-legacy.js b/web_src/js/features/repo-legacy.js index 19a00a1c0b971..36852a9b45fe5 100644 --- a/web_src/js/features/repo-legacy.js +++ b/web_src/js/features/repo-legacy.js @@ -440,6 +440,8 @@ async function onEditContent(event) { } else { $renderContent.html(data.content); $rawContent.text($textarea.val()); + // check if the content contains ref-issue + // if there are ref issues, attach the tippy const refIssues = $renderContent.find('p .ref-issue'); if (refIssues) { attachTippyToRefIssues(refIssues); From 12d9df9557d2667a06832fc326989d2a23a119ba Mon Sep 17 00:00:00 2001 From: HesterG Date: Fri, 24 Mar 2023 18:08:33 +0800 Subject: [PATCH 05/15] handle path including pr or issue --- modules/markup/html.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/markup/html.go b/modules/markup/html.go index 01734759af063..70e0cf9623226 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -837,10 +837,18 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { matchRepo := linkParts[len(linkParts)-3] if matchOrg == ctx.Metas["user"] && matchRepo == ctx.Metas["repo"] { - replaceContent(node, m[0], m[1], createLink(link, id, "ref-issue")) + if link == node.Data { + replaceContent(node, m[0], m[1], createLink(link, id, "ref-issue")) + } else { + replaceContent(node, m[0], len(node.Data), createLink(link, id, "ref-issue")) + } } else { orgRepoID := matchOrg + "/" + matchRepo + id - replaceContent(node, m[0], m[1], createLink(link, orgRepoID, "ref-issue")) + if link == node.Data { + replaceContent(node, m[0], m[1], createLink(link, orgRepoID, "ref-issue")) + } else { + replaceContent(node, m[0], len(node.Data), createLink(link, orgRepoID, "ref-issue")) + } } node = node.NextSibling.NextSibling } From 0cd84edd13a7193411bc44816541b444437982d8 Mon Sep 17 00:00:00 2001 From: HesterG Date: Fri, 24 Mar 2023 18:15:27 +0800 Subject: [PATCH 06/15] adjust condition --- modules/markup/html.go | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/modules/markup/html.go b/modules/markup/html.go index 70e0cf9623226..1c13da1e0b7e9 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -835,20 +835,16 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { linkParts := strings.Split(link, "/") matchOrg := linkParts[len(linkParts)-4] matchRepo := linkParts[len(linkParts)-3] + replaceEnd := m[1] + if link != node.Data { + replaceEnd = len(node.Data) + } if matchOrg == ctx.Metas["user"] && matchRepo == ctx.Metas["repo"] { - if link == node.Data { - replaceContent(node, m[0], m[1], createLink(link, id, "ref-issue")) - } else { - replaceContent(node, m[0], len(node.Data), createLink(link, id, "ref-issue")) - } + replaceContent(node, m[0], replaceEnd, createLink(link, id, "ref-issue")) } else { orgRepoID := matchOrg + "/" + matchRepo + id - if link == node.Data { - replaceContent(node, m[0], m[1], createLink(link, orgRepoID, "ref-issue")) - } else { - replaceContent(node, m[0], len(node.Data), createLink(link, orgRepoID, "ref-issue")) - } + replaceContent(node, m[0], replaceEnd, createLink(link, orgRepoID, "ref-issue")) } node = node.NextSibling.NextSibling } From e5d109d57d2d2a45005616443eb4443641e87cae Mon Sep 17 00:00:00 2001 From: HesterG Date: Mon, 27 Mar 2023 13:34:29 +0800 Subject: [PATCH 07/15] add popup when preview changes --- modules/markup/html.go | 8 ++------ modules/markup/html_internal_test.go | 8 ++++++-- web_src/js/features/comp/MarkupContentPreview.js | 5 +++++ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/modules/markup/html.go b/modules/markup/html.go index 1c13da1e0b7e9..01734759af063 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -835,16 +835,12 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { linkParts := strings.Split(link, "/") matchOrg := linkParts[len(linkParts)-4] matchRepo := linkParts[len(linkParts)-3] - replaceEnd := m[1] - if link != node.Data { - replaceEnd = len(node.Data) - } if matchOrg == ctx.Metas["user"] && matchRepo == ctx.Metas["repo"] { - replaceContent(node, m[0], replaceEnd, createLink(link, id, "ref-issue")) + replaceContent(node, m[0], m[1], createLink(link, id, "ref-issue")) } else { orgRepoID := matchOrg + "/" + matchRepo + id - replaceContent(node, m[0], replaceEnd, createLink(link, orgRepoID, "ref-issue")) + replaceContent(node, m[0], m[1], createLink(link, orgRepoID, "ref-issue")) } node = node.NextSibling.NextSibling } diff --git a/modules/markup/html_internal_test.go b/modules/markup/html_internal_test.go index a048f1f527889..7e04b03531d87 100644 --- a/modules/markup/html_internal_test.go +++ b/modules/markup/html_internal_test.go @@ -330,13 +330,17 @@ func TestRender_FullIssueURLs(t *testing.T) { test("Look here http://localhost:3000/person/repo/issues/4", `Look here person/repo#4`) test("http://localhost:3000/person/repo/issues/4#issuecomment-1234", - `person/repo#4`) + `person/repo#4 (comment)`) test("http://localhost:3000/gogits/gogs/issues/4", `#4`) test("http://localhost:3000/gogits/gogs/issues/4 test", `#4 test`) test("http://localhost:3000/gogits/gogs/issues/4?a=1&b=2#comment-123 test", - `#4 test`) + `#4 (comment) test`) + test("http://localhost:3000/testOrg/testOrgRepo/pulls/2/files#issuecomment-24", + "http://localhost:3000/testOrg/testOrgRepo/pulls/2/files#issuecomment-24") + test("http://localhost:3000/testOrg/testOrgRepo/pulls/2/files", + "http://localhost:3000/testOrg/testOrgRepo/pulls/2/files") } func TestRegExp_sha1CurrentPattern(t *testing.T) { diff --git a/web_src/js/features/comp/MarkupContentPreview.js b/web_src/js/features/comp/MarkupContentPreview.js index 61fd699b29714..50aafb1428899 100644 --- a/web_src/js/features/comp/MarkupContentPreview.js +++ b/web_src/js/features/comp/MarkupContentPreview.js @@ -1,5 +1,6 @@ import $ from 'jquery'; import {initMarkupContent} from '../../markup/content.js'; +import {attachTippyToRefIssues} from '../contextpopup.js'; const {csrfToken} = window.config; @@ -15,8 +16,12 @@ export function initCompMarkupContentPreviewTab($form) { text: $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val() }, (data) => { const $previewPanel = $form.find(`.tab[data-tab="${$tabMenu.data('preview')}"]`); + const refIssues = $previewPanel.find('p .ref-issue'); $previewPanel.html(data); initMarkupContent(); + if (refIssues) { + attachTippyToRefIssues(refIssues); + } }); }); } From 13f051504548f733b15b8fed64056dc74c1c8fe7 Mon Sep 17 00:00:00 2001 From: HesterG Date: Mon, 27 Mar 2023 14:22:13 +0800 Subject: [PATCH 08/15] move if to attachTippyToRefIssues --- web_src/js/features/contextpopup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web_src/js/features/contextpopup.js b/web_src/js/features/contextpopup.js index c92df8b1d9f6c..253696c300494 100644 --- a/web_src/js/features/contextpopup.js +++ b/web_src/js/features/contextpopup.js @@ -6,11 +6,11 @@ import {createTippy} from '../modules/tippy.js'; export function initContextPopups() { const refIssues = $('.ref-issue'); - if (!refIssues.length) return; attachTippyToRefIssues(refIssues); } export function attachTippyToRefIssues(refIssues) { + if (!refIssues.length) return; refIssues.each(function () { if ($(this).hasClass('ref-external-issue')) { return; From 76dbc979b5e20b2c9a00e480df1ed849f371f29d Mon Sep 17 00:00:00 2001 From: HesterG Date: Mon, 27 Mar 2023 14:23:53 +0800 Subject: [PATCH 09/15] move filesChangedm --- modules/markup/html.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/markup/html.go b/modules/markup/html.go index 01734759af063..af517700b23bc 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -811,11 +811,11 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { next := node.NextSibling for node != nil && node != next { m := getIssueFullPattern().FindStringSubmatchIndex(node.Data) - filesChangedm := getFilesChangedFullPattern().FindStringSubmatchIndex(node.Data) if m == nil { return } + filesChangedm := getFilesChangedFullPattern().FindStringSubmatchIndex(node.Data) // if the link is from files changed tab in pull requests, leave it as it is if filesChangedm != nil { return From b3839f2bb9540b8fab85f81887db218ff803af46 Mon Sep 17 00:00:00 2001 From: HesterG Date: Mon, 27 Mar 2023 14:50:17 +0800 Subject: [PATCH 10/15] remove unnecessary ifs and fix order --- web_src/js/features/comp/MarkupContentPreview.js | 6 ++---- web_src/js/features/repo-legacy.js | 4 +--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/web_src/js/features/comp/MarkupContentPreview.js b/web_src/js/features/comp/MarkupContentPreview.js index 50aafb1428899..6a1faa3c27301 100644 --- a/web_src/js/features/comp/MarkupContentPreview.js +++ b/web_src/js/features/comp/MarkupContentPreview.js @@ -16,12 +16,10 @@ export function initCompMarkupContentPreviewTab($form) { text: $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val() }, (data) => { const $previewPanel = $form.find(`.tab[data-tab="${$tabMenu.data('preview')}"]`); - const refIssues = $previewPanel.find('p .ref-issue'); $previewPanel.html(data); + const refIssues = $previewPanel.find('p .ref-issue'); + attachTippyToRefIssues(refIssues); initMarkupContent(); - if (refIssues) { - attachTippyToRefIssues(refIssues); - } }); }); } diff --git a/web_src/js/features/repo-legacy.js b/web_src/js/features/repo-legacy.js index 36852a9b45fe5..f642fcc76d2f2 100644 --- a/web_src/js/features/repo-legacy.js +++ b/web_src/js/features/repo-legacy.js @@ -443,9 +443,7 @@ async function onEditContent(event) { // check if the content contains ref-issue // if there are ref issues, attach the tippy const refIssues = $renderContent.find('p .ref-issue'); - if (refIssues) { - attachTippyToRefIssues(refIssues); - } + attachTippyToRefIssues(refIssues); } const $content = $segment; if (!$content.find('.dropzone-attachments').length) { From bb58eda6d0107377d4a52e83d33d2b8102cd747d Mon Sep 17 00:00:00 2001 From: HesterG Date: Tue, 28 Mar 2023 08:49:30 +0800 Subject: [PATCH 11/15] try add locale --- modules/markup/html.go | 10 ++++++---- options/locale/locale_en-US.ini | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/modules/markup/html.go b/modules/markup/html.go index af517700b23bc..879685ffbaff2 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -9,6 +9,7 @@ import ( "net/url" "path" "path/filepath" + "reflect" "regexp" "strings" "sync" @@ -22,6 +23,7 @@ import ( "code.gitea.io/gitea/modules/regexplru" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/templates/vars" + "code.gitea.io/gitea/modules/translation" "code.gitea.io/gitea/modules/util" "golang.org/x/net/html" @@ -807,7 +809,6 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { if ctx.Metas == nil { return } - next := node.NextSibling for node != nil && node != next { m := getIssueFullPattern().FindStringSubmatchIndex(node.Data) @@ -815,9 +816,9 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { return } - filesChangedm := getFilesChangedFullPattern().FindStringSubmatchIndex(node.Data) + Changedm := getFilesChangedFullPattern().FindStringSubmatchIndex(node.Data) // if the link is from files changed tab in pull requests, leave it as it is - if filesChangedm != nil { + if Changedm != nil { return } @@ -827,7 +828,8 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { // if m[4] and m[5] is not -1, then link is to a comment // indicate that in the text by appending (comment) if m[4] != -1 && m[5] != -1 { - id += " (comment)" + locale := reflect.ValueOf(ctx.Ctx).Elem().FieldByName("Locale").Interface().(translation.Locale) + id += " " + locale.Tr("repo.from_comment") } // extract repo and org name from matched link like diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 12dcd6e0172f3..67fe8847814f6 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1102,6 +1102,7 @@ download_file = Download file normal_view = Normal View line = line lines = lines +from_comment = (comment) editor.add_file = Add File editor.new_file = New File From d5f70c606dc782da83a8853ab08da5c7783d1b47 Mon Sep 17 00:00:00 2001 From: HesterG Date: Tue, 28 Mar 2023 14:12:25 +0800 Subject: [PATCH 12/15] pass language to metas --- modules/markup/html.go | 6 ++++-- routers/common/markup.go | 2 +- routers/web/repo/issue.go | 15 +++++++++------ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/modules/markup/html.go b/modules/markup/html.go index 879685ffbaff2..0c2702df19d04 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -5,11 +5,11 @@ package markup import ( "bytes" + "fmt" "io" "net/url" "path" "path/filepath" - "reflect" "regexp" "strings" "sync" @@ -809,6 +809,8 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { if ctx.Metas == nil { return } + fmt.Println("ctx.Metas") + fmt.Println(ctx.Metas) next := node.NextSibling for node != nil && node != next { m := getIssueFullPattern().FindStringSubmatchIndex(node.Data) @@ -828,7 +830,7 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { // if m[4] and m[5] is not -1, then link is to a comment // indicate that in the text by appending (comment) if m[4] != -1 && m[5] != -1 { - locale := reflect.ValueOf(ctx.Ctx).Elem().FieldByName("Locale").Interface().(translation.Locale) + locale := translation.NewLocale(ctx.Metas["language"]) id += " " + locale.Tr("repo.from_comment") } diff --git a/routers/common/markup.go b/routers/common/markup.go index 89f24e00075cc..3eb3182d8e003 100644 --- a/routers/common/markup.go +++ b/routers/common/markup.go @@ -73,7 +73,7 @@ func RenderMarkup(ctx *context.Context, mode, text, urlPrefix, filePath string, if mode != "comment" { meta["mode"] = "document" } - + meta["language"] = ctx.Locale.Language() if err := markup.Render(&markup.RenderContext{ Ctx: ctx, URLPrefix: urlPrefix, diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 3715320f10c84..136ed203e4d50 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -1319,10 +1319,11 @@ func ViewIssue(ctx *context.Context) { } } ctx.Data["IssueWatch"] = iw - + metas := ctx.Repo.Repository.ComposeMetas() + metas["language"] = ctx.Locale.Language() issue.RenderedContent, err = markdown.RenderString(&markup.RenderContext{ URLPrefix: ctx.Repo.RepoLink, - Metas: ctx.Repo.Repository.ComposeMetas(), + Metas: metas, GitRepo: ctx.Repo.GitRepo, Ctx: ctx, }, issue.Content) @@ -2021,10 +2022,11 @@ func UpdateIssueContent(ctx *context.Context) { return } } - + metas := ctx.Repo.Repository.ComposeMetas() + metas["language"] = ctx.Locale.Language() content, err := markdown.RenderString(&markup.RenderContext{ URLPrefix: ctx.FormString("context"), // FIXME: <- IS THIS SAFE ? - Metas: ctx.Repo.Repository.ComposeMetas(), + Metas: metas, GitRepo: ctx.Repo.GitRepo, Ctx: ctx, }, issue.Content) @@ -2829,10 +2831,11 @@ func UpdateCommentContent(ctx *context.Context) { return } } - + metas := ctx.Repo.Repository.ComposeMetas() + metas["language"] = ctx.Locale.Language() content, err := markdown.RenderString(&markup.RenderContext{ URLPrefix: ctx.FormString("context"), // FIXME: <- IS THIS SAFE ? - Metas: ctx.Repo.Repository.ComposeMetas(), + Metas: metas, GitRepo: ctx.Repo.GitRepo, Ctx: ctx, }, comment.Content) From c68298343ed7186e377a0b8b424a6fc2d180f2e0 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Tue, 28 Mar 2023 14:40:35 +0800 Subject: [PATCH 13/15] use context key for locale --- modules/context/context.go | 4 +++- modules/markup/html.go | 25 +++++++++++++------------ modules/translation/translation.go | 4 ++++ routers/common/markup.go | 2 +- routers/web/repo/issue.go | 15 ++++++--------- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/modules/context/context.go b/modules/context/context.go index 5876e23cc40a2..1eff1459a14af 100644 --- a/modules/context/context.go +++ b/modules/context/context.go @@ -628,7 +628,9 @@ func (ctx *Context) Value(key interface{}) interface{} { if key == git.RepositoryContextKey && ctx.Repo != nil { return ctx.Repo.GitRepo } - + if key == translation.ContextKey && ctx.Locale != nil { + return ctx.Locale + } return ctx.Req.Context().Value(key) } diff --git a/modules/markup/html.go b/modules/markup/html.go index 0c2702df19d04..f0ba706347363 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -5,7 +5,6 @@ package markup import ( "bytes" - "fmt" "io" "net/url" "path" @@ -809,8 +808,6 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { if ctx.Metas == nil { return } - fmt.Println("ctx.Metas") - fmt.Println(ctx.Metas) next := node.NextSibling for node != nil && node != next { m := getIssueFullPattern().FindStringSubmatchIndex(node.Data) @@ -818,20 +815,24 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { return } - Changedm := getFilesChangedFullPattern().FindStringSubmatchIndex(node.Data) - // if the link is from files changed tab in pull requests, leave it as it is - if Changedm != nil { + mDiffView := getFilesChangedFullPattern().FindStringSubmatchIndex(node.Data) + // if the link is from "Files Changed" tab in pull requests https://domain/org/repo/pulls/27/files (aka: the files diff view) + // leave it as it is + if mDiffView != nil { return } link := node.Data[m[0]:m[1]] id := "#" + node.Data[m[2]:m[3]] - + text := id // if m[4] and m[5] is not -1, then link is to a comment // indicate that in the text by appending (comment) if m[4] != -1 && m[5] != -1 { - locale := translation.NewLocale(ctx.Metas["language"]) - id += " " + locale.Tr("repo.from_comment") + if locale, ok := ctx.Ctx.Value(translation.ContextKey).(translation.Locale); ok { + text += " " + locale.Tr("repo.from_comment") + } else { + text += " " + " (comment)" + } } // extract repo and org name from matched link like @@ -841,10 +842,10 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { matchRepo := linkParts[len(linkParts)-3] if matchOrg == ctx.Metas["user"] && matchRepo == ctx.Metas["repo"] { - replaceContent(node, m[0], m[1], createLink(link, id, "ref-issue")) + replaceContent(node, m[0], m[1], createLink(link, text, "ref-issue")) } else { - orgRepoID := matchOrg + "/" + matchRepo + id - replaceContent(node, m[0], m[1], createLink(link, orgRepoID, "ref-issue")) + text = matchOrg + "/" + matchRepo + text + replaceContent(node, m[0], m[1], createLink(link, text, "ref-issue")) } node = node.NextSibling.NextSibling } diff --git a/modules/translation/translation.go b/modules/translation/translation.go index 5a1009bfa3d80..3165390c3238c 100644 --- a/modules/translation/translation.go +++ b/modules/translation/translation.go @@ -18,6 +18,10 @@ import ( "golang.org/x/text/language" ) +type contextKey struct{} + +var ContextKey interface{} = &contextKey{} + // Locale represents an interface to translation type Locale interface { Language() string diff --git a/routers/common/markup.go b/routers/common/markup.go index 3eb3182d8e003..89f24e00075cc 100644 --- a/routers/common/markup.go +++ b/routers/common/markup.go @@ -73,7 +73,7 @@ func RenderMarkup(ctx *context.Context, mode, text, urlPrefix, filePath string, if mode != "comment" { meta["mode"] = "document" } - meta["language"] = ctx.Locale.Language() + if err := markup.Render(&markup.RenderContext{ Ctx: ctx, URLPrefix: urlPrefix, diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 136ed203e4d50..3715320f10c84 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -1319,11 +1319,10 @@ func ViewIssue(ctx *context.Context) { } } ctx.Data["IssueWatch"] = iw - metas := ctx.Repo.Repository.ComposeMetas() - metas["language"] = ctx.Locale.Language() + issue.RenderedContent, err = markdown.RenderString(&markup.RenderContext{ URLPrefix: ctx.Repo.RepoLink, - Metas: metas, + Metas: ctx.Repo.Repository.ComposeMetas(), GitRepo: ctx.Repo.GitRepo, Ctx: ctx, }, issue.Content) @@ -2022,11 +2021,10 @@ func UpdateIssueContent(ctx *context.Context) { return } } - metas := ctx.Repo.Repository.ComposeMetas() - metas["language"] = ctx.Locale.Language() + content, err := markdown.RenderString(&markup.RenderContext{ URLPrefix: ctx.FormString("context"), // FIXME: <- IS THIS SAFE ? - Metas: metas, + Metas: ctx.Repo.Repository.ComposeMetas(), GitRepo: ctx.Repo.GitRepo, Ctx: ctx, }, issue.Content) @@ -2831,11 +2829,10 @@ func UpdateCommentContent(ctx *context.Context) { return } } - metas := ctx.Repo.Repository.ComposeMetas() - metas["language"] = ctx.Locale.Language() + content, err := markdown.RenderString(&markup.RenderContext{ URLPrefix: ctx.FormString("context"), // FIXME: <- IS THIS SAFE ? - Metas: metas, + Metas: ctx.Repo.Repository.ComposeMetas(), GitRepo: ctx.Repo.GitRepo, Ctx: ctx, }, comment.Content) From 42a57bf238ab6cf6ac9966c69c8ed6d81f7535b3 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Tue, 28 Mar 2023 15:58:10 +0800 Subject: [PATCH 14/15] fine tune variable name and comments --- modules/markup/html.go | 8 ++++---- web_src/js/features/comp/MarkupContentPreview.js | 4 ++-- web_src/js/features/contextpopup.js | 4 ++-- web_src/js/features/repo-legacy.js | 6 ++---- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/modules/markup/html.go b/modules/markup/html.go index f0ba706347363..0ba6c807b8476 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -106,6 +106,7 @@ var filesChangedFullPatternOnce sync.Once func getIssueFullPattern() *regexp.Regexp { issueFullPatternOnce.Do(func() { + // example: https://domain/org/repo/pulls/27#hash issueFullPattern = regexp.MustCompile(regexp.QuoteMeta(setting.AppURL) + `[\w_.-]+/[\w_.-]+/(?:issues|pulls)/((?:\w{1,10}-)?[1-9][0-9]*)([\?|#](\S+)?)?\b`) }) @@ -114,6 +115,7 @@ func getIssueFullPattern() *regexp.Regexp { func getFilesChangedFullPattern() *regexp.Regexp { filesChangedFullPatternOnce.Do(func() { + // example: https://domain/org/repo/pulls/27/files#hash filesChangedFullPattern = regexp.MustCompile(regexp.QuoteMeta(setting.AppURL) + `[\w_.-]+/[\w_.-]+/pulls/((?:\w{1,10}-)?[1-9][0-9]*)/files([\?|#](\S+)?)?\b`) }) @@ -816,15 +818,13 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { } mDiffView := getFilesChangedFullPattern().FindStringSubmatchIndex(node.Data) - // if the link is from "Files Changed" tab in pull requests https://domain/org/repo/pulls/27/files (aka: the files diff view) - // leave it as it is + // leave it as it is if the link is from "Files Changed" tab in PR Diff View https://domain/org/repo/pulls/27/files if mDiffView != nil { return } link := node.Data[m[0]:m[1]] - id := "#" + node.Data[m[2]:m[3]] - text := id + text := "#" + node.Data[m[2]:m[3]] // if m[4] and m[5] is not -1, then link is to a comment // indicate that in the text by appending (comment) if m[4] != -1 && m[5] != -1 { diff --git a/web_src/js/features/comp/MarkupContentPreview.js b/web_src/js/features/comp/MarkupContentPreview.js index 6a1faa3c27301..a32bf301843c8 100644 --- a/web_src/js/features/comp/MarkupContentPreview.js +++ b/web_src/js/features/comp/MarkupContentPreview.js @@ -1,6 +1,6 @@ import $ from 'jquery'; import {initMarkupContent} from '../../markup/content.js'; -import {attachTippyToRefIssues} from '../contextpopup.js'; +import {attachRefIssueContextPopup} from '../contextpopup.js'; const {csrfToken} = window.config; @@ -18,7 +18,7 @@ export function initCompMarkupContentPreviewTab($form) { const $previewPanel = $form.find(`.tab[data-tab="${$tabMenu.data('preview')}"]`); $previewPanel.html(data); const refIssues = $previewPanel.find('p .ref-issue'); - attachTippyToRefIssues(refIssues); + attachRefIssueContextPopup(refIssues); initMarkupContent(); }); }); diff --git a/web_src/js/features/contextpopup.js b/web_src/js/features/contextpopup.js index 253696c300494..7b37035547a13 100644 --- a/web_src/js/features/contextpopup.js +++ b/web_src/js/features/contextpopup.js @@ -6,10 +6,10 @@ import {createTippy} from '../modules/tippy.js'; export function initContextPopups() { const refIssues = $('.ref-issue'); - attachTippyToRefIssues(refIssues); + attachRefIssueContextPopup(refIssues); } -export function attachTippyToRefIssues(refIssues) { +export function attachRefIssueContextPopup(refIssues) { if (!refIssues.length) return; refIssues.each(function () { if ($(this).hasClass('ref-external-issue')) { diff --git a/web_src/js/features/repo-legacy.js b/web_src/js/features/repo-legacy.js index f642fcc76d2f2..3689c342721c7 100644 --- a/web_src/js/features/repo-legacy.js +++ b/web_src/js/features/repo-legacy.js @@ -26,7 +26,7 @@ import {initCompReactionSelector} from './comp/ReactionSelector.js'; import {initRepoSettingBranches} from './repo-settings.js'; import {initRepoPullRequestMergeForm} from './repo-issue-pr-form.js'; import {hideElem, showElem} from '../utils/dom.js'; -import {attachTippyToRefIssues} from './contextpopup.js'; +import {attachRefIssueContextPopup} from './contextpopup.js'; const {csrfToken} = window.config; @@ -440,10 +440,8 @@ async function onEditContent(event) { } else { $renderContent.html(data.content); $rawContent.text($textarea.val()); - // check if the content contains ref-issue - // if there are ref issues, attach the tippy const refIssues = $renderContent.find('p .ref-issue'); - attachTippyToRefIssues(refIssues); + attachRefIssueContextPopup(refIssues); } const $content = $segment; if (!$content.find('.dropzone-attachments').length) { From 8f471ea28641fc7050864abf0e27ddf23695d729 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Tue, 28 Mar 2023 21:38:47 +0800 Subject: [PATCH 15/15] Update modules/markup/html.go --- modules/markup/html.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/markup/html.go b/modules/markup/html.go index 0ba6c807b8476..11888b8536353 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -831,7 +831,7 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { if locale, ok := ctx.Ctx.Value(translation.ContextKey).(translation.Locale); ok { text += " " + locale.Tr("repo.from_comment") } else { - text += " " + " (comment)" + text += " (comment)" } }