diff --git a/src/Textamina.Markdig/Formatters/HtmlFormatter.cs b/src/Textamina.Markdig/Formatters/HtmlFormatter.cs index fe5fdebd..146c72c0 100644 --- a/src/Textamina.Markdig/Formatters/HtmlFormatter.cs +++ b/src/Textamina.Markdig/Formatters/HtmlFormatter.cs @@ -240,7 +240,7 @@ namespace Textamina.Markdig.Formatters protected void Write(HardlineBreakInline hardlineBreak) { - writer.WriteConstant("
"); + writer.WriteLineConstant("
"); } protected void WriteChildren(ContainerInline containerInline) @@ -274,7 +274,7 @@ namespace Textamina.Markdig.Formatters inline = inline.NextSibling; } } - else + else if (leafBlock.Lines != null) { var lines = leafBlock.Lines; for (int i = 0; i < lines.Count; i++) diff --git a/src/Textamina.Markdig/Parsers/CodeBlockParser.cs b/src/Textamina.Markdig/Parsers/CodeBlockParser.cs index cc202deb..64f5c6f5 100644 --- a/src/Textamina.Markdig/Parsers/CodeBlockParser.cs +++ b/src/Textamina.Markdig/Parsers/CodeBlockParser.cs @@ -29,6 +29,7 @@ namespace Textamina.Markdig.Parsers { return state.IsBlankLine && block != null ? BlockState.BreakDiscard : BlockState.None; } + state.MoveTo(state.StartBeforeIndent + 4); return BlockState.Continue; } } diff --git a/src/Textamina.Markdig/Parsers/FencedCodeBlockParser.cs b/src/Textamina.Markdig/Parsers/FencedCodeBlockParser.cs index 1d07962a..ccc7d01d 100644 --- a/src/Textamina.Markdig/Parsers/FencedCodeBlockParser.cs +++ b/src/Textamina.Markdig/Parsers/FencedCodeBlockParser.cs @@ -120,12 +120,14 @@ namespace Textamina.Markdig.Parsers count--; } - if (count <=0 && line.TrimEnd()) + if (count <=0 && !state.IsCodeIndent && line.TrimEnd()) { // Don't keep the last line return BlockState.BreakDiscard; } + state.MoveTo(state.StartBeforeIndent); + // Remove any indent spaces c = state.CurrentChar; var indentCount = fence.IndentCount; diff --git a/src/Textamina.Markdig/Parsers/Inlines/HardlineBreakInlineParser.cs b/src/Textamina.Markdig/Parsers/Inlines/HardlineBreakInlineParser.cs index cc4598a0..91ced7e2 100644 --- a/src/Textamina.Markdig/Parsers/Inlines/HardlineBreakInlineParser.cs +++ b/src/Textamina.Markdig/Parsers/Inlines/HardlineBreakInlineParser.cs @@ -1,5 +1,6 @@ using Textamina.Markdig.Helpers; using Textamina.Markdig.Syntax; +using Textamina.Markdig.Syntax.Inlines; namespace Textamina.Markdig.Parsers.Inlines { @@ -20,6 +21,17 @@ namespace Textamina.Markdig.Parsers.Inlines return false; } + // A line break (not in a code span or HTML tag) that is preceded by two or more spaces + // and does not occur at the end of a block is parsed as a hard line break (rendered in HTML as a
tag) + var literal = state.Inline as LiteralInline; + if (literal != null) + { + literal.TrimEnd = true; + } + + state.Inline = new HardlineBreakInline(); + text.NextChar(); // Skip \n + //// A line break (not in a code span or HTML tag) that is preceded by two or more spaces //// and does not occur at the end of a block is parsed as a hard line break (rendered in HTML as a
tag) //var text = state.Lines; @@ -40,7 +52,7 @@ namespace Textamina.Markdig.Parsers.Inlines // return false; //} - return false; + return true; } } } \ No newline at end of file diff --git a/src/Textamina.Markdig/Parsers/MarkdownParser.cs b/src/Textamina.Markdig/Parsers/MarkdownParser.cs index 1e1456b2..07ec5c9b 100644 --- a/src/Textamina.Markdig/Parsers/MarkdownParser.cs +++ b/src/Textamina.Markdig/Parsers/MarkdownParser.cs @@ -145,7 +145,8 @@ namespace Textamina.Markdig.Parsers Block = leafBlock }; - var text = new StringSlice(leafBlock.Lines.ToString()); + var text = new StringSlice(leafBlock.ToInlineText()); + leafBlock.Lines = null; while (!text.IsEndOfSlice) { @@ -254,8 +255,11 @@ namespace Textamina.Markdig.Parsers { Log.WriteLine("** Dump before Emphasis:"); leafBlock.Inline.DumpTo(Log); - EmphasisInline.ProcessEmphasis(leafBlock.Inline); + } + EmphasisInline.ProcessEmphasis(leafBlock.Inline); + if (Log != null) + { Log.WriteLine(); Log.WriteLine("** Dump after Emphasis:"); leafBlock.Inline.DumpTo(Log); diff --git a/src/Textamina.Markdig/Parsers/ParagraphBlockParser.cs b/src/Textamina.Markdig/Parsers/ParagraphBlockParser.cs index 4068adf7..6a342333 100644 --- a/src/Textamina.Markdig/Parsers/ParagraphBlockParser.cs +++ b/src/Textamina.Markdig/Parsers/ParagraphBlockParser.cs @@ -41,7 +41,11 @@ namespace Textamina.Markdig.Parsers var lineCount = lines.Count; for (int i = 0; i < lineCount; i++) { - lines.Slices[i].Trim(); + lines.Slices[i].TrimStart(); + } + if (lineCount > 0) + { + lines.Slices[lineCount - 1].TrimEnd(); } } else // if (heading?.Lines.Count > 1) diff --git a/src/Textamina.Markdig/Syntax/HeadingBlock.cs b/src/Textamina.Markdig/Syntax/HeadingBlock.cs index 1bf42133..33477cf8 100644 --- a/src/Textamina.Markdig/Syntax/HeadingBlock.cs +++ b/src/Textamina.Markdig/Syntax/HeadingBlock.cs @@ -11,8 +11,14 @@ namespace Textamina.Markdig.Syntax { public HeadingBlock(BlockParser parser) : base(parser) { + ProcessInlines = true; } public int Level { get; set; } + + public override string ToInlineText() + { + return Lines.ToString(true); + } } } \ No newline at end of file diff --git a/src/Textamina.Markdig/Syntax/Inlines/LiteralInline.cs b/src/Textamina.Markdig/Syntax/Inlines/LiteralInline.cs index 06c984c9..23b22ab1 100644 --- a/src/Textamina.Markdig/Syntax/Inlines/LiteralInline.cs +++ b/src/Textamina.Markdig/Syntax/Inlines/LiteralInline.cs @@ -15,9 +15,16 @@ namespace Textamina.Markdig.Syntax.Inlines public string Content { get; set; } + public bool TrimEnd { get; set; } + protected override void Close(InlineParserState state) { - Content = HtmlHelper.Unescape(ContentBuilder.ToString(), false); + var str = ContentBuilder.ToString(); + if (TrimEnd) + { + str = str.TrimEnd(); + } + Content = HtmlHelper.Unescape(str, false); state.StringBuilders.Release(ContentBuilder); ContentBuilder = null; } diff --git a/src/Textamina.Markdig/Syntax/LeafBlock.cs b/src/Textamina.Markdig/Syntax/LeafBlock.cs index 1fe514aa..36d203db 100644 --- a/src/Textamina.Markdig/Syntax/LeafBlock.cs +++ b/src/Textamina.Markdig/Syntax/LeafBlock.cs @@ -26,5 +26,10 @@ namespace Textamina.Markdig.Syntax } Lines.Append(ref line); } + + public virtual string ToInlineText() + { + return Lines.ToString(); + } } } \ No newline at end of file diff --git a/src/Textamina.Markdig/Syntax/StringSliceList.cs b/src/Textamina.Markdig/Syntax/StringSliceList.cs index 6bcf5aab..ef47771e 100644 --- a/src/Textamina.Markdig/Syntax/StringSliceList.cs +++ b/src/Textamina.Markdig/Syntax/StringSliceList.cs @@ -48,12 +48,18 @@ namespace Textamina.Markdig.Syntax public override string ToString() { + return ToString(false); + } + + public string ToString(bool replaceEndOfLineBySpace) + { + var newLine = replaceEndOfLineBySpace ? ' ' : '\n'; var builder = StringBuilderCache.Local(); - for(int i = 0; i < Count; i++) + for (int i = 0; i < Count; i++) { if (i > 0) { - builder.Append('\n'); + builder.Append(newLine); } builder.Append(Slices[i].Text, Slices[i].Start, Slices[i].Length); }