From 49e145437f7ced04c0b402bc17e5a0e83631069b Mon Sep 17 00:00:00 2001 From: upstream Date: Sat, 19 Sep 2026 11:52:40 +0200 Subject: [PATCH] Upstream xoofx/markdig state of the touched files before 27b8c9eb56 --- site/docs/extensions/emphasis-extras.md | 93 +++++++++++++++++++ src/Markdig.Tests/TestEmphasisRoundtrip.cs | 68 -------------- .../Parsers/Inlines/EmphasisInlineParser.cs | 13 --- 3 files changed, 93 insertions(+), 81 deletions(-) create mode 100644 site/docs/extensions/emphasis-extras.md delete mode 100644 src/Markdig.Tests/TestEmphasisRoundtrip.cs diff --git a/site/docs/extensions/emphasis-extras.md b/site/docs/extensions/emphasis-extras.md new file mode 100644 index 0000000..8c0ee64 --- /dev/null +++ b/site/docs/extensions/emphasis-extras.md @@ -0,0 +1,93 @@ +--- +title: Emphasis extras +--- + +# Emphasis extras + +Enable with `.UseEmphasisExtras()` (included in `UseAdvancedExtensions()`). + +This extension adds several emphasis styles beyond standard bold and italic. + +If you need improved emphasis parsing for Chinese/Japanese/Korean (CJK) text, see [CJK friendly emphasis](cjk-friendly-emphasis.md). + +## Strikethrough + +Wrap text with `~~` for strikethrough: + +```markdown +This is ~~deleted~~ text. +``` + +This is ~~deleted~~ text. + +## Subscript + +Wrap text with `~` for subscript: + +```markdown +H~2~O is water. +``` + +H~2~O is water. + +## Superscript + +Wrap text with `^` for superscript: + +```markdown +2^10^ is 1024. +``` + +2^10^ is 1024. + +## Inserted text + +Wrap text with `++` for inserted/underlined text: + +```markdown +This text has been ++inserted++. +``` + +This text has been ++inserted++. + +## Marked/highlighted text + +Wrap text with `==` for marked/highlighted text: + +```markdown +This is ==highlighted== text. +``` + +This is ==highlighted== text. + +## HTML output + +{.table} +| Syntax | HTML output | +|---|---| +| `~~text~~` | `text` | +| `~text~` | `text` | +| `^text^` | `text` | +| `++text++` | `text` | +| `==text==` | `text` | + +## Selective activation + +By default, all emphasis extras are enabled. Use `EmphasisExtraOptions` to enable only specific ones: + +```csharp +using Markdig.Extensions.EmphasisExtras; + +var pipeline = new MarkdownPipelineBuilder() + .UseEmphasisExtras(EmphasisExtraOptions.Strikethrough | EmphasisExtraOptions.Superscript) + .Build(); +``` + +Available options: + +- `EmphasisExtraOptions.Strikethrough` +- `EmphasisExtraOptions.Subscript` +- `EmphasisExtraOptions.Superscript` +- `EmphasisExtraOptions.Inserted` +- `EmphasisExtraOptions.Marked` +- `EmphasisExtraOptions.Default` (all of the above) diff --git a/src/Markdig.Tests/TestEmphasisRoundtrip.cs b/src/Markdig.Tests/TestEmphasisRoundtrip.cs deleted file mode 100644 index 3847447..0000000 --- a/src/Markdig.Tests/TestEmphasisRoundtrip.cs +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) Alexandre Mutel. All rights reserved. -// This file is licensed under the BSD-Clause 2 license. -// See the license.txt file in the project root for more information. - -using Markdig.Renderers.Roundtrip; -using Markdig.Syntax; - -namespace Markdig.Tests; - -[TestFixture] -public class TestEmphasisRoundtrip -{ - private static string RoundTrip(string markdown, MarkdownPipeline pipeline) - { - MarkdownDocument document = Markdown.Parse(markdown, pipeline); - var writer = new StringWriter(); - var renderer = new RoundtripRenderer(writer); - pipeline.Setup(renderer); - renderer.Write(document); - return writer.ToString(); - } - - // Leftover delimiter characters below the minimum count used to stay nested - // inside the emphasis they closed, moving the following text to the end of - // the block. https://github.com/xoofx/markdig/issues/743 - [Test] - public void GridTableSeparatorRoundtripsWithTrackTrivia() - { - string markdown = - "+---------------+---------------+--------------------+\n" + - "| Fruit | Price | Advantages |\n" + - "+===============+===============+====================+\n" + - "| Bananas | first line | first line |\n" + - "| | next line | next line |\n" + - "+---------------+---------------+--------------------+\n"; - - var pipeline = new MarkdownPipelineBuilder() - .UseAutoLinks() - .UseEmphasisExtras() - .UseListExtras() - .EnableTrackTrivia() - .Build(); - - Assert.That(RoundTrip(markdown, pipeline), Is.EqualTo(markdown)); - } - - // Same defect, minimal: leftovers (15 = 7 * 2 + 1) below the "==" minimum. - [Test] - public void UnbalancedMarkedRunsRoundtrip() - { - string markdown = "+===============+===============+\n"; - - var pipeline = new MarkdownPipelineBuilder() - .UseEmphasisExtras() - .EnableTrackTrivia() - .Build(); - - Assert.That(RoundTrip(markdown, pipeline), Is.EqualTo(markdown)); - } - - // The fix must not prevent balanced "marked" emphasis from being detected. - [Test] - public void BalancedMarkedEmphasisStillParses() - { - var pipeline = new MarkdownPipelineBuilder().UseEmphasisExtras().Build(); - Assert.That(Markdown.ToHtml("==bold==", pipeline).Trim(), Is.EqualTo("

bold

")); - } -} diff --git a/src/Markdig/Parsers/Inlines/EmphasisInlineParser.cs b/src/Markdig/Parsers/Inlines/EmphasisInlineParser.cs index 4ad19fd..10fb4e3 100644 --- a/src/Markdig/Parsers/Inlines/EmphasisInlineParser.cs +++ b/src/Markdig/Parsers/Inlines/EmphasisInlineParser.cs @@ -419,19 +419,6 @@ public class EmphasisInlineParser : InlineParser, IPostInlineProcessor break; } } - - // Leftover delimiter characters keep the following inlines nested inside - // the emphasis; move them out so they keep their original position. - if (closeDelimiter.DelimiterCount > 0 && closeDelimiter.Parent is EmphasisInline closerParentEmphasis) - { - var outermostEmphasis = closerParentEmphasis; - while (outermostEmphasis.Parent is EmphasisInline ancestorEmphasis) - { - outermostEmphasis = ancestorEmphasis; - } - - closeDelimiter.MoveChildrenAfter(outermostEmphasis); - } } }