gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package markdown
  4. import (
  5. "bytes"
  6. "fmt"
  7. "code.gitea.io/gitea/modules/container"
  8. "code.gitea.io/gitea/modules/markup/common"
  9. "code.gitea.io/gitea/modules/util"
  10. "github.com/yuin/goldmark/ast"
  11. )
  12. type prefixedIDs struct {
  13. values container.Set[string]
  14. }
  15. // Generate generates a new element id.
  16. func (p *prefixedIDs) Generate(value []byte, kind ast.NodeKind) []byte {
  17. dft := []byte("id")
  18. if kind == ast.KindHeading {
  19. dft = []byte("heading")
  20. }
  21. return p.GenerateWithDefault(value, dft)
  22. }
  23. // GenerateWithDefault generates a new element id.
  24. func (p *prefixedIDs) GenerateWithDefault(value, dft []byte) []byte {
  25. result := common.CleanValue(value)
  26. if len(result) == 0 {
  27. result = dft
  28. }
  29. if !bytes.HasPrefix(result, []byte("user-content-")) {
  30. result = append([]byte("user-content-"), result...)
  31. }
  32. if p.values.Add(util.UnsafeBytesToString(result)) {
  33. return result
  34. }
  35. for i := 1; ; i++ {
  36. newResult := fmt.Sprintf("%s-%d", result, i)
  37. if p.values.Add(newResult) {
  38. return []byte(newResult)
  39. }
  40. }
  41. }
  42. // Put puts a given element id to the used ids table.
  43. func (p *prefixedIDs) Put(value []byte) {
  44. p.values.Add(util.UnsafeBytesToString(value))
  45. }
  46. func newPrefixedIDs() *prefixedIDs {
  47. return &prefixedIDs{
  48. values: make(container.Set[string]),
  49. }
  50. }