diff --git a/example/pages/test.md b/example/pages/test.md new file mode 100644 index 0000000..20da2c7 --- /dev/null +++ b/example/pages/test.md @@ -0,0 +1,14 @@ +# This is a Test + +Hi, I am a test file. + +* asdasfdsadf +* sadf +* saf +* sdf +* sad +* f +* sdf +* sa +* fs +* a diff --git a/go.mod b/go.mod index be0f622..05e67a6 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/gofiber/fiber/v2 v2.52.9 github.com/gofiber/template/html/v2 v2.1.3 github.com/stretchr/testify v1.10.0 + github.com/yuin/goldmark v1.7.13 ) require ( @@ -14,6 +15,8 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/gofiber/template v1.8.3 // indirect github.com/gofiber/utils v1.1.0 // indirect + github.com/google/licensecheck v0.3.1 // indirect + github.com/google/safehtml v0.0.3-0.20211026203422-d6f0e11a5516 // indirect github.com/google/uuid v1.6.0 // indirect github.com/klauspost/compress v1.17.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect @@ -24,6 +27,15 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.51.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect - golang.org/x/sys v0.28.0 // indirect + golang.org/x/mod v0.26.0 // indirect + golang.org/x/net v0.42.0 // indirect + golang.org/x/pkgsite v0.0.0-20250721174030-d4de6668b910 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.34.0 // indirect + golang.org/x/text v0.27.0 // indirect + golang.org/x/tools v0.35.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + rsc.io/markdown v0.0.0-20231214224604-88bb533a6020 // indirect ) + +tool golang.org/x/pkgsite/cmd/pkgsite diff --git a/go.sum b/go.sum index f9ac82c..511fdca 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,12 @@ github.com/gofiber/template/html/v2 v2.1.3 h1:n1LYBtmr9C0V/k/3qBblXyMxV5B0o/gpb6 github.com/gofiber/template/html/v2 v2.1.3/go.mod h1:U5Fxgc5KpyujU9OqKzy6Kn6Qup6Tm7zdsISR+VpnHRE= github.com/gofiber/utils v1.1.0 h1:vdEBpn7AzIUJRhe+CiTOJdUcTg4Q9RK+pEa0KPbLdrM= github.com/gofiber/utils v1.1.0/go.mod h1:poZpsnhBykfnY1Mc0KeEa6mSHrS3dV0+oBWyeQmb2e0= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/licensecheck v0.3.1 h1:QoxgoDkaeC4nFrtGN1jV7IPmDCHFNIVh54e5hSt6sPs= +github.com/google/licensecheck v0.3.1/go.mod h1:ORkR35t/JjW+emNKtfJDII0zlciG9JgbT7SmsohlHmY= +github.com/google/safehtml v0.0.3-0.20211026203422-d6f0e11a5516 h1:pSEdbeokt55L2hwtWo6A2k7u5SG08rmw0LhWEyrdWgk= +github.com/google/safehtml v0.0.3-0.20211026203422-d6f0e11a5516/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= @@ -35,11 +41,29 @@ github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1S github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= +github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/pkgsite v0.0.0-20250721174030-d4de6668b910 h1:pVfSCzQYqJGWW9yuI25d4eDh7kzYPKCIl2l3kKOquq4= +golang.org/x/pkgsite v0.0.0-20250721174030-d4de6668b910/go.mod h1:lHdU14GvKhxtIb9U1NN0ss4Ns49PaAz8Ecq/I97LUwI= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/markdown v0.0.0-20231214224604-88bb533a6020 h1:GqQcl3Kno/rOntek8/d8axYjau8r/c1zVFojXS6WJFI= +rsc.io/markdown v0.0.0-20231214224604-88bb533a6020/go.mod h1:8xcPgWmwlZONN1D9bjxtHEjrUtSEa3fakVF8iaewYKQ= diff --git a/main.go b/main.go index c160dd8..e5e1752 100644 --- a/main.go +++ b/main.go @@ -10,6 +10,7 @@ import ( "github.com/gofiber/fiber/v2" "github.com/gofiber/template/html/v2" "zedshaw.games/ssgod/config" + "github.com/yuin/goldmark" ) func Fail(err error, format string, v ...any) error { @@ -34,9 +35,9 @@ func ProcessDirEntry(engine *html.Engine, path string, d fs.DirEntry, err error) split_path := strings.Split(path, string(os.PathSeparator))[1:] source_name := strings.Join(split_path, "/") // Render wants / even on windows ext := filepath.Ext(source_name) - template_name, found := strings.CutSuffix(source_name, ext) + source_name, found := strings.CutSuffix(source_name, ext) - if found && ext == ".html" && template_name != settings.Layout { + if found && source_name != settings.Layout { prefixed_path := append([]string{settings.Target}, split_path...) target_path := filepath.Join(prefixed_path...) @@ -48,19 +49,36 @@ func ProcessDirEntry(engine *html.Engine, path string, d fs.DirEntry, err error) os.MkdirAll(target_dir, 0750) } - // TODO: compare time stamps and skip if not newer + // generate a data-testid for all pages based on template name + page_id := strings.ReplaceAll(source_name, "/", "-") + "-page" - out, err := os.OpenFile(target_path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) - if err != nil { return Fail(err, "writing file %s", target_path) } + if ext == ".html" { + out, err := os.OpenFile(target_path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) + defer out.Close() - // generate a data-testid for all pages based on template name - page_id := strings.ReplaceAll(template_name, "/", "-") + "-page" + if err != nil { return Fail(err, "writing file %s", target_path) } + + err = engine.Render(out, source_name, fiber.Map{"PageId": page_id}, settings.Layout) + if err != nil { return Fail(err, "failed to render %s", path) } + + log.Printf("RENDER: %s -> %s", source_name, target_path) + } else if ext == ".md" { + // need to strip the .md and replace with .html + html_name, _ := strings.CutSuffix(target_path, ext) + html_name = fmt.Sprintf("%s.html", html_name) + + log.Printf("MARKDOWN: %s -> %s", path, html_name) - err = engine.Render(out, template_name, fiber.Map{"PageId": page_id}, settings.Layout) - if err != nil { return Fail(err, "failed to render %s", path) } + out, err := os.OpenFile(html_name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) + defer out.Close() - log.Printf("RENDER: %s -> %s", template_name, target_path) - out.Close() + if err != nil { return Fail(err, "writing file %s", target_path) } + + input_data, err := os.ReadFile(path) + err = goldmark.Convert(input_data, out) + + if err != nil { return Fail(err, "failed to render markdown %s", path) } + } } } @@ -81,8 +99,5 @@ func RenderPages() { func main() { config.Load("ssgod.toml") - log.Printf("views=%s, layouts=%s, target=%s", - config.Settings.Views, config.Settings.Layout, config.Settings.Target) - RenderPages() }