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}