diff --git a/blogo/markdown/markdown.go b/blogo/markdown/markdown.go new file mode 100644 index 0000000..57db946 --- /dev/null +++ b/blogo/markdown/markdown.go @@ -0,0 +1,59 @@ +package markdown + +import ( + "io" + "io/fs" + "strings" + + "github.com/yuin/goldmark" + meta "github.com/yuin/goldmark-meta" + "github.com/yuin/goldmark/extension" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/renderer" + "github.com/yuin/goldmark/text" + + "forge.capytal.company/loreddev/x/blogo" +) + +const pluginName = "blogo-markdown" + +type plugin struct { + parser parser.Parser + renderer renderer.Renderer +} + +func New() blogo.Plugin { + m := goldmark.New( + goldmark.WithExtensions( + extension.NewLinkify(), + meta.Meta, + ), + ) + + return &plugin{ + parser: m.Parser(), + renderer: m.Renderer(), + } +} + +func (p *plugin) Name() string { + return pluginName +} + +func (p *plugin) Render(f fs.File, w io.Writer) error { + stat, err := f.Stat() + if err != nil || !strings.HasSuffix(stat.Name(), ".md") { + return blogo.ErrRendererNotSupportedFile + } + + src, err := io.ReadAll(f) + if err != nil { + return err + } + + txt := text.NewReader(src) + + ast := p.parser.Parse(txt) + + return p.renderer.Render(w, src, ast) +} diff --git a/go.mod b/go.mod index ad6de2f..654d80f 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,10 @@ module forge.capytal.company/loreddev/x go 1.23.3 -require github.com/a-h/templ v0.2.793 +require ( + github.com/a-h/templ v0.2.793 + github.com/yuin/goldmark v1.7.8 + github.com/yuin/goldmark-meta v1.1.0 +) + +require gopkg.in/yaml.v2 v2.3.0 // indirect diff --git a/go.sum b/go.sum index dab7b07..48d0b02 100644 --- a/go.sum +++ b/go.sum @@ -2,3 +2,11 @@ github.com/a-h/templ v0.2.793 h1:Io+/ocnfGWYO4VHdR0zBbf39PQlnzVCVVD+wEEs6/qY= github.com/a-h/templ v0.2.793/go.mod h1:lq48JXoUvuQrU0VThrK31yFwdRjTCnIE5bcPCM9IP1w= 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/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= +github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark-meta v1.1.0 h1:pWw+JLHGZe8Rk0EGsMVssiNb/AaPMHfSRszZeUeiOUc= +github.com/yuin/goldmark-meta v1.1.0/go.mod h1:U4spWENafuA7Zyg+Lj5RqK/MF+ovMYtBvXi1lBb2VP0= +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.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=