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 "maps"
10 "strings"
11)
12
13type rendererCustom struct {
14 conf Conf
15}
16
17func NewRendererCustom(conf Conf) rendererCustom {
18 return rendererCustom{conf: conf}
19}
20
21func (r rendererCustom) renderPage(pageBuilder *strings.Builder, lines []CacheLineRelativeLink) {
22 layout := r.conf.CustomLayout
23 for _, line := range lines {
24 pathHtml := line.line.fp
25 if p, ok := strings.CutSuffix(pathHtml, ".md"); ok {
26 pathHtml = fmt.Sprintf("%s.html", p)
27 }
28 vars := map[string]string{
29 "title": line.line.title,
30 "path": line.line.fp,
31 "relativePath": line.relativePath,
32 "pathHtml": pathHtml,
33 }
34 for i, s := range line.line.selects {
35 vars[fmt.Sprintf("select[%d]", i)] = s
36 }
37 maps.Copy(vars, r.conf.Metadata)
38 interpolateVars(pageBuilder, layout, vars)
39 }
40}
41
42func interpolateVars(pageBuilder *strings.Builder, content string, vars map[string]string) {
43 for line := range strings.SplitSeq(content, "\n") {
44 for foundFirst, foundLast := strings.Index(line, "{{"), strings.Index(line, "}}"); foundFirst != -1 && foundLast != -1; foundFirst, foundLast = strings.Index(line, "{{"), strings.Index(line, "}}") {
45 key := line[foundFirst+2 : foundLast]
46 pre := line[:foundFirst]
47 pageBuilder.WriteString(pre)
48 if value, ok := vars[key]; ok {
49 pageBuilder.WriteString(value)
50 } else {
51 pageBuilder.WriteString(line[foundFirst : foundLast+2])
52 }
53 line = line[foundLast+2:]
54 }
55 pageBuilder.WriteString(line)
56 pageBuilder.WriteString("\n")
57 }
58}