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