Files

122 lines
2.6 KiB
Go
Raw Permalink Normal View History

// Copyright 2020 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package markdown
import (
2022-10-05 19:55:36 +01:00
"fmt"
"strings"
2023-04-18 03:05:19 +08:00
"code.gitea.io/gitea/modules/markup"
"github.com/yuin/goldmark/ast"
2022-09-13 17:33:37 +01:00
"gopkg.in/yaml.v3"
)
// RenderConfig represents rendering configuration for this file
type RenderConfig struct {
2023-04-18 03:05:19 +08:00
Meta markup.RenderMetaMode
TOC string // "false": hide, "side"/empty: in sidebar, "main"/"true": in main view
2022-09-13 17:33:37 +01:00
Lang string
yamlNode *yaml.Node
// Used internally. Cannot be controlled by frontmatter.
metaLength int
}
2023-04-18 03:05:19 +08:00
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
}
}
2022-09-13 17:33:37 +01:00
// UnmarshalYAML implement yaml.v3 UnmarshalYAML
func (rc *RenderConfig) UnmarshalYAML(value *yaml.Node) error {
if rc == nil {
2023-04-18 03:05:19 +08:00
return nil
}
2023-04-18 03:05:19 +08:00
2022-09-13 17:33:37 +01:00
rc.yamlNode = value
2022-10-05 19:55:36 +01:00
type commonRenderConfig struct {
2023-04-18 03:05:19 +08:00
TOC string `yaml:"include_toc"`
2022-10-05 19:55:36 +01:00
Lang string `yaml:"lang"`
}
2022-10-05 19:55:36 +01:00
var basic commonRenderConfig
if err := value.Decode(&basic); err != nil {
return fmt.Errorf("unable to decode into commonRenderConfig %w", err)
2022-09-13 17:33:37 +01:00
}
if basic.Lang != "" {
rc.Lang = basic.Lang
}
rc.TOC = basic.TOC
2022-10-05 19:55:36 +01:00
type controlStringRenderConfig struct {
Gitea string `yaml:"gitea"`
}
2022-10-05 19:55:36 +01:00
var stringBasic controlStringRenderConfig
if err := value.Decode(&stringBasic); err == nil {
if stringBasic.Gitea != "" {
2023-04-18 03:05:19 +08:00
rc.Meta = renderMetaModeFromString(stringBasic.Gitea)
2022-09-13 17:33:37 +01:00
}
return nil
}
2022-09-13 17:33:37 +01:00
2023-04-18 03:05:19 +08:00
type yamlRenderConfig struct {
2022-10-05 19:55:36 +01:00
Meta *string `yaml:"meta"`
2025-04-03 13:48:24 +08:00
Icon *string `yaml:"details_icon"` // deprecated, because there is no font icon, so no custom icon
2023-04-18 03:05:19 +08:00
TOC *string `yaml:"include_toc"`
2022-10-05 19:55:36 +01:00
Lang *string `yaml:"lang"`
}
2023-04-18 03:05:19 +08:00
type yamlRenderConfigWrapper struct {
Gitea *yamlRenderConfig `yaml:"gitea"`
2022-10-05 19:55:36 +01:00
}
2023-04-18 03:05:19 +08:00
var cfg yamlRenderConfigWrapper
if err := value.Decode(&cfg); err != nil {
return fmt.Errorf("unable to decode into yamlRenderConfigWrapper %w", err)
}
2023-04-18 03:05:19 +08:00
if cfg.Gitea == nil {
2022-10-05 19:55:36 +01:00
return nil
}
2023-04-18 03:05:19 +08:00
if cfg.Gitea.Meta != nil {
rc.Meta = renderMetaModeFromString(*cfg.Gitea.Meta)
2022-09-13 17:33:37 +01:00
}
2023-04-18 03:05:19 +08:00
if cfg.Gitea.Lang != nil && *cfg.Gitea.Lang != "" {
rc.Lang = *cfg.Gitea.Lang
2022-09-13 17:33:37 +01:00
}
2023-04-18 03:05:19 +08:00
if cfg.Gitea.TOC != nil {
rc.TOC = *cfg.Gitea.TOC
2022-09-13 17:33:37 +01:00
}
return nil
}
2025-04-03 13:48:24 +08:00
func (rc *RenderConfig) toMetaNode(g *ASTTransformer) ast.Node {
2022-09-13 17:33:37 +01:00
if rc.yamlNode == nil {
return nil
}
switch rc.Meta {
2023-04-18 03:05:19 +08:00
case markup.RenderMetaAsTable:
2022-09-13 17:33:37 +01:00
return nodeToTable(rc.yamlNode)
2023-04-18 03:05:19 +08:00
case markup.RenderMetaAsDetails:
2025-04-03 13:48:24 +08:00
return nodeToDetails(g, rc.yamlNode)
2022-09-13 17:33:37 +01:00
default:
return nil
}
}