code.gitea.io/gitea@v1.19.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 "github.com/yuin/goldmark/ast" 11 "gopkg.in/yaml.v3" 12 ) 13 14 // RenderConfig represents rendering configuration for this file 15 type RenderConfig struct { 16 Meta string 17 Icon string 18 TOC bool 19 Lang string 20 yamlNode *yaml.Node 21 } 22 23 // UnmarshalYAML implement yaml.v3 UnmarshalYAML 24 func (rc *RenderConfig) UnmarshalYAML(value *yaml.Node) error { 25 if rc == nil { 26 rc = &RenderConfig{ 27 Meta: "table", 28 Icon: "table", 29 Lang: "", 30 } 31 } 32 rc.yamlNode = value 33 34 type commonRenderConfig struct { 35 TOC bool `yaml:"include_toc"` 36 Lang string `yaml:"lang"` 37 } 38 var basic commonRenderConfig 39 if err := value.Decode(&basic); err != nil { 40 return fmt.Errorf("unable to decode into commonRenderConfig %w", err) 41 } 42 43 if basic.Lang != "" { 44 rc.Lang = basic.Lang 45 } 46 47 rc.TOC = basic.TOC 48 49 type controlStringRenderConfig struct { 50 Gitea string `yaml:"gitea"` 51 } 52 53 var stringBasic controlStringRenderConfig 54 55 if err := value.Decode(&stringBasic); err == nil { 56 if stringBasic.Gitea != "" { 57 switch strings.TrimSpace(strings.ToLower(stringBasic.Gitea)) { 58 case "none": 59 rc.Meta = "none" 60 case "table": 61 rc.Meta = "table" 62 default: // "details" 63 rc.Meta = "details" 64 } 65 } 66 return nil 67 } 68 69 type giteaControl struct { 70 Meta *string `yaml:"meta"` 71 Icon *string `yaml:"details_icon"` 72 TOC *bool `yaml:"include_toc"` 73 Lang *string `yaml:"lang"` 74 } 75 76 type complexGiteaConfig struct { 77 Gitea *giteaControl `yaml:"gitea"` 78 } 79 var complex complexGiteaConfig 80 if err := value.Decode(&complex); err != nil { 81 return fmt.Errorf("unable to decode into complexRenderConfig %w", err) 82 } 83 84 if complex.Gitea == nil { 85 return nil 86 } 87 88 if complex.Gitea.Meta != nil { 89 switch strings.TrimSpace(strings.ToLower(*complex.Gitea.Meta)) { 90 case "none": 91 rc.Meta = "none" 92 case "table": 93 rc.Meta = "table" 94 default: // "details" 95 rc.Meta = "details" 96 } 97 } 98 99 if complex.Gitea.Icon != nil { 100 rc.Icon = strings.TrimSpace(strings.ToLower(*complex.Gitea.Icon)) 101 } 102 103 if complex.Gitea.Lang != nil && *complex.Gitea.Lang != "" { 104 rc.Lang = *complex.Gitea.Lang 105 } 106 107 if complex.Gitea.TOC != nil { 108 rc.TOC = *complex.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 "table": 120 return nodeToTable(rc.yamlNode) 121 case "details": 122 return nodeToDetails(rc.yamlNode, rc.Icon) 123 default: 124 return nil 125 } 126 }