phase2: markdown converter with goldmark, chroma, and ASCII-translit anchors

This commit is contained in:
Sergey Filkin
2026-04-18 11:47:18 +03:00
parent cab04768b5
commit 8deba3627f
39 changed files with 5662 additions and 0 deletions
+45
View File
@@ -0,0 +1,45 @@
package converter
import (
"github.com/yuin/goldmark/ast"
"github.com/yuin/goldmark/renderer"
"github.com/yuin/goldmark/util"
)
type escapedRawHTMLRenderer struct{}
func (r *escapedRawHTMLRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
reg.Register(ast.KindHTMLBlock, r.renderHTMLBlock)
reg.Register(ast.KindRawHTML, r.renderRawHTML)
}
func (r *escapedRawHTMLRenderer) renderHTMLBlock(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
n := node.(*ast.HTMLBlock)
if entering {
for i := 0; i < n.Lines().Len(); i++ {
line := n.Lines().At(i)
_, _ = w.Write(util.EscapeHTML(line.Value(source)))
}
return ast.WalkContinue, nil
}
if n.HasClosure() {
_, _ = w.Write(util.EscapeHTML(n.ClosureLine.Value(source)))
}
return ast.WalkContinue, nil
}
func (r *escapedRawHTMLRenderer) renderRawHTML(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
if !entering {
return ast.WalkSkipChildren, nil
}
n := node.(*ast.RawHTML)
for i := 0; i < n.Segments.Len(); i++ {
segment := n.Segments.At(i)
_, _ = w.Write(util.EscapeHTML(segment.Value(source)))
}
return ast.WalkSkipChildren, nil
}