diff --git a/src/Markdig.Tests/TestPlayParser.cs b/src/Markdig.Tests/TestPlayParser.cs index c881f5a7..ee737631 100644 --- a/src/Markdig.Tests/TestPlayParser.cs +++ b/src/Markdig.Tests/TestPlayParser.cs @@ -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("
", result); + } + } + [Test] public void TestLink() { diff --git a/src/Markdig.Tests/TestRoundtrip.cs b/src/Markdig.Tests/TestRoundtrip.cs index 2a8c9a4b..0eba22a4 100644 --- a/src/Markdig.Tests/TestRoundtrip.cs +++ b/src/Markdig.Tests/TestRoundtrip.cs @@ -23,7 +23,8 @@ namespace Markdig.Tests nr.Write(markdownDocument); - Assert.AreEqual(markdown, sw.ToString()); + var result = sw.ToString(); + Assert.AreEqual(markdown, result); } } } diff --git a/src/Markdig/Helpers/LinkHelper.cs b/src/Markdig/Helpers/LinkHelper.cs index 29b5b745..f0b7ee31 100644 --- a/src/Markdig/Helpers/LinkHelper.cs +++ b/src/Markdig/Helpers/LinkHelper.cs @@ -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; diff --git a/src/Markdig/Helpers/StringLineGroup.cs b/src/Markdig/Helpers/StringLineGroup.cs index ab238fd7..19e0d7ac 100644 --- a/src/Markdig/Helpers/StringLineGroup.cs +++ b/src/Markdig/Helpers/StringLineGroup.cs @@ -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) { diff --git a/src/Markdig/Syntax/CharIteratorHelper.cs b/src/Markdig/Syntax/CharIteratorHelper.cs index 5edf20be..de0c2e2b 100644 --- a/src/Markdig/Syntax/CharIteratorHelper.cs +++ b/src/Markdig/Syntax/CharIteratorHelper.cs @@ -13,45 +13,39 @@ namespace Markdig.Syntax { public static bool TrimStartAndCountNewLines