diff --git a/markdown.go b/markdown.go index d489ce8..43988c1 100644 --- a/markdown.go +++ b/markdown.go @@ -3,7 +3,6 @@ package main import ( "bytes" "strings" - "sync" kemoji "github.com/kyokomi/emoji" "github.com/yuin/goldmark" @@ -18,7 +17,6 @@ import ( ) var emojilib definition.Emojis -var emojiOnce sync.Once var markdown goldmark.Markdown @@ -40,43 +38,38 @@ func initMarkdown() { emoji.New( emoji.WithEmojis(emojiGoLib()), ), - // Links - newCustomExtension(), + // Custom + &customExtension{}, ), ) } -func renderMarkdown(source string) (content []byte, err error) { +func renderMarkdown(source string) ([]byte, error) { var buffer bytes.Buffer - err = markdown.Convert([]byte(source), &buffer) - content = buffer.Bytes() - return + err := markdown.Convert([]byte(source), &buffer) + return buffer.Bytes(), err } // Extensions etc... // All emojis from emoji lib func emojiGoLib() definition.Emojis { - emojiOnce.Do(func() { + if emojilib == nil { var emojis []definition.Emoji for shotcode, e := range kemoji.CodeMap() { emojis = append(emojis, definition.NewEmoji(e, []rune(e), strings.ReplaceAll(shotcode, ":", ""))) } emojilib = definition.NewEmojis(emojis...) - }) + } return emojilib } // Links type customExtension struct{} -func newCustomExtension() goldmark.Extender { - return &customExtension{} -} - func (l *customExtension) Extend(m goldmark.Markdown) { m.Renderer().AddOptions(renderer.WithNodeRenderers( - util.Prioritized(newLinkRenderer(), 500), + util.Prioritized(&customRenderer{}, 500), )) } @@ -88,28 +81,27 @@ func (c *customRenderer) RegisterFuncs(r renderer.NodeRendererFuncRegisterer) { } func (c *customRenderer) renderLink(w util.BufWriter, _ []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { - n := node.(*ast.Link) if entering { - // Make URL absolute if it's relative - newDestination := string(util.URLEscape(n.Destination, true)) - if strings.HasPrefix(newDestination, "/") { - newDestination = appConfig.Server.PublicAddress + newDestination - } - // Write URL + n := node.(*ast.Link) _, _ = w.WriteString("') + _, _ = w.WriteRune('>') } else { _, _ = w.WriteString("") } @@ -122,28 +114,26 @@ func (c *customRenderer) renderImage(w util.BufWriter, source []byte, node ast.N } n := node.(*ast.Image) // Make URL absolute if it's relative - destination := string(util.URLEscape(n.Destination, true)) - if strings.HasPrefix(destination, "/") { - destination = appConfig.Server.PublicAddress + destination + destination := util.URLEscape(n.Destination, true) + if bytes.HasPrefix(destination, []byte("/")) { + destination = util.EscapeHTML(append([]byte(appConfig.Server.PublicAddress), destination...)) + } else { + destination = util.EscapeHTML(destination) } _, _ = w.WriteString("") _, _ = w.WriteString("`)
+	_, _ = w.Write(destination)
+	_, _ = w.WriteString(") return ast.WalkSkipChildren, nil } - -func newLinkRenderer() renderer.NodeRenderer { - return &customRenderer{} -}