2024-09-20 16:45:23 +00:00
|
|
|
package markdown
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"github.com/yuin/goldmark"
|
|
|
|
|
highlighting "github.com/yuin/goldmark-highlighting/v2"
|
|
|
|
|
"github.com/yuin/goldmark/extension"
|
|
|
|
|
"github.com/yuin/goldmark/parser"
|
|
|
|
|
"github.com/yuin/goldmark/renderer/html"
|
|
|
|
|
"io"
|
2024-09-20 18:25:14 +00:00
|
|
|
"io/fs"
|
2024-09-20 16:45:23 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type Renderer struct {
|
|
|
|
|
cache map[string]string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewRenderer() *Renderer {
|
|
|
|
|
return &Renderer{cache: make(map[string]string)}
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-20 18:25:14 +00:00
|
|
|
func (r *Renderer) RenderFile(source string, system fs.FS) string {
|
2024-09-20 16:45:23 +00:00
|
|
|
if val, ok := r.cache[source]; ok {
|
|
|
|
|
return val
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-20 18:25:14 +00:00
|
|
|
o, err := system.Open(source)
|
|
|
|
|
defer o.Close()
|
2024-09-20 16:45:23 +00:00
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buf := RenderMarkdown(o)
|
|
|
|
|
r.cache[source] = buf.String()
|
|
|
|
|
return r.cache[source]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func RenderMarkdown(reader io.Reader) bytes.Buffer {
|
|
|
|
|
md := goldmark.New(
|
|
|
|
|
goldmark.WithExtensions(extension.GFM),
|
|
|
|
|
goldmark.WithParserOptions(
|
|
|
|
|
parser.WithAutoHeadingID(),
|
|
|
|
|
),
|
|
|
|
|
goldmark.WithRendererOptions(
|
|
|
|
|
html.WithUnsafe(),
|
|
|
|
|
),
|
|
|
|
|
goldmark.WithExtensions(
|
|
|
|
|
highlighting.NewHighlighting(
|
|
|
|
|
highlighting.WithStyle("github"),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
source, _ := io.ReadAll(reader)
|
|
|
|
|
var buf bytes.Buffer
|
|
|
|
|
if err := md.Convert(source, &buf); err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return buf
|
|
|
|
|
}
|