mdtable.gno
1.59 Kb ยท 66 lines
1// Package mdtable provides a simple way to create Markdown tables.
2//
3// Example usage:
4//
5// import "gno.land/p/moul/mdtable"
6//
7// func Render(path string) string {
8// table := mdtable.Table{
9// Headers: []string{"ID", "Title", "Status", "Date"},
10// }
11// table.Append([]string{"#1", "Add a new validator", "succeed", "2024-01-01"})
12// table.Append([]string{"#2", "Change parameter", "timed out", "2024-01-02"})
13// return table.String()
14// }
15//
16// Output:
17//
18// | ID | Title | Status | Date |
19// | --- | --- | --- | --- |
20// | #1 | Add a new validator | succeed | 2024-01-01 |
21// | #2 | Change parameter | timed out | 2024-01-02 |
22package mdtable
23
24import (
25 "strings"
26)
27
28type Table struct {
29 Headers []string
30 Rows [][]string
31 // XXX: optional headers alignment.
32}
33
34func (t *Table) Append(row []string) {
35 t.Rows = append(t.Rows, row)
36}
37
38func (t Table) String() string {
39 // XXX: switch to using text/tabwriter when porting to Gno to support
40 // better-formatted raw Markdown output.
41
42 if len(t.Headers) == 0 && len(t.Rows) == 0 {
43 return ""
44 }
45
46 var sb strings.Builder
47
48 if len(t.Headers) == 0 {
49 t.Headers = make([]string, len(t.Rows[0]))
50 }
51
52 // Print header.
53 sb.WriteString("| " + strings.Join(t.Headers, " | ") + " |\n")
54 sb.WriteString("|" + strings.Repeat(" --- |", len(t.Headers)) + "\n")
55
56 // Print rows.
57 for _, row := range t.Rows {
58 escapedRow := make([]string, len(row))
59 for i, cell := range row {
60 escapedRow[i] = strings.ReplaceAll(cell, "|", "|") // Escape pipe characters.
61 }
62 sb.WriteString("| " + strings.Join(escapedRow, " | ") + " |\n")
63 }
64
65 return sb.String()
66}