diff --git a/modules/structs/miscellaneous.go b/modules/structs/miscellaneous.go index bff10f95b7..3af7c818d1 100644 --- a/modules/structs/miscellaneous.go +++ b/modules/structs/miscellaneous.go @@ -37,6 +37,14 @@ type MarkupOption struct { // // in: body FilePath string + // The current branch path where the form gets posted + // + // in: body + BranchPath string + // Relative path to the repository + // + // in: body + RelativePath string } // MarkupRender is a rendered markup document diff --git a/routers/api/v1/misc/markup.go b/routers/api/v1/misc/markup.go index 9699c79368..e9d6617fb7 100644 --- a/routers/api/v1/misc/markup.go +++ b/routers/api/v1/misc/markup.go @@ -41,7 +41,17 @@ func Markup(ctx *context.APIContext) { return } - common.RenderMarkup(ctx.Base, ctx.Repo, form.Mode, form.Text, form.Context, form.FilePath, form.Wiki) + re := common.Renderer{ + Mode: form.Mode, + Text: form.Text, + UrlPrefix: form.Context, + FilePath: form.FilePath, + BranchPath: form.BranchPath, + RelativePath: form.RelativePath, + IsWiki: form.Wiki, + } + + re.RenderMarkup(ctx.Base, ctx.Repo) } // Markdown render markdown document to HTML @@ -76,7 +86,14 @@ func Markdown(ctx *context.APIContext) { mode = form.Mode } - common.RenderMarkup(ctx.Base, ctx.Repo, mode, form.Text, form.Context, "", form.Wiki) + re := common.Renderer{ + Mode: mode, + Text: form.Text, + UrlPrefix: form.Context, + IsWiki: form.Wiki, + } + + re.RenderMarkup(ctx.Base, ctx.Repo) } // MarkdownRaw render raw markdown HTML diff --git a/routers/common/markup.go b/routers/common/markup.go index 2d5638ef61..4c17c48e99 100644 --- a/routers/common/markup.go +++ b/routers/common/markup.go @@ -18,26 +18,31 @@ import ( "mvdan.cc/xurls/v2" ) +type Renderer struct { + Mode, Text, UrlPrefix, FilePath, BranchPath, RelativePath string + IsWiki bool +} + // RenderMarkup renders markup text for the /markup and /markdown endpoints -func RenderMarkup(ctx *context.Base, repo *context.Repository, mode, text, urlPrefix, filePath string, wiki bool) { +func (re *Renderer) RenderMarkup(ctx *context.Base, repo *context.Repository) { var markupType string relativePath := "" - if len(text) == 0 { + if len(re.Text) == 0 { _, _ = ctx.Write([]byte("")) return } - switch mode { + switch re.Mode { case "markdown": // Raw markdown if err := markdown.RenderRaw(&markup.RenderContext{ Ctx: ctx, Links: markup.Links{ AbsolutePrefix: true, - Base: urlPrefix, + Base: re.UrlPrefix, }, - }, strings.NewReader(text), ctx.Resp); err != nil { + }, strings.NewReader(re.Text), ctx.Resp); err != nil { ctx.Error(http.StatusInternalServerError, err.Error()) } return @@ -50,30 +55,31 @@ func RenderMarkup(ctx *context.Base, repo *context.Repository, mode, text, urlPr case "file": // File as document based on file extension markupType = "" - relativePath = filePath + re.UrlPrefix = re.RelativePath + relativePath = re.FilePath default: - ctx.Error(http.StatusUnprocessableEntity, fmt.Sprintf("Unknown mode: %s", mode)) + ctx.Error(http.StatusUnprocessableEntity, fmt.Sprintf("Unknown mode: %s", re.Mode)) return } - if !strings.HasPrefix(setting.AppSubURL+"/", urlPrefix) { + if !strings.HasPrefix(setting.AppSubURL+"/", re.UrlPrefix) { // check if urlPrefix is already set to a URL linkRegex, _ := xurls.StrictMatchingScheme("https?://") - m := linkRegex.FindStringIndex(urlPrefix) + m := linkRegex.FindStringIndex(re.UrlPrefix) if m == nil { - urlPrefix = util.URLJoin(setting.AppURL, urlPrefix) + re.UrlPrefix = util.URLJoin(setting.AppURL, re.UrlPrefix) } } meta := map[string]string{} if repo != nil && repo.Repository != nil { - if mode == "comment" { + if re.Mode == "comment" { meta = repo.Repository.ComposeMetas(ctx) } else { meta = repo.Repository.ComposeDocumentMetas(ctx) } } - if mode != "comment" { + if re.Mode != "comment" { meta["mode"] = "document" } @@ -81,13 +87,14 @@ func RenderMarkup(ctx *context.Base, repo *context.Repository, mode, text, urlPr Ctx: ctx, Links: markup.Links{ AbsolutePrefix: true, - Base: urlPrefix, + Base: re.UrlPrefix, + BranchPath: re.BranchPath, }, Metas: meta, - IsWiki: wiki, + IsWiki: re.IsWiki, Type: markupType, RelativePath: relativePath, - }, strings.NewReader(text), ctx.Resp); err != nil { + }, strings.NewReader(re.Text), ctx.Resp); err != nil { if markup.IsErrUnsupportedRenderExtension(err) { ctx.Error(http.StatusUnprocessableEntity, err.Error()) } else { diff --git a/routers/web/misc/markup.go b/routers/web/misc/markup.go index 2dbbd6fc09..f35158fa9e 100644 --- a/routers/web/misc/markup.go +++ b/routers/web/misc/markup.go @@ -14,5 +14,16 @@ import ( // Markup render markup document to HTML func Markup(ctx *context.Context) { form := web.GetForm(ctx).(*api.MarkupOption) - common.RenderMarkup(ctx.Base, ctx.Repo, form.Mode, form.Text, form.Context, form.FilePath, form.Wiki) + + re := common.Renderer{ + Mode: form.Mode, + Text: form.Text, + UrlPrefix: form.Context, + FilePath: form.FilePath, + BranchPath: form.BranchPath, + RelativePath: form.RelativePath, + IsWiki: form.Wiki, + } + + re.RenderMarkup(ctx.Base, ctx.Repo) } diff --git a/templates/repo/editor/edit.tmpl b/templates/repo/editor/edit.tmpl index 59bdc91448..71cecf1514 100644 --- a/templates/repo/editor/edit.tmpl +++ b/templates/repo/editor/edit.tmpl @@ -28,7 +28,7 @@