move style hashing to file layer
1 file changed, 45 insertions(+), 61 deletions(-)
changed files
M internal/builder/builder.go → internal/builder/builder.go
@@ -11,6 +11,7 @@ "slices" "time" "go.alanpearce.eu/homestead/internal/buffer" + "go.alanpearce.eu/homestead/internal/builder/template" "go.alanpearce.eu/homestead/internal/config" "go.alanpearce.eu/homestead/internal/content" "go.alanpearce.eu/homestead/internal/sitemap"@@ -30,10 +31,6 @@ VCSRemoteURL config.URL `conf:"default:https://git.alanpearce.eu/website"` Storage storage.Writer `conf:"-"` Repo *vcs.Repository `conf:"-"` -} - -type Result struct { - Hashes []string } func joinSourcePath(src string) func(string) string {@@ -65,16 +62,12 @@ func build( options *Options, config *config.Config, log *log.Logger, -) (*Result, error) { +) error { ctx := context.TODO() buf := new(buffer.Buffer) joinSource := joinSourcePath(options.Source) storage := options.Storage - r := &Result{ - Hashes: make([]string, 0), - } - log.Debug("reading posts", "source", options.Source) cc, err := content.NewContentCollection(&content.Config{ Root: options.Source,@@ -82,7 +75,7 @@ PostDir: "post", Repo: options.Repo, }, log.Named("content")) if err != nil { - return nil, err + return err } sitemap := sitemap.New(config)@@ -96,21 +89,21 @@ log.Debug("rendering post", "post", post.Basename) sitemap.AddPath(post.URL, post.Date) buf.Reset() if err := templates.PostPage(config, post).Render(ctx, buf); err != nil { - return nil, errors.WithMessage(err, "could not render post") + return errors.WithMessage(err, "could not render post") } if err := storage.WritePost(&post, buf); err != nil { - return nil, err + return err } } log.Debug("rendering tags list") buf.Reset() if err := templates.TagsPage(config, "tags", mapset.Sorted(cc.Tags), "/tags").Render(ctx, buf); err != nil { - return nil, err + return err } if err := storage.Write("/tags/", buf); err != nil { - return nil, err + return err } sitemap.AddPath("/tags/", lastMod)@@ -125,100 +118,93 @@ log.Debug("rendering tags page", "tag", tag) url := path.Join("/tags", tag) + "/" buf.Reset() if err := templates.TagPage(config, tag, matchingPosts, url).Render(ctx, buf); err != nil { - return nil, err + return err } if err = storage.Write(url, buf); err != nil { - return nil, err + return err } sitemap.AddPath(url, matchingPosts[0].Date) log.Debug("rendering tags feed", "tag", tag) - feed, err := renderFeed( + feed, err := template.RenderFeed( fmt.Sprintf("%s - %s", config.Title, tag), config, matchingPosts, tag, ) if err != nil { - return nil, errors.WithMessage(err, "could not render tag feed page") + return errors.WithMessage(err, "could not render tag feed page") } buf.Reset() if _, err := feed.WriteTo(buf); err != nil { - return nil, err + return err } if err := storage.Write(path.Join("/tags", tag, "atom.xml"), buf); err != nil { - return nil, err + return err } } log.Debug("rendering list page") buf.Reset() if err := templates.ListPage(config, cc.Posts, "/post").Render(ctx, buf); err != nil { - return nil, err + return err } if err := storage.Write("/post/", buf); err != nil { - return nil, err + return err } sitemap.AddPath("/post/", lastMod) log.Debug("rendering feed") - feed, err := renderFeed(config.Title, config, cc.Posts, "feed") + feed, err := template.RenderFeed(config.Title, config, cc.Posts, "feed") if err != nil { - return nil, errors.WithMessage(err, "could not render feed") + return errors.WithMessage(err, "could not render feed") } buf.Reset() if _, err := feed.WriteTo(buf); err != nil { - return nil, err + return err } if err := storage.Write("/atom.xml", buf); err != nil { - return nil, err + return err } - buf.Reset() - log.Debug("rendering feed styles") - if err := renderFeedStyles(buf); err != nil { - return nil, errors.WithMessage(err, "could not render feed styles") - } - if err := storage.Write("/feed-styles.xsl", buf); err != nil { - return nil, err - } - _, err = buf.Seek(0, 0) - if err != nil { - return nil, err + for _, filename := range []string{"feed-styles.xsl", "style.css"} { + buf.Reset() + log.Debug("rendering template file", "filename", filename) + if err := template.CopyFile(filename, buf); err != nil { + return errors.WithMessagef(err, "could not render template file %s", filename) + } + if err := storage.Write("/"+filename, buf); err != nil { + return err + } } - h, err := getFeedStylesHash(buf) - if err != nil { - return nil, err - } - r.Hashes = append(r.Hashes, h) pages, err := filepath.Glob(joinSource("*.md")) if err != nil { - return nil, errors.WithMessage(err, "could not glob pagess") + return errors.WithMessage(err, "could not glob pagess") } for _, p := range pages { page, err := filepath.Rel(options.Source, p) if err != nil { - return nil, err + return err } post, err := cc.GetPage(page) if err != nil { - return nil, err + return err } buf.Reset() log.Debug("rendering page", "source", page, "path", post.URL) if page == "index.md" { if err := templates.Homepage(config, cc.Posts, post).Render(ctx, buf); err != nil { - return nil, err + return err } } else { if err := templates.Page(config, post).Render(ctx, buf); err != nil { - return nil, err + return err } } if err := storage.WritePost(post, buf); err != nil { - return nil, err + return err } }@@ -228,31 +214,29 @@ // without a date, which could be newer sitemap.AddPath("/", time.Time{}) err = buf.SeekStart() if err != nil { - return nil, err + return err } - h, _ = getHTMLStyleHash(buf) - r.Hashes = append(r.Hashes, h) log.Debug("rendering sitemap") buf.Reset() if _, err := sitemap.WriteTo(buf); err != nil { - return nil, err + return err } if err := storage.Write("/sitemap.xml", buf); err != nil { - return nil, err + return err } log.Debug("rendering robots.txt") - rob, err := renderRobotsTXT(config) + rob, err := template.RenderRobotsTXT(config) if err != nil { - return nil, err + return err } buf.Reset() if _, err := io.Copy(buf, rob); err != nil { - return nil, err + return err } if err := storage.Write("/robots.txt", buf); err != nil { - return nil, err + return err } for _, sf := range cc.StaticFiles {@@ -260,16 +244,16 @@ src := joinSource(sf) log.Debug("copying static file", "sf", sf, "src", src) err = copyFile(storage, src, sf) if err != nil { - return nil, err + return err } } - return r, nil + return nil } -func BuildSite(options *Options, cfg *config.Config, log *log.Logger) (*Result, error) { +func BuildSite(options *Options, cfg *config.Config, log *log.Logger) error { if cfg == nil { - return nil, errors.New("config is nil") + return errors.New("config is nil") } cfg.InjectLiveReload = options.Development cfg.EnableGoatCounter = !options.Development