summaryrefslogtreecommitdiffstats
path: root/modules/markup/markdown/renderconfig.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/markup/markdown/renderconfig.go')
-rw-r--r--modules/markup/markdown/renderconfig.go126
1 files changed, 126 insertions, 0 deletions
diff --git a/modules/markup/markdown/renderconfig.go b/modules/markup/markdown/renderconfig.go
new file mode 100644
index 00000000..f4c48d1b
--- /dev/null
+++ b/modules/markup/markdown/renderconfig.go
@@ -0,0 +1,126 @@
+// Copyright 2020 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package markdown
+
+import (
+ "fmt"
+ "strings"
+
+ "code.gitea.io/gitea/modules/markup"
+
+ "github.com/yuin/goldmark/ast"
+ "gopkg.in/yaml.v3"
+)
+
+// RenderConfig represents rendering configuration for this file
+type RenderConfig struct {
+ Meta markup.RenderMetaMode
+ Icon string
+ TOC string // "false": hide, "side"/empty: in sidebar, "main"/"true": in main view
+ Lang string
+ yamlNode *yaml.Node
+
+ // Used internally. Cannot be controlled by frontmatter.
+ metaLength int
+}
+
+func renderMetaModeFromString(s string) markup.RenderMetaMode {
+ switch strings.TrimSpace(strings.ToLower(s)) {
+ case "none":
+ return markup.RenderMetaAsNone
+ case "table":
+ return markup.RenderMetaAsTable
+ default: // "details"
+ return markup.RenderMetaAsDetails
+ }
+}
+
+// UnmarshalYAML implement yaml.v3 UnmarshalYAML
+func (rc *RenderConfig) UnmarshalYAML(value *yaml.Node) error {
+ if rc == nil {
+ return nil
+ }
+
+ rc.yamlNode = value
+
+ type commonRenderConfig struct {
+ TOC string `yaml:"include_toc"`
+ Lang string `yaml:"lang"`
+ }
+ var basic commonRenderConfig
+ if err := value.Decode(&basic); err != nil {
+ return fmt.Errorf("unable to decode into commonRenderConfig %w", err)
+ }
+
+ if basic.Lang != "" {
+ rc.Lang = basic.Lang
+ }
+
+ rc.TOC = basic.TOC
+
+ type controlStringRenderConfig struct {
+ Gitea string `yaml:"gitea"`
+ }
+
+ var stringBasic controlStringRenderConfig
+
+ if err := value.Decode(&stringBasic); err == nil {
+ if stringBasic.Gitea != "" {
+ rc.Meta = renderMetaModeFromString(stringBasic.Gitea)
+ }
+ return nil
+ }
+
+ type yamlRenderConfig struct {
+ Meta *string `yaml:"meta"`
+ Icon *string `yaml:"details_icon"`
+ TOC *string `yaml:"include_toc"`
+ Lang *string `yaml:"lang"`
+ }
+
+ type yamlRenderConfigWrapper struct {
+ Gitea *yamlRenderConfig `yaml:"gitea"`
+ }
+
+ var cfg yamlRenderConfigWrapper
+ if err := value.Decode(&cfg); err != nil {
+ return fmt.Errorf("unable to decode into yamlRenderConfigWrapper %w", err)
+ }
+
+ if cfg.Gitea == nil {
+ return nil
+ }
+
+ if cfg.Gitea.Meta != nil {
+ rc.Meta = renderMetaModeFromString(*cfg.Gitea.Meta)
+ }
+
+ if cfg.Gitea.Icon != nil {
+ rc.Icon = strings.TrimSpace(strings.ToLower(*cfg.Gitea.Icon))
+ }
+
+ if cfg.Gitea.Lang != nil && *cfg.Gitea.Lang != "" {
+ rc.Lang = *cfg.Gitea.Lang
+ }
+
+ if cfg.Gitea.TOC != nil {
+ rc.TOC = *cfg.Gitea.TOC
+ }
+
+ return nil
+}
+
+func (rc *RenderConfig) toMetaNode() ast.Node {
+ if rc.yamlNode == nil {
+ return nil
+ }
+ switch rc.Meta {
+ case markup.RenderMetaAsTable:
+ return nodeToTable(rc.yamlNode)
+ case markup.RenderMetaAsDetails:
+ return nodeToDetails(rc.yamlNode, rc.Icon)
+ default:
+ return nil
+ }
+}