- Enable the wiki on the .mokogitea (public) or .mokogitea-private (members-only)
- repository to get started.
+ Enable a public or members-only wiki for this organization to get started.
diff --git a/routers/web/org/wiki.go b/routers/web/org/wiki.go index e6d76f08c3..510257d871 100644 --- a/routers/web/org/wiki.go +++ b/routers/web/org/wiki.go @@ -4,8 +4,10 @@ package org import ( + htmltemplate "html/template" "net/http" "path" + "regexp" "strings" "code.mokoconsulting.tech/MokoConsulting/MokoGitea/models/renderhelper" @@ -114,6 +116,11 @@ func Wiki(ctx *context.Context) { ctx.ServerError("RenderString", err) return } + // Intra-wiki links render as repo-file URLs (/{owner}/{repo}/src/branch/...). + // Rewrite them to the org wiki route so they open the wiki viewer instead of + // the repo file browser, and don't leak the underlying wiki repo name. + wikiLinkBase := setting.AppSubURL + "/" + org.Name + "/-/wiki/" + renderedContent = rewriteOrgWikiLinks(renderedContent, wikiRepo, wikiLinkBase) ctx.Data["WikiContent"] = renderedContent // Render _Sidebar if it exists. @@ -123,7 +130,7 @@ func Wiki(ctx *context.Context) { if err == nil { rendered, err := markdown.RenderString(rctx, sidebarContent) if err == nil { - ctx.Data["WikiSidebarHTML"] = rendered + ctx.Data["WikiSidebarHTML"] = rewriteOrgWikiLinks(rendered, wikiRepo, wikiLinkBase) } } } @@ -135,7 +142,7 @@ func Wiki(ctx *context.Context) { if err == nil { rendered, err := markdown.RenderString(rctx, footerContent) if err == nil { - ctx.Data["WikiFooterHTML"] = rendered + ctx.Data["WikiFooterHTML"] = rewriteOrgWikiLinks(rendered, wikiRepo, wikiLinkBase) } } } @@ -143,6 +150,20 @@ func Wiki(ctx *context.Context) { ctx.HTML(http.StatusOK, tplOrgWiki) } +// rewriteOrgWikiLinks rewrites links produced by the RepoFile render context +// (/{owner}/{repo}/src/branch/{branch}/PATH) into org wiki routes +// (/{owner}/-/wiki/PATH), stripping a trailing .md, so intra-wiki links open the +// wiki viewer instead of the repo file browser. +func rewriteOrgWikiLinks(html htmltemplate.HTML, wikiRepo *repo_model.Repository, wikiBase string) htmltemplate.HTML { + prefix := wikiRepo.Link() + "/src/branch/" + util.PathEscapeSegments(wikiRepo.DefaultBranch) + "/" + re := regexp.MustCompile(`href="(?:https?://[^/"]+)?` + regexp.QuoteMeta(prefix) + `([^"#?]*)([^"]*)"`) + out := re.ReplaceAllStringFunc(string(html), func(m string) string { + sm := re.FindStringSubmatch(m) + return `href="` + wikiBase + strings.TrimSuffix(sm[1], ".md") + sm[2] + `"` + }) + return htmltemplate.HTML(out) +} + // buildOrgWikiTree builds a hierarchical folder tree from the org wiki git repo. // Shows up to 2 levels deep (folders and their immediate children). func buildOrgWikiTree(commit *git.Commit) []*OrgWikiTreeNode { diff --git a/routers/web/repo/setting/metadata.go b/routers/web/repo/setting/metadata.go index 58abe8c548..c18838f5c4 100644 --- a/routers/web/repo/setting/metadata.go +++ b/routers/web/repo/setting/metadata.go @@ -40,9 +40,8 @@ func Metadata(ctx *context.Context) { } } ctx.Data["Manifest"] = manifest - // Organization is derived from the org profile (repo owner), not stored. - // It is displayed read-only. See issue #771. - ctx.Data["DerivedOrg"] = ctx.Repo.Repository.DerivedOrgName(ctx) + // Organization is derived from the org profile (repo owner), not stored, + // and is no longer surfaced on the metadata page (redundant). See #771. // Platform dropdown options come from the admin-configurable setting // (Admin -> Metadata). Keep the repo's current value selectable even if it diff --git a/templates/org/wiki/view.tmpl b/templates/org/wiki/view.tmpl index de4020fb3f..ee0e1ecdd8 100644 --- a/templates/org/wiki/view.tmpl +++ b/templates/org/wiki/view.tmpl @@ -1,7 +1,6 @@ {{template "base/head" .}}
- Enable the wiki on the .mokogitea (public) or .mokogitea-private (members-only)
- repository to get started.
+ Enable a public or members-only wiki for this organization to get started.