|
@@ -0,0 +1,160 @@
|
|
|
+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
|
|
|
+
|
|
|
+}
|