package html
import (
"bytes"
"fmt"
"github.com/usememos/memos/plugin/gomark/ast"
)
// HTMLRenderer is a simple renderer that converts AST to HTML.
// nolint
type HTMLRenderer struct {
output *bytes.Buffer
context *RendererContext
}
type RendererContext struct {
}
// NewHTMLRenderer creates a new HTMLRenderer.
func NewHTMLRenderer() *HTMLRenderer {
return &HTMLRenderer{
output: new(bytes.Buffer),
context: &RendererContext{},
}
}
// RenderNode renders a single AST node to HTML.
func (r *HTMLRenderer) RenderNode(node ast.Node) {
prevSibling, nextSibling := node.GetPrevSibling(), node.GetNextSibling()
switch n := node.(type) {
case *ast.LineBreak:
r.output.WriteString("
")
case *ast.Paragraph:
r.output.WriteString("
") r.RenderNodes(n.Children) r.output.WriteString("
") case *ast.CodeBlock: r.output.WriteString("")
r.output.WriteString(n.Content)
r.output.WriteString("
")
case *ast.Heading:
r.output.WriteString(fmt.Sprintf("") } r.RenderNodes(n.Children) if nextSibling != nil && nextSibling.Type() == ast.NodeTypeBlockquote { r.RenderNode(nextSibling) } if prevSibling == nil || prevSibling.Type() != ast.NodeTypeBlockquote { r.output.WriteString("") } case *ast.BoldItalic: r.output.WriteString("") r.output.WriteString(n.Content) r.output.WriteString("") case *ast.Bold: r.output.WriteString("") r.output.WriteString(n.Content) r.output.WriteString("") case *ast.Italic: r.output.WriteString("") r.output.WriteString(n.Content) r.output.WriteString("") case *ast.Code: r.output.WriteString("
")
r.output.WriteString(n.Content)
r.output.WriteString("
")
case *ast.Link:
r.output.WriteString(``)
r.output.WriteString(n.Text)
r.output.WriteString("")
case *ast.Image:
r.output.WriteString(`