|
@@ -164,6 +164,7 @@ func (staticmd *Staticmd) Multi() {
|
|
markdown = append([]byte(toc), markdown...)
|
|
markdown = append([]byte(toc), markdown...)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // convert to html, and accept as part of the template
|
|
page.Content = template.HTML(blackfriday.MarkdownCommon(markdown))
|
|
page.Content = template.HTML(blackfriday.MarkdownCommon(markdown))
|
|
} else {
|
|
} else {
|
|
staticmd.Logger.Error("failed to read file: %s, %s", p, err)
|
|
staticmd.Logger.Error("failed to read file: %s, %s", p, err)
|
|
@@ -192,8 +193,8 @@ func (staticmd *Staticmd) Multi() {
|
|
}
|
|
}
|
|
|
|
|
|
// send pages to workers for async rendering
|
|
// send pages to workers for async rendering
|
|
- for _, page := range staticmd.Pages {
|
|
|
|
- pages <- page
|
|
|
|
|
|
+ for i, _ := range staticmd.Pages {
|
|
|
|
+ pages <- staticmd.Pages[i]
|
|
}
|
|
}
|
|
|
|
|
|
// close channel and wait for async to finish before continuing
|
|
// close channel and wait for async to finish before continuing
|
|
@@ -204,6 +205,78 @@ func (staticmd *Staticmd) Multi() {
|
|
// build output synchronously to a single page
|
|
// build output synchronously to a single page
|
|
func (staticmd *Staticmd) Single() {
|
|
func (staticmd *Staticmd) Single() {
|
|
|
|
|
|
- // still determining strategy
|
|
|
|
|
|
+ // prepare []byte array to store all files markdown
|
|
|
|
+ content := make([]byte, 0)
|
|
|
|
+
|
|
|
|
+ // prepare a table-of-contents
|
|
|
|
+ toc := "\n"
|
|
|
|
+
|
|
|
|
+ // iterate and append all files contents
|
|
|
|
+ for _, p := range staticmd.Pages {
|
|
|
|
+
|
|
|
|
+ // shorthand
|
|
|
|
+ shorthand := strings.TrimPrefix(p, staticmd.Input+string(os.PathSeparator))
|
|
|
|
+
|
|
|
|
+ // acquire depth
|
|
|
|
+ depth := strings.Count(shorthand, string(os.PathSeparator))
|
|
|
|
+
|
|
|
|
+ // prepare anchor text
|
|
|
|
+ anchor := strings.Replace(shorthand, string(os.PathSeparator), "-", -1)
|
|
|
|
+
|
|
|
|
+ // create new toc record
|
|
|
|
+ toc = toc + strings.Repeat("\t", depth) + "- [" + basename(p) + "](#" + anchor + ")\n"
|
|
|
|
+
|
|
|
|
+ // read markdown from file or skip to next file
|
|
|
|
+ markdown, err := ioutil.ReadFile(p)
|
|
|
|
+ if err != nil {
|
|
|
|
+ staticmd.Logger.Error("failed to read file: %s, %s", p, err)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // prepend anchor to content
|
|
|
|
+ markdown = append([]byte("\n<a id='" + anchor + "'/>\n\n"), markdown...)
|
|
|
|
+
|
|
|
|
+ // append a "back-to-top" anchor
|
|
|
|
+ markdown = append(markdown, []byte("\n[back to top](#top)\n\n")...)
|
|
|
|
+
|
|
|
|
+ // append to content
|
|
|
|
+ content = append(content, markdown...)
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ // prepend toc
|
|
|
|
+ content = append([]byte(toc), content...)
|
|
|
|
+
|
|
|
|
+ // create page object with version & content
|
|
|
|
+ page := Page{
|
|
|
|
+ Version: staticmd.Version,
|
|
|
|
+ Content: template.HTML(blackfriday.MarkdownCommon(content)),
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ staticmd.Logger.Info("page: %+v", page)
|
|
|
|
+
|
|
|
|
+ // prepare output directory
|
|
|
|
+ if ok, _ := exists(staticmd.Output); !ok {
|
|
|
|
+ if err := os.MkdirAll(staticmd.Output, 0770); err != nil {
|
|
|
|
+ staticmd.Logger.Error("Failed to create path: %s, %s", staticmd.Output, err)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // prepare output file path
|
|
|
|
+ out := filepath.Join(staticmd.Output, "index.html")
|
|
|
|
+
|
|
|
|
+ // open file for output and run through template
|
|
|
|
+ if f, err := os.Create(out); err == nil {
|
|
|
|
+ defer f.Close()
|
|
|
|
+
|
|
|
|
+ // prepare a writer /w buffer
|
|
|
|
+ fb := bufio.NewWriter(f)
|
|
|
|
+ defer fb.Flush()
|
|
|
|
+
|
|
|
|
+ // attempt to use template to write output with page context
|
|
|
|
+ if e := staticmd.Template.Execute(fb, page); e != nil {
|
|
|
|
+ staticmd.Logger.Error("Failed to write template: %s, %s", out, e)
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ staticmd.Logger.Error("failed to create new file: %s, %s", out, err)
|
|
|
|
+ }
|
|
}
|
|
}
|