GitRoot
Craft your forge, Build your project, Grow your community freely
1// SPDX-FileCopyrightText: 2026 Romain Maneschi <romain@gitroot.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5package main
6
7import (
8 "fmt"
9 "strings"
10)
11
12type rendererTable struct {
13 conf Conf
14}
15
16func NewRendererTable(conf Conf) rendererTable {
17 return rendererTable{conf: conf}
18}
19
20func (r rendererTable) renderPage(pageBuilder *strings.Builder, lines []CacheLineRelativeLink) {
21 maxByColumns := r.initCalculMaxByColumn()
22 for _, line := range lines {
23 columnsMax := r.calculMaxByColumn(line)
24 for len(maxByColumns) < len(columnsMax) {
25 maxByColumns = append(maxByColumns, 0)
26 }
27 for i, c := range columnsMax {
28 maxByColumns[i] = max(maxByColumns[i], c)
29 }
30 }
31 if len(lines) > 0 {
32 r.init(pageBuilder, maxByColumns)
33 }
34 for _, line := range lines {
35 r.makeLink(pageBuilder, line.line, line.relativePath, maxByColumns)
36 pageBuilder.WriteString("\n")
37 }
38}
39
40func (r rendererTable) initCalculMaxByColumn() []int {
41 res := make([]int, 1+len(r.conf.selections))
42 for i := range res {
43 res[i] = 3
44 }
45 if r.conf.TableHeader != "" {
46 columns := strings.Split(strings.Trim(r.conf.TableHeader, "|"), "|")
47 for i, c := range columns {
48 res[i] = max(res[i], len(strings.Trim(c, " ")))
49 }
50 }
51 return res
52}
53
54func (r rendererTable) calculMaxByColumn(line CacheLineRelativeLink) []int {
55 res := make([]int, 1+len(line.line.selects))
56 res[0] = len(fmt.Sprintf("[%s](%s)", line.line.title, line.relativePath))
57 for i, s := range line.line.selects {
58 res[i+1] = len(s)
59 }
60 return res
61}
62
63func (r rendererTable) init(pageBuilder *strings.Builder, maxByColumns []int) {
64 if r.conf.TableHeader != "" {
65 pageBuilder.WriteString("|")
66 columns := strings.Split(strings.Trim(r.conf.TableHeader, "|"), "|")
67 for i, max := range maxByColumns {
68 c := strings.TrimSpace(columns[i])
69 nbMissingSpace := max - len(c)
70 if nbMissingSpace > 0 {
71 c = c + strings.Repeat(" ", nbMissingSpace)
72 }
73 fmt.Fprintf(pageBuilder, " %s |", c)
74 }
75 } else {
76 pageBuilder.WriteString("|")
77 for _, max := range maxByColumns {
78 spaces := strings.Repeat(" ", max+2)
79 fmt.Fprintf(pageBuilder, "%s|", spaces)
80 }
81 }
82 pageBuilder.WriteString("\n|")
83 for _, max := range maxByColumns {
84 spaces := strings.Repeat("-", max)
85 fmt.Fprintf(pageBuilder, " %s |", spaces)
86 }
87 pageBuilder.WriteString("\n")
88}
89
90func (r rendererTable) makeLink(pageBuilder *strings.Builder, cacheLine CacheLine, path string, maxByColumns []int) {
91 append := ""
92 for i, s := range cacheLine.selects {
93 nbMissingSpace := maxByColumns[i+1] - len(s)
94 append = append + fmt.Sprintf(" %s %s|", s, strings.Repeat(" ", nbMissingSpace))
95 }
96 link := fmt.Sprintf("[%s](%s)", cacheLine.title, path)
97 nbMissingSpace := maxByColumns[0] - len(link)
98 if nbMissingSpace > 0 {
99 link = link + strings.Repeat(" ", nbMissingSpace)
100 }
101 fmt.Fprintf(pageBuilder, "| %s |%s", link, append)
102}