summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruint <abhinav.prsai@gmail.com>2025-12-19 18:48:18 +0000
committeruint <abhinav.prsai@gmail.com>2025-12-19 18:48:18 +0000
commit6c6da4ffbafd745ffb6a7b9ed6cef19e9536d296 (patch)
tree1e4ef2231b69af863f60d6e8b9a582636e67b738
parentc29694fce7fe52f2ec5c6dbc60203999141ee214 (diff)
implement minimal kew
-rw-r--r--README.md2
-rw-r--r--kew.go114
2 files changed, 110 insertions, 6 deletions
diff --git a/README.md b/README.md
index 59752cf..923a404 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-### kew - oK, Enough of Werc
+### kew - K, Enough of Werc
kew is an extremely minimal static site generator written in go inspired by the legendary `werc` by Uriel @ cat-v.
it uses `lowdown`.
diff --git a/kew.go b/kew.go
index c9652e0..520fe61 100644
--- a/kew.go
+++ b/kew.go
@@ -2,18 +2,122 @@ package main
import (
"fmt"
+ "io"
"os"
+ "os/exec"
+ "path/filepath"
+ "strings"
)
+func md_to_html(input_path string, output_path string) error {
+ var cmd *exec.Cmd
+ var err error
+
+ /* open source markdown */
+ var in *os.File
+ in, err = os.Open(input_path)
+ if err != nil {
+ return err
+ }
+ defer in.Close()
+
+ /* create output html */
+ var out *os.File
+ out, err = os.Create(output_path)
+ if err != nil {
+ return err
+ }
+ defer out.Close()
+
+ /*
+ run:
+ lowdown -Thtml
+ stdin <- markdown file
+ stdout -> html file
+ */
+ cmd = exec.Command("lowdown", "-Thtml")
+ cmd.Stdin = in
+ cmd.Stdout = out
+ cmd.Stderr = os.Stderr
+
+ err = cmd.Run()
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func copy_file(src string, dst string) error {
+ var err error
+
+ var in *os.File
+ in, err = os.Open(src)
+ if err != nil {
+ return err
+ }
+ defer in.Close()
+
+ var out *os.File
+ out, err = os.Create(dst)
+ if err != nil {
+ return err
+ }
+ defer out.Close()
+
+ _, err = io.Copy(out, in)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
func main() {
+ var err error
+
if len(os.Args) != 3 {
- fmt.Fprintf(os.Stderr, "usage: kew in/ out/\n")
+ fmt.Fprintf(os.Stderr, "usage: kew <in> <out>\n")
os.Exit(1)
}
- src := os.Args[1]
- out := os.Args[2]
+ var src string = os.Args[1]
+ var out string = os.Args[2]
+
+ fmt.Printf("kew: %s -> %s\n", src, out)
+
+ err = filepath.WalkDir(src, func(path string, entry os.DirEntry, err error) error {
+ if err != nil {
+ return err
+ }
+
+ /* find relative path */
+ var rel string
+ rel, err = filepath.Rel(src, path)
+ if err != nil {
+ return err
+ }
+
+ var outpath string = filepath.Join(out, rel)
+
+ /* mirror src */
+ if entry.IsDir() {
+ return os.MkdirAll(outpath, 0755)
+ }
+
+ /* convert markdown else copy */
+ if strings.HasSuffix(path, ".md") {
+ outpath = strings.TrimSuffix(outpath, ".md") + ".html"
+ return md_to_html(path, outpath)
+ }
+
+ return copy_file(path, outpath)
+ })
+
+ if err != nil {
+ fmt.Fprintln(os.Stderr, "kew:", err)
+ os.Exit(1)
+ }
- fmt.Println("src:", src)
- fmt.Println("out:", out)
+ fmt.Println("kew: done")
}