From 0d86a9320003d7d595ebfdc2a3ad64bc7e691016 Mon Sep 17 00:00:00 2001 From: Ruud Poutsma Date: Fri, 25 Sep 2020 17:58:58 +0200 Subject: [PATCH] fix block nodes --- src/Markdig.Tests/TestCst.cs | 43 ++++++++++++++++++- src/Markdig/Parsers/FencedCodeBlockParser.cs | 6 ++- src/Markdig/Parsers/NumberedListItemParser.cs | 1 + src/Markdig/Parsers/OrderedListItemParser.cs | 1 + src/Markdig/Parsers/ParagraphBlockParser.cs | 2 +- src/Markdig/Parsers/QuoteBlockParser.cs | 1 + .../Renderers/Normalize/CodeBlockRenderer.cs | 2 + .../Renderers/Normalize/QuoteBlockRenderer.cs | 10 +++-- 8 files changed, 58 insertions(+), 8 deletions(-) diff --git a/src/Markdig.Tests/TestCst.cs b/src/Markdig.Tests/TestCst.cs index b8887409..fa0a425d 100644 --- a/src/Markdig.Tests/TestCst.cs +++ b/src/Markdig.Tests/TestCst.cs @@ -106,6 +106,13 @@ namespace Markdig.Tests [TestCase(" p\n\n p ")] [TestCase("p \n\n p ")] [TestCase(" p \n\n p ")] + + // special cases + [TestCase(" p \n\n\n\n p \n\n")] + [TestCase("\np")] + [TestCase("\n\np")] + [TestCase("p\n")] + [TestCase("p\n\n")] public void TestParagraph(string value) { RoundTrip(value); @@ -128,11 +135,19 @@ namespace Markdig.Tests [TestCase("- i1\n- i2")] [TestCase("- i1\n - i2")] [TestCase("- i1\n - i1.1\n - i1.2")] - public void TestList(string value) + public void TestUnorederedList(string value) { RoundTrip(value); } + [TestCase("1. i")] + [TestCase("1. i")] + [TestCase("1. i ")] + [TestCase("1. i ")] + public void TestOrderedList(string value) + { + RoundTrip(value); + } [Test] public void TestImage() @@ -158,7 +173,7 @@ namespace Markdig.Tests [TestCase(" - > q")] [TestCase(" - > q")] [TestCase(" - > q1\n - > q2")] - public void TestListItem_BlockQuote(string value) + public void TestUnorderedListItem_BlockQuote(string value) { RoundTrip(value); } @@ -172,6 +187,16 @@ namespace Markdig.Tests RoundTrip(value); } + [TestCase("\n> q")] + [TestCase("\n> q\n")] + [TestCase("\n> q\n\n")] + [TestCase("> q\n\np")] + [TestCase("p\n\n> q\n\n# h")] + public void TestBlockQuote_Paragraph(string value) + { + RoundTrip(value); + } + [Test] public void TestBlockQuote() { @@ -362,5 +387,19 @@ namespace Markdig.Tests { RoundTrip(value); } + + [TestCase("```\nc\n```")] + [TestCase("\n```\nc\n```")] + [TestCase("\n\n```\nc\n```")] + [TestCase("```\nc\n```\n")] + [TestCase("```\nc\n```\n\n")] + [TestCase("\n```\nc\n```\n")] + [TestCase("\n```\nc\n```\n\n")] + [TestCase("\n\n```\nc\n```\n")] + [TestCase("\n\n```\nc\n```\n\n")] + public void TestCodeBlock(string value) + { + RoundTrip(value); + } } } diff --git a/src/Markdig/Parsers/FencedCodeBlockParser.cs b/src/Markdig/Parsers/FencedCodeBlockParser.cs index 41c8937b..694837c5 100644 --- a/src/Markdig/Parsers/FencedCodeBlockParser.cs +++ b/src/Markdig/Parsers/FencedCodeBlockParser.cs @@ -26,7 +26,11 @@ namespace Markdig.Parsers protected override FencedCodeBlock CreateFencedBlock(BlockProcessor processor) { - return new FencedCodeBlock(this) {IndentCount = processor.Indent}; + return new FencedCodeBlock(this) + { + IndentCount = processor.Indent, + LinesBefore = processor.UseLinesBefore(), + }; } public override BlockState TryContinue(BlockProcessor processor, Block block) diff --git a/src/Markdig/Parsers/NumberedListItemParser.cs b/src/Markdig/Parsers/NumberedListItemParser.cs index 07dc0ed2..2650bd2f 100644 --- a/src/Markdig/Parsers/NumberedListItemParser.cs +++ b/src/Markdig/Parsers/NumberedListItemParser.cs @@ -40,6 +40,7 @@ namespace Markdig.Parsers { startChar = endChar; } + state.NextChar(); c = state.NextChar(); countDigit++; } diff --git a/src/Markdig/Parsers/OrderedListItemParser.cs b/src/Markdig/Parsers/OrderedListItemParser.cs index 23d694b8..2e20796e 100644 --- a/src/Markdig/Parsers/OrderedListItemParser.cs +++ b/src/Markdig/Parsers/OrderedListItemParser.cs @@ -37,6 +37,7 @@ namespace Markdig.Parsers { if (delimiter == orderedDelimiter) { + state.NextChar(); state.NextChar(); return true; } diff --git a/src/Markdig/Parsers/ParagraphBlockParser.cs b/src/Markdig/Parsers/ParagraphBlockParser.cs index ee92fe21..bc12da7a 100644 --- a/src/Markdig/Parsers/ParagraphBlockParser.cs +++ b/src/Markdig/Parsers/ParagraphBlockParser.cs @@ -103,7 +103,7 @@ namespace Markdig.Parsers Level = level, Lines = paragraph.Lines, BeforeWhitespace = state.PopBeforeWhitespace(state.Column), - LinesBefore = state.UseLinesBefore() + LinesBefore = state.UseLinesBefore(), }; //heading.Lines.Trim(); diff --git a/src/Markdig/Parsers/QuoteBlockParser.cs b/src/Markdig/Parsers/QuoteBlockParser.cs index 915bd8bb..066cfe95 100644 --- a/src/Markdig/Parsers/QuoteBlockParser.cs +++ b/src/Markdig/Parsers/QuoteBlockParser.cs @@ -51,6 +51,7 @@ namespace Markdig.Parsers Span = new SourceSpan(sourcePosition, processor.Line.End), BeforeWhitespace = processor.PopBeforeWhitespace(column), HasSpaceAfterQuoteChar = hasSpaceAfterQuoteChar, + LinesBefore = processor.UseLinesBefore() }); processor.WhitespaceStart += whitespaceToAdd; return BlockState.Continue; diff --git a/src/Markdig/Renderers/Normalize/CodeBlockRenderer.cs b/src/Markdig/Renderers/Normalize/CodeBlockRenderer.cs index 4a6f11e9..6aaa495d 100644 --- a/src/Markdig/Renderers/Normalize/CodeBlockRenderer.cs +++ b/src/Markdig/Renderers/Normalize/CodeBlockRenderer.cs @@ -18,6 +18,7 @@ namespace Markdig.Renderers.Normalize { if (obj is FencedCodeBlock fencedCodeBlock) { + renderer.RenderLinesBefore(obj); var opening = new string(fencedCodeBlock.FencedChar, fencedCodeBlock.FencedCharCount); renderer.Write(opening); @@ -55,6 +56,7 @@ namespace Markdig.Renderers.Normalize renderer.WriteLeafRawLines(obj, true); renderer.Write(opening); + renderer.RenderLinesAfter(obj); } else { diff --git a/src/Markdig/Renderers/Normalize/QuoteBlockRenderer.cs b/src/Markdig/Renderers/Normalize/QuoteBlockRenderer.cs index 4f773e7a..43f341b9 100644 --- a/src/Markdig/Renderers/Normalize/QuoteBlockRenderer.cs +++ b/src/Markdig/Renderers/Normalize/QuoteBlockRenderer.cs @@ -12,17 +12,19 @@ namespace Markdig.Renderers.Normalize /// public class QuoteBlockRenderer : NormalizeObjectRenderer { - protected override void Write(NormalizeRenderer renderer, QuoteBlock obj) + protected override void Write(NormalizeRenderer renderer, QuoteBlock quoteBlock) { - renderer.Write(obj.BeforeWhitespace); + renderer.RenderLinesBefore(quoteBlock); + renderer.Write(quoteBlock.BeforeWhitespace); - var quoteIndent = obj.HasSpaceAfterQuoteChar ? obj.QuoteChar + " " : obj.QuoteChar.ToString(); + var quoteIndent = quoteBlock.HasSpaceAfterQuoteChar ? quoteBlock.QuoteChar + " " : quoteBlock.QuoteChar.ToString(); //renderer.PushIndent(quoteIndent); renderer.Write(quoteIndent); - renderer.WriteChildren(obj); + renderer.WriteChildren(quoteBlock); //renderer.PopIndent(); renderer.FinishBlock(); + renderer.RenderLinesAfter(quoteBlock); } } } \ No newline at end of file