summaryrefslogtreecommitdiff
path: root/crocc.go
diff options
context:
space:
mode:
authorNicolas Paul <n@nc0.fr>2023-04-26 03:45:11 +0200
committerNicolas Paul <n@nc0.fr>2023-04-26 03:45:11 +0200
commit3b41c3e2008498a804a03154f5b876827f1f4e7c (patch)
treebd36b8671ad9b99fecfd353e335e1660287224c6 /crocc.go
parentdab887d5b26df8ba45bf61e426736684a1d8df78 (diff)
Add HTML generation
Diffstat (limited to 'crocc.go')
-rw-r--r--crocc.go103
1 files changed, 88 insertions, 15 deletions
diff --git a/crocc.go b/crocc.go
index c4b6d2e..52fbd10 100644
--- a/crocc.go
+++ b/crocc.go
@@ -9,15 +9,17 @@ import (
"flag"
"fmt"
"log"
+ "os"
+ "path/filepath"
"runtime"
+ "text/template"
)
var (
- outputdir = flag.String("out", "dst", "output directory")
- url = flag.String("url", "http://localhost", "site URL")
- sitemap = flag.Bool("sitemap", false, "generate sitemap.xml")
+ out = flag.String("out", "dst", "output directory")
+ url = flag.String("url", "http://localhost", "site URL")
+ // TODO(nc0): sitemap = flag.Bool("sitemap", false, "generate sitemap.xml")
generateHidden = flag.Bool("hidden", false, "generate hidden pages")
- verbose = flag.Bool("v", false, "verbose output")
printVersion = flag.Bool("version", false, "print version and exit")
)
@@ -39,9 +41,14 @@ var (
date string
)
+var (
+ in string
+ htmlTemplate template.Template
+)
+
func init() {
flag.Usage = func() {
- log.Println(usage)
+ fmt.Println(usage)
flag.PrintDefaults()
}
}
@@ -62,18 +69,84 @@ func main() {
return
}
- inputdir := flag.Arg(0)
- if inputdir == "" {
+ // Check input directory
+ in = flag.Arg(0)
+ if in == "" {
log.Fatalln("no input directory specified")
}
- if *verbose {
- log.Printf(`Version: %s
-Input directory: %s
-Output directory: %s
-Site URL: %s
-Generate sitemap: %t
-Generate hidden pages: %t`, versionFormat(), inputdir, *outputdir, *url,
- *sitemap, *generateHidden)
+ if _, err := os.Stat(in); os.IsNotExist(err) {
+ log.Fatalf("input directory %q does not exist", in)
+ }
+
+ // Check output directory
+ if _, err := os.Stat(*out); !os.IsNotExist(err) {
+ log.Fatalf("output directory %q already exists", *out)
+ }
+
+ // Retrieve template file
+ templatePath := filepath.Join(in, ".crocc.html")
+ if _, err := os.Stat(templatePath); os.IsNotExist(err) {
+ log.Fatalf("template file %q does not exist", templatePath)
+ }
+ tp, err := os.ReadFile(templatePath)
+ if err != nil {
+ log.Fatalf("error reading template file %q: %v", templatePath, err)
+ }
+ htmlTemplate = *template.Must(template.New("html-template").Parse(string(tp)))
+
+ // Logic
+ if err := Crocc(in); err != nil {
+ log.Fatalf("unable to complete generation from %q: %v", in, err)
}
}
+
+// Crocc is the function that applies to every file in a directory.
+func Crocc(root string) error {
+ files, err := os.ReadDir(root)
+ if err != nil {
+ return err
+ }
+
+ for _, file := range files {
+ filename := file.Name()
+ log.Printf("processing %q", filename)
+
+ // Ignore template file
+ if filename == ".crocc.html" {
+ continue
+ }
+
+ // If the file is a directory, create it in the output directory
+ if file.IsDir() {
+ if err := TransformDirectory(root, filename, *out); err != nil {
+ return err
+ }
+
+ if err := Crocc(filepath.Join(root, filename)); err != nil {
+ return err
+ }
+
+ continue
+ }
+
+ // Copy non-Markdown files into the output directory
+ if filepath.Ext(filename) != ".md" &&
+ filepath.Ext(filename) != ".markdown" &&
+ filepath.Ext(filename) != ".mdown" &&
+ filepath.Ext(filename) != ".Markdown" {
+ if err := TransformNonMarkdownFile(root, filename, *out); err != nil {
+ return err
+ }
+
+ continue
+ }
+
+ // Transform Markdown files into HTML
+ if err := TransformMarkdownFile(root, filename, *out); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}