gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package markdown
  4. import (
  5. "fmt"
  6. "strings"
  7. "code.gitea.io/gitea/modules/markup"
  8. "github.com/yuin/goldmark/ast"
  9. "gopkg.in/yaml.v3"
  10. )
  11. // RenderConfig represents rendering configuration for this file
  12. type RenderConfig struct {
  13. Meta markup.RenderMetaMode
  14. TOC string // "false": hide, "side"/empty: in sidebar, "main"/"true": in main view
  15. Lang string
  16. yamlNode *yaml.Node
  17. // Used internally. Cannot be controlled by frontmatter.
  18. metaLength int
  19. }
  20. func renderMetaModeFromString(s string) markup.RenderMetaMode {
  21. switch strings.TrimSpace(strings.ToLower(s)) {
  22. case "none":
  23. return markup.RenderMetaAsNone
  24. case "table":
  25. return markup.RenderMetaAsTable
  26. default: // "details"
  27. return markup.RenderMetaAsDetails
  28. }
  29. }
  30. // UnmarshalYAML implement yaml.v3 UnmarshalYAML
  31. func (rc *RenderConfig) UnmarshalYAML(value *yaml.Node) error {
  32. if rc == nil {
  33. return nil
  34. }
  35. rc.yamlNode = value
  36. type commonRenderConfig struct {
  37. TOC string `yaml:"include_toc"`
  38. Lang string `yaml:"lang"`
  39. }
  40. var basic commonRenderConfig
  41. if err := value.Decode(&basic); err != nil {
  42. return fmt.Errorf("unable to decode into commonRenderConfig %w", err)
  43. }
  44. if basic.Lang != "" {
  45. rc.Lang = basic.Lang
  46. }
  47. rc.TOC = basic.TOC
  48. type controlStringRenderConfig struct {
  49. Gitea string `yaml:"gitea"`
  50. }
  51. var stringBasic controlStringRenderConfig
  52. if err := value.Decode(&stringBasic); err == nil {
  53. if stringBasic.Gitea != "" {
  54. rc.Meta = renderMetaModeFromString(stringBasic.Gitea)
  55. }
  56. return nil
  57. }
  58. type yamlRenderConfig struct {
  59. Meta *string `yaml:"meta"`
  60. Icon *string `yaml:"details_icon"` // deprecated, because there is no font icon, so no custom icon
  61. TOC *string `yaml:"include_toc"`
  62. Lang *string `yaml:"lang"`
  63. }
  64. type yamlRenderConfigWrapper struct {
  65. Gitea *yamlRenderConfig `yaml:"gitea"`
  66. }
  67. var cfg yamlRenderConfigWrapper
  68. if err := value.Decode(&cfg); err != nil {
  69. return fmt.Errorf("unable to decode into yamlRenderConfigWrapper %w", err)
  70. }
  71. if cfg.Gitea == nil {
  72. return nil
  73. }
  74. if cfg.Gitea.Meta != nil {
  75. rc.Meta = renderMetaModeFromString(*cfg.Gitea.Meta)
  76. }
  77. if cfg.Gitea.Lang != nil && *cfg.Gitea.Lang != "" {
  78. rc.Lang = *cfg.Gitea.Lang
  79. }
  80. if cfg.Gitea.TOC != nil {
  81. rc.TOC = *cfg.Gitea.TOC
  82. }
  83. return nil
  84. }
  85. func (rc *RenderConfig) toMetaNode(g *ASTTransformer) ast.Node {
  86. if rc.yamlNode == nil {
  87. return nil
  88. }
  89. switch rc.Meta {
  90. case markup.RenderMetaAsTable:
  91. return nodeToTable(rc.yamlNode)
  92. case markup.RenderMetaAsDetails:
  93. return nodeToDetails(g, rc.yamlNode)
  94. default:
  95. return nil
  96. }
  97. }