From 829c34129c4b3b1d9a2e4b519892868d7ade866a Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 3 Dec 2024 07:59:07 -0800 Subject: [PATCH 1/7] Quick fix for license file name (#32696) --- routers/web/repo/release.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go index 96c512dd3df95..c178ba249166c 100644 --- a/routers/web/repo/release.go +++ b/routers/web/repo/release.go @@ -31,6 +31,7 @@ import ( "code.gitea.io/gitea/services/context/upload" "code.gitea.io/gitea/services/forms" releaseservice "code.gitea.io/gitea/services/release" + repo_service "code.gitea.io/gitea/services/repository" ) const ( @@ -193,6 +194,8 @@ func Releases(ctx *context.Context) { pager.SetDefaultParams(ctx) ctx.Data["Page"] = pager + ctx.Data["LicenseFileName"] = repo_service.LicenseFileName + ctx.HTML(http.StatusOK, tplReleasesList) } @@ -251,6 +254,7 @@ func TagsList(ctx *context.Context) { pager.SetDefaultParams(ctx) ctx.Data["Page"] = pager ctx.Data["PageIsViewCode"] = !ctx.Repo.Repository.UnitEnabled(ctx, unit.TypeReleases) + ctx.Data["LicenseFileName"] = repo_service.LicenseFileName ctx.HTML(http.StatusOK, tplTagsList) } From 136408307c6de7aac2ab5476f8cddf90f39355dc Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 3 Dec 2024 17:24:16 +0100 Subject: [PATCH 2/7] Add Swift login endpoint (#32693) Fix #32683 This PR adds the login endpoint and fixes the documentation links. --- routers/api/packages/api.go | 68 +++++++++++--------- routers/api/packages/swift/swift.go | 34 ++++++---- tests/integration/api_packages_swift_test.go | 18 ++++++ 3 files changed, 77 insertions(+), 43 deletions(-) diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go index d17e4875b13a7..c3da5a7513bc3 100644 --- a/routers/api/packages/api.go +++ b/routers/api/packages/api.go @@ -610,40 +610,46 @@ func CommonRoutes() *web.Router { }, reqPackageAccess(perm.AccessModeWrite)) }, reqPackageAccess(perm.AccessModeRead)) r.Group("/swift", func() { - r.Group("/{scope}/{name}", func() { - r.Group("", func() { - r.Get("", swift.EnumeratePackageVersions) - r.Get(".json", swift.EnumeratePackageVersions) - }, swift.CheckAcceptMediaType(swift.AcceptJSON)) - r.Group("/{version}", func() { - r.Get("/Package.swift", swift.CheckAcceptMediaType(swift.AcceptSwift), swift.DownloadManifest) - r.Put("", reqPackageAccess(perm.AccessModeWrite), swift.CheckAcceptMediaType(swift.AcceptJSON), swift.UploadPackageFile) - r.Get("", func(ctx *context.Context) { - // Can't use normal routes here: https://github.com/go-chi/chi/issues/781 - - version := ctx.PathParam("version") - if strings.HasSuffix(version, ".zip") { - swift.CheckAcceptMediaType(swift.AcceptZip)(ctx) - if ctx.Written() { - return - } - ctx.SetPathParam("version", version[:len(version)-4]) - swift.DownloadPackageFile(ctx) - } else { - swift.CheckAcceptMediaType(swift.AcceptJSON)(ctx) - if ctx.Written() { - return - } - if strings.HasSuffix(version, ".json") { - ctx.SetPathParam("version", version[:len(version)-5]) + r.Group("", func() { // Needs to be unauthenticated. + r.Post("", swift.CheckAuthenticate) + r.Post("/login", swift.CheckAuthenticate) + }) + r.Group("", func() { + r.Group("/{scope}/{name}", func() { + r.Group("", func() { + r.Get("", swift.EnumeratePackageVersions) + r.Get(".json", swift.EnumeratePackageVersions) + }, swift.CheckAcceptMediaType(swift.AcceptJSON)) + r.Group("/{version}", func() { + r.Get("/Package.swift", swift.CheckAcceptMediaType(swift.AcceptSwift), swift.DownloadManifest) + r.Put("", reqPackageAccess(perm.AccessModeWrite), swift.CheckAcceptMediaType(swift.AcceptJSON), swift.UploadPackageFile) + r.Get("", func(ctx *context.Context) { + // Can't use normal routes here: https://github.com/go-chi/chi/issues/781 + + version := ctx.PathParam("version") + if strings.HasSuffix(version, ".zip") { + swift.CheckAcceptMediaType(swift.AcceptZip)(ctx) + if ctx.Written() { + return + } + ctx.SetPathParam("version", version[:len(version)-4]) + swift.DownloadPackageFile(ctx) + } else { + swift.CheckAcceptMediaType(swift.AcceptJSON)(ctx) + if ctx.Written() { + return + } + if strings.HasSuffix(version, ".json") { + ctx.SetPathParam("version", version[:len(version)-5]) + } + swift.PackageVersionMetadata(ctx) } - swift.PackageVersionMetadata(ctx) - } + }) }) }) - }) - r.Get("/identifiers", swift.CheckAcceptMediaType(swift.AcceptJSON), swift.LookupPackageIdentifiers) - }, reqPackageAccess(perm.AccessModeRead)) + r.Get("/identifiers", swift.CheckAcceptMediaType(swift.AcceptJSON), swift.LookupPackageIdentifiers) + }, reqPackageAccess(perm.AccessModeRead)) + }) r.Group("/vagrant", func() { r.Group("/authenticate", func() { r.Get("", vagrant.CheckAuthenticate) diff --git a/routers/api/packages/swift/swift.go b/routers/api/packages/swift/swift.go index d5d4d4e9d134c..4d7fb8b1a6992 100644 --- a/routers/api/packages/swift/swift.go +++ b/routers/api/packages/swift/swift.go @@ -27,7 +27,7 @@ import ( "github.com/hashicorp/go-version" ) -// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#35-api-versioning +// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#35-api-versioning const ( AcceptJSON = "application/vnd.swift.registry.v1+json" AcceptSwift = "application/vnd.swift.registry.v1+swift" @@ -35,9 +35,9 @@ const ( ) var ( - // https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#361-package-scope + // https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#361-package-scope scopePattern = regexp.MustCompile(`\A[a-zA-Z0-9][a-zA-Z0-9-]{0,38}\z`) - // https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#362-package-name + // https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#362-package-name namePattern = regexp.MustCompile(`\A[a-zA-Z0-9][a-zA-Z0-9-_]{0,99}\z`) ) @@ -49,7 +49,7 @@ type headers struct { Link string } -// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#35-api-versioning +// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#35-api-versioning func setResponseHeaders(resp http.ResponseWriter, h *headers) { if h.ContentType != "" { resp.Header().Set("Content-Type", h.ContentType) @@ -69,7 +69,7 @@ func setResponseHeaders(resp http.ResponseWriter, h *headers) { } } -// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#33-error-handling +// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#33-error-handling func apiError(ctx *context.Context, status int, obj any) { // https://www.rfc-editor.org/rfc/rfc7807 type Problem struct { @@ -91,7 +91,7 @@ func apiError(ctx *context.Context, status int, obj any) { }) } -// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#35-api-versioning +// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#35-api-versioning func CheckAcceptMediaType(requiredAcceptHeader string) func(ctx *context.Context) { return func(ctx *context.Context) { accept := ctx.Req.Header.Get("Accept") @@ -101,6 +101,16 @@ func CheckAcceptMediaType(requiredAcceptHeader string) func(ctx *context.Context } } +// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/PackageRegistryUsage.md#registry-authentication +func CheckAuthenticate(ctx *context.Context) { + if ctx.Doer == nil { + apiError(ctx, http.StatusUnauthorized, nil) + return + } + + ctx.Status(http.StatusOK) +} + func buildPackageID(scope, name string) string { return scope + "." + name } @@ -113,7 +123,7 @@ type EnumeratePackageVersionsResponse struct { Releases map[string]Release `json:"releases"` } -// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#41-list-package-releases +// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#41-list-package-releases func EnumeratePackageVersions(ctx *context.Context) { packageScope := ctx.PathParam("scope") packageName := ctx.PathParam("name") @@ -170,7 +180,7 @@ type PackageVersionMetadataResponse struct { Metadata *swift_module.SoftwareSourceCode `json:"metadata"` } -// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#endpoint-2 +// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#endpoint-2 func PackageVersionMetadata(ctx *context.Context) { id := buildPackageID(ctx.PathParam("scope"), ctx.PathParam("name")) @@ -228,7 +238,7 @@ func PackageVersionMetadata(ctx *context.Context) { }) } -// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#43-fetch-manifest-for-a-package-release +// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#43-fetch-manifest-for-a-package-release func DownloadManifest(ctx *context.Context) { packageScope := ctx.PathParam("scope") packageName := ctx.PathParam("name") @@ -280,7 +290,7 @@ func DownloadManifest(ctx *context.Context) { }) } -// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#endpoint-6 +// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#endpoint-6 func UploadPackageFile(ctx *context.Context) { packageScope := ctx.PathParam("scope") packageName := ctx.PathParam("name") @@ -379,7 +389,7 @@ func UploadPackageFile(ctx *context.Context) { ctx.Status(http.StatusCreated) } -// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#endpoint-4 +// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#endpoint-4 func DownloadPackageFile(ctx *context.Context) { pv, err := packages_model.GetVersionByNameAndVersion(ctx, ctx.Package.Owner.ID, packages_model.TypeSwift, buildPackageID(ctx.PathParam("scope"), ctx.PathParam("name")), ctx.PathParam("version")) if err != nil { @@ -420,7 +430,7 @@ type LookupPackageIdentifiersResponse struct { Identifiers []string `json:"identifiers"` } -// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#endpoint-5 +// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#endpoint-5 func LookupPackageIdentifiers(ctx *context.Context) { url := ctx.FormTrim("url") if url == "" { diff --git a/tests/integration/api_packages_swift_test.go b/tests/integration/api_packages_swift_test.go index 7d4ff954e2274..c0e0dccfab11b 100644 --- a/tests/integration/api_packages_swift_test.go +++ b/tests/integration/api_packages_swift_test.go @@ -42,6 +42,24 @@ func TestPackageSwift(t *testing.T) { url := fmt.Sprintf("/api/packages/%s/swift", user.Name) + t.Run("CheckLogin", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequestWithBody(t, "POST", url, strings.NewReader("")) + MakeRequest(t, req, http.StatusUnauthorized) + + req = NewRequestWithBody(t, "POST", url, strings.NewReader("")). + AddBasicAuth(user.Name) + MakeRequest(t, req, http.StatusOK) + + req = NewRequestWithBody(t, "POST", url+"/login", strings.NewReader("")) + MakeRequest(t, req, http.StatusUnauthorized) + + req = NewRequestWithBody(t, "POST", url+"/login", strings.NewReader("")). + AddBasicAuth(user.Name) + MakeRequest(t, req, http.StatusOK) + }) + t.Run("CheckAcceptMediaType", func(t *testing.T) { defer tests.PrintCurrentTest(t)() From 690d07470cab795d64153c77405aba7dc5814a9e Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Wed, 4 Dec 2024 01:52:25 +0900 Subject: [PATCH 3/7] Fix word overflow in file search page (#32695) --- templates/repo/find/files.tmpl | 2 +- web_src/js/features/repo-findfile.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/templates/repo/find/files.tmpl b/templates/repo/find/files.tmpl index 548ce2f0e8018..ce242796bec80 100644 --- a/templates/repo/find/files.tmpl +++ b/templates/repo/find/files.tmpl @@ -9,7 +9,7 @@ - +
diff --git a/web_src/js/features/repo-findfile.ts b/web_src/js/features/repo-findfile.ts index 1f151d7056cba..6500978bc8189 100644 --- a/web_src/js/features/repo-findfile.ts +++ b/web_src/js/features/repo-findfile.ts @@ -90,6 +90,7 @@ function filterRepoFiles(filter) { const span = document.createElement('span'); // safely escape by using textContent span.textContent = part; + span.title = span.textContent; // if the target file path is "abc/xyz", to search "bx", then the matchResult is ['a', 'b', 'c/', 'x', 'yz'] // the matchResult[odd] is matched and highlighted to red. if (index % 2 === 1) span.classList.add('ui', 'text', 'red'); From 171edfc79373fe0e80e064748c0cec8cc93aea2e Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Wed, 4 Dec 2024 01:53:57 +0800 Subject: [PATCH 4/7] Fix oauth2 login methods (#32698) Regression of #32687 It should use "or" but not "and", otherwise the oauth2 methods won't show when no ENABLE_OPENID_SIGNIN --- templates/user/auth/signin_inner.tmpl | 5 +++-- templates/user/auth/signup_inner.tmpl | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/templates/user/auth/signin_inner.tmpl b/templates/user/auth/signin_inner.tmpl index e0a19a974330a..3124048d36edd 100644 --- a/templates/user/auth/signin_inner.tmpl +++ b/templates/user/auth/signin_inner.tmpl @@ -48,10 +48,11 @@ {{end}}{{/*if .EnablePasswordSignInForm*/}} - {{if and .OAuth2Providers .EnableOpenIDSignIn .EnablePasswordSignInForm}} + {{$showOAuth2Methods := or .OAuth2Providers .EnableOpenIDSignIn}} + {{if and $showOAuth2Methods .EnablePasswordSignInForm}}
{{ctx.Locale.Tr "sign_in_or"}}
{{end}} - {{if and .OAuth2Providers .EnableOpenIDSignIn}} + {{if $showOAuth2Methods}} {{template "user/auth/oauth_container" .}} {{end}} diff --git a/templates/user/auth/signup_inner.tmpl b/templates/user/auth/signup_inner.tmpl index 6969003968670..41d0cd49b522d 100644 --- a/templates/user/auth/signup_inner.tmpl +++ b/templates/user/auth/signup_inner.tmpl @@ -47,8 +47,8 @@ {{end}} - - {{if and .OAuth2Providers .EnableOpenIDSignIn}} + {{$showOAuth2Methods := or .OAuth2Providers .EnableOpenIDSignIn}} + {{if $showOAuth2Methods}}
{{ctx.Locale.Tr "sign_in_or"}}
{{template "user/auth/oauth_container" .}} {{end}} From 2f43536c3eb6ba20e43521f5539df8372f225652 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Wed, 4 Dec 2024 09:39:33 +0800 Subject: [PATCH 5/7] Fix issue title rendering and refactor legacy function names (#32703) Fix #32700, regression of recent markup refactoring And by the way, clarify many legacy problems: 1. Some "RenderXxx" functions do not really "render", they only call "post processors" 2. Merge "RenderEmoji | RenderCodeBlock", they are all for "simple issue title" --- models/repo/repo.go | 2 +- modules/markup/html.go | 45 ++++++++++--------- modules/markup/html_internal_test.go | 4 +- modules/markup/render.go | 4 ++ modules/templates/util_render.go | 27 ++++++----- modules/templates/util_render_test.go | 4 +- routers/web/repo/commit.go | 4 +- templates/repo/diff/compare.tmpl | 2 +- templates/repo/issue/card.tmpl | 2 +- templates/repo/issue/view_title.tmpl | 2 +- templates/repo/pulse.tmpl | 14 +++--- templates/shared/issuelist.tmpl | 2 +- templates/user/dashboard/feeds.tmpl | 8 ++-- .../user/notification/notification_div.tmpl | 2 +- 14 files changed, 69 insertions(+), 53 deletions(-) diff --git a/models/repo/repo.go b/models/repo/repo.go index 4a12de9d98d9d..8d211caf40b90 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 04b768bb8ec4d..25628db39e4c5 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,26 +211,20 @@ 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) } -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 { - return "", err - } - return buf.String(), nil -} - -// RenderDescriptionHTML will use similar logic as PostProcess, but will +// PostProcessDescriptionHTML will use similar logic as PostProcess, but will // use a single special linkProcessor. -func RenderDescriptionHTML(ctx *RenderContext, content string) (string, error) { +func PostProcessDescriptionHTML(ctx *RenderContext, content string) (string, error) { return postProcessString(ctx, []processor{ descriptionLinkProcessor, emojiShortCodeProcessor, @@ -238,13 +232,24 @@ func RenderDescriptionHTML(ctx *RenderContext, content string) (string, error) { }, content) } -// RenderEmoji for when we want to just process emoji and shortcodes +// 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 RenderEmoji(ctx *RenderContext, content string) (string, error) { +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 { + return "", err + } + return buf.String(), nil +} + 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 651e674108c90..9419350e61599 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 3b112b1a142fc..b239e59687b7b 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 3237de5ecb18b..1800747f48daa 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 c0241c0a8c5f3..80094ab26ea7d 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 0be9689c3f5e3..c5652784fa012 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 28419a34628b1..118d6478d19a6 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 6c24419b467a3..2e19e86d7af30 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 cf775f22b57ba..bf2ede58e487d 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 1d7923b2f2f7f..522263350784f 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 ef2352665d586..fe5184e7d224f 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 d3e2f7a06c2b3..1c1ba5566fcf5 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 c2bb4e2e87b1f..0d2371a358abb 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}} From c9e582c6b6cbc7beae66d24b05be6e1d338aa81b Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Wed, 4 Dec 2024 10:11:34 +0800 Subject: [PATCH 6/7] Refactor markdown editor and use it for milestone description editor (#32688) Refactor markdown editor to clarify its "preview" behavior and remove jQuery code. Close #15045 --------- Co-authored-by: silverwind --- modules/web/route.go | 5 +- options/locale/locale_en-US.ini | 1 - routers/web/web.go | 2 + templates/devtest/devtest-footer.tmpl | 2 +- templates/devtest/devtest-header.tmpl | 2 +- templates/devtest/gitea-ui.tmpl | 3 +- templates/org/settings/options.tmpl | 1 + templates/projects/new.tmpl | 11 +++- templates/repo/diff/box.tmpl | 5 +- templates/repo/diff/comment_form.tmpl | 12 ++-- templates/repo/diff/new_review.tmpl | 4 +- templates/repo/issue/comment_tab.tmpl | 7 ++- templates/repo/issue/fields/textarea.tmpl | 7 ++- templates/repo/issue/milestone_new.tmpl | 9 ++- templates/repo/issue/view_content.tmpl | 5 +- templates/repo/release/new.tmpl | 5 +- templates/repo/wiki/new.tmpl | 8 +-- templates/shared/combomarkdowneditor.tmpl | 38 +++++++++--- templates/user/settings/profile.tmpl | 1 + web_src/css/editor/combomarkdowneditor.css | 5 ++ web_src/css/repo.css | 2 +- web_src/css/review.css | 25 -------- web_src/js/features/common-form.ts | 8 ++- .../js/features/comp/ComboMarkdownEditor.ts | 58 +++++++++++-------- web_src/js/features/repo-editor.ts | 8 +-- web_src/js/features/repo-issue.ts | 5 -- web_src/js/features/repo-release.ts | 10 ---- web_src/js/features/repo-wiki.ts | 7 +-- web_src/js/index.ts | 7 ++- 29 files changed, 147 insertions(+), 116 deletions(-) diff --git a/modules/web/route.go b/modules/web/route.go index 77c411a97b911..787521dfb07f5 100644 --- a/modules/web/route.go +++ b/modules/web/route.go @@ -9,6 +9,7 @@ import ( "reflect" "strings" + "code.gitea.io/gitea/modules/htmlutil" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/web/middleware" @@ -214,7 +215,9 @@ func (r *Router) normalizeRequestPath(resp http.ResponseWriter, req *http.Reques normalizedPath = "/" } else if !strings.HasPrefix(normalizedPath+"/", "/v2/") { // do not respond to other requests, to simulate a real sub-path environment - http.Error(resp, "404 page not found, sub-path is: "+setting.AppSubURL, http.StatusNotFound) + resp.Header().Add("Content-Type", "text/html; charset=utf-8") + resp.WriteHeader(http.StatusNotFound) + _, _ = resp.Write([]byte(htmlutil.HTMLFormat(`404 page not found, sub-path is: %s`, setting.AppSubURL, setting.AppSubURL))) return } normalized = true diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 8da7412adeb35..57d2d89c5acad 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -2590,7 +2590,6 @@ diff.generated = generated diff.vendored = vendored diff.comment.add_line_comment = Add line comment diff.comment.placeholder = Leave a comment -diff.comment.markdown_info = Styling with markdown is supported. diff.comment.add_single_comment = Add single comment diff.comment.add_review_comment = Add comment diff.comment.start_review = Start review diff --git a/routers/web/web.go b/routers/web/web.go index 5ed046a9838b1..e89d06944930e 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -485,6 +485,8 @@ func registerRoutes(m *web.Router) { m.Methods("GET, HEAD", "/*", public.FileHandlerFunc()) }, optionsCorsHandler()) + m.Post("/-/markup", reqSignIn, web.Bind(structs.MarkupOption{}), misc.Markup) + m.Group("/explore", func() { m.Get("", func(ctx *context.Context) { ctx.Redirect(setting.AppSubURL + "/explore/repos") diff --git a/templates/devtest/devtest-footer.tmpl b/templates/devtest/devtest-footer.tmpl index 1c755508a5ec1..a1b3b86e5c47d 100644 --- a/templates/devtest/devtest-footer.tmpl +++ b/templates/devtest/devtest-footer.tmpl @@ -1,3 +1,3 @@ {{/* TODO: the devtest.js is isolated from index.js, so no module is shared and many index.js functions do not work in devtest.ts */}} -{{template "base/footer" dict}} +{{template "base/footer" ctx.RootData}} diff --git a/templates/devtest/devtest-header.tmpl b/templates/devtest/devtest-header.tmpl index a5910b96e6f46..ee085456406d3 100644 --- a/templates/devtest/devtest-header.tmpl +++ b/templates/devtest/devtest-header.tmpl @@ -1,2 +1,2 @@ -{{template "base/head" dict}} +{{template "base/head" ctx.RootData}} diff --git a/templates/devtest/gitea-ui.tmpl b/templates/devtest/gitea-ui.tmpl index 303421fe13407..5b40268761dd2 100644 --- a/templates/devtest/gitea-ui.tmpl +++ b/templates/devtest/gitea-ui.tmpl @@ -183,8 +183,7 @@

ComboMarkdownEditor

-
ps: no JS code attached, so just a layout
- {{template "shared/combomarkdowneditor" .}} + {{template "shared/combomarkdowneditor" dict "MarkdownPreviewContext" "/owner/path"}}

Tailwind CSS Demo

diff --git a/templates/org/settings/options.tmpl b/templates/org/settings/options.tmpl index 62debfc0aefac..3b817d068b585 100644 --- a/templates/org/settings/options.tmpl +++ b/templates/org/settings/options.tmpl @@ -23,6 +23,7 @@
+ {{/* it is rendered as markdown, but the length is limited, so at the moment we do not use the markdown editor here */}}
diff --git a/templates/projects/new.tmpl b/templates/projects/new.tmpl index bd173b54bcec9..a936079c46615 100644 --- a/templates/projects/new.tmpl +++ b/templates/projects/new.tmpl @@ -18,7 +18,16 @@
- + {{/* TODO: repo-level project and org-level project have different behaviros to render */}} + {{/* the "Repository" is nil when the project is org-level */}} + {{template "shared/combomarkdowneditor" (dict + "MarkdownPreviewInRepo" $.Repository + "MarkdownPreviewContext" (Iif $.Repository "" .HomeLink) + "MarkdownPreviewMode" (Iif $.Repository "comment") + "TextareaName" "content" + "TextareaContent" .content + "TextareaPlaceholder" (ctx.Locale.Tr "repo.projects.description_placeholder") + )}}
{{if not .PageIsEditProjects}} diff --git a/templates/repo/diff/box.tmpl b/templates/repo/diff/box.tmpl index 20e0c9db668c9..0f1458bfbfd22 100644 --- a/templates/repo/diff/box.tmpl +++ b/templates/repo/diff/box.tmpl @@ -240,8 +240,9 @@