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  }