This commit is contained in:
yuin 2019-11-30 03:33:46 +09:00
parent 8549b83b0c
commit 9f9f8f0e5e
2 changed files with 46 additions and 4 deletions

View file

@ -132,11 +132,53 @@ func (s *linkifyParser) CloseBlock(parent ast.Node, pc parser.Context) {
type linkify struct { type linkify struct {
} }
type linkifyASTTransformer struct {
}
var defaultLinkifyASTTransformer = &linkifyASTTransformer{}
// NewLinkifyASTTransformer returns a new parser.ASTTransformer that
// is related to AutoLink.
func NewLinkifyASTTransformer() parser.ASTTransformer {
return defaultLinkifyASTTransformer
}
func (a *linkifyASTTransformer) Transform(node *ast.Document, reader text.Reader, pc parser.Context) {
var autoLinks []*ast.AutoLink
_ = ast.Walk(node, func(n ast.Node, entering bool) (ast.WalkStatus, error) {
if entering {
if autoLink, ok := n.(*ast.AutoLink); ok {
autoLinks = append(autoLinks, autoLink)
}
}
return ast.WalkContinue, nil
})
for _, autoLink := range autoLinks {
nested := false
for p := autoLink.Parent(); p != nil; p = p.Parent() {
if _, ok := p.(*ast.Link); ok {
nested = true
break
}
}
if nested {
parent := autoLink.Parent()
parent.ReplaceChild(parent, autoLink, ast.NewString(autoLink.Label(reader.Source())))
}
}
}
// Linkify is an extension that allow you to parse text that seems like a URL. // Linkify is an extension that allow you to parse text that seems like a URL.
var Linkify = &linkify{} var Linkify = &linkify{}
func (e *linkify) Extend(m goldmark.Markdown) { func (e *linkify) Extend(m goldmark.Markdown) {
m.Parser().AddOptions(parser.WithInlineParsers( m.Parser().AddOptions(
parser.WithInlineParsers(
util.Prioritized(NewLinkifyParser(), 999), util.Prioritized(NewLinkifyParser(), 999),
)) ),
parser.WithASTTransformers(
util.Prioritized(NewLinkifyASTTransformer(), 999),
),
)
} }

View file

@ -4,8 +4,8 @@ import (
"testing" "testing"
"github.com/yuin/goldmark" "github.com/yuin/goldmark"
"github.com/yuin/goldmark/testutil"
"github.com/yuin/goldmark/renderer/html" "github.com/yuin/goldmark/renderer/html"
"github.com/yuin/goldmark/testutil"
) )
func TestLinkify(t *testing.T) { func TestLinkify(t *testing.T) {