Fix regression when parsing link reference definitions (#543)

This commit is contained in:
Alexandre Mutel
2021-06-10 08:58:29 +02:00
parent 27f625f15b
commit 4c92fe5a3b
5 changed files with 38 additions and 25 deletions

View File

@@ -12,6 +12,16 @@ namespace Markdig.Tests
[TestFixture]
public class TestPlayParser
{
[Test]
public void TestLinksWithCarriageReturn()
{
{
var text = "[Link 1][link-1], [link 2][link-2].\r\n\r\n[link-1]: https://example.com\r\n[link-2]: https://example.com";
var result = Markdown.ToHtml(text).TrimEnd();
Assert.AreEqual("<p><a href=\"https://example.com\">Link 1</a>, <a href=\"https://example.com\">link 2</a>.</p>", result);
}
}
[Test]
public void TestLink()
{

View File

@@ -23,7 +23,8 @@ namespace Markdig.Tests
nr.Write(markdownDocument);
Assert.AreEqual(markdown, sw.ToString());
var result = sw.ToString();
Assert.AreEqual(markdown, result);
}
}
}

View File

@@ -1231,7 +1231,9 @@ namespace Markdig.Helpers
var saved = text;
var hasWhiteSpaces = CharIteratorHelper.TrimStartAndCountNewLines(ref text, out int newLineCount, out newLine);
triviaBeforeTitle = new SourceSpan(triviaBeforeTitleStart, text.Start - 1);
// Remove the newline from the trivia (as it may have multiple lines)
var triviaBeforeTitleEnd = text.Start - 1;
triviaBeforeTitle = new SourceSpan(triviaBeforeTitleStart, triviaBeforeTitleEnd);
var c = text.CurrentChar;
if (c == '\'' || c == '"' || c == '(')
{
@@ -1246,6 +1248,9 @@ namespace Markdig.Helpers
{
return false;
}
// Discard the newline if we have a title
newLine = NewLine.None;
}
else
{
@@ -1256,6 +1261,8 @@ namespace Markdig.Helpers
{
if (text.IsEmpty || newLineCount > 0)
{
// If we have an end of line, we need to remove it from the trivia
triviaBeforeTitle.End -= newLine.Length();
triviaAfterTitle = new SourceSpan(text.Start, text.Start - 1);
return true;
}
@@ -1277,6 +1284,7 @@ namespace Markdig.Helpers
{
text = saved;
title = null;
newLine = NewLine.None;
unescapedTitle = SourceSpan.Empty;
triviaAfterTitle = SourceSpan.Empty;
return true;

View File

@@ -299,7 +299,7 @@ namespace Markdig.Helpers
CurrentChar = '\r';
}
}
else if (_offset + 1 == slice.Length)
else if (_offset - 1 == slice.Length)
{
if (newLine == NewLine.CarriageReturnLineFeed)
{

View File

@@ -13,45 +13,39 @@ namespace Markdig.Syntax
{
public static bool TrimStartAndCountNewLines<T>(ref T iterator, out int countNewLines) where T : ICharIterator
{
countNewLines = 0;
var c = iterator.CurrentChar;
bool hasWhitespaces = false;
while (c.IsWhitespace())
{
if (c == '\n')
{
countNewLines++;
}
hasWhitespaces = true;
c = iterator.NextChar();
}
return hasWhitespaces;
return TrimStartAndCountNewLines(ref iterator, out countNewLines, out _);
}
public static bool TrimStartAndCountNewLines<T>(ref T iterator, out int countNewLines, out NewLine firstNewline) where T : ICharIterator
public static bool TrimStartAndCountNewLines<T>(ref T iterator, out int countNewLines, out NewLine lastLine) where T : ICharIterator
{
countNewLines = 0;
var c = iterator.CurrentChar;
bool hasWhitespaces = false;
firstNewline = NewLine.None;
while (c.IsWhitespace())
lastLine = NewLine.None;
while (c != '\0' && c.IsWhitespace())
{
if (c == '\n' || c == '\r')
{
if (c == '\r' && iterator.PeekChar() == '\n' && firstNewline != NewLine.None)
if (c == '\r' && iterator.PeekChar() == '\n')
{
firstNewline = NewLine.CarriageReturnLineFeed;
lastLine = NewLine.CarriageReturnLineFeed;
iterator.SkipChar(); // skip \n
}
else if (c == '\n' && firstNewline != NewLine.None)
else if (c == '\n')
{
firstNewline = NewLine.LineFeed;
lastLine = NewLine.LineFeed;
}
else if (c == '\r' && firstNewline != NewLine.None)
else if (c == '\r')
{
firstNewline = NewLine.CarriageReturn;
lastLine = NewLine.CarriageReturn;
}
countNewLines++;
}
else
{
// reset last line if if have a whitespace after
lastLine = NewLine.None;
}
hasWhitespaces = true;
c = iterator.NextChar();
}