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}