mirror of
https://github.com/yuin/goldmark
synced 2025-03-04 23:04:52 +00:00
Closes #41
This commit is contained in:
parent
8549b83b0c
commit
9f9f8f0e5e
2 changed files with 46 additions and 4 deletions
|
|
@ -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),
|
||||||
|
),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue