diff options
| author | a73x <[email protected]> | 2024-08-27 19:43:56 +0100 |
|---|---|---|
| committer | a73x <[email protected]> | 2024-08-27 20:23:18 +0100 |
| commit | d38fc83df3824b840f0b3930e4cb7236bdab84b2 (patch) | |
| tree | 586a7f940291f933ef2a7e05b20dff21ded6d78a /web/web.go | |
| parent | cffb105a9ff8ed5d7aa04e5f4097368f6be38b8e (diff) | |
feat(content): support templating in content
this is tired person code
don't write tired person code
Diffstat (limited to 'web/web.go')
| -rw-r--r-- | web/web.go | 138 |
1 files changed, 7 insertions, 131 deletions
@@ -1,138 +1,16 @@ package web import ( - "bytes" "fmt" - "io" "io/fs" "net/http" - "path/filepath" - "strings" - "text/template" "time" "git.sr.ht/~a73x/home" - "github.com/yuin/goldmark" - "github.com/yuin/goldmark/parser" - "go.abhg.dev/goldmark/frontmatter" + "git.sr.ht/~a73x/home/pages" "go.uber.org/zap" ) -type CommonData struct { - Posts []PostData -} - -type PostData struct { - Title string - Path string -} - -func GeneratePosts(mux *http.ServeMux) ([]PostData, error) { - converter := goldmark.New( - goldmark.WithExtensions( - &frontmatter.Extender{}, - )) - - t, err := template.ParseFS(home.Content, "templates/layouts/*.html") - if err != nil { - return nil, fmt.Errorf("failed to parse layouts: %v", err) - } - - final := []PostData{} - posts, err := fs.Glob(home.Content, "posts/*.md") - if err != nil { - return nil, fmt.Errorf("failed to glob posts: %v", err) - } - - for _, post := range posts { - postName := filepath.Base(post) - postName = strings.Split(postName, ".")[0] + ".html" - - // parse markdown - input, err := fs.ReadFile(home.Content, post) - if err != nil { - return nil, fmt.Errorf("failed to read post: %v", err) - } - - var b bytes.Buffer - ctx := parser.NewContext() - if err := converter.Convert(input, &b, parser.WithContext(ctx)); err != nil { - return nil, err - } - - d := frontmatter.Get(ctx) - var meta map[string]string - if err := d.Decode(&meta); err != nil { - return nil, err - } - - foo, err := t.ParseFS(home.Content, "templates/post.html") - if err != nil { - return nil, fmt.Errorf("failed to parse post template: %v", err) - } - - content, err := io.ReadAll(&b) - if err != nil { - return nil, fmt.Errorf("failed to read post template: %v", err) - } - - type IPostData struct { - Title string - Post string - } - - mux.HandleFunc("/posts/"+postName, func(w http.ResponseWriter, r *http.Request) { - if err := foo.ExecuteTemplate(w, "post.html", IPostData{ - Title: meta["title"], - Post: string(content), - }); err != nil { - fmt.Println(err) - } - }) - - final = append(final, PostData{ - Title: meta["title"], - Path: "posts/" + postName, - }) - } - - return final, nil -} - -func loadTemplates(mux *http.ServeMux, data any) error { - tmplFiles, err := fs.ReadDir(home.Content, "templates") - if err != nil { - return fmt.Errorf("failed to parse template layouts") - } - - for _, tmpl := range tmplFiles { - if tmpl.IsDir() { - continue - } - - pt, err := template.ParseFS(home.Content, "templates/"+tmpl.Name(), "templates/layouts/*.html") - if err != nil { - return fmt.Errorf("failed to parse template "+tmpl.Name(), err) - } - - if tmpl.Name() == "index.html" { - mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - pt.ExecuteTemplate(w, tmpl.Name(), data) - }) - } else if tmpl.Name() == "page.html" { - continue - } else { - mux.HandleFunc("/"+tmpl.Name(), func(w http.ResponseWriter, r *http.Request) { - pt, err := template.ParseFS(home.Content, "templates/"+tmpl.Name(), "templates/layouts/*.html") - if err != nil { - fmt.Printf("failed to parse template "+tmpl.Name(), err) - } - pt.ExecuteTemplate(w, tmpl.Name(), data) - }) - } - } - return nil -} func New(logger *zap.Logger) (*http.Server, error) { loggingMiddleware := func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -148,17 +26,15 @@ func New(logger *zap.Logger) (*http.Server, error) { } mux := http.NewServeMux() - postData, err := GeneratePosts(mux) + pages, err := pages.Collect() if err != nil { - return nil, fmt.Errorf("failed to generate posts: %v", err) - } - - data := CommonData{ - Posts: postData, + return nil, err } - if err := loadTemplates(mux, data); err != nil { - return nil, fmt.Errorf("failed to parse templates: %v", err) + for _, page := range pages { + mux.HandleFunc("GET /"+page.Path, func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte(page.Content)) + }) } staticFs, err := fs.Sub(home.Content, "public/static") |
