main mdparser.go
Eric Bower  ·  2026-09-14
 1package main
 2
 3import (
 4	"bytes"
 5
 6	"github.com/alecthomas/chroma/v2/formatters/html"
 7	"github.com/yuin/goldmark"
 8	highlighting "github.com/yuin/goldmark-highlighting/v2"
 9	meta "github.com/yuin/goldmark-meta"
10	"github.com/yuin/goldmark/extension"
11	"github.com/yuin/goldmark/parser"
12	ghtml "github.com/yuin/goldmark/renderer/html"
13	gtext "github.com/yuin/goldmark/text"
14	"go.abhg.dev/goldmark/anchor"
15	"go.abhg.dev/goldmark/hashtag"
16)
17
18func CreateGoldmark(extenders ...goldmark.Extender) goldmark.Markdown {
19	return goldmark.New(
20		goldmark.WithExtensions(
21			extenders...,
22		),
23		goldmark.WithParserOptions(
24			parser.WithAutoHeadingID(),
25		),
26		goldmark.WithRendererOptions(
27			ghtml.WithUnsafe(),
28		),
29	)
30}
31
32func ParseMarkdown(text string) (string, error) {
33	hili := highlighting.NewHighlighting(
34		highlighting.WithFormatOptions(
35			html.WithClasses(true),
36		),
37	)
38	extenders := []goldmark.Extender{
39		extension.GFM,
40		extension.Footnote,
41		meta.Meta,
42		&hashtag.Extender{},
43		hili,
44		&anchor.Extender{
45			Position: anchor.After,
46			Texter:   anchor.Text("#"),
47		},
48	}
49	md := CreateGoldmark(extenders...)
50	context := parser.NewContext()
51	btext := []byte(text)
52	doc := md.Parser().Parse(gtext.NewReader(btext), parser.WithContext(context))
53
54	var buf bytes.Buffer
55	if err := md.Renderer().Render(&buf, btext, doc); err != nil {
56		return "", err
57	}
58	return buf.String(), nil
59}