From 05d89a0b453fa00b429a3b89a8f9628580c05138 Mon Sep 17 00:00:00 2001 From: yuin Date: Sun, 17 Oct 2021 17:29:01 +0900 Subject: [PATCH] #248 - 7 --- _test/extra.txt | 8 +++++++- parser/link.go | 12 +++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/_test/extra.txt b/_test/extra.txt index f8d89e6..7e849f1 100644 --- a/_test/extra.txt +++ b/_test/extra.txt @@ -542,7 +542,6 @@ _a[b_c_](d)

[o] :x

//= = = = = = = = = = = = = = = = = = = = = = = =// - 42: Unclosed link reference titles can interrupt link references //- - - - - - - - -// [r]: @@ -556,3 +555,10 @@ x

'

'

//= = = = = = = = = = = = = = = = = = = = = = = =// + +43: A link containing an image containing a link should disable the outer link +//- - - - - - - - -// +[ ![ [b](c) ](x) ](y) +//- - - - - - - - -// +

[  b ](y)

+//= = = = = = = = = = = = = = = = = = = = = = = =// diff --git a/parser/link.go b/parser/link.go index 4717d6e..bd96dfb 100644 --- a/parser/link.go +++ b/parser/link.go @@ -140,7 +140,7 @@ func (s *linkParser) Parse(parent ast.Node, block text.Reader, pc Context) ast.N } block.Advance(1) removeLinkLabelState(pc, last) - if s.containsLink(last) { // a link in a link text is not allowed + if !last.IsImage && s.containsLink(last) { // a link in a link text is not allowed ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment) return nil } @@ -182,15 +182,17 @@ func (s *linkParser) Parse(parent ast.Node, block text.Reader, pc Context) ast.N return link } -func (s *linkParser) containsLink(last *linkLabelState) bool { - if last.IsImage { +func (s *linkParser) containsLink(n ast.Node) bool { + if n == nil { return false } - var c ast.Node - for c = last; c != nil; c = c.NextSibling() { + for c := n; c != nil; c = c.NextSibling() { if _, ok := c.(*ast.Link); ok { return true } + if s.containsLink(c.FirstChild()) { + return true + } } return false }