package main
import (
"html/template"
"os"
"path/filepath"
"strings"
// "bufio"
// "io/ioutil"
// "path"
// "github.com/russross/blackfriday"
"github.com/cdelorme/go-log"
)
type Staticmd struct {
Logger log.Logger
Input string
Output string
Template template.Template
Book bool
Relative bool
MaxParallelism int
Version string
Navigation []string
Pages []string
Subdirectories map[string][]string
Indexes map[string][]string
}
// search for readme or fallback to index
func (staticmd *Staticmd) index(pages []string) string {
for _, page := range pages {
if n := basename(page); n == "readme" {
return n
}
}
return "index"
}
func (staticmd *Staticmd) Walk(path string, file os.FileInfo, err error) error {
if file == nil {
} else if file.IsDir() {
// prepare path to create for matching output
mkd := filepath.Join(staticmd.Output, strings.TrimPrefix(path, staticmd.Input))
// include parent output path
if path == staticmd.Input {
mkd = staticmd.Output
} else {
// note subdirectory for indexing
if _, ok := staticmd.Subdirectories[filepath.Dir(path)]; !ok {
staticmd.Subdirectories[filepath.Dir(path)] = make([]string, 0)
}
staticmd.Subdirectories[filepath.Dir(path)] = append(staticmd.Subdirectories[filepath.Dir(path)], path)
}
// create all matching output paths
staticmd.Logger.Debug("creating matching output path: %s", mkd)
if err := os.MkdirAll(mkd, 0770); err != nil {
staticmd.Logger.Error("failed to create matching output path: %s, %s", path, err)
}
} else if file.Mode().IsRegular() && file.Size() > 0 {
// append all markdown files to our pages list
if strings.HasSuffix(path, ".md") || strings.HasSuffix(path, ".mkd") || strings.HasSuffix(path, ".markdown") {
staticmd.Pages = append(staticmd.Pages, path)
dir := filepath.Dir(path)
// append to navigation, index
if dir == staticmd.Input {
staticmd.Navigation = append(staticmd.Navigation, path)
} else {
// prepare index container
if _, ok := staticmd.Indexes[dir]; !ok {
staticmd.Indexes[dir] = make([]string, 0)
}
staticmd.Indexes[dir] = append(staticmd.Indexes[dir], dir+basename(strings.TrimPrefix(path, staticmd.Input))+".html")
}
}
}
return err
}
func (staticmd *Staticmd) Multi() {
// test filepath.Rel()
// iterate all subdirectories to find index/readme and append to
// for i, _ := range staticmd.Subdirectories {
// for _, d := range staticmd.Subdirectories[i] {
// // can only append to indexes that exist
// if _, ok := staticmd.Indexes[filepath.Dir(staticmd.Subdirectories[i][d])]; !ok {
// continue
// }
// // determine whether to append relative path or just the folder
// if staticmd.Relative {
// // trim input path, and append to indexes as .html
// idx := staticmd.index(staticmd.Subdirectories[i][d])
// staticmd.Subdirectories[i][d]+idx+".html"
// // determine whether index or readme exists, assume index
// } else {
// // simply append `subfolder/`
// }
// }
// }
// rebuild navigation pathing
// for i, page := range staticmd.Navigation {
// if staticmd.Relative {
// staticmd.Navigation[i] = strings.TrimPrefix(strings.TrimPrefix(page, staticmd.Input), "/")
// } else if basename(page) == "index" {
// staticmd.Navigation[i] = "/"
// } else {
// staticmd.Navigation[i] = strings.TrimPrefix(page, staticmd.Input)
// }
// }
// debug output
staticmd.Logger.Debug("Navigation: %+v", staticmd.Navigation)
staticmd.Logger.Debug("Indexes: %+v", staticmd.Indexes)
// concurrently build pages
}
func (staticmd *Staticmd) Single() {
// open single index.html for building
file := staticmd.Output
// prepare index
index := make([]string, 0)
// prepare markdown thingy?
// content := template.HTML(blackfriday.MarkdownCommon(markdown))
// synchronously build one output file
for i, _ := range staticmd.Pages {
// create index record
// staticmd.Pages[i]
// append each file to content
}
// append index
}