Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix inline code in left navigation and h1 rendering #290

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
15 changes: 15 additions & 0 deletions src/Elastic.Markdown/Helpers/Markdown.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Licensed to Elasticsearch B.V under one or more agreements.
// 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

namespace Elastic.Markdown.Helpers;

public static class MarkdownStringExtensions
{
public static string StripMarkdown(this string markdown)
{
using var writer = new StringWriter();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For funsies tried to see if pooling the StringBuilder() this instantatiates each time had an impact but its very minimal:

private static readonly ObjectPool<StringBuilder> StringBuilderPool = new DefaultObjectPool<StringBuilder>(new StringBuilderPooledObjectPolicy());
public static string StripMarkdownPooled(string markdown)
{
   	var sb = StringBuilderPool.Get();
	try
	{
		using var writer = new StringWriter(sb, CultureInfo.InvariantCulture);
		Markdig.Markdown.ToPlainText(markdown, writer);
		return writer.ToString().TrimEnd('\n');
	}
	finally
	{
		StringBuilderPool.Return(sb);
	}
}
Method Mean Error Gen0 Gen1 Allocated
StripMarkdown 1.963 us NA 0.4829 0.0029 3.95 KB
StripMarkdownPooled 1.706 us NA 0.4435 0.0027 3.63 KB

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh interesting, thank you!

How did you actually measure this?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark dot Will add a general benchmarking project at some point in the next week so we can utilize this more.

and: https://www.elastic.co/guide/en/ecs-logging/dotnet/current/benchmark-dotnet-data-shipper.html on CI 😄

Markdig.Markdown.ToPlainText(markdown, writer);
return writer.ToString().TrimEnd('\n');
}
}
17 changes: 14 additions & 3 deletions src/Elastic.Markdown/IO/MarkdownFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,21 @@ public DocumentationGroup? Parent
public string? UrlPathPrefix { get; }
private MarkdownParser MarkdownParser { get; }
public YamlFrontMatter? YamlFrontMatter { get; private set; }
public string? Title { get; private set; }
public string? TitleRaw { get; private set; }

public string? Title
{
get => _title;
private set
{
_title = value?.StripMarkdown();
TitleRaw = value;
}
}
public string? NavigationTitle
{
get => !string.IsNullOrEmpty(_navigationTitle) ? _navigationTitle : Title;
private set => _navigationTitle = value;
private set => _navigationTitle = value?.StripMarkdown();
}

//indexed by slug
Expand All @@ -64,6 +74,7 @@ public string? NavigationTitle

private bool _instructionsParsed;
private DocumentationGroup? _parent;
private string? _title;

public MarkdownFile[] YieldParents()
{
Expand Down Expand Up @@ -156,7 +167,7 @@ private void ReadDocumentInstructions(MarkdownDocument document)
.Select(h => (h.GetData("header") as string, h.GetData("anchor") as string))
.Select(h => new PageTocItem
{
Heading = h.Item1!.Replace("`", "").Replace("*", ""),
Heading = h.Item1!.StripMarkdown(),
Slug = (h.Item2 ?? h.Item1).Slugify()
})
.ToList();
Expand Down
1 change: 1 addition & 0 deletions src/Elastic.Markdown/Slices/HtmlWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ public async Task<string> RenderLayout(MarkdownFile markdown, Cancel ctx = defau
var slice = Index.Create(new IndexViewModel
{
Title = markdown.Title ?? "[TITLE NOT SET]",
TitleRaw = markdown.TitleRaw ?? "[TITLE NOT SET]",
MarkdownHtml = html,
PageTocItems = markdown.TableOfContents.Values.ToList(),
Tree = DocumentationSet.Tree,
Expand Down
4 changes: 3 additions & 1 deletion src/Elastic.Markdown/Slices/Index.cshtml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
@using Markdig
@inherits RazorSliceHttpResult<IndexViewModel>
@implements IUsesLayout<Elastic.Markdown.Slices._Layout, LayoutViewModel>
@functions {
Expand All @@ -16,7 +17,8 @@
};
}
<section id="elastic-docs-v3">
<h1>@(Model.Title)</h1>
@* This way it's correctly rendered as <h1>text</h1> instead of <h1><p>text</p></h1> *@
@(new HtmlString(Markdown.ToHtml("# " + Model.TitleRaw)))
@if (Model.Applies is not null)
{
await RenderPartialAsync(Applies.Create(Model.Applies));
Expand Down
2 changes: 2 additions & 0 deletions src/Elastic.Markdown/Slices/_ViewModels.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ namespace Elastic.Markdown.Slices;
public class IndexViewModel
{
public required string Title { get; init; }
public required string TitleRaw { get; init; }
public required string MarkdownHtml { get; init; }
public required DocumentationGroup Tree { get; init; }
public required IReadOnlyCollection<PageTocItem> PageTocItems { get; init; }
Expand All @@ -26,6 +27,7 @@ public class IndexViewModel
public class LayoutViewModel
{
public string Title { get; set; } = "Elastic Documentation";
public string RawTitle { get; set; } = "Elastic Documentation";
public required IReadOnlyCollection<PageTocItem> PageTocItems { get; init; }
public required DocumentationGroup Tree { get; init; }
public required MarkdownFile CurrentDocument { get; init; }
Expand Down
Loading