progdoc/siteopts.go

117 lines
2.2 KiB
Go

package progdoc
import (
"errors"
"log"
"os"
"path/filepath"
"strings"
)
type Option struct {
configSitemap func(sm *siteMap) error
}
func Meta(meta SiteMeta) Option {
return Option{
configSitemap: func(sm *siteMap) error {
sm.Meta = &meta
return nil
},
}
}
func SourceFile(path, file string) Option {
return Option{
configSitemap: func(sm *siteMap) error {
_, err := os.Stat(file)
if err != nil {
return err
}
// TODO: support things other than markdown
src, err := inferSourceFromFilename(file)
if err != nil {
return err
}
log.Printf("Page '%s' -> %s", path, file)
sm.Pages = append(sm.Pages, sitePage{
Path: path,
Source: stdLayoutSource{MainSource: src},
})
return nil
},
}
}
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 {
return filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() && info.Mode().IsRegular() {
src, err := inferSourceFromFilename(path)
if err != nil {
return nil
}
relPath, err := filepath.Rel(dir, strings.TrimSuffix(path, filepath.Ext(path)))
if err != nil {
return nil
}
targetPath := filepath.Join(basePath, relPath)
log.Printf("Page '%s' -> %s", targetPath, path)
sm.Pages = append(sm.Pages, sitePage{
Path: relPath,
Source: stdLayoutSource{MainSource: src},
})
}
return nil
})
},
}
}
func inferSourceFromFilename(fname string) (pageSource, error) {
absName, err := filepath.Abs(fname)
if err != nil {
return nil, err
}
if strings.HasSuffix(absName, ".md") {
return mdSource{MDFile: absName}, nil
}
return nil, errors.New("unsupported file type")
}