diff --git a/README.md b/README.md index fcaa877..16e5c7c 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,18 @@ var converter = new ReverseMarkdown.Converter(config); snippet source | anchor +If you need to preserve markdown-like text as literal content (for example `# Heading` or `- Item`), either enable `EscapeMarkdownLineStarts` or use `CommonMark`: + +```cs +var config = new ReverseMarkdown.Config +{ + EscapeMarkdownLineStarts = true + // or CommonMark = true +}; + +var converter = new ReverseMarkdown.Converter(config); +``` + ## Configuration options * `DefaultCodeBlockLanguage` - Option to set the default code block language for Github style markdown if class based language markers are not available @@ -94,6 +106,9 @@ var converter = new ReverseMarkdown.Converter(config); * `CommonMarkUseHtmlInlineTags` - When CommonMark is enabled, emit HTML for inline tags (`em`, `strong`, `a`, `img`) to avoid delimiter edge cases. Default is true * `CommonMarkIntrawordEmphasisSpacing` - When CommonMark is enabled, insert spaces to avoid intraword emphasis. Default is false * Note: CommonMark is best used on its own. Combining `CommonMark` with `GithubFlavored` can produce mixed output; keep them separate unless you explicitly want that behavior. +* `EscapeMarkdownLineStarts` - Escape markdown line starts (headings, lists, block markers) in plain text output. Default is false + * Note: If you need to preserve markdown-like text as literal content, enable `EscapeMarkdownLineStarts` or use `CommonMark`. +* `OutputLineEnding` - Output line endings used in generated markdown. Default is `Environment.NewLine` * `CleanupUnnecessarySpaces` - Cleanup unnecessary spaces in the output. Default is true * `SuppressDivNewlines` - Removes prefixed newlines from `div` tags. Default is false * `ListBulletChar` - Allows you to change the bullet character. Default value is `-`. Some systems expect the bullet character to be `*` rather than `-`, this config allows you to change it. Note: This option is ignored when `SlackFlavored` is enabled diff --git a/src/ReverseMarkdown.Test/ConverterTests.cs b/src/ReverseMarkdown.Test/ConverterTests.cs index fc1adf0..34f2887 100644 --- a/src/ReverseMarkdown.Test/ConverterTests.cs +++ b/src/ReverseMarkdown.Test/ConverterTests.cs @@ -117,6 +117,22 @@ public void WhenEscapeMarkdownLineStartsEnabled_ThenEscapeHeadingAndListMarkers( Assert.Equal(@"1\. Point 1", converter.Convert("

1. Point 1

")); } + [Fact] + public void WhenOutputLineEndingConfigured_ThenNormalizeOutputLineEndings() + { + var html = "

one

\r\n

two

\r

three

\n

four

"; + var config = new Config + { + OutputLineEnding = "\n" + }; + var converter = new Converter(config); + + var result = converter.Convert(html); + + Assert.Equal(result, result.ReplaceLineEndings("\n")); + Assert.DoesNotContain("\r", result); + } + diff --git a/src/ReverseMarkdown/Config.cs b/src/ReverseMarkdown/Config.cs index 601519d..fce398f 100644 --- a/src/ReverseMarkdown/Config.cs +++ b/src/ReverseMarkdown/Config.cs @@ -31,6 +31,12 @@ public class Config /// public bool EscapeMarkdownLineStarts { get; set; } = false; + /// + /// Output line endings to use for the generated markdown. + /// Defaults to . + /// + public string OutputLineEnding { get; set; } = Environment.NewLine; + public bool SuppressDivNewlines { get; set; } = false; public bool RemoveComments { get; set; } = false; diff --git a/src/ReverseMarkdown/Converter.cs b/src/ReverseMarkdown/Converter.cs index a5e7de8..48ea434 100644 --- a/src/ReverseMarkdown/Converter.cs +++ b/src/ReverseMarkdown/Converter.cs @@ -96,8 +96,10 @@ public virtual string Convert(string html) { using var _ = EnsureContext(); + html = html.ReplaceLineEndings("\n"); + if (Config.CommonMark && LooksLikeCommonMarkHtmlBlock(html)) { - return html; + return ApplyOutputLineEndings(html); } if (Config.CommonMark) { @@ -105,7 +107,7 @@ public virtual string Convert(string html) if (trimmed.StartsWith("", StringComparison.OrdinalIgnoreCase)) { var inner = paragraphTrimmed.Substring(3, paragraphTrimmed.Length - 7); if (inner.TrimStart().StartsWith("