diff --git a/osu.Game/Graphics/Containers/Markdown/OsuMarkdownContainer.cs b/osu.Game/Graphics/Containers/Markdown/OsuMarkdownContainer.cs
index e884b5db69..7e9581c056 100644
--- a/osu.Game/Graphics/Containers/Markdown/OsuMarkdownContainer.cs
+++ b/osu.Game/Graphics/Containers/Markdown/OsuMarkdownContainer.cs
@@ -4,10 +4,6 @@
#nullable disable
using Markdig;
-using Markdig.Extensions.AutoLinks;
-using Markdig.Extensions.CustomContainers;
-using Markdig.Extensions.EmphasisExtras;
-using Markdig.Extensions.Footnotes;
using Markdig.Extensions.Tables;
using Markdig.Extensions.Yaml;
using Markdig.Syntax;
@@ -21,24 +17,6 @@ namespace osu.Game.Graphics.Containers.Markdown
{
public partial class OsuMarkdownContainer : MarkdownContainer
{
- ///
- /// Allows this markdown container to parse and link footnotes.
- ///
- ///
- protected virtual bool Footnotes => false;
-
- ///
- /// Allows this markdown container to make URL text clickable.
- ///
- ///
- protected virtual bool Autolinks => false;
-
- ///
- /// Allows this markdown container to parse custom containers (used for flags and infoboxes).
- ///
- ///
- protected virtual bool CustomContainers => false;
-
public OsuMarkdownContainer()
{
LineSpacing = 21;
@@ -99,25 +77,13 @@ namespace osu.Game.Graphics.Containers.Markdown
return new OsuMarkdownUnorderedListItem(level);
}
- // reference: https://github.com/ppy/osu-web/blob/05488a96b25b5a09f2d97c54c06dd2bae59d1dc8/app/Libraries/Markdown/OsuMarkdown.php#L301
- protected override MarkdownPipeline CreateBuilder()
- {
- var pipeline = new MarkdownPipelineBuilder()
- .UseAutoIdentifiers()
- .UsePipeTables()
- .UseEmphasisExtras(EmphasisExtraOptions.Strikethrough)
- .UseYamlFrontMatter();
+ protected sealed override MarkdownPipeline CreateBuilder()
+ => Options.BuildPipeline();
- if (Footnotes)
- pipeline = pipeline.UseFootnotes();
-
- if (Autolinks)
- pipeline = pipeline.UseAutoLinks();
-
- if (CustomContainers)
- pipeline.UseCustomContainers();
-
- return pipeline.Build();
- }
+ ///
+ /// Creates a instance which is used to determine
+ /// which CommonMark/Markdig extensions should be enabled for this .
+ ///
+ protected virtual OsuMarkdownContainerOptions Options => new OsuMarkdownContainerOptions();
}
}
diff --git a/osu.Game/Graphics/Containers/Markdown/OsuMarkdownContainerOptions.cs b/osu.Game/Graphics/Containers/Markdown/OsuMarkdownContainerOptions.cs
new file mode 100644
index 0000000000..f2fd0e06a6
--- /dev/null
+++ b/osu.Game/Graphics/Containers/Markdown/OsuMarkdownContainerOptions.cs
@@ -0,0 +1,61 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using Markdig;
+using Markdig.Extensions.AutoLinks;
+using Markdig.Extensions.CustomContainers;
+using Markdig.Extensions.EmphasisExtras;
+using Markdig.Extensions.Footnotes;
+
+namespace osu.Game.Graphics.Containers.Markdown
+{
+ ///
+ /// Groups options of customising the set of available extensions to instances.
+ ///
+ public class OsuMarkdownContainerOptions
+ {
+ ///
+ /// Allows the to parse and link footnotes.
+ ///
+ ///
+ public bool Footnotes { get; init; }
+
+ ///
+ /// Allows the container to make URL text clickable.
+ ///
+ ///
+ public bool Autolinks { get; init; }
+
+ ///
+ /// Allows the to parse custom containers (used for flags and infoboxes).
+ ///
+ ///
+ public bool CustomContainers { get; init; }
+
+ ///
+ /// Returns a prepared according to the options specified by the current instance.
+ ///
+ ///
+ /// Compare: https://github.com/ppy/osu-web/blob/05488a96b25b5a09f2d97c54c06dd2bae59d1dc8/app/Libraries/Markdown/OsuMarkdown.php#L301
+ ///
+ public MarkdownPipeline BuildPipeline()
+ {
+ var pipeline = new MarkdownPipelineBuilder()
+ .UseAutoIdentifiers()
+ .UsePipeTables()
+ .UseEmphasisExtras(EmphasisExtraOptions.Strikethrough)
+ .UseYamlFrontMatter();
+
+ if (Footnotes)
+ pipeline = pipeline.UseFootnotes();
+
+ if (Autolinks)
+ pipeline = pipeline.UseAutoLinks();
+
+ if (CustomContainers)
+ pipeline.UseCustomContainers();
+
+ return pipeline.Build();
+ }
+ }
+}
diff --git a/osu.Game/Overlays/Comments/CommentMarkdownContainer.cs b/osu.Game/Overlays/Comments/CommentMarkdownContainer.cs
index 664946fc63..9cc20caa05 100644
--- a/osu.Game/Overlays/Comments/CommentMarkdownContainer.cs
+++ b/osu.Game/Overlays/Comments/CommentMarkdownContainer.cs
@@ -11,7 +11,10 @@ namespace osu.Game.Overlays.Comments
{
public partial class CommentMarkdownContainer : OsuMarkdownContainer
{
- protected override bool Autolinks => true;
+ protected override OsuMarkdownContainerOptions Options => new OsuMarkdownContainerOptions
+ {
+ Autolinks = true
+ };
protected override MarkdownHeading CreateHeading(HeadingBlock headingBlock) => new CommentMarkdownHeading(headingBlock);
diff --git a/osu.Game/Overlays/Wiki/Markdown/WikiMarkdownContainer.cs b/osu.Game/Overlays/Wiki/Markdown/WikiMarkdownContainer.cs
index 4ef9be90c9..bb296c5d41 100644
--- a/osu.Game/Overlays/Wiki/Markdown/WikiMarkdownContainer.cs
+++ b/osu.Game/Overlays/Wiki/Markdown/WikiMarkdownContainer.cs
@@ -16,8 +16,11 @@ namespace osu.Game.Overlays.Wiki.Markdown
{
public partial class WikiMarkdownContainer : OsuMarkdownContainer
{
- protected override bool Footnotes => true;
- protected override bool CustomContainers => true;
+ protected override OsuMarkdownContainerOptions Options => new OsuMarkdownContainerOptions
+ {
+ Footnotes = true,
+ CustomContainers = true
+ };
public string CurrentPath
{