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() {