1
0
mirror of https://git.sr.ht/~adnano/kiln synced 2024-11-08 14:19:20 +01:00
kiln/main.go

161 lines
3.2 KiB
Go
Raw Normal View History

2020-09-22 22:42:14 +02:00
package main
import (
"embed"
2021-04-11 22:00:29 +02:00
"flag"
"fmt"
2021-04-11 23:50:18 +02:00
"io"
"io/fs"
2020-09-22 22:42:14 +02:00
"log"
2021-04-11 23:50:18 +02:00
"os"
"path/filepath"
"strings"
2020-09-29 01:54:48 +02:00
)
2021-04-12 06:31:55 +02:00
var (
Version string
)
2020-09-22 22:42:14 +02:00
func main() {
2021-04-20 22:00:39 +02:00
if len(os.Args) >= 2 {
switch os.Args[1] {
case "build":
build()
return
case "new":
if len(os.Args) < 3 {
fmt.Println("usage: kiln new <path>")
os.Exit(1)
}
newSite(os.Args[2])
return
case "version":
fmt.Println("kiln", Version)
return
}
}
fmt.Println("usage: kiln <build | new | version> args...")
os.Exit(1)
}
func build() {
2021-04-11 22:00:29 +02:00
var (
2021-04-20 22:00:39 +02:00
config string
2021-04-11 22:00:29 +02:00
)
2021-04-20 22:12:52 +02:00
flags := flag.NewFlagSet("kiln build", flag.ExitOnError)
flags.StringVar(&config, "c", "config.toml", "the configuration file to use")
flags.Parse(os.Args[2:])
2020-09-22 22:42:14 +02:00
site, err := LoadSite(config)
2021-03-20 07:02:36 +01:00
if err != nil {
log.Fatalf("ERROR: %v", err)
2020-11-20 18:07:38 +01:00
}
2021-05-10 01:28:09 +02:00
if err := site.run(); err != nil {
log.Fatalf("ERROR: %v", err)
2021-04-11 22:00:29 +02:00
}
}
func (site *Site) run() error {
for _, task := range site.Tasks {
err := site.runTask(task)
2021-04-11 22:00:29 +02:00
if err != nil {
return err
}
2021-02-28 03:53:16 +01:00
}
2021-04-11 22:00:29 +02:00
return nil
}
2021-02-28 03:53:16 +01:00
func (s *Site) runTask(task *Task) error {
// Read content
2022-02-09 19:18:11 +01:00
s.Root = &Page{Path: "/", FilePath: ".", URL: task.URL + "/"}
2022-02-09 18:25:39 +01:00
if err := s.Root.read("content", task, s); err != nil {
2021-04-11 22:00:29 +02:00
return err
}
2022-02-09 18:25:39 +01:00
s.Root.sort()
// Process content
2022-02-09 18:25:39 +01:00
if err := s.Root.process(s, task); err != nil {
2021-04-11 22:00:29 +02:00
return err
}
// Write content
2022-02-09 18:25:39 +01:00
if err := s.Root.write(task.OutputDir, task); err != nil {
2021-04-11 22:00:29 +02:00
return err
}
2021-04-11 23:50:18 +02:00
// Copy static files
2021-04-12 00:42:55 +02:00
if task.StaticDir != "" {
err := copyAll(task.StaticDir, task.OutputDir)
2021-04-11 23:50:18 +02:00
if err != nil {
if os.IsNotExist(err) {
log.Printf("static_dir '%s' does not exist\n", task.StaticDir)
return nil
}
2021-04-11 23:50:18 +02:00
return err
}
}
2020-09-22 22:42:14 +02:00
return nil
}
2021-04-11 23:50:18 +02:00
func copyAll(srcDir, dstDir string) error {
return filepath.Walk(srcDir, func(path string, info fs.FileInfo, err error) error {
if err != nil {
return err
}
2021-04-11 23:50:18 +02:00
if info.IsDir() {
// Do nothing
return nil
}
src, err := os.Open(path)
if err != nil {
return err
}
defer src.Close()
sinfo, err := src.Stat()
if err != nil {
return err
}
mode := sinfo.Mode()
2021-04-11 23:50:18 +02:00
dstPath := filepath.Join(dstDir, strings.TrimPrefix(path, srcDir))
os.MkdirAll(filepath.Dir(dstPath), 0755)
dst, err := os.OpenFile(dstPath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, mode)
2021-04-11 23:50:18 +02:00
if err != nil {
return err
}
defer dst.Close()
if _, err := io.Copy(dst, src); err != nil {
return err
}
return nil
})
}
2021-04-20 22:00:39 +02:00
2021-05-10 21:03:02 +02:00
//go:embed templates/_default config.toml
var builtin embed.FS
2021-04-20 22:00:39 +02:00
func newSite(name string) {
2022-02-09 18:36:59 +01:00
name = filepath.Clean(name)
2021-04-20 22:00:39 +02:00
os.Mkdir(name, 0755)
2022-02-09 18:36:59 +01:00
os.Mkdir(filepath.Join(name, "content"), 0755)
os.Mkdir(filepath.Join(name, "templates"), 0755)
os.Mkdir(filepath.Join(name, "templates", "_default"), 0755)
os.Mkdir(filepath.Join(name, "static"), 0755)
os.Mkdir(filepath.Join(name, "public"), 0755)
2021-04-20 22:00:39 +02:00
config, _ := builtin.ReadFile("config.toml")
2022-02-09 18:36:59 +01:00
os.WriteFile(filepath.Join(name, "config.toml"), config, 0644)
2021-04-20 22:00:39 +02:00
2021-05-17 18:55:15 +02:00
index := []byte("---\ntitle: Hello, world!\n---\n")
2022-02-09 18:36:59 +01:00
os.WriteFile(filepath.Join(name, "content", "_index.gmi"), index, 0644)
templates := []string{"atom.xml", "index.gmi", "page.gmi"}
for _, template := range templates {
2022-02-09 18:36:59 +01:00
b, _ := builtin.ReadFile(filepath.Join("templates", "_default", template))
os.WriteFile(filepath.Join(name, "templates", "_default", template), b, 0644)
}
2021-04-20 22:00:39 +02:00
}