-
Notifications
You must be signed in to change notification settings - Fork 119
/
render_markdown.go
70 lines (64 loc) · 1.88 KB
/
render_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
62
63
64
65
66
67
68
69
70
package table
import "strings"
// RenderMarkdown renders the Table in Markdown format. Example:
// | # | First Name | Last Name | Salary | |
// | ---:| --- | --- | ---:| --- |
// | 1 | Arya | Stark | 3000 | |
// | 20 | Jon | Snow | 2000 | You know nothing, Jon Snow! |
// | 300 | Tyrion | Lannister | 5000 | |
// | | | Total | 10000 | |
func (t *Table) RenderMarkdown() string {
t.initForRender()
var out strings.Builder
if t.numColumns > 0 {
t.markdownRenderRows(&out, t.rowsHeader, true, false)
t.markdownRenderRows(&out, t.rows, false, false)
t.markdownRenderRows(&out, t.rowsFooter, false, true)
if t.caption != "" {
out.WriteString("\n_")
out.WriteString(t.caption)
out.WriteRune('_')
}
}
return t.render(&out)
}
func (t *Table) markdownRenderRow(out *strings.Builder, row rowStr, isSeparator bool) {
if len(row) > 0 {
// when working on line number 2 or more, insert a newline first
if out.Len() > 0 {
out.WriteRune('\n')
}
// render each column up to the max. columns seen in all the rows
out.WriteRune('|')
for colIdx := 0; colIdx < t.numColumns; colIdx++ {
if isSeparator {
out.WriteString(t.getAlign(colIdx, renderHint{}).MarkdownProperty())
} else {
var colStr string
if colIdx < len(row) {
colStr = row[colIdx]
}
out.WriteRune(' ')
if strings.Contains(colStr, "|") {
colStr = strings.Replace(colStr, "|", "\\|", -1)
}
if strings.Contains(colStr, "\n") {
colStr = strings.Replace(colStr, "\n", "<br/>", -1)
}
out.WriteString(colStr)
out.WriteRune(' ')
}
out.WriteRune('|')
}
}
}
func (t *Table) markdownRenderRows(out *strings.Builder, rows []rowStr, isHeader bool, isFooter bool) {
if len(rows) > 0 {
for idx, row := range rows {
t.markdownRenderRow(out, row, false)
if idx == len(rows)-1 && isHeader {
t.markdownRenderRow(out, t.rowSeparator, true)
}
}
}
}