mirror of https://github.com/jlelse/GoBlog
Custom link rendering
This commit is contained in:
parent
856f0a307c
commit
dbbc498994
64
markdown.go
64
markdown.go
|
@ -6,9 +6,12 @@ import (
|
||||||
"github.com/yuin/goldmark"
|
"github.com/yuin/goldmark"
|
||||||
"github.com/yuin/goldmark-emoji"
|
"github.com/yuin/goldmark-emoji"
|
||||||
"github.com/yuin/goldmark-emoji/definition"
|
"github.com/yuin/goldmark-emoji/definition"
|
||||||
|
"github.com/yuin/goldmark/ast"
|
||||||
"github.com/yuin/goldmark/extension"
|
"github.com/yuin/goldmark/extension"
|
||||||
"github.com/yuin/goldmark/parser"
|
"github.com/yuin/goldmark/parser"
|
||||||
|
"github.com/yuin/goldmark/renderer"
|
||||||
"github.com/yuin/goldmark/renderer/html"
|
"github.com/yuin/goldmark/renderer/html"
|
||||||
|
"github.com/yuin/goldmark/util"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
@ -32,8 +35,10 @@ func initMarkdown() {
|
||||||
extension.Typographer,
|
extension.Typographer,
|
||||||
// Emojis
|
// Emojis
|
||||||
emoji.New(
|
emoji.New(
|
||||||
emoji.WithEmojis(EmojiGoLib()),
|
emoji.WithEmojis(emojiGoLib()),
|
||||||
),
|
),
|
||||||
|
// Links
|
||||||
|
newLinkExtension(),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -45,7 +50,10 @@ func renderMarkdown(source string) (content []byte, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func EmojiGoLib() definition.Emojis {
|
// Extensions etc...
|
||||||
|
|
||||||
|
// All emojis from emoji lib
|
||||||
|
func emojiGoLib() definition.Emojis {
|
||||||
emojiOnce.Do(func() {
|
emojiOnce.Do(func() {
|
||||||
var emojis []definition.Emoji
|
var emojis []definition.Emoji
|
||||||
for shotcode, e := range kemoji.CodeMap() {
|
for shotcode, e := range kemoji.CodeMap() {
|
||||||
|
@ -55,3 +63,55 @@ func EmojiGoLib() definition.Emojis {
|
||||||
})
|
})
|
||||||
return emojilib
|
return emojilib
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Links
|
||||||
|
type linkExtension struct{}
|
||||||
|
|
||||||
|
func newLinkExtension() goldmark.Extender {
|
||||||
|
return &linkExtension{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *linkExtension) Extend(m goldmark.Markdown) {
|
||||||
|
m.Renderer().AddOptions(renderer.WithNodeRenderers(
|
||||||
|
util.Prioritized(newLinkRenderer(), 500),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
type linkRenderer struct{}
|
||||||
|
|
||||||
|
func (l *linkRenderer) RegisterFuncs(r renderer.NodeRendererFuncRegisterer) {
|
||||||
|
r.Register(ast.KindLink, l.renderLink)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *linkRenderer) 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
|
||||||
|
_, _ = w.WriteString("<a href=\"")
|
||||||
|
_, _ = w.Write(util.EscapeHTML([]byte(newDestination)))
|
||||||
|
_ = w.WriteByte('"')
|
||||||
|
// Open external links (links that start with "http") in new tab
|
||||||
|
if strings.HasPrefix(string(n.Destination), "http") {
|
||||||
|
_, _ = w.WriteString(` target="_blank" rel="noopener"`)
|
||||||
|
}
|
||||||
|
// Title
|
||||||
|
if n.Title != nil {
|
||||||
|
_, _ = w.WriteString(` title="`)
|
||||||
|
_, _ = w.Write(n.Title)
|
||||||
|
_ = w.WriteByte('"')
|
||||||
|
}
|
||||||
|
_ = w.WriteByte('>')
|
||||||
|
} else {
|
||||||
|
_, _ = w.WriteString("</a>")
|
||||||
|
}
|
||||||
|
return ast.WalkContinue, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func newLinkRenderer() renderer.NodeRenderer {
|
||||||
|
return &linkRenderer{}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue