feat: custom markdown renderer

This commit is contained in:
Guz
2025-04-11 16:23:04 -03:00
parent 50ba162e65
commit 14bb4c2fc3

72
app.go
View File

@@ -249,16 +249,7 @@ func (app *app) blogEN() blogo.Blogo {
blog.Use(gitea)
blog.Use(&listRenderer{app.templates, "en-US"})
rf := plugins.NewFoldingRenderer(plugins.FoldingRendererOpts{
Assertions: app.assert,
Logger: app.log.WithGroup("folding-renderer"),
})
rf.Use(markdown.New())
rf.Use(&blogPostRenderer{app.templates, "en"})
blog.Use(rf)
blog.Use(NewBlogPostRenderer(app.templates, "en-US"))
blog.Use(plugins.NewPlainText())
return blog
@@ -275,17 +266,8 @@ func (app *app) blogPT() blogo.Blogo {
})
blog.Use(gitea)
blog.Use(&listRenderer{app.templates, "pt"})
rf := plugins.NewFoldingRenderer(plugins.FoldingRendererOpts{
Assertions: app.assert,
Logger: app.log.WithGroup("folding-renderer"),
})
rf.Use(markdown.New())
rf.Use(&blogPostRenderer{app.templates, "pt"})
blog.Use(rf)
blog.Use(&listRenderer{app.templates, "pt-BR"})
blog.Use(NewBlogPostRenderer(app.templates, "pt-BR"))
blog.Use(plugins.NewPlainText())
return blog
@@ -302,10 +284,22 @@ func (app *app) ServeHTTP(w http.ResponseWriter, r *http.Request) {
type blogPostRenderer struct {
templates templates.ITemplate
lang string
parser parser.Parser
renderer renderer.Renderer
}
var _ plugin.Renderer = (*blogPostRenderer)(nil)
func NewBlogPostRenderer(templates templates.ITemplate, lang string) *blogPostRenderer {
return &blogPostRenderer{
templates: templates,
lang: lang,
parser: md.Parser(),
renderer: md.Renderer(),
}
}
func (r *blogPostRenderer) Name() string {
return "capytal-blogpostrenderer-renderer"
}
@@ -318,18 +312,44 @@ func (r *blogPostRenderer) Render(src fs.File, w io.Writer) error {
return err
}
m := re.FindStringSubmatch(string(c))
doc := r.parser.Parse(text.NewReader(c))
meta := doc.OwnerDocument().Meta()
title := "Blog"
if len(m) > 1 {
t := strings.TrimSuffix(strings.TrimPrefix(m[0], "<h1>"), "</h1>")
title = fmt.Sprintf("%s - Capytal's Blog", t)
if t, ok := meta["title"]; ok {
tt, ok := t.(string)
if ok {
title = tt
}
} else {
err := ast.Walk(doc, func(n ast.Node, entering bool) (ast.WalkStatus, error) {
if n.Kind().String() != "Heading" {
return ast.WalkContinue, nil
}
if h, ok := n.(*ast.Heading); !ok || h.Level > 1 {
return ast.WalkContinue, nil
}
// TODO: This is deprecated
title = string(n.Text(c))
return ast.WalkStop, nil
})
if err != nil {
return err
}
}
f := new(strings.Builder)
err = r.renderer.Render(f, c, doc)
if err != nil {
return err
}
return r.templates.ExecuteTemplate(w, "blog-post", map[string]any{
"Title": title,
"Lang": r.lang,
"Content": template.HTML(string(c)),
"Content": template.HTML(f.String()),
})
}