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}