diff --git a/assets.go b/assets.go new file mode 100644 index 0000000..a630c95 --- /dev/null +++ b/assets.go @@ -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) +} diff --git a/cmd/doc/main.go b/cmd/doc/main.go index 9f3e9c2..6a15591 100644 --- a/cmd/doc/main.go +++ b/cmd/doc/main.go @@ -11,7 +11,8 @@ func main() { progdoc.Meta(progdoc.SiteMeta{Title: "Prog Doc"}), progdoc.SourceFile("/", "README.md"), progdoc.SourceDir("/", "_site"), - ).Publish(); err != nil { + progdoc.StaticFile("/go.mod", "go.mod"), + ).Generate(); err != nil { log.Fatal(err) } } diff --git a/generator.go b/generator.go index 6b27813..ea5f00b 100644 --- a/generator.go +++ b/generator.go @@ -1,6 +1,8 @@ package progdoc import ( + "io" + "log" "os" "path/filepath" ) @@ -21,6 +23,7 @@ func (g generator) genSite(siteMap siteMap) (_ generation, err error) { return generation{}, err } } + log.Printf("Output dir: %s", outDir) for _, page := range siteMap.Pages { srcCtx := SourceCtx{Meta: siteMap.Meta} @@ -42,5 +45,34 @@ func (g generator) genSite(siteMap siteMap) (_ generation, err error) { 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 } diff --git a/models.go b/models.go index c099477..69a012b 100644 --- a/models.go +++ b/models.go @@ -15,9 +15,15 @@ type sitePage struct { Source pageSource } +type siteStatic struct { + Path string + Source staticSource +} + type siteMap struct { - Meta *SiteMeta - Pages []sitePage + Meta *SiteMeta + Pages []sitePage + Static []siteStatic } type SourceCtx struct { diff --git a/progdoc.go b/progdoc.go index 6d5e4b3..5f0d0e2 100644 --- a/progdoc.go +++ b/progdoc.go @@ -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 { - siteMap := siteMap{} - - 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) + genOut, err := sb.generate() if err != nil { return err } @@ -43,6 +39,27 @@ func (sb *SiteBuilder) Publish() error { 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 { netlifyAuthToken := os.Getenv("NETLIFY_AUTH_TOKEN") if netlifyAuthToken == "" { diff --git a/siteopts.go b/siteopts.go index 249ca0e..4b5b82c 100644 --- a/siteopts.go +++ b/siteopts.go @@ -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 { return Option{ configSitemap: func(sm *siteMap) error {