Added a static file source

This commit is contained in:
Leon Mika 2026-02-02 21:25:43 +11:00
parent 64e19d8700
commit b3ada31245
6 changed files with 117 additions and 17 deletions

18
assets.go Normal file
View file

@ -0,0 +1,18 @@
package progdoc
import (
"io"
"os"
)
type staticSource interface {
Open() (io.ReadCloser, error)
}
type fileStaticSource struct {
Filename string
}
func (f fileStaticSource) Open() (io.ReadCloser, error) {
return os.Open(f.Filename)
}

View file

@ -11,7 +11,8 @@ func main() {
progdoc.Meta(progdoc.SiteMeta{Title: "Prog Doc"}), progdoc.Meta(progdoc.SiteMeta{Title: "Prog Doc"}),
progdoc.SourceFile("/", "README.md"), progdoc.SourceFile("/", "README.md"),
progdoc.SourceDir("/", "_site"), progdoc.SourceDir("/", "_site"),
).Publish(); err != nil { progdoc.StaticFile("/go.mod", "go.mod"),
).Generate(); err != nil {
log.Fatal(err) log.Fatal(err)
} }
} }

View file

@ -1,6 +1,8 @@
package progdoc package progdoc
import ( import (
"io"
"log"
"os" "os"
"path/filepath" "path/filepath"
) )
@ -21,6 +23,7 @@ func (g generator) genSite(siteMap siteMap) (_ generation, err error) {
return generation{}, err return generation{}, err
} }
} }
log.Printf("Output dir: %s", outDir)
for _, page := range siteMap.Pages { for _, page := range siteMap.Pages {
srcCtx := SourceCtx{Meta: siteMap.Meta} srcCtx := SourceCtx{Meta: siteMap.Meta}
@ -42,5 +45,34 @@ func (g generator) genSite(siteMap siteMap) (_ generation, err error) {
return generation{}, err return generation{}, err
} }
} }
for _, static := range siteMap.Static {
targetFullPath := filepath.Join(outDir, static.Path)
targetFullDir := filepath.Dir(targetFullPath)
err := os.MkdirAll(targetFullDir, os.ModePerm)
if err != nil {
return generation{}, err
}
if err := (func(fileName string) error {
r, err := static.Source.Open()
if err != nil {
return err
}
defer r.Close()
f, err := os.Create(fileName)
if err != nil {
return err
}
defer f.Close()
_, err = io.Copy(f, r)
return err
})(targetFullPath); err != nil {
return generation{}, err
}
}
return generation{OutDir: outDir}, nil return generation{OutDir: outDir}, nil
} }

View file

@ -15,9 +15,15 @@ type sitePage struct {
Source pageSource Source pageSource
} }
type siteStatic struct {
Path string
Source staticSource
}
type siteMap struct { type siteMap struct {
Meta *SiteMeta Meta *SiteMeta
Pages []sitePage Pages []sitePage
Static []siteStatic
} }
type SourceCtx struct { type SourceCtx struct {

View file

@ -21,21 +21,17 @@ func Site(opts ...Option) *SiteBuilder {
} }
} }
func (sb *SiteBuilder) Generate() error {
_, err := sb.generate()
if err != nil {
return err
}
return err
}
func (sb *SiteBuilder) Publish() error { func (sb *SiteBuilder) Publish() error {
siteMap := siteMap{} genOut, err := sb.generate()
for _, opt := range sb.opts {
if err := opt.configSitemap(&siteMap); err != nil {
return err
}
}
if len(siteMap.Pages) == 0 {
return errors.New("No pages found")
}
gen := generator{}
genOut, err := gen.genSite(siteMap)
if err != nil { if err != nil {
return err return err
} }
@ -43,6 +39,27 @@ func (sb *SiteBuilder) Publish() error {
return sb.deployToNetlify(genOut) return sb.deployToNetlify(genOut)
} }
func (sb *SiteBuilder) generate() (generation, error) {
siteMap := siteMap{}
for _, opt := range sb.opts {
if err := opt.configSitemap(&siteMap); err != nil {
return generation{}, err
}
}
if len(siteMap.Pages) == 0 {
return generation{}, errors.New("No pages found")
}
gen := generator{}
genOut, err := gen.genSite(siteMap)
if err != nil {
return generation{}, err
}
return genOut, nil
}
func (sb *SiteBuilder) deployToNetlify(genOut generation) error { func (sb *SiteBuilder) deployToNetlify(genOut generation) error {
netlifyAuthToken := os.Getenv("NETLIFY_AUTH_TOKEN") netlifyAuthToken := os.Getenv("NETLIFY_AUTH_TOKEN")
if netlifyAuthToken == "" { if netlifyAuthToken == "" {

View file

@ -46,6 +46,32 @@ func SourceFile(path, file string) Option {
} }
} }
func StaticFile(path, file string) Option {
return Option{
configSitemap: func(sm *siteMap) error {
_, err := os.Stat(file)
if err != nil {
return err
}
absName, err := filepath.Abs(file)
if err != nil {
return err
}
log.Printf("Static '%s' -> %s", path, file)
sm.Static = append(sm.Static, siteStatic{
Path: path,
Source: fileStaticSource{
Filename: absName,
},
})
return nil
},
}
}
func SourceDir(basePath, dir string) Option { func SourceDir(basePath, dir string) Option {
return Option{ return Option{
configSitemap: func(sm *siteMap) error { configSitemap: func(sm *siteMap) error {