gitea源码

repo_comment.go 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package renderhelper
  4. import (
  5. "context"
  6. "fmt"
  7. repo_model "code.gitea.io/gitea/models/repo"
  8. "code.gitea.io/gitea/modules/markup"
  9. "code.gitea.io/gitea/modules/util"
  10. )
  11. type RepoComment struct {
  12. ctx *markup.RenderContext
  13. opts RepoCommentOptions
  14. commitChecker *commitChecker
  15. repoLink string
  16. }
  17. func (r *RepoComment) CleanUp() {
  18. _ = r.commitChecker.Close()
  19. }
  20. func (r *RepoComment) IsCommitIDExisting(commitID string) bool {
  21. return r.commitChecker.IsCommitIDExisting(commitID)
  22. }
  23. func (r *RepoComment) ResolveLink(link, preferLinkType string) string {
  24. linkType, link := markup.ParseRenderedLink(link, preferLinkType)
  25. switch linkType {
  26. case markup.LinkTypeRoot:
  27. return r.ctx.ResolveLinkRoot(link)
  28. default:
  29. return r.ctx.ResolveLinkRelative(r.repoLink, r.opts.CurrentRefPath, link)
  30. }
  31. }
  32. var _ markup.RenderHelper = (*RepoComment)(nil)
  33. type RepoCommentOptions struct {
  34. DeprecatedRepoName string // it is only a patch for the non-standard "markup" api
  35. DeprecatedOwnerName string // it is only a patch for the non-standard "markup" api
  36. CurrentRefPath string // eg: "branch/main" or "commit/11223344"
  37. FootnoteContextID string // the extra context ID for footnotes, used to avoid conflicts with other footnotes in the same page
  38. }
  39. func NewRenderContextRepoComment(ctx context.Context, repo *repo_model.Repository, opts ...RepoCommentOptions) *markup.RenderContext {
  40. helper := &RepoComment{opts: util.OptionalArg(opts)}
  41. rctx := markup.NewRenderContext(ctx)
  42. helper.ctx = rctx
  43. var metas map[string]string
  44. if repo != nil {
  45. helper.repoLink = repo.Link()
  46. helper.commitChecker = newCommitChecker(ctx, repo)
  47. metas = repo.ComposeCommentMetas(ctx)
  48. } else {
  49. // repo can be nil when rendering a commit message in user's dashboard feedback whose repository has been deleted
  50. metas = map[string]string{}
  51. if helper.opts.DeprecatedOwnerName != "" {
  52. // this is almost dead code, only to pass the incorrect tests
  53. helper.repoLink = fmt.Sprintf("%s/%s", helper.opts.DeprecatedOwnerName, helper.opts.DeprecatedRepoName)
  54. metas["user"] = helper.opts.DeprecatedOwnerName
  55. metas["repo"] = helper.opts.DeprecatedRepoName
  56. }
  57. metas["markdownNewLineHardBreak"] = "true"
  58. metas["markupAllowShortIssuePattern"] = "true"
  59. }
  60. metas["footnoteContextId"] = helper.opts.FootnoteContextID
  61. rctx = rctx.WithMetas(metas).WithHelper(helper)
  62. return rctx
  63. }