From 48dc84641206fae07224cf13df233decdcb94e4f Mon Sep 17 00:00:00 2001 From: jakraft <52800741+jakraft@users.noreply.github.com> Date: Sun, 16 Jan 2022 22:33:02 -0500 Subject: [PATCH] Optionally enable Markdig extensions that are not included by default in DocFX (#7833) --- .../Constants.cs | 18 ++++++++ .../MarkdownExtensions.cs | 22 +++++++++ .../MarkdigMarkdownService.cs | 10 +++- .../GeneralTest.cs | 46 ++++++++++++++++++- .../TestUtility.cs | 7 ++- 5 files changed, 98 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.DocAsCode.MarkdigEngine.Extensions/Constants.cs b/src/Microsoft.DocAsCode.MarkdigEngine.Extensions/Constants.cs index e85c1eebaaf..b3f194788c6 100644 --- a/src/Microsoft.DocAsCode.MarkdigEngine.Extensions/Constants.cs +++ b/src/Microsoft.DocAsCode.MarkdigEngine.Extensions/Constants.cs @@ -11,5 +11,23 @@ public static class WarningCodes { public const string InvalidTabGroup = "InvalidTabGroup"; } + + /// + /// Names of properties supported in the markdownEngineProperties + /// property in the docfx.json + /// + public static class EngineProperties + { + /// + /// Enables the . + /// + public const string EnableSourceInfo = "EnableSourceInfo"; + + /// + /// Contains a list of optional Markdig extensions that are not + /// enabled by default by DocFX. + /// + public const string MarkdigExtensions = "markdigExtensions"; + } } } diff --git a/src/Microsoft.DocAsCode.MarkdigEngine.Extensions/MarkdownExtensions.cs b/src/Microsoft.DocAsCode.MarkdigEngine.Extensions/MarkdownExtensions.cs index a9e465ba6ea..132167f64a4 100644 --- a/src/Microsoft.DocAsCode.MarkdigEngine.Extensions/MarkdownExtensions.cs +++ b/src/Microsoft.DocAsCode.MarkdigEngine.Extensions/MarkdownExtensions.cs @@ -4,6 +4,8 @@ namespace Microsoft.DocAsCode.MarkdigEngine.Extensions { using System; + using System.Collections.Generic; + using System.Linq; using Markdig; using Markdig.Extensions.AutoIdentifiers; using Markdig.Extensions.CustomContainers; @@ -39,6 +41,26 @@ public static MarkdownPipelineBuilder UseDocfxExtensions(this MarkdownPipelineBu .RemoveUnusedExtensions(); } + /// + /// Enables optional Markdig extensions that are not added by default with DocFX + /// + /// The markdown pipeline builder + /// The list of optional extensions + /// The pipeline with optional extensions enabled + public static MarkdownPipelineBuilder UseOptionalExtensions( + this MarkdownPipelineBuilder pipeline, + IEnumerable optionalExtensions) + { + if (!optionalExtensions.Any()) + { + return pipeline; + } + + pipeline.Configure(string.Join("+", optionalExtensions)); + + return pipeline; + } + private static MarkdownPipelineBuilder RemoveUnusedExtensions(this MarkdownPipelineBuilder pipeline) { pipeline.Extensions.RemoveAll(extension => extension is CustomContainerExtension); diff --git a/src/Microsoft.DocAsCode.MarkdigEngine/MarkdigMarkdownService.cs b/src/Microsoft.DocAsCode.MarkdigEngine/MarkdigMarkdownService.cs index 7650917d5d4..1385c43a2c4 100644 --- a/src/Microsoft.DocAsCode.MarkdigEngine/MarkdigMarkdownService.cs +++ b/src/Microsoft.DocAsCode.MarkdigEngine/MarkdigMarkdownService.cs @@ -15,6 +15,7 @@ namespace Microsoft.DocAsCode.MarkdigEngine using Markdig.Syntax; using Microsoft.DocAsCode.Plugins; using Microsoft.DocAsCode.Common; + using System.Collections.Generic; public class MarkdigMarkdownService : IMarkdownService { @@ -136,7 +137,7 @@ public MarkupResult Render(MarkdownDocument document, bool isInline) private MarkdownPipeline CreateMarkdownPipeline(bool isInline, bool enableValidation) { object enableSourceInfoObj = null; - _parameters?.Extensions?.TryGetValue("EnableSourceInfo", out enableSourceInfoObj); + _parameters?.Extensions?.TryGetValue(Constants.EngineProperties.EnableSourceInfo, out enableSourceInfoObj); var enableSourceInfo = !(enableSourceInfoObj is bool enabled) || enabled; @@ -160,6 +161,13 @@ private MarkdownPipeline CreateMarkdownPipeline(bool isInline, bool enableValida builder.UseInlineOnly(); } + object optionalExtensionsObj = null; + if ((_parameters?.Extensions?.TryGetValue(Constants.EngineProperties.MarkdigExtensions, out optionalExtensionsObj) ?? false) + && optionalExtensionsObj is IEnumerable optionalExtensions) + { + builder.UseOptionalExtensions(optionalExtensions.Select(e => e as string).Where(e => e != null)); + } + return builder.Build(); } diff --git a/test/Microsoft.DocAsCode.MarkdigEngine.Extensions.Tests/GeneralTest.cs b/test/Microsoft.DocAsCode.MarkdigEngine.Extensions.Tests/GeneralTest.cs index 328052290b5..1a974734689 100644 --- a/test/Microsoft.DocAsCode.MarkdigEngine.Extensions.Tests/GeneralTest.cs +++ b/test/Microsoft.DocAsCode.MarkdigEngine.Extensions.Tests/GeneralTest.cs @@ -23,9 +23,9 @@ public void MarkdigWithDefaultFAL() [Fact] [Trait("Related", "DfmMarkdown")] - public void TestDfm_TaskList() + public void TestDfm_TaskList_ExtensionDisabledByDefault() { - // Confirm that the [ ] and { } in the middle of list should not be parsed. + // Confirm that the [ ] and { } in the middle of list should not be parsed by default. var source = @"* Not contain a special character: \ ! # $ % & * + / = ? ^ ` { } | ~ < > ( ) ' ; : , [ ] "" @ _"; var expected = @"