From 6c6da4ffbafd745ffb6a7b9ed6cef19e9536d296 Mon Sep 17 00:00:00 2001 From: uint Date: Fri, 19 Dec 2025 18:48:18 +0000 Subject: implement minimal kew --- README.md | 2 +- kew.go | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 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 \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") } -- cgit v1.2.3