diff options
Diffstat (limited to 'utils/markdown/inlines.go')
-rw-r--r-- | utils/markdown/inlines.go | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/utils/markdown/inlines.go b/utils/markdown/inlines.go index 03da2f15c..8a4f7a531 100644 --- a/utils/markdown/inlines.go +++ b/utils/markdown/inlines.go @@ -21,7 +21,8 @@ func (inlineBase) IsInline() bool { return true } type Text struct { inlineBase - Text string + Text string + Range Range } type CodeSpan struct { @@ -141,8 +142,10 @@ func (p *inlineParser) parseBackticks() { return } p.position += len(opening) + absPos := relativeToAbsolutePosition(p.ranges, p.position-len(opening)) p.inlines = append(p.inlines, &Text{ - Text: opening, + Text: opening, + Range: Range{absPos, absPos + len(opening)}, }) } @@ -162,13 +165,17 @@ func (p *inlineParser) parseLineEnding() { func (p *inlineParser) parseEscapeCharacter() { if p.position+1 < len(p.raw) && isEscapableByte(p.raw[p.position+1]) { + absPos := relativeToAbsolutePosition(p.ranges, p.position+1) p.inlines = append(p.inlines, &Text{ - Text: string(p.raw[p.position+1]), + Text: string(p.raw[p.position+1]), + Range: Range{absPos, absPos + len(string(p.raw[p.position+1]))}, }) p.position += 2 } else { + absPos := relativeToAbsolutePosition(p.ranges, p.position) p.inlines = append(p.inlines, &Text{ - Text: `\`, + Text: `\`, + Range: Range{absPos, absPos + 1}, }) p.position++ } @@ -176,18 +183,24 @@ func (p *inlineParser) parseEscapeCharacter() { func (p *inlineParser) parseText() { if next := strings.IndexAny(p.raw[p.position:], "\r\n\\`&![]"); next == -1 { + absPos := relativeToAbsolutePosition(p.ranges, p.position) p.inlines = append(p.inlines, &Text{ - Text: strings.TrimRightFunc(p.raw[p.position:], isWhitespace), + Text: strings.TrimRightFunc(p.raw[p.position:], isWhitespace), + Range: Range{absPos, absPos + len(p.raw[p.position:])}, }) p.position = len(p.raw) } else { + absPos := relativeToAbsolutePosition(p.ranges, p.position) if p.raw[p.position+next] == '\r' || p.raw[p.position+next] == '\n' { + s := strings.TrimRightFunc(p.raw[p.position:p.position+next], isWhitespace) p.inlines = append(p.inlines, &Text{ - Text: strings.TrimRightFunc(p.raw[p.position:p.position+next], isWhitespace), + Text: s, + Range: Range{absPos, absPos + len(s)}, }) } else { p.inlines = append(p.inlines, &Text{ - Text: p.raw[p.position : p.position+next], + Text: p.raw[p.position : p.position+next], + Range: Range{absPos, absPos + next}, }) } p.position += next @@ -195,9 +208,11 @@ func (p *inlineParser) parseText() { } func (p *inlineParser) parseLinkOrImageDelimiter() { + absPos := relativeToAbsolutePosition(p.ranges, p.position) if p.raw[p.position] == '[' { p.inlines = append(p.inlines, &Text{ - Text: "[", + Text: "[", + Range: Range{absPos, absPos + 1}, }) p.delimiterStack.PushBack(&delimiter{ Type: linkOpeningDelimiter, @@ -207,7 +222,8 @@ func (p *inlineParser) parseLinkOrImageDelimiter() { p.position++ } else if p.raw[p.position] == '!' && p.position+1 < len(p.raw) && p.raw[p.position+1] == '[' { p.inlines = append(p.inlines, &Text{ - Text: "![", + Text: "![", + Range: Range{absPos, absPos + 2}, }) p.delimiterStack.PushBack(&delimiter{ Type: imageOpeningDelimiter, @@ -217,7 +233,8 @@ func (p *inlineParser) parseLinkOrImageDelimiter() { p.position += 2 } else { p.inlines = append(p.inlines, &Text{ - Text: "!", + Text: "!", + Range: Range{absPos, absPos + 1}, }) p.position++ } @@ -347,8 +364,10 @@ func (p *inlineParser) lookForLinkOrImage() { break } } + absPos := relativeToAbsolutePosition(p.ranges, p.position) p.inlines = append(p.inlines, &Text{ - Text: "]", + Text: "]", + Range: Range{absPos, absPos + 1}, }) p.position++ } @@ -403,19 +422,23 @@ func CharacterReference(ref string) string { } func (p *inlineParser) parseCharacterReference() { + absPos := relativeToAbsolutePosition(p.ranges, p.position) p.position++ if semicolon := strings.IndexByte(p.raw[p.position:], ';'); semicolon == -1 { p.inlines = append(p.inlines, &Text{ - Text: "&", + Text: "&", + Range: Range{absPos, 1}, }) } else if s := CharacterReference(p.raw[p.position : p.position+semicolon]); s != "" { p.position += semicolon + 1 p.inlines = append(p.inlines, &Text{ - Text: s, + Text: s, + Range: Range{absPos, absPos + len(s)}, }) } else { p.inlines = append(p.inlines, &Text{ - Text: "&", + Text: "&", + Range: Range{absPos, 1}, }) } } |