From 021a5ec82106427dedb4fc2280c07c0c7f542824 Mon Sep 17 00:00:00 2001 From: Jan Calanog Date: Fri, 11 Apr 2025 09:29:58 +0200 Subject: [PATCH 1/4] Don't allow dots (.) in slug --- src/Elastic.Markdown/Helpers/SlugExtensions.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Elastic.Markdown/Helpers/SlugExtensions.cs b/src/Elastic.Markdown/Helpers/SlugExtensions.cs index 85816fc16..e36099721 100644 --- a/src/Elastic.Markdown/Helpers/SlugExtensions.cs +++ b/src/Elastic.Markdown/Helpers/SlugExtensions.cs @@ -8,8 +8,14 @@ namespace Elastic.Markdown.Helpers; public static class SlugExtensions { - private static readonly SlugHelper Instance = new(); + private static readonly SlugHelper Instance = InitSlugHelper(); - public static string Slugify(this string? text) => Instance.GenerateSlug(text); + private static SlugHelper InitSlugHelper() + { + var config = new SlugHelperConfiguration(); + _ = config.AllowedChars.Remove('.'); + return new SlugHelper(config); + } + public static string Slugify(this string? text) => Instance.GenerateSlug(text); } From 1f468dbf79221504fb59a7bdd5c4673e9cb27c3b Mon Sep 17 00:00:00 2001 From: Jan Calanog Date: Fri, 11 Apr 2025 09:46:40 +0200 Subject: [PATCH 2/4] Don't slugify custom anchors --- src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs b/src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs index ae4a4e4e0..9088fe2ae 100644 --- a/src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs +++ b/src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs @@ -32,11 +32,9 @@ protected override void Write(HtmlRenderer renderer, HeadingBlock obj) var header = obj.GetData("header") as string; var anchor = obj.GetData("anchor") as string; - var slugTarget = (anchor ?? header) ?? string.Empty; - if (slugTarget.Contains('$')) - slugTarget = HeadingAnchorParser.InlineAnchors().Replace(slugTarget, ""); - - var slug = slugTarget.Slugify(); + var slug = anchor ?? header.Slugify(); + if (slug.Contains('$')) + slug = HeadingAnchorParser.InlineAnchors().Replace(slug, "").Slugify(); _ = renderer.Write(@"
Date: Fri, 11 Apr 2025 09:53:05 +0200 Subject: [PATCH 3/4] Only slugify header and dont slugify custom created anchors --- src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs b/src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs index 9088fe2ae..457a7128f 100644 --- a/src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs +++ b/src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs @@ -34,7 +34,7 @@ protected override void Write(HtmlRenderer renderer, HeadingBlock obj) var slug = anchor ?? header.Slugify(); if (slug.Contains('$')) - slug = HeadingAnchorParser.InlineAnchors().Replace(slug, "").Slugify(); + slug = HeadingAnchorParser.InlineAnchors().Replace(slug, ""); _ = renderer.Write(@"
Date: Fri, 11 Apr 2025 11:12:57 +0200 Subject: [PATCH 4/4] Allow dots in custom anchors --- src/Elastic.Markdown/Helpers/SlugExtensions.cs | 10 +++++++--- src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/Elastic.Markdown/Helpers/SlugExtensions.cs b/src/Elastic.Markdown/Helpers/SlugExtensions.cs index e36099721..fa2edefef 100644 --- a/src/Elastic.Markdown/Helpers/SlugExtensions.cs +++ b/src/Elastic.Markdown/Helpers/SlugExtensions.cs @@ -9,13 +9,17 @@ namespace Elastic.Markdown.Helpers; public static class SlugExtensions { private static readonly SlugHelper Instance = InitSlugHelper(); + private static readonly SlugHelper InstanceWithDots = InitSlugHelper(true); - private static SlugHelper InitSlugHelper() + private static SlugHelper InitSlugHelper(bool allowDots = false) { var config = new SlugHelperConfiguration(); - _ = config.AllowedChars.Remove('.'); + if (!allowDots) + _ = config.AllowedChars.Remove('.'); return new SlugHelper(config); } - public static string Slugify(this string? text) => Instance.GenerateSlug(text); + public static string Slugify(this string? text, bool allowDots = false) => allowDots + ? InstanceWithDots.GenerateSlug(text) + : Instance.GenerateSlug(text); } diff --git a/src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs b/src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs index 457a7128f..2efab2d23 100644 --- a/src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs +++ b/src/Elastic.Markdown/Myst/SectionedHeadingRenderer.cs @@ -32,9 +32,13 @@ protected override void Write(HtmlRenderer renderer, HeadingBlock obj) var header = obj.GetData("header") as string; var anchor = obj.GetData("anchor") as string; - var slug = anchor ?? header.Slugify(); - if (slug.Contains('$')) - slug = HeadingAnchorParser.InlineAnchors().Replace(slug, ""); + var slugTarget = (anchor ?? header) ?? string.Empty; + if (slugTarget.Contains('$')) + slugTarget = HeadingAnchorParser.InlineAnchors().Replace(slugTarget, ""); + + var slug = slugTarget.Slugify(); + if (anchor != null || slugTarget.Contains('$')) + slug = slugTarget.Slugify(true); _ = renderer.Write(@"