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}