gitea源码

toc.go 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package markdown
  4. import (
  5. "net/url"
  6. "code.gitea.io/gitea/modules/translation"
  7. "github.com/yuin/goldmark/ast"
  8. )
  9. // Header holds the data about a header.
  10. type Header struct {
  11. Level int
  12. Text string
  13. ID string
  14. }
  15. func createTOCNode(toc []Header, lang string, detailsAttrs map[string]string) ast.Node {
  16. details := NewDetails()
  17. summary := NewSummary()
  18. for k, v := range detailsAttrs {
  19. details.SetAttributeString(k, []byte(v))
  20. }
  21. summary.AppendChild(summary, ast.NewString([]byte(translation.NewLocale(lang).TrString("toc"))))
  22. details.AppendChild(details, summary)
  23. ul := ast.NewList('-')
  24. details.AppendChild(details, ul)
  25. currentLevel := 6
  26. for _, header := range toc {
  27. if header.Level < currentLevel {
  28. currentLevel = header.Level
  29. }
  30. }
  31. for _, header := range toc {
  32. for currentLevel > header.Level {
  33. ul = ul.Parent().(*ast.List)
  34. currentLevel--
  35. }
  36. for currentLevel < header.Level {
  37. newL := ast.NewList('-')
  38. ul.AppendChild(ul, newL)
  39. currentLevel++
  40. ul = newL
  41. }
  42. li := ast.NewListItem(currentLevel * 2)
  43. a := ast.NewLink()
  44. a.Destination = []byte("#" + url.QueryEscape(header.ID))
  45. a.AppendChild(a, ast.NewString([]byte(header.Text)))
  46. li.AppendChild(li, a)
  47. ul.AppendChild(ul, li)
  48. }
  49. return details
  50. }