code.gitea.io/gitea@v1.19.3/modules/markup/markdown/convertyaml.go (about)

     1  // Copyright 2022 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package markdown
     5  
     6  import (
     7  	"github.com/yuin/goldmark/ast"
     8  	east "github.com/yuin/goldmark/extension/ast"
     9  	"gopkg.in/yaml.v3"
    10  )
    11  
    12  func nodeToTable(meta *yaml.Node) ast.Node {
    13  	for {
    14  		if meta == nil {
    15  			return nil
    16  		}
    17  		switch meta.Kind {
    18  		case yaml.DocumentNode:
    19  			meta = meta.Content[0]
    20  			continue
    21  		default:
    22  		}
    23  		break
    24  	}
    25  	switch meta.Kind {
    26  	case yaml.MappingNode:
    27  		return mappingNodeToTable(meta)
    28  	case yaml.SequenceNode:
    29  		return sequenceNodeToTable(meta)
    30  	default:
    31  		return ast.NewString([]byte(meta.Value))
    32  	}
    33  }
    34  
    35  func mappingNodeToTable(meta *yaml.Node) ast.Node {
    36  	table := east.NewTable()
    37  	alignments := []east.Alignment{}
    38  	for i := 0; i < len(meta.Content); i += 2 {
    39  		alignments = append(alignments, east.AlignNone)
    40  	}
    41  
    42  	headerRow := east.NewTableRow(alignments)
    43  	valueRow := east.NewTableRow(alignments)
    44  	for i := 0; i < len(meta.Content); i += 2 {
    45  		cell := east.NewTableCell()
    46  
    47  		cell.AppendChild(cell, nodeToTable(meta.Content[i]))
    48  		headerRow.AppendChild(headerRow, cell)
    49  
    50  		if i+1 < len(meta.Content) {
    51  			cell = east.NewTableCell()
    52  			cell.AppendChild(cell, nodeToTable(meta.Content[i+1]))
    53  			valueRow.AppendChild(valueRow, cell)
    54  		}
    55  	}
    56  
    57  	table.AppendChild(table, east.NewTableHeader(headerRow))
    58  	table.AppendChild(table, valueRow)
    59  	return table
    60  }
    61  
    62  func sequenceNodeToTable(meta *yaml.Node) ast.Node {
    63  	table := east.NewTable()
    64  	alignments := []east.Alignment{east.AlignNone}
    65  	for _, item := range meta.Content {
    66  		row := east.NewTableRow(alignments)
    67  		cell := east.NewTableCell()
    68  		cell.AppendChild(cell, nodeToTable(item))
    69  		row.AppendChild(row, cell)
    70  		table.AppendChild(table, row)
    71  	}
    72  	return table
    73  }
    74  
    75  func nodeToDetails(meta *yaml.Node, icon string) ast.Node {
    76  	details := NewDetails()
    77  	summary := NewSummary()
    78  	summary.AppendChild(summary, NewIcon(icon))
    79  	details.AppendChild(details, summary)
    80  	details.AppendChild(details, nodeToTable(meta))
    81  
    82  	return details
    83  }