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 rendererAlphabetic struct {
13	conf Conf
14}
15
16func NewRendererAlphabetic(conf Conf) rendererAlphabetic {
17	return rendererAlphabetic{conf: conf}
18}
19
20func (r rendererAlphabetic) renderPage(pageBuilder *strings.Builder, lines []CacheLineRelativeLink) {
21	alpha := map[string][]CacheLineRelativeLink{}
22	for _, line := range lines {
23		toGroup := r.extractWhatToGroup(line.line)
24		letter := strings.ToUpper(toGroup[0:1])
25		if t, ok := alpha[letter]; ok {
26			alpha[letter] = append(t, line)
27		} else {
28			alpha[letter] = []CacheLineRelativeLink{line}
29		}
30	}
31
32	for ch := 'A'; ch <= 'Z'; ch++ {
33		letter := fmt.Sprintf("%c", ch)
34		if _, ok := alpha[letter]; ok {
35			fmt.Fprintf(pageBuilder, "[%s](#%s)", letter, strings.ToLower(letter))
36		} else {
37			pageBuilder.WriteString(letter)
38		}
39		if letter != "Z" {
40			pageBuilder.WriteString(" ")
41		}
42	}
43
44	pageBuilder.WriteString("\n\n")
45
46	for ch := 'A'; ch <= 'Z'; ch++ {
47		letter := fmt.Sprintf("%c", ch)
48		if all, ok := alpha[letter]; ok {
49			fmt.Fprintf(pageBuilder, "# %s\n\n", letter)
50			for _, line := range all {
51				toGroup := r.extractWhatToGroup(line.line)
52				fmt.Fprintf(pageBuilder, "- [%s](%s)\n", toGroup, line.relativePath)
53			}
54			pageBuilder.WriteString("\n")
55		}
56	}
57}
58
59func (r rendererAlphabetic) extractWhatToGroup(line CacheLine) string {
60	if r.conf.GroupBy != "" {
61		switch r.conf.GroupBy {
62		case "file":
63			return line.fp
64		case "title":
65			return line.title
66		case "select[0]":
67			return line.selects[0]
68		case "select[1]":
69			return line.selects[1]
70		}
71		return r.conf.GroupBy
72	}
73	if len(line.selects) > 0 {
74		return line.selects[0]
75	}
76	if line.title != "" {
77		return line.title
78	}
79	return line.fp
80}