2021-06-12 03:51:07 +00:00
|
|
|
package parsing
|
|
|
|
|
|
|
|
import (
|
2021-06-13 17:22:55 +00:00
|
|
|
"bytes"
|
|
|
|
|
|
|
|
"github.com/yuin/goldmark"
|
2021-06-23 03:52:04 +00:00
|
|
|
highlighting "github.com/yuin/goldmark-highlighting"
|
2021-06-13 17:22:55 +00:00
|
|
|
"github.com/yuin/goldmark/extension"
|
2021-06-23 03:52:04 +00:00
|
|
|
"github.com/yuin/goldmark/util"
|
2021-06-12 03:51:07 +00:00
|
|
|
)
|
|
|
|
|
2021-07-05 18:34:51 +00:00
|
|
|
// Used for rendering real-time previews of post content.
|
|
|
|
var PreviewMarkdown = goldmark.New(
|
|
|
|
goldmark.WithExtensions(makeGoldmarkExtensions(true)...),
|
2021-06-13 17:22:55 +00:00
|
|
|
)
|
2021-07-05 18:34:51 +00:00
|
|
|
|
|
|
|
// Used for generating the final HTML for a post.
|
|
|
|
var RealMarkdown = goldmark.New(
|
|
|
|
goldmark.WithExtensions(makeGoldmarkExtensions(false)...),
|
2021-06-20 18:01:40 +00:00
|
|
|
)
|
|
|
|
|
2021-07-05 18:34:51 +00:00
|
|
|
// Used for generating plain-text previews of posts.
|
|
|
|
var PlaintextMarkdown = goldmark.New(
|
|
|
|
goldmark.WithExtensions(makeGoldmarkExtensions(false)...),
|
|
|
|
goldmark.WithRenderer(plaintextRenderer{}),
|
|
|
|
)
|
2021-06-13 17:22:55 +00:00
|
|
|
|
2021-07-23 19:00:37 +00:00
|
|
|
func ParseMarkdown(source string, md goldmark.Markdown) string {
|
2021-06-13 17:22:55 +00:00
|
|
|
var buf bytes.Buffer
|
|
|
|
if err := md.Convert([]byte(source), &buf); err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return buf.String()
|
|
|
|
}
|
2021-06-23 03:52:04 +00:00
|
|
|
|
2021-07-05 18:34:51 +00:00
|
|
|
func makeGoldmarkExtensions(preview bool) []goldmark.Extender {
|
|
|
|
return []goldmark.Extender{
|
|
|
|
extension.GFM,
|
|
|
|
highlightExtension,
|
|
|
|
SpoilerExtension{},
|
|
|
|
EmbedExtension{
|
|
|
|
Preview: preview,
|
|
|
|
},
|
|
|
|
MathjaxExtension{},
|
|
|
|
BBCodeExtension{
|
|
|
|
Preview: preview,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-23 03:52:04 +00:00
|
|
|
var highlightExtension = highlighting.NewHighlighting(
|
|
|
|
highlighting.WithFormatOptions(HMNChromaOptions...),
|
|
|
|
highlighting.WithWrapperRenderer(func(w util.BufWriter, context highlighting.CodeBlockContext, entering bool) {
|
|
|
|
if entering {
|
|
|
|
w.WriteString(`<pre class="hmn-code">`)
|
|
|
|
} else {
|
|
|
|
w.WriteString(`</pre>`)
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
)
|