commit 2df6762

Artur Manuel  ·  2026-07-21 02:38:30 +0000 UTC
parent ebc3484
cmd: seperate commands, add init command
3 files changed,  +163, -85
+97, -0
 1@@ -0,0 +1,97 @@
 2+package main
 3+
 4+import (
 5+	"context"
 6+	"log/slog"
 7+	"os"
 8+	"path/filepath"
 9+	"strings"
10+
11+	"codeberg.org/dani-institute/pages/pkg/ssg"
12+	"github.com/urfave/cli/v3"
13+	"github.com/yuin/goldmark"
14+	meta "github.com/yuin/goldmark-meta"
15+	"github.com/yuin/goldmark/parser"
16+)
17+
18+var buildCommand = cli.Command{
19+	Name:    "build",
20+	Aliases: []string{"b"},
21+	Flags: []cli.Flag{
22+		&cli.StringFlag{
23+			Name:  "base-url",
24+			Value: "",
25+		},
26+		&cli.StringFlag{
27+			Name:  "config",
28+			Value: "./config.toml",
29+		},
30+		&cli.StringFlag{
31+			Name:  "templates-dir",
32+			Value: "./templates",
33+		},
34+		&cli.StringFlag{
35+			Name:  "pages-dir",
36+			Value: "./pages",
37+		},
38+		&cli.StringFlag{
39+			Name:  "assets-dir",
40+			Value: "./assets",
41+		},
42+		&cli.StringFlag{
43+			Name:  "output-dir",
44+			Value: "./output",
45+		},
46+	},
47+}
48+
49+func buildAction(ctx context.Context, c *cli.Command) error {
50+	slog.Info("generating pages")
51+	var config ssg.Config
52+	baseUrl := c.String("base-url")
53+	_ = baseUrl
54+	configFile := c.String("config")
55+	if err := ssg.LoadConfigFile(configFile, &config); err != nil {
56+		return err
57+	}
58+	pagesDir := c.String("pages-dir")
59+	pages, err := ssg.GetPages(pagesDir)
60+	if err != nil {
61+		return err
62+	}
63+	templatesDir := c.String("templates-dir")
64+	templates, err := ssg.GetTemplates(templatesDir)
65+	if err != nil {
66+		return err
67+	}
68+	sidebar, err := ssg.GetSidebar(pagesDir, config.SidebarOrder)
69+	if err != nil {
70+		return err
71+	}
72+	outputDir := c.String("output-dir")
73+	if err := os.MkdirAll(outputDir, 0o700); os.IsNotExist(err) {
74+		return err
75+	}
76+	assetsDir := c.String("assets-dir")
77+	if err := ssg.CopyDir(assetsDir, outputDir); err != nil {
78+		return err
79+	}
80+	markdown := goldmark.New(
81+		goldmark.WithExtensions(meta.Meta),
82+		goldmark.WithParserOptions(parser.WithAutoHeadingID()),
83+	)
84+	for path, page := range pages {
85+		name := strings.TrimSuffix(filepath.Base(path), ".md")
86+		slog.Info("building page", "page", name)
87+		outputPath := filepath.Join(outputDir, name) + ".html"
88+		f, err := os.Create(outputPath)
89+		if err != nil {
90+			return err
91+		}
92+		defer f.Close()
93+		if err := ssg.BuildPage(f, name, path, page, markdown, templates, config, baseUrl, sidebar); err != nil {
94+			return err
95+		}
96+	}
97+	return nil
98+}
+60, -0
 1@@ -0,0 +1,60 @@
 2+package main
 3+
 4+import (
 5+	"context"
 6+	"os"
 7+	"path/filepath"
 8+
 9+	"github.com/urfave/cli/v3"
10+)
11+
12+const defaultGlercConfig = `
13+		# this is an example config.toml for glerc, change as you please
14+
15+		base_url = "https://example.com"
16+		title = "wiff bark bark"
17+		description = "A glerc site for puppies"
18+
19+		[extra]
20+		favourite_danis = [
21+			"the original dani",
22+			"the wizard dani",
23+			"the mushroom dani",
24+		]
25+	`
26+
27+var initCommand = cli.Command{
28+	Name:    "init",
29+	Usage:   "Initialise a glerc project",
30+	Aliases: []string{"i"},
31+	Flags: []cli.Flag{
32+		&cli.StringFlag{
33+			Name:    "dir",
34+			Aliases: []string{"d"},
35+			Sources: cli.EnvVars("PWD"),
36+			Value:   ".",
37+			Usage:   "Where glerc's files will be made",
38+		},
39+	},
40+	Action: initAction,
41+}
42+
43+func initAction(ctx context.Context, cmd *cli.Command) error {
44+	outputDirectory := cmd.String("dir")
45+	outputConfigFile := filepath.Join(outputDirectory, "config.toml")
46+	dirsToCreate := []string{"pages", "templates"}
47+	f, err := os.OpenFile(outputConfigFile, os.O_CREATE|os.O_WRONLY, 0o644)
48+	if err != nil {
49+		return err
50+	}
51+	_, err = f.Write([]byte(defaultGlercConfig))
52+	if err != nil {
53+		return err
54+	}
55+	for _, dir := range dirsToCreate {
56+		if err := os.MkdirAll(filepath.Join(outputDirectory, dir), 0o755); err != nil {
57+			return nil
58+		}
59+	}
60+	return nil
61+}
+6, -85
  1@@ -4,97 +4,18 @@ import (
  2 	"context"
  3 	"log/slog"
  4 	"os"
  5-	"path/filepath"
  6-	"strings"
  7 
  8-	"codeberg.org/dani-institute/pages/pkg/ssg"
  9 	"github.com/urfave/cli/v3"
 10-	"github.com/yuin/goldmark"
 11-	meta "github.com/yuin/goldmark-meta"
 12-	"github.com/yuin/goldmark/parser"
 13 )
 14 
 15 var cmd = cli.Command{
 16-	Name:    "generate_pages",
 17-	Version: "2026.5.0",
 18-	Flags: []cli.Flag{
 19-		&cli.StringFlag{
 20-			Name:  "base-url",
 21-			Value: "",
 22-		},
 23-		&cli.StringFlag{
 24-			Name:  "config",
 25-			Value: "./config.toml",
 26-		},
 27-		&cli.StringFlag{
 28-			Name:  "templates-dir",
 29-			Value: "./templates",
 30-		},
 31-		&cli.StringFlag{
 32-			Name:  "pages-dir",
 33-			Value: "./pages",
 34-		},
 35-		&cli.StringFlag{
 36-			Name:  "assets-dir",
 37-			Value: "./assets",
 38-		},
 39-		&cli.StringFlag{
 40-			Name:  "output-dir",
 41-			Value: "./output",
 42-		},
 43+	Name:    "glerc",
 44+	Version: "2026.7.0",
 45+	Usage:   "Generate werc-like static pages",
 46+	Commands: []*cli.Command{
 47+		&buildCommand,
 48+		&initCommand,
 49 	},
 50-	Action: mainAction,
 51-}
 52-
 53-func mainAction(ctx context.Context, c *cli.Command) error {
 54-	slog.Info("generating pages")
 55-	var config ssg.Config
 56-	baseUrl := c.String("base-url")
 57-	_ = baseUrl
 58-	configFile := c.String("config")
 59-	if err := ssg.LoadConfigFile(configFile, &config); err != nil {
 60-		return err
 61-	}
 62-	pagesDir := c.String("pages-dir")
 63-	pages, err := ssg.GetPages(pagesDir)
 64-	if err != nil {
 65-		return err
 66-	}
 67-	templatesDir := c.String("templates-dir")
 68-	templates, err := ssg.GetTemplates(templatesDir)
 69-	if err != nil {
 70-		return err
 71-	}
 72-	sidebar, err := ssg.GetSidebar(pagesDir, config.SidebarOrder)
 73-	if err != nil {
 74-		return err
 75-	}
 76-	outputDir := c.String("output-dir")
 77-	if err := os.MkdirAll(outputDir, 0o700); os.IsNotExist(err) {
 78-		return err
 79-	}
 80-	assetsDir := c.String("assets-dir")
 81-	if err := ssg.CopyDir(assetsDir, outputDir); err != nil {
 82-		return err
 83-	}
 84-	markdown := goldmark.New(
 85-		goldmark.WithExtensions(meta.Meta),
 86-		goldmark.WithParserOptions(parser.WithAutoHeadingID()),
 87-	)
 88-	for path, page := range pages {
 89-		name := strings.TrimSuffix(filepath.Base(path), ".md")
 90-		slog.Info("building page", "page", name)
 91-		outputPath := filepath.Join(outputDir, name) + ".html"
 92-		f, err := os.Create(outputPath)
 93-		if err != nil {
 94-			return err
 95-		}
 96-		defer f.Close()
 97-		if err := ssg.BuildPage(f, name, path, page, markdown, templates, config, baseUrl, sidebar); err != nil {
 98-			return err
 99-		}
100-	}
101-	return nil
102 }
103 
104 func main() {