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);
}