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 }