mugit/internal/markdown/markdown.go (view raw)
| 1 | package markdown |
| 2 | |
| 3 | import ( |
| 4 | "bytes" |
| 5 | "path/filepath" |
| 6 | |
| 7 | "github.com/yuin/goldmark" |
| 8 | emoji "github.com/yuin/goldmark-emoji" |
| 9 | "github.com/yuin/goldmark/extension" |
| 10 | "github.com/yuin/goldmark/parser" |
| 11 | "github.com/yuin/goldmark/renderer/html" |
| 12 | callout "gitlab.com/staticnoise/goldmark-callout" |
| 13 | ) |
| 14 | |
| 15 | var ( |
| 16 | repoNameKey = parser.NewContextKey() |
| 17 | repoRefKey = parser.NewContextKey() |
| 18 | baseDirKey = parser.NewContextKey() |
| 19 | |
| 20 | markdown = goldmark.New( |
| 21 | goldmark.WithRendererOptions(html.WithUnsafe()), |
| 22 | goldmark.WithParserOptions(parser.WithAutoHeadingID()), |
| 23 | goldmark.WithExtensions( |
| 24 | extension.GFM, |
| 25 | emoji.Emoji, |
| 26 | callout.CalloutExtention, |
| 27 | &relativeLink{}, |
| 28 | )) |
| 29 | ) |
| 30 | |
| 31 | func Render(repoName, repoRef, readmePath, readmeSource string) (string, error) { |
| 32 | ctx := parser.NewContext() |
| 33 | ctx.Set(repoNameKey, repoName) |
| 34 | ctx.Set(repoRefKey, repoRef) |
| 35 | ctx.Set(baseDirKey, filepath.Dir(readmePath)) |
| 36 | parserOpts := parser.WithContext(ctx) |
| 37 | |
| 38 | var buf bytes.Buffer |
| 39 | if err := markdown.Convert([]byte(readmeSource), &buf, parserOpts); err != nil { |
| 40 | return "", err |
| 41 | } |
| 42 | return buf.String(), nil |
| 43 | } |