mirror of
https://github.com/xoofx/markdig.git
synced 2026-02-11 05:44:45 +00:00
Fix regression when parsing link reference definitions (#543)
This commit is contained in:
@@ -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()
|
||||
{
|
||||
|
||||
@@ -23,7 +23,8 @@ namespace Markdig.Tests
|
||||
|
||||
nr.Write(markdownDocument);
|
||||
|
||||
Assert.AreEqual(markdown, sw.ToString());
|
||||
var result = sw.ToString();
|
||||
Assert.AreEqual(markdown, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user