aboutsummaryrefslogtreecommitdiffstats
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.go163
1 files changed, 163 insertions, 0 deletions
diff --git a/modules/markup/markdown/renderconfig.go b/modules/markup/markdown/renderconfig.go
new file mode 100644
index 0000000000..bef67e9e59
--- /dev/null
+++ b/modules/markup/markdown/renderconfig.go
@@ -0,0 +1,163 @@
+// Copyright 2020 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package markdown
+
+import (
+ "fmt"
+ "strings"
+
+ "github.com/yuin/goldmark/ast"
+ east "github.com/yuin/goldmark/extension/ast"
+ "gopkg.in/yaml.v2"
+)
+
+// RenderConfig represents rendering configuration for this file
+type RenderConfig struct {
+ Meta string
+ Icon string
+ TOC bool
+ Lang string
+}
+
+// ToRenderConfig converts a yaml.MapSlice to a RenderConfig
+func (rc *RenderConfig) ToRenderConfig(meta yaml.MapSlice) {
+ if meta == nil {
+ return
+ }
+ found := false
+ var giteaMetaControl yaml.MapItem
+ for _, item := range meta {
+ strKey, ok := item.Key.(string)
+ if !ok {
+ continue
+ }
+ strKey = strings.TrimSpace(strings.ToLower(strKey))
+ switch strKey {
+ case "gitea":
+ giteaMetaControl = item
+ found = true
+ case "include_toc":
+ val, ok := item.Value.(bool)
+ if !ok {
+ continue
+ }
+ rc.TOC = val
+ case "lang":
+ val, ok := item.Value.(string)
+ if !ok {
+ continue
+ }
+ val = strings.TrimSpace(val)
+ if len(val) == 0 {
+ continue
+ }
+ rc.Lang = val
+ }
+ }
+
+ if found {
+ switch v := giteaMetaControl.Value.(type) {
+ case string:
+ switch v {
+ case "none":
+ rc.Meta = "none"
+ case "table":
+ rc.Meta = "table"
+ default: // "details"
+ rc.Meta = "details"
+ }
+ case yaml.MapSlice:
+ for _, item := range v {
+ strKey, ok := item.Key.(string)
+ if !ok {
+ continue
+ }
+ strKey = strings.TrimSpace(strings.ToLower(strKey))
+ switch strKey {
+ case "meta":
+ val, ok := item.Value.(string)
+ if !ok {
+ continue
+ }
+ switch strings.TrimSpace(strings.ToLower(val)) {
+ case "none":
+ rc.Meta = "none"
+ case "table":
+ rc.Meta = "table"
+ default: // "details"
+ rc.Meta = "details"
+ }
+ case "details_icon":
+ val, ok := item.Value.(string)
+ if !ok {
+ continue
+ }
+ rc.Icon = strings.TrimSpace(strings.ToLower(val))
+ case "include_toc":
+ val, ok := item.Value.(bool)
+ if !ok {
+ continue
+ }
+ rc.TOC = val
+ case "lang":
+ val, ok := item.Value.(string)
+ if !ok {
+ continue
+ }
+ val = strings.TrimSpace(val)
+ if len(val) == 0 {
+ continue
+ }
+ rc.Lang = val
+ }
+ }
+ }
+ }
+}
+
+func (rc *RenderConfig) toMetaNode(meta yaml.MapSlice) ast.Node {
+ switch rc.Meta {
+ case "table":
+ return metaToTable(meta)
+ case "details":
+ return metaToDetails(meta, rc.Icon)
+ default:
+ return nil
+ }
+}
+
+func metaToTable(meta yaml.MapSlice) ast.Node {
+ table := east.NewTable()
+ alignments := []east.Alignment{}
+ for range meta {
+ alignments = append(alignments, east.AlignNone)
+ }
+ row := east.NewTableRow(alignments)
+ for _, item := range meta {
+ cell := east.NewTableCell()
+ cell.AppendChild(cell, ast.NewString([]byte(fmt.Sprintf("%v", item.Key))))
+ row.AppendChild(row, cell)
+ }
+ table.AppendChild(table, east.NewTableHeader(row))
+
+ row = east.NewTableRow(alignments)
+ for _, item := range meta {
+ cell := east.NewTableCell()
+ cell.AppendChild(cell, ast.NewString([]byte(fmt.Sprintf("%v", item.Value))))
+ row.AppendChild(row, cell)
+ }
+ table.AppendChild(table, row)
+ return table
+}
+
+func metaToDetails(meta yaml.MapSlice, icon string) ast.Node {
+ details := NewDetails()
+ summary := NewSummary()
+ summary.AppendChild(summary, NewIcon(icon))
+ details.AppendChild(details, summary)
+ details.AppendChild(details, metaToTable(meta))
+
+ return details
+}