}
- [CONTENT]
+ @Model.RenderBlock()
diff --git a/src/Elastic.Markdown/Slices/Directives/Stepper.cshtml b/src/Elastic.Markdown/Slices/Directives/Stepper.cshtml
index 57e23b35d..e93ba2fcc 100644
--- a/src/Elastic.Markdown/Slices/Directives/Stepper.cshtml
+++ b/src/Elastic.Markdown/Slices/Directives/Stepper.cshtml
@@ -1,6 +1,6 @@
@inherits RazorSlice
- [CONTENT]
+ @Model.RenderBlock()
diff --git a/src/Elastic.Markdown/Slices/Directives/TabItem.cshtml b/src/Elastic.Markdown/Slices/Directives/TabItem.cshtml
index d6facc90c..45db9625a 100644
--- a/src/Elastic.Markdown/Slices/Directives/TabItem.cshtml
+++ b/src/Elastic.Markdown/Slices/Directives/TabItem.cshtml
@@ -7,5 +7,5 @@
- [CONTENT]
+ @Model.RenderBlock()
diff --git a/src/Elastic.Markdown/Slices/Directives/TabSet.cshtml b/src/Elastic.Markdown/Slices/Directives/TabSet.cshtml
index a22edf60b..723678f12 100644
--- a/src/Elastic.Markdown/Slices/Directives/TabSet.cshtml
+++ b/src/Elastic.Markdown/Slices/Directives/TabSet.cshtml
@@ -1,4 +1,4 @@
@inherits RazorSlice
- [CONTENT]
+ @Model.RenderBlock()
diff --git a/src/Elastic.Markdown/Slices/Directives/Version.cshtml b/src/Elastic.Markdown/Slices/Directives/Version.cshtml
index 4deb9fe85..3bfa31c5d 100644
--- a/src/Elastic.Markdown/Slices/Directives/Version.cshtml
+++ b/src/Elastic.Markdown/Slices/Directives/Version.cshtml
@@ -1,6 +1,5 @@
@inherits RazorSlice
@Model.Title
- [CONTENT]
-
+ @Model.RenderBlock()
\ No newline at end of file
diff --git a/src/Elastic.Markdown/Slices/Directives/_ViewModels.cs b/src/Elastic.Markdown/Slices/Directives/_ViewModels.cs
index 7a73c8997..9680d896b 100644
--- a/src/Elastic.Markdown/Slices/Directives/_ViewModels.cs
+++ b/src/Elastic.Markdown/Slices/Directives/_ViewModels.cs
@@ -2,14 +2,30 @@
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
// See the LICENSE file in the project root for more information
-using System.Security.Cryptography;
using System.Text;
using Elastic.Markdown.Helpers;
+using Elastic.Markdown.Myst.CodeBlocks;
using Elastic.Markdown.Myst.Settings;
+using Markdig.Syntax;
+using Microsoft.AspNetCore.Html;
namespace Elastic.Markdown.Slices.Directives;
-public class AdmonitionViewModel
+public abstract class DirectiveViewModel
+{
+ public required ContainerBlock DirectiveBlock { get; set; }
+ public HtmlString RenderBlock()
+ {
+ var subscription = DocumentationObjectPoolProvider.HtmlRendererPool.Get();
+ subscription.HtmlRenderer.WriteChildren(DirectiveBlock);
+
+ var result = subscription.RentedStringBuilder?.ToString();
+ DocumentationObjectPoolProvider.HtmlRendererPool.Return(subscription);
+ return new HtmlString(result);
+ }
+}
+
+public class AdmonitionViewModel : DirectiveViewModel
{
public required string Title { get; init; }
public required string Directive { get; init; }
@@ -24,18 +40,34 @@ public class CodeViewModel
public required string? Caption { get; init; }
public required string Language { get; init; }
public required string? CrossReferenceName { get; init; }
+ public string? RawIncludedFileContents { get; init; }
+ public EnhancedCodeBlock? EnhancedCodeBlock { get; set; }
+
+ public HtmlString RenderBlock()
+ {
+ if (!string.IsNullOrWhiteSpace(RawIncludedFileContents))
+ return new HtmlString(RawIncludedFileContents);
+ if (EnhancedCodeBlock == null)
+ return HtmlString.Empty;
+
+ var subscription = DocumentationObjectPoolProvider.HtmlRendererPool.Get();
+ EnhancedCodeBlockHtmlRenderer.RenderCodeBlockLines(subscription.HtmlRenderer, EnhancedCodeBlock);
+ var result = subscription.RentedStringBuilder?.ToString();
+ DocumentationObjectPoolProvider.HtmlRendererPool.Return(subscription);
+ return new HtmlString(result);
+ }
}
-public class VersionViewModel
+public class VersionViewModel : DirectiveViewModel
{
public required string Directive { get; init; }
public required string VersionClass { get; init; }
public required string Title { get; init; }
}
-public class TabSetViewModel;
+public class TabSetViewModel : DirectiveViewModel;
-public class TabItemViewModel
+public class TabItemViewModel : DirectiveViewModel
{
public required int Index { get; init; }
public required int TabSetIndex { get; init; }
@@ -43,12 +75,12 @@ public class TabItemViewModel
public required string? SyncKey { get; init; }
public required string? TabSetGroupKey { get; init; }
}
-public class IncludeViewModel
+public class IncludeViewModel : DirectiveViewModel
{
public required string Html { get; init; }
}
-public class ImageViewModel
+public class ImageViewModel : DirectiveViewModel
{
public required string? Label { get; init; }
public required string? Align { get; init; }
@@ -90,11 +122,11 @@ public class SettingsViewModel
public required Func RenderMarkdown { get; init; }
}
-public class MermaidViewModel;
+public class MermaidViewModel : DirectiveViewModel;
-public class StepperViewModel;
+public class StepperViewModel : DirectiveViewModel;
-public class StepViewModel
+public class StepViewModel : DirectiveViewModel
{
public required string Title { get; init; }
public required string Anchor { get; init; }
diff --git a/src/Elastic.Markdown/Slices/HtmlWriter.cs b/src/Elastic.Markdown/Slices/HtmlWriter.cs
index 3cd927b01..86e688779 100644
--- a/src/Elastic.Markdown/Slices/HtmlWriter.cs
+++ b/src/Elastic.Markdown/Slices/HtmlWriter.cs
@@ -89,7 +89,7 @@ public async Task RenderLayout(MarkdownFile markdown, Cancel ctx = defau
private async Task RenderLayout(MarkdownFile markdown, MarkdownDocument document, Cancel ctx = default)
{
- var html = markdown.CreateHtml(document);
+ var html = MarkdownFile.CreateHtml(document);
await DocumentationSet.Tree.Resolve(ctx);
var navigationHtml = await NavigationHtmlWriter.RenderNavigation(markdown.NavigationRoot, markdown.NavigationSource, ctx);
diff --git a/tests/Elastic.Markdown.Tests/Directives/DirectiveBaseTests.cs b/tests/Elastic.Markdown.Tests/Directives/DirectiveBaseTests.cs
index 2fcf94e93..62696a2cf 100644
--- a/tests/Elastic.Markdown.Tests/Directives/DirectiveBaseTests.cs
+++ b/tests/Elastic.Markdown.Tests/Directives/DirectiveBaseTests.cs
@@ -83,7 +83,7 @@ public virtual async ValueTask InitializeAsync()
await Set.LinkResolver.FetchLinks(TestContext.Current.CancellationToken);
Document = await File.ParseFullAsync(TestContext.Current.CancellationToken);
- var html = File.CreateHtml(Document).AsSpan();
+ var html = MarkdownFile.CreateHtml(Document).AsSpan();
var find = "";
var start = html.IndexOf(find, StringComparison.Ordinal);
Html = start >= 0
diff --git a/tests/Elastic.Markdown.Tests/Inline/InlneBaseTests.cs b/tests/Elastic.Markdown.Tests/Inline/InlneBaseTests.cs
index 3ad3c8c1d..8ec6a4bb5 100644
--- a/tests/Elastic.Markdown.Tests/Inline/InlneBaseTests.cs
+++ b/tests/Elastic.Markdown.Tests/Inline/InlneBaseTests.cs
@@ -132,7 +132,7 @@ public virtual async ValueTask InitializeAsync()
await Set.LinkResolver.FetchLinks(TestContext.Current.CancellationToken);
Document = await File.ParseFullAsync(TestContext.Current.CancellationToken);
- var html = File.CreateHtml(Document).AsSpan();
+ var html = MarkdownFile.CreateHtml(Document).AsSpan();
var find = "\n";
var start = html.IndexOf(find, StringComparison.Ordinal);
Html = start >= 0 && !TestingFullDocument
diff --git a/tests/authoring/Blocks/Admonitions.fs b/tests/authoring/Blocks/Admonitions.fs
index 71ea14e13..d4e6c5d8b 100644
--- a/tests/authoring/Blocks/Admonitions.fs
+++ b/tests/authoring/Blocks/Admonitions.fs
@@ -27,7 +27,7 @@ type ``admonition in list`` () =
Note