main soggy/glerc / ssg / template.go
 1package ssg
 2
 3import (
 4	"io"
 5	"os"
 6	"path/filepath"
 7	"strings"
 8	"text/template"
 9)
10
11type TemplateData struct {
12	Title       string
13	Description string
14	BaseURL     string
15	Params      map[string]any
16	Config      Config
17	Content     string
18	Sidebar     []SidebarItem
19}
20
21type SidebarItem struct {
22	Name string
23	Path string
24}
25
26type Templates map[string]string
27
28func DefaultTemplateData() TemplateData {
29	return TemplateData{
30		Title:       "",
31		Description: "",
32		BaseURL:     "",
33		Params:      map[string]any{},
34		Config:      Config{},
35		Content:     "",
36	}
37}
38
39func BuildTemplate(w io.Writer, name string, t string, data TemplateData) error {
40	master, err := template.New(name).Parse(t)
41	if err != nil {
42		return err
43	}
44	_, err = master.New("content").Parse(data.Content)
45	if err != nil {
46		return err
47	}
48	if err := master.ExecuteTemplate(w, name, data); err != nil {
49		return err
50	}
51	return nil
52}
53
54func GetTemplates(dir string) (Templates, error) {
55	res := make(map[string]string, 0)
56	entries, err := os.ReadDir(dir)
57	if err != nil {
58		return res, err
59	}
60	for _, entry := range entries {
61		entryName := entry.Name()
62		if !strings.HasSuffix(entryName, ".html") {
63			continue
64		}
65		name := strings.TrimSuffix(filepath.Base(entryName), ".html")
66		content, err := os.ReadFile(filepath.Join(dir, entryName))
67		if err != nil {
68			return res, err
69		}
70		res[name] = string(content)
71	}
72	return res, nil
73}