blog/markdown/markdown.go

56 lines
1.2 KiB
Go

package markdown
import (
"bytes"
"io"
"strings"
"go.jolheiser.com/emdbed"
chromahtml "github.com/alecthomas/chroma/formatters/html"
"github.com/yuin/goldmark"
emoji "github.com/yuin/goldmark-emoji"
highlighting "github.com/yuin/goldmark-highlighting"
"github.com/yuin/goldmark/extension"
"github.com/yuin/goldmark/parser"
"github.com/yuin/goldmark/renderer/html"
)
var gm = goldmark.New(
goldmark.WithExtensions(
extension.GFM,
highlighting.NewHighlighting(
highlighting.WithStyle("monokai"),
highlighting.WithFormatOptions(
chromahtml.WithLineNumbers(true),
chromahtml.LinkableLineNumbers(true, "code-"),
chromahtml.LineNumbersInTable(true),
),
),
emoji.Emoji,
),
goldmark.WithParserOptions(
parser.WithAutoHeadingID(),
),
goldmark.WithRendererOptions(
html.WithHardWraps(),
),
)
// Convert transforms a markdown document into HTML
func Convert(baseDir string, r io.Reader) (string, error) {
content, err := Content(r)
if err != nil {
return "", err
}
content, err = emdbed.Convert(baseDir, strings.NewReader(content))
if err != nil {
return "", err
}
var buf bytes.Buffer
if err := gm.Convert([]byte(content), &buf); err != nil {
return "", err
}
return buf.String(), nil
}