package templates import ( "bytes" "fmt" "html/template" "strings" "time" "gitblog/internal/content" ) type Manager struct { templates map[string]*template.Template funcMap template.FuncMap } type PageData struct { Title string Content template.HTML Posts []*content.Post Post *content.Post Page *content.Page Navigation []content.Navigation Categories []string Theme string CurrentYear int Meta map[string]string } func NewManager() *Manager { funcMap := template.FuncMap{ "formatDate": formatDate, "formatDateTime": formatDateTime, "truncate": truncate, "safeHTML": safeHTML, "join": strings.Join, "contains": strings.Contains, "hasPrefix": strings.HasPrefix, "hasSuffix": strings.HasSuffix, "toLower": strings.ToLower, "toUpper": strings.ToUpper, "title": strings.Title, "now": time.Now, } return &Manager{ templates: make(map[string]*template.Template), funcMap: funcMap, } } func (m *Manager) LoadTemplates() error { templates := []string{ "base", "home", "post", "page", "category", "404", } for _, name := range templates { if err := m.loadTemplate(name); err != nil { return fmt.Errorf("failed to load template %s: %w", name, err) } } return nil } func (m *Manager) loadTemplate(name string) error { baseTemplate := m.getBaseTemplate() pageTemplate := m.getPageTemplate(name) tmpl, err := template.New(name).Funcs(m.funcMap).Parse(baseTemplate + pageTemplate) if err != nil { return err } m.templates[name] = tmpl return nil } func (m *Manager) Render(templateName string, data PageData) (string, error) { tmpl, exists := m.templates[templateName] if !exists { return "", fmt.Errorf("template %s not found", templateName) } var buf bytes.Buffer if err := tmpl.Execute(&buf, data); err != nil { return "", err } return buf.String(), nil } func (m *Manager) getBaseTemplate() string { return `
A modern blog powered by GitHub
Posts in this category