-
Notifications
You must be signed in to change notification settings - Fork 4
/
markdown.go
61 lines (53 loc) · 1.11 KB
/
markdown.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package util
import (
"strings"
"github.com/pkg/errors"
)
func MarkdownTable(header []string, rows [][]string) (string, error) {
maxes := make([]int, 0, len(header))
for _, h := range header {
maxes = append(maxes, len(h))
}
for vi, v := range rows {
if len(v) != len(header) {
return "", errors.Errorf("row [%d] contains [%d] fields, but [%d] header fields were provided", vi, len(v), len(header))
}
for cellIdx, cellVal := range v {
if cellIdx <= len(maxes)-1 && len(cellVal) > maxes[cellIdx] {
maxes[cellIdx] = len(cellVal)
}
}
}
ret := make([]string, 0, len(rows))
add := func(x []string) {
line := "| "
for vi, v := range x {
mx := 0
if vi < len(maxes) {
mx = maxes[vi]
}
line += StringPad(v, mx)
if vi < len(x)-1 {
line += " | "
}
}
line += " |"
ret = append(ret, line)
}
add(header)
divider := "|-"
for mi, m := range maxes {
for i := 0; i < m; i++ {
divider += "-"
}
if mi < len(maxes)-1 {
divider += "-|-"
}
}
divider += "-|"
ret = append(ret, divider)
for _, row := range rows {
add(row)
}
return strings.Join(ret, "\n"), nil
}