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  }