mirror of
https://github.com/yuin/goldmark
synced 2025-03-04 23:04:52 +00:00
Fixes #457
This commit is contained in:
parent
dc32f35808
commit
15ade8aace
3 changed files with 55 additions and 8 deletions
|
|
@ -787,3 +787,10 @@ text" /></p>
|
||||||
//- - - - - - - - -//
|
//- - - - - - - - -//
|
||||||
<p><img src="https://example.com/img.png" alt="`alt" /></p>
|
<p><img src="https://example.com/img.png" alt="`alt" /></p>
|
||||||
//= = = = = = = = = = = = = = = = = = = = = = = =//
|
//= = = = = = = = = = = = = = = = = = = = = = = =//
|
||||||
|
|
||||||
|
63: Emphasis in link label
|
||||||
|
//- - - - - - - - -//
|
||||||
|
[*[a]*](b)
|
||||||
|
//- - - - - - - - -//
|
||||||
|
<p><a href="b"><em>[a]</em></a></p>
|
||||||
|
//= = = = = = = = = = = = = = = = = = = = = = = =//
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,13 @@
|
||||||
package goldmark
|
package goldmark
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io"
|
||||||
|
|
||||||
"github.com/yuin/goldmark/parser"
|
"github.com/yuin/goldmark/parser"
|
||||||
"github.com/yuin/goldmark/renderer"
|
"github.com/yuin/goldmark/renderer"
|
||||||
"github.com/yuin/goldmark/renderer/html"
|
"github.com/yuin/goldmark/renderer/html"
|
||||||
"github.com/yuin/goldmark/text"
|
"github.com/yuin/goldmark/text"
|
||||||
"github.com/yuin/goldmark/util"
|
"github.com/yuin/goldmark/util"
|
||||||
"io"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// DefaultParser returns a new Parser that is configured by default values.
|
// DefaultParser returns a new Parser that is configured by default values.
|
||||||
|
|
|
||||||
|
|
@ -126,13 +126,13 @@ func (s *linkParser) Parse(parent ast.Node, block text.Reader, pc Context) ast.N
|
||||||
if line[0] == '!' {
|
if line[0] == '!' {
|
||||||
if len(line) > 1 && line[1] == '[' {
|
if len(line) > 1 && line[1] == '[' {
|
||||||
block.Advance(1)
|
block.Advance(1)
|
||||||
pc.Set(linkBottom, pc.LastDelimiter())
|
pushLinkBottom(pc)
|
||||||
return processLinkLabelOpen(block, segment.Start+1, true, pc)
|
return processLinkLabelOpen(block, segment.Start+1, true, pc)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if line[0] == '[' {
|
if line[0] == '[' {
|
||||||
pc.Set(linkBottom, pc.LastDelimiter())
|
pushLinkBottom(pc)
|
||||||
return processLinkLabelOpen(block, segment.Start, false, pc)
|
return processLinkLabelOpen(block, segment.Start, false, pc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -143,6 +143,7 @@ func (s *linkParser) Parse(parent ast.Node, block text.Reader, pc Context) ast.N
|
||||||
}
|
}
|
||||||
last := tlist.(*linkLabelState).Last
|
last := tlist.(*linkLabelState).Last
|
||||||
if last == nil {
|
if last == nil {
|
||||||
|
_ = popLinkBottom(pc)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
block.Advance(1)
|
block.Advance(1)
|
||||||
|
|
@ -151,11 +152,13 @@ func (s *linkParser) Parse(parent ast.Node, block text.Reader, pc Context) ast.N
|
||||||
// > A link label can have at most 999 characters inside the square brackets.
|
// > A link label can have at most 999 characters inside the square brackets.
|
||||||
if linkLabelStateLength(tlist.(*linkLabelState)) > 998 {
|
if linkLabelStateLength(tlist.(*linkLabelState)) > 998 {
|
||||||
ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment)
|
ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment)
|
||||||
|
_ = popLinkBottom(pc)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if !last.IsImage && 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)
|
ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment)
|
||||||
|
_ = popLinkBottom(pc)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -169,6 +172,7 @@ func (s *linkParser) Parse(parent ast.Node, block text.Reader, pc Context) ast.N
|
||||||
link, hasValue = s.parseReferenceLink(parent, last, block, pc)
|
link, hasValue = s.parseReferenceLink(parent, last, block, pc)
|
||||||
if link == nil && hasValue {
|
if link == nil && hasValue {
|
||||||
ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment)
|
ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment)
|
||||||
|
_ = popLinkBottom(pc)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -182,12 +186,14 @@ func (s *linkParser) Parse(parent ast.Node, block text.Reader, pc Context) ast.N
|
||||||
// > A link label can have at most 999 characters inside the square brackets.
|
// > A link label can have at most 999 characters inside the square brackets.
|
||||||
if len(maybeReference) > 999 {
|
if len(maybeReference) > 999 {
|
||||||
ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment)
|
ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment)
|
||||||
|
_ = popLinkBottom(pc)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
ref, ok := pc.Reference(util.ToLinkReference(maybeReference))
|
ref, ok := pc.Reference(util.ToLinkReference(maybeReference))
|
||||||
if !ok {
|
if !ok {
|
||||||
ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment)
|
ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment)
|
||||||
|
_ = popLinkBottom(pc)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
link = ast.NewLink()
|
link = ast.NewLink()
|
||||||
|
|
@ -230,11 +236,7 @@ func processLinkLabelOpen(block text.Reader, pos int, isImage bool, pc Context)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *linkParser) processLinkLabel(parent ast.Node, link *ast.Link, last *linkLabelState, pc Context) {
|
func (s *linkParser) processLinkLabel(parent ast.Node, link *ast.Link, last *linkLabelState, pc Context) {
|
||||||
var bottom ast.Node
|
bottom := popLinkBottom(pc)
|
||||||
if v := pc.Get(linkBottom); v != nil {
|
|
||||||
bottom = v.(ast.Node)
|
|
||||||
}
|
|
||||||
pc.Set(linkBottom, nil)
|
|
||||||
ProcessDelimiters(bottom, pc)
|
ProcessDelimiters(bottom, pc)
|
||||||
for c := last.NextSibling(); c != nil; {
|
for c := last.NextSibling(); c != nil; {
|
||||||
next := c.NextSibling()
|
next := c.NextSibling()
|
||||||
|
|
@ -395,6 +397,43 @@ func parseLinkTitle(block text.Reader) ([]byte, bool) {
|
||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func pushLinkBottom(pc Context) {
|
||||||
|
bottoms := pc.Get(linkBottom)
|
||||||
|
b := pc.LastDelimiter()
|
||||||
|
if bottoms == nil {
|
||||||
|
pc.Set(linkBottom, b)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if s, ok := bottoms.([]ast.Node); ok {
|
||||||
|
pc.Set(linkBottom, append(s, b))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
pc.Set(linkBottom, []ast.Node{bottoms.(ast.Node), b})
|
||||||
|
}
|
||||||
|
|
||||||
|
func popLinkBottom(pc Context) ast.Node {
|
||||||
|
bottoms := pc.Get(linkBottom)
|
||||||
|
if bottoms == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if v, ok := bottoms.(ast.Node); ok {
|
||||||
|
pc.Set(linkBottom, nil)
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
s := bottoms.([]ast.Node)
|
||||||
|
v := s[len(s)-1]
|
||||||
|
n := s[0 : len(s)-1]
|
||||||
|
switch len(n) {
|
||||||
|
case 0:
|
||||||
|
pc.Set(linkBottom, nil)
|
||||||
|
case 1:
|
||||||
|
pc.Set(linkBottom, n[0])
|
||||||
|
default:
|
||||||
|
pc.Set(linkBottom, s[0:len(s)-1])
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
func (s *linkParser) CloseBlock(parent ast.Node, block text.Reader, pc Context) {
|
func (s *linkParser) CloseBlock(parent ast.Node, block text.Reader, pc Context) {
|
||||||
pc.Set(linkBottom, nil)
|
pc.Set(linkBottom, nil)
|
||||||
tlist := pc.Get(linkLabelStateKey)
|
tlist := pc.Get(linkLabelStateKey)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue