2017-06-10 21:38:09 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
2017-06-11 01:32:39 +02:00
|
|
|
"sort"
|
2017-06-10 21:38:09 +02:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/acstech/liquid"
|
|
|
|
)
|
|
|
|
|
|
|
|
// This is the longest label. Pull it out here so we can both use it, and measure it for alignment.
|
|
|
|
const configurationFileLabel = "Configuration file:"
|
|
|
|
|
|
|
|
func printSetting(label string, value string) {
|
|
|
|
fmt.Printf("%s %s\n",
|
|
|
|
leftPad(label, len(configurationFileLabel)-len(label)), value)
|
|
|
|
}
|
|
|
|
|
|
|
|
func printPathSetting(label string, path string) {
|
|
|
|
path, err := filepath.Abs(path)
|
|
|
|
if err != nil {
|
|
|
|
panic("Couldn't convert to absolute path")
|
|
|
|
}
|
|
|
|
printSetting(label, path)
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
liquid.Tags["link"] = LinkFactory
|
|
|
|
|
|
|
|
flag.StringVar(&siteConfig.DestinationDir, "destination", siteConfig.DestinationDir, "Destination directory")
|
|
|
|
flag.StringVar(&siteConfig.SourceDir, "source", siteConfig.SourceDir, "Source directory")
|
2017-06-11 01:32:39 +02:00
|
|
|
|
|
|
|
// routes subcommand
|
|
|
|
dynamic := flag.Bool("dynamic", false, "Dynamic routes only")
|
|
|
|
|
2017-06-10 21:38:09 +02:00
|
|
|
flag.Parse()
|
|
|
|
|
2017-06-10 23:51:46 +02:00
|
|
|
configPath := filepath.Join(siteConfig.SourceDir, "_config.yml")
|
2017-06-10 21:38:09 +02:00
|
|
|
// TODO error if file is e.g. unreadable
|
|
|
|
if _, err := os.Stat(configPath); err == nil {
|
2017-06-11 01:32:39 +02:00
|
|
|
if err := siteConfig.read(configPath); err != nil {
|
2017-06-10 21:38:09 +02:00
|
|
|
fmt.Println(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
printPathSetting(configurationFileLabel, configPath)
|
|
|
|
} else {
|
|
|
|
printSetting(configurationFileLabel, "none")
|
|
|
|
}
|
|
|
|
printPathSetting("Source:", siteConfig.SourceDir)
|
|
|
|
printPathSetting("Destination:", siteConfig.DestinationDir)
|
|
|
|
|
2017-06-10 23:51:46 +02:00
|
|
|
fileMap, err := buildSiteMap()
|
2017-06-10 21:38:09 +02:00
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
siteMap = fileMap
|
|
|
|
|
|
|
|
switch flag.Arg(0) {
|
|
|
|
case "s", "serve", "server":
|
|
|
|
err = server()
|
|
|
|
case "b", "build":
|
|
|
|
printSetting("Generating...", "")
|
|
|
|
start := time.Now()
|
|
|
|
err = build()
|
|
|
|
elapsed := time.Since(start)
|
|
|
|
printSetting("", fmt.Sprintf("done in %.2fs.", elapsed.Seconds()))
|
|
|
|
case "routes":
|
|
|
|
fmt.Printf("\nRoutes:\n")
|
2017-06-11 01:32:39 +02:00
|
|
|
urls := []string{}
|
|
|
|
for u, p := range siteMap {
|
|
|
|
if !(*dynamic && p.Static) {
|
|
|
|
urls = append(urls, u)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sort.Strings(urls)
|
|
|
|
for _, u := range urls {
|
|
|
|
fmt.Printf(" %s -> %s\n", u, siteMap[u].Path)
|
2017-06-10 21:38:09 +02:00
|
|
|
}
|
2017-06-10 23:51:46 +02:00
|
|
|
case "render":
|
|
|
|
// build a single page, and print it to stdout; for testing
|
|
|
|
page, err2 := readFile("index.md", siteData, true)
|
2017-06-10 21:38:09 +02:00
|
|
|
if err2 != nil {
|
|
|
|
err = err2
|
|
|
|
break
|
|
|
|
}
|
|
|
|
fmt.Println(string(page.Body))
|
|
|
|
default:
|
|
|
|
fmt.Println("A subcommand is required.")
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
|
|
|
}
|