.Shared.Get();
node.WithIdentifier(hrContent);
parentNode.AddChildNode(node);
}
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/HtmlSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/HtmlBlockSyntaxNodeSerializer.cs
similarity index 56%
rename from src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/HtmlSyntaxNodeSerializer.cs
rename to src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/HtmlBlockSyntaxNodeSerializer.cs
index 43473768..14c7cc25 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/HtmlSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/HtmlBlockSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Text.RegularExpressions;
@@ -10,17 +9,54 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class HtmlSyntaxNodeSerializer {
- private static readonly int HtmlPreId = MdRegexLib.GetGroupId(MdRegexGroupNames.HtmlPre);
- private static readonly int HtmlBodyId = MdRegexLib.GetGroupId(MdRegexGroupNames.HtmlBody);
- private static readonly int HtmlPostId = MdRegexLib.GetGroupId(MdRegexGroupNames.HtmlPost);
- private static readonly int SpanTagAttrsId = MdRegexLib.GetGroupId(MdRegexGroupNames.SpanTagAttrs);
- private static readonly int SpanBodyId = MdRegexLib.GetGroupId(MdRegexGroupNames.SpanBody);
+public partial class HtmlBlockSyntaxNodeSerializer : IMdSyntaxNodeSerializer{
+ [GeneratedRegex("""
+ \G
+ (?.+?)?
+ (?
+ <(?\w+)\b[^>]*>
+ (?>
+ [^<]+
+ | <(?\k)\b[^>]*>
+ | (?<-open>\k)>
+ | <(?!/?\k\b)[^>]+>
+ )*
+ (?(open)(?!))
+ (\k>)
+ )
+ (?.+)?
+ """, RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline | RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+ [GeneratedRegex("""
+ \b[^>]*)>
+ (?
+ (?>
+ [^<]+
+ | <(?span)\b[^>]*>
+ | (?<-open>span)>
+ | <(?!/?span\b)[^>]+>
+ )*
+ )
+ (?(open)(?!))
+ ()
+ """, RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline | RegexOptions.Compiled)]
+ private static partial Regex SpanSyntax { get; }
+
+ private static readonly int HtmlPreId = Syntax.GroupNumberFromName("pre");
+ private static readonly int HtmlBodyId = Syntax.GroupNumberFromName("body");
+ private static readonly int HtmlPostId = Syntax.GroupNumberFromName("post");
+ private static readonly int SpanTagAttrsId = SpanSyntax.GroupNumberFromName("attr");
+ private static readonly int SpanBodyId = SpanSyntax.GroupNumberFromName("body");
+ public char[] TriggerCharacters { get; } = Array.Empty();
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
@@ -32,14 +68,14 @@ Match match
bool hasHtmlBody = match.Groups[HtmlBodyId].TryGetValue(out string? htmlBody);
string? spanBody = null;
if (hasHtmlBody && htmlBody is not null) {
- spanMatch = MdRegexLib.FindSpanHtmlRegex.Match(htmlBody);
+ spanMatch = SpanSyntax.Match(htmlBody);
if (spanMatch.Groups[SpanBodyId].TryGetValue(out spanBody)) {
hasTrailingContent = true;
}
}
if (hasTrailingContent && parentNode is not (ParagraphMdSyntaxNode or HtmlSpanMdSyntaxNode)) {
- parentNode = parentNode.AddChildNode(ParagraphMdSyntaxNode.Pool.Get());
+ parentNode = parentNode.AddChildNode(MdSyntaxNodePool.Shared.Get());
}
if (match.Groups[HtmlPostId].TryGetValue(out string? post)) {
@@ -49,7 +85,7 @@ Match match
if (hasHtmlBody && htmlBody is not null) {
// Span should be the only special case allowed that allows for Markdown parsing within it
if (spanMatch is not null && spanBody is not null) {
- HtmlSpanMdSyntaxNode spanNode = HtmlSpanMdSyntaxNode.Pool.Get();
+ HtmlSpanMdSyntaxNode spanNode = MdSyntaxNodePool.Shared.Get();
string spanTagAttrs = spanMatch.Groups[SpanTagAttrsId].Value;
spanNode.WithAttributes(spanTagAttrs);
@@ -58,7 +94,7 @@ Match match
stack.PushProcessedNodeToStack(parentNode, spanNode);
}
else {
- HtmlMdSyntaxNode htmlNode = HtmlMdSyntaxNode.Pool.Get();
+ HtmlMdSyntaxNode htmlNode = MdSyntaxNodePool.Shared.Get();
htmlNode.WithContent(htmlBody);
stack.PushProcessedNodeToStack(parentNode, htmlNode);
}
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/ItalicSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/ItalicSyntaxNodeSerializer.cs
index 84a2e7f6..41f1bb50 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/ItalicSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/ItalicSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Text.RegularExpressions;
@@ -10,20 +9,27 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class ItalicSyntaxNodeSerializer {
- private static readonly int ItalicId = MdRegexLib.GetGroupId(MdRegexGroupNames.ItalicContent);
-
+public partial class ItalicSyntaxNodeSerializer : IMdSyntaxNodeSerializer {
+ [GeneratedRegex(@"\G\*(?(?>[^\\\*]+|\\\*|\*\*|(?\*)|(?<-open>\*))+)(?(open)(?!))\*", RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+ private static readonly int ItalicContentId = Syntax.GroupNumberFromName("i");
+
+ public char[] TriggerCharacters { get; } = ['*'];
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
) {
- if (!match.Groups[ItalicId].TryGetValue(out string? italicValue)) return;
+ string italicValue = match.Groups[ItalicContentId].Value;
- ItalicMdSyntaxNode node = ItalicMdSyntaxNode.Pool.Get();
+ ItalicMdSyntaxNode node = MdSyntaxNodePool.Shared.Get();
parentNode.AddChildNode(node);
stack.PushSingleLineMatchesToStack(italicValue, node);
}
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/LinkSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/LinkSyntaxNodeSerializer.cs
index 7ba4503b..923f4096 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/LinkSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/LinkSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Text.RegularExpressions;
@@ -10,29 +9,44 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class LinkSyntaxNodeSerializer {
- private static readonly int LnTextId = MdRegexLib.GetGroupId(MdRegexGroupNames.LinkText);
- private static readonly int LnHrefId = MdRegexLib.GetGroupId(MdRegexGroupNames.LinkHref);
- private static readonly int LnModsId = MdRegexLib.GetGroupId(MdRegexGroupNames.LinkModifiers);
- private static readonly int LnBangId = MdRegexLib.GetGroupId(MdRegexGroupNames.LinkBang);
- private static readonly int LnTitleId = MdRegexLib.GetGroupId(MdRegexGroupNames.LinkTitle);
-
+public partial class LinkSyntaxNodeSerializer : IMdSyntaxNodeSerializer {
+ [GeneratedRegex("""
+ \G
+ (?!)?
+ \[(? (?:\ *!?\[.+?\]\(.+?\)\ *)|(?:[^\\\]]|\\\]|\\[^\]])*?)\]
+ \(
+ (?\ *https?[^\ |]+)
+ (?:\ ?\"(?.+)\")?
+ (?\|.*)?
+ \)
+ """, RegexOptions.IgnorePatternWhitespace | RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+ private static readonly int LnBangId = Syntax.GroupNumberFromName("bang");
+ private static readonly int LnTextId = Syntax.GroupNumberFromName("text");
+ private static readonly int LnHrefId = Syntax.GroupNumberFromName("href");
+ private static readonly int LnTitleId = Syntax.GroupNumberFromName("title");
+ private static readonly int LnModsId = Syntax.GroupNumberFromName("mods");
+
+ public char[] TriggerCharacters { get; } = ['!', '['];
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
) {
- if (!match.Groups[LnTextId].TryGetValue(out string? linkText)) return;
- if (!match.Groups[LnHrefId].TryGetValue(out string? linkHref)) return;
-
- match.Groups[LnModsId].TryGetValue(out string? mods);
- match.Groups[LnTitleId].TryGetValue(out string? title);
+ string linkText = match.Groups[LnTextId].Value;
+ string linkHref = match.Groups[LnHrefId].Value;
+ string mods = match.Groups[LnModsId].Value;
+ string title = match.Groups[LnTitleId].Value;
if (match.Groups[LnBangId].Success) {
- ImageMdSyntaxNode imgNode = ImageMdSyntaxNode.Pool.Get();
+ ImageMdSyntaxNode imgNode = MdSyntaxNodePool.Shared.Get();
imgNode.WithAltText(linkText);
imgNode.WithHref(linkHref);
@@ -43,7 +57,7 @@ Match match
return;
}
- LinkMdSyntaxNode linkNode = LinkMdSyntaxNode.Pool.Get();
+ LinkMdSyntaxNode linkNode = MdSyntaxNodePool.Shared.Get();
linkNode.WithHref(linkHref);
if (mods.IsNotNullOrWhiteSpace()) linkNode.WithModifier(MdSyntaxNodeModifier.FromString(mods));
if (title.IsNotNullOrEmpty()) linkNode.WithTitle(title);
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/ListSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/ListSyntaxNodeSerializer.cs
index 387d483b..7140a6b7 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/ListSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/ListSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Buffers;
@@ -11,28 +10,43 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class ListSyntaxNodeSerializer {
- private static readonly int LsId = MdRegexLib.GetGroupId(MdRegexGroupNames.ListIdentifier);
- private static readonly int LTaskId = MdRegexLib.GetGroupId(MdRegexGroupNames.ListTask);
- private static readonly int LHeadId = MdRegexLib.GetGroupId(MdRegexGroupNames.ListHead);
- private static readonly int LBodyId = MdRegexLib.GetGroupId(MdRegexGroupNames.ListBody);
- private static readonly int LIndexId = MdRegexLib.GetGroupId(MdRegexGroupNames.ListIndex);
- private static readonly int ListItemLeadingSpaces = MdRegexLib.GetGroupId(MdRegexGroupNames.ListItemLeadingSpaces);
- private static readonly int ListTaskItemLeadingSpaces = MdRegexLib.GetGroupId(MdRegexGroupNames.ListTaskItemLeadingSpaces);
-
+public partial class ListSyntaxNodeSerializer : IMdSyntaxNodeSerializer {
+ [GeneratedRegex("""
+ \G
+ ^[^\S\n]*(?-(?!-)|\d+\.|\.\d+).+
+ (?:\n(?:(?:-(?!-)|\d+\.|\.\d+)|(?:[\ ]+)).+)*
+ """, RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline | RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+
+ [GeneratedRegex(@"^ *(?:-|(?\d*)\.)(?:(? *)\[(?[ xX~])])?(?:(? *)(?.+)|(? )|(?))(?(?:\n +.*)*)", RegexOptions.Multiline | RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex ListItemBodySyntax { get; }
+
+ private static readonly int LsId = Syntax.GroupNumberFromName("id");
+
+ private static readonly int LIndexId = ListItemBodySyntax.GroupNumberFromName("index");
+ private static readonly int ListTaskItemLeadingSpaces = ListItemBodySyntax.GroupNumberFromName("taskSpace");
+ private static readonly int LTaskId = ListItemBodySyntax.GroupNumberFromName("task");
+ private static readonly int ListItemLeadingSpaces = ListItemBodySyntax.GroupNumberFromName("space");
+ private static readonly int LHeadId = ListItemBodySyntax.GroupNumberFromName("head");
+ private static readonly int LBodyId = ListItemBodySyntax.GroupNumberFromName("body");
+
+ public char[] TriggerCharacters { get; } = ['-', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
) {
- if (!match.TryGetValue(out string? listBody)) return;
-
+ string listBody = match.Value;
bool isOrdered = !match.Groups[LsId].ValueSpan.Contains('-');
- MatchCollection matchCollection = MdRegexLib.ListItemBodyRegex.Matches(listBody);
+ MatchCollection matchCollection = ListItemBodySyntax.Matches(listBody);
int matchCount = matchCollection.Count;
Match[] matchArray = ArrayPool.Shared.Rent(matchCount);
@@ -40,14 +54,14 @@ Match match
matchCollection.CopyTo(matchArray, 0);
IMdSyntaxNode listNode = isOrdered
- ? ListOrderedMdSyntaxNode.Pool.Get()
- : ListUnOrderedMdSyntaxNode.Pool.Get();
+ ? MdSyntaxNodePool.Shared.Get()
+ : MdSyntaxNodePool.Shared.Get();
parentNode.AddChildNode(listNode);
for (int i = 0; i < matchCount; i++) {
GroupCollection groups = matchArray[i].Groups;
- ListItemMdSyntaxNode listItemNode = ListItemMdSyntaxNode.Pool.Get();
+ ListItemMdSyntaxNode listItemNode = MdSyntaxNodePool.Shared.Get();
listNode.AddChildNode(listItemNode);
groups[ListItemLeadingSpaces].TryGetLength(out int listItemLeadingSpaces);
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/NewLineSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/NewLineSyntaxNodeSerializer.cs
index cb7ecf4f..62783fe0 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/NewLineSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/NewLineSyntaxNodeSerializer.cs
@@ -9,14 +9,20 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class NewLineSyntaxNodeSerializer {
-
+public partial class NewLineSyntaxNodeSerializer : IMdSyntaxNodeSerializer {
+ [GeneratedRegex(@"\G\n")]
+ private static partial Regex Syntax { get; }
+
+ public char[] TriggerCharacters { get; } = ['\n'];
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
- ) => parentNode.AddChildNode(NewLineMdSyntaxNode.Pool.Get());
+ ) => parentNode.AddChildNode(MdSyntaxNodePool.Shared.Get());
}
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/ParagraphSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/ParagraphSyntaxNodeSerializer.cs
index e33d095d..0c3229b9 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/ParagraphSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/ParagraphSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Text.RegularExpressions;
@@ -10,24 +9,33 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class ParagraphSyntaxNodeSerializer {
- private static readonly int PId = MdRegexLib.GetGroupId(MdRegexGroupNames.ParagraphContent);
+public partial class ParagraphSyntaxNodeSerializer : IMdSyntaxNodeSerializer{
+
+ [GeneratedRegex(@"\G^(?.+?)$", RegexOptions.Multiline | RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+ private static readonly int PId = Syntax.GroupNumberFromName("p");
+
+ public char[] TriggerCharacters { get; } = Array.Empty();
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
) {
- if (!match.Groups[PId].TryGetValue(out string? paragraph)) return;
+ string paragraph = match.Groups[PId].Value;
if (parentNode is HtmlSpanMdSyntaxNode) {
stack.PushSingleLineMatchesToStack(paragraph, parentNode);
return;
}
- ParagraphMdSyntaxNode node = ParagraphMdSyntaxNode.Pool.Get();
+ ParagraphMdSyntaxNode node = MdSyntaxNodePool.Shared.Get();
parentNode = parentNode.AddChildNode(node);
stack.PushSingleLineMatchesToStack(paragraph, parentNode);
}
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/StrikeSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/StrikeSyntaxNodeSerializer.cs
index 49fb6879..9ebce46e 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/StrikeSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/StrikeSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Text.RegularExpressions;
@@ -10,20 +9,27 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class StrikeSyntaxNodeSerializer {
- private static readonly int StrikeContentId = MdRegexLib.GetGroupId(MdRegexGroupNames.StrikeContent);
-
+public partial class StrikeSyntaxNodeSerializer : IMdSyntaxNodeSerializer{
+ [GeneratedRegex(@"\G~~(?(?>[^\\~]+|\\~|~|(?~~)|(?<-open>~~))+?~?)(?(open)(?!))~~", RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+ private static readonly int StrikeContentId = Syntax.GroupNumberFromName("s");
+
+ public char[] TriggerCharacters { get; } = ['~'];
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
) {
- if (!match.Groups[StrikeContentId].TryGetValue(out string? strikeValue)) return;
+ string strikeValue = match.Groups[StrikeContentId].Value;
- StrikeMdSyntaxNode node = StrikeMdSyntaxNode.Pool.Get();
+ StrikeMdSyntaxNode node = MdSyntaxNodePool.Shared.Get();
parentNode.AddChildNode(node);
stack.PushSingleLineMatchesToStack(strikeValue, node);
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/SubScriptSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/SubScriptSyntaxNodeSerializer.cs
index 7711a105..29270fd2 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/SubScriptSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/SubScriptSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Text.RegularExpressions;
@@ -10,20 +9,27 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class SubScriptSyntaxNodeSerializer {
- private static readonly int SbId = MdRegexLib.GetGroupId(MdRegexGroupNames.SubScriptContent);
-
+public partial class SubScriptSyntaxNodeSerializer : IMdSyntaxNodeSerializer{
+ [GeneratedRegex(@"\G~(?(?>[^\\~\n]+|\\~|~~|(?~)|(?<-open>~))+)(?(open)(?!))~", RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+ private static readonly int SbId = Syntax.GroupNumberFromName("sb");
+
+ public char[] TriggerCharacters { get; } = ['~'];
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
) {
- if (!match.Groups[SbId].TryGetValue(out string? subValue)) return;
+ string subValue = match.Groups[SbId].Value;
- SubScriptMdSyntaxNode node = SubScriptMdSyntaxNode.Pool.Get();
+ SubScriptMdSyntaxNode node = MdSyntaxNodePool.Shared.Get();
parentNode.AddChildNode(node);
stack.PushSingleLineMatchesToStack(subValue, node);
}
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/SuperScriptSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/SuperScriptSyntaxNodeSerializer.cs
index 60a0c0ea..8b206a06 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/SuperScriptSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/SuperScriptSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Text.RegularExpressions;
@@ -10,20 +9,27 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class SuperScriptSyntaxNodeSerializer {
- private static readonly int SpId = MdRegexLib.GetGroupId(MdRegexGroupNames.SuperScriptContent);
-
+public partial class SuperScriptSyntaxNodeSerializer : IMdSyntaxNodeSerializer{
+ [GeneratedRegex(@"\G\^(?(?>[^\\\^\n]+|\\\^|\^\^|(?\^)|(?<-open>\^))+)(?(open)(?!))\^", RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+ private static readonly int SpId = Syntax.GroupNumberFromName("sp");
+
+ public char[] TriggerCharacters { get; } = ['^'];
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
) {
- if (!match.Groups[SpId].TryGetValue(out string? superValue)) return;
+ string superValue = match.Groups[SpId].Value;
- SuperScriptMdSyntaxNode node = SuperScriptMdSyntaxNode.Pool.Get();
+ SuperScriptMdSyntaxNode node = MdSyntaxNodePool.Shared.Get();
parentNode.AddChildNode(node);
stack.PushSingleLineMatchesToStack(superValue, node);
}
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/TableSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/TableSyntaxNodeSerializer.cs
index 1f02a3d3..746738c9 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/TableSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/TableSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Buffers;
@@ -11,17 +10,29 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class TableSyntaxNodeSerializer {
+public partial class TableSyntaxNodeSerializer : IMdSyntaxNodeSerializer{
+ [GeneratedRegex("""
+ \G
+ ^\|(?.+)\|[\ ]*\n
+ ^\|(?[:\-|\ ]+?)\|[\ ]*
+ (?(?:\n(?:^\|.*\|$))+)
+ """, RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline | RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+ private static readonly int HeadId = Syntax.GroupNumberFromName("head");
+ private static readonly int SepId = Syntax.GroupNumberFromName("sep");
+ private static readonly int BodyId = Syntax.GroupNumberFromName("body");
+
private const int StackAllocThreshold = 16;
- private static readonly int BodyId = MdRegexLib.GetGroupId(MdRegexGroupNames.TableBody);
- private static readonly int HeadId = MdRegexLib.GetGroupId(MdRegexGroupNames.TableHead);
- private static readonly int SepId = MdRegexLib.GetGroupId(MdRegexGroupNames.TableSeparator);
-
+ public char[] TriggerCharacters { get; } = ['|'];
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
@@ -42,16 +53,16 @@ Match match
int rowCount = rows.Split(rowRanges, '\n', StringSplitOptions.TrimEntries);
// Construct table HTML
- TableMdSyntaxNode tableNode = TableMdSyntaxNode.Pool.Get();
+ TableMdSyntaxNode tableNode = MdSyntaxNodePool.Shared.Get();
parentNode.AddChildNode(tableNode);
if (hasSeparatorData) tableNode.WithAlignments(separatorColumData);
// Add headers
- TableRowMdSyntaxNode tableHeadRow = TableRowMdSyntaxNode.Pool.Get();
+ TableRowMdSyntaxNode tableHeadRow = MdSyntaxNodePool.Shared.Get();
tableNode.TrySetHeader(tableHeadRow);
for (int index = 0; index < headerColumnCount; index++) {
- TableCellMdSyntaxNode tableHeadCellNode = TableCellMdSyntaxNode.Pool.Get();
+ TableCellMdSyntaxNode tableHeadCellNode = MdSyntaxNodePool.Shared.Get();
tableHeadRow.AddChildNode(tableHeadCellNode);
ReadOnlySpan column = header[headerColumns[index]];
@@ -71,11 +82,11 @@ Match match
int rowColumnCount = row.Split(columnBuffer, '|', StringSplitOptions.RemoveEmptyEntries);
- TableRowMdSyntaxNode tableRow = TableRowMdSyntaxNode.Pool.Get();
+ TableRowMdSyntaxNode tableRow = MdSyntaxNodePool.Shared.Get();
tableNode.TryAddRow(tableRow);
for (int columnIndex = 0; columnIndex < rowColumnCount; columnIndex++) {
- TableCellMdSyntaxNode tableCell = TableCellMdSyntaxNode.Pool.Get();
+ TableCellMdSyntaxNode tableCell = MdSyntaxNodePool.Shared.Get();
tableRow.AddChildNode(tableCell);
ReadOnlySpan column = row[columnBuffer[columnIndex]];
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/TagSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/TagSyntaxNodeSerializer.cs
index beb307cd..79563bfd 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/TagSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/TagSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Text.RegularExpressions;
@@ -10,20 +9,27 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class TagSyntaxNodeSerializer {
- private static readonly int TextId = MdRegexLib.GetGroupId(MdRegexGroupNames.TagText);
-
+public partial class TagSyntaxNodeSerializer : IMdSyntaxNodeSerializer{
+ [GeneratedRegex(@"\G\#(?[\p{L}\p{N}\-_\/\.]+)", RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+ private static readonly int TextId = Syntax.GroupNumberFromName("t");
+
+ public char[] TriggerCharacters { get; } = ['#'];
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
) {
- if (!match.Groups[TextId].TryGetValue(out string? tagValue)) return;
+ string tagValue = match.Groups[TextId].Value;
- TagMdSyntaxNode node = TagMdSyntaxNode.Pool.Get();
+ TagMdSyntaxNode node = MdSyntaxNodePool.Shared.Get();
node.WithContent(tagValue);
parentNode.AddChildNode(node);
}
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/TemplateSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/TemplateSyntaxNodeSerializer.cs
index 5b183012..e8449a75 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/TemplateSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/TemplateSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Text.RegularExpressions;
@@ -10,22 +9,28 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class TemplateSyntaxNodeSerializer {
- private static readonly int TemplateId = MdRegexLib.GetGroupId(MdRegexGroupNames.Template);
- private static readonly int TemplateContentId = MdRegexLib.GetGroupId(MdRegexGroupNames.TemplateContent);
-
+public partial class TemplateSyntaxNodeSerializer : IMdSyntaxNodeSerializer {
+ [GeneratedRegex(@"\G(?\{)+(?[^\s{}]+)(?<-open>\})+(?(open)(?!))", RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+ private static readonly int TemplateContentId = Syntax.GroupNumberFromName("t");
+
+ public char[] TriggerCharacters { get; } = ['{'];
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
) {
- if (!match.Groups[TemplateContentId].TryGetValue(out string? variableContent)) return;
- if (!match.Groups[TemplateId].TryGetLength(out int variableLength)) return;
+ string variableContent = match.Groups[TemplateContentId].Value;
+ int variableLength = match.Length;
- TemplateMdSyntaxNode node = TemplateMdSyntaxNode.Pool.Get();
+ TemplateMdSyntaxNode node = MdSyntaxNodePool.Shared.Get();
node.WithContent(variableContent)
.WithBracesCount((variableLength - variableContent.Length) / 2);
parentNode.AddChildNode(node);
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/UnderlineSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/UnderlineSyntaxNodeSerializer.cs
index 9e382575..5300cb0f 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/UnderlineSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/UnderlineSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Text.RegularExpressions;
@@ -10,20 +9,27 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class UnderlineSyntaxNodeSerializer {
- private static readonly int UId = MdRegexLib.GetGroupId(MdRegexGroupNames.UnderlineContent);
-
+public partial class UnderlineSyntaxNodeSerializer : IMdSyntaxNodeSerializer {
+ [GeneratedRegex(@"\G_(?(?>[^\\_]+|\\_|__|(?_)|(?<-open>_))+)(?(open)(?!))_", RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+ private static readonly int UId = Syntax.GroupNumberFromName("u");
+
+ public char[] TriggerCharacters { get; } = ['_'];
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
) {
- if (!match.Groups[UId].TryGetValue(out string? underlineValue)) return;
+ string underlineValue = match.Groups[UId].Value;
- UnderlineMdSyntaxNode node = UnderlineMdSyntaxNode.Pool.Get();
+ UnderlineMdSyntaxNode node = MdSyntaxNodePool.Shared.Get();
parentNode.AddChildNode(node);
stack.PushSingleLineMatchesToStack(underlineValue, node);
}
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/UserSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/UserSyntaxNodeSerializer.cs
index 2e482ef4..681af16d 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/UserSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/UserSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Text.RegularExpressions;
@@ -10,20 +9,27 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class UserSyntaxNodeSerializer {
- private static readonly int UsernameId = MdRegexLib.GetGroupId(MdRegexGroupNames.UserName);
-
+public partial class UserSyntaxNodeSerializer : IMdSyntaxNodeSerializer {
+ [GeneratedRegex(@"\G\@(?[\p{L}\p{N}\-_\/\.]+)", RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+ private static readonly int UsernameId = Syntax.GroupNumberFromName("u");
+
+ public char[] TriggerCharacters { get; } = ['@'];
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
) {
- if (!match.Groups[UsernameId].TryGetValue(out string? username)) return;
+ string username = match.Groups[UsernameId].Value;
- UserMdSyntaxNode node = UserMdSyntaxNode.Pool.Get();
+ UserMdSyntaxNode node = MdSyntaxNodePool.Shared.Get();
node.WithContent(username);
parentNode.AddChildNode(node);
}
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/WikiLinkSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/WikiLinkSyntaxNodeSerializer.cs
index 5baa09bd..746dde11 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/WikiLinkSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/WikiLinkSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Text.RegularExpressions;
@@ -10,20 +9,28 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class WikiLinkSyntaxNodeSerializer {
- private static readonly int WikiLinkHrefId = MdRegexLib.GetGroupId(MdRegexGroupNames.WikiLinkHref);
-
+public partial class WikiLinkSyntaxNodeSerializer : IMdSyntaxNodeSerializer{
+
+ [GeneratedRegex(@"\G\[\[(?[^\]\[\ ]+)\]\]", RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+ private static readonly int WikiLinkHrefId = Syntax.GroupNumberFromName("href");
+
+ public char[] TriggerCharacters { get; } = ['['];
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(
IMdSyntaxFragmentStack stack,
IMdSyntaxNode parentNode,
Match match
) {
- if (!match.Groups[WikiLinkHrefId].TryGetValue(out string? href)) return;
+ string href = match.Groups[WikiLinkHrefId].Value;
- WikiLinkMdSyntaxNode node = WikiLinkMdSyntaxNode.Pool.Get();
+ WikiLinkMdSyntaxNode node = MdSyntaxNodePool.Shared.Get();
node.WithContent(href);
parentNode.AddChildNode(node);
}
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/WrapperSyntaxNodeSerializer.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/WrapperSyntaxNodeSerializer.cs
index da7aa858..9c17926f 100644
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/WrapperSyntaxNodeSerializer.cs
+++ b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/NodeSerializers/WrapperSyntaxNodeSerializer.cs
@@ -1,7 +1,6 @@
// ---------------------------------------------------------------------------------------------------------------------
// Imports
// ---------------------------------------------------------------------------------------------------------------------
-using InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
using InfiniBlazor.Markdown.Syntax;
using InfiniBlazor.Markdown.Syntax.Nodes;
using System.Text.RegularExpressions;
@@ -10,18 +9,26 @@ namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.NodeSerializers;
// ---------------------------------------------------------------------------------------------------------------------
// Code
// ---------------------------------------------------------------------------------------------------------------------
-public static class WrapperSyntaxNodeSerializer {
- private static readonly int WId = MdRegexLib.GetGroupId(MdRegexGroupNames.WrapperContent);
- private static readonly int WModsId = MdRegexLib.GetGroupId(MdRegexGroupNames.WrapperMods);
+public partial class WrapperSyntaxNodeSerializer : IMdSyntaxNodeSerializer{
+ [GeneratedRegex(@"\G<(?\|.*?)>(?.*)>", RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
+ private static partial Regex Syntax { get; }
+
+ private static readonly int WId = Syntax.GroupNumberFromName("w");
+ private static readonly int WModsId = Syntax.GroupNumberFromName("mods");
+
+ public char[] TriggerCharacters { get; } = ['<'];
// -----------------------------------------------------------------------------------------------------------------
// Methods
// -----------------------------------------------------------------------------------------------------------------
- public static void Serialize(IMdSyntaxFragmentStack stack, IMdSyntaxNode parentNode, Match match) {
- if (!match.Groups[WId].TryGetValue(out string? wrapperValue)) return;
- if (!match.Groups[WModsId].TryGetValue(out string? mods)) return;// Mods are required for this match
+ public Match Match(string input, int startPosition = 0)
+ => Syntax.Match(input, startPosition);
+
+ public void Serialize(IMdSyntaxFragmentStack stack, IMdSyntaxNode parentNode, Match match) {
+ string wrapperValue = match.Groups[WId].Value;
+ string mods = match.Groups[WModsId].Value; // Mods are required for this match
- WrapperMdSyntaxNode node = WrapperMdSyntaxNode.Pool.Get();
+ WrapperMdSyntaxNode node = MdSyntaxNodePool.Shared.Get();
node.WithModifier(MdSyntaxNodeModifier.FromString(mods));
parentNode.AddChildNode(node);
stack.PushSingleLineMatchesToStack(wrapperValue, node);
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/RegexLib/MdRegexGroupNames.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/RegexLib/MdRegexGroupNames.cs
deleted file mode 100644
index 8c5e2004..00000000
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/RegexLib/MdRegexGroupNames.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-// ---------------------------------------------------------------------------------------------------------------------
-// Imports
-// ---------------------------------------------------------------------------------------------------------------------
-namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
-// ---------------------------------------------------------------------------------------------------------------------
-// Code
-// ---------------------------------------------------------------------------------------------------------------------
-public static class MdRegexGroupNames {
- public const string BlockQuote = "blockQuote";
- public const string Bold = "bold";
- public const string BoldContent = "b";
- public const string Break = "break";
- public const string Callout = "callout";
- public const string CalloutBody = "clBody";
- public const string CalloutMod = "clMod";
- public const string CalloutOption = "clOption";
- public const string CalloutTitle = "clTitle";
- public const string CalloutType = "clType";
- public const string CodeBlock = "codeBlock";
- public const string CodeBlockContent = "cBody";
- public const string CodeBlockLang = "cLang";
- public const string CodeBlockTrailing = "cTrailing";
- public const string CodeInline = "code";
- public const string CodeInlineContent = "c";
- public const string Emote = "emote";
- public const string EmoteContent = "e";
- public const string Escaped = "escaped";
- public const string FootnoteDescription = "footnoteDesc";
- public const string FootnoteDescriptionBody = "fdBody";
- public const string FootnoteDescriptionIdentifier = "fdId";
- public const string FootnoteReference = "footnoteRef";
- public const string FootnoteReferenceIdentifier = "frId";
- public const string Frontmatter = "frontmatter";
- public const string FrontmatterLang = "fLang";
- public const string FrontmatterBody = "fBody";
- public const string Heading = "heading";
- public const string HeadingLevel = "hLevel";
- public const string HeadingSimple = "headingSimple";
- public const string HeadingSimpleIdentifier = "hsIdentifier";
- public const string HeadingSimpleText = "hsText";
- public const string HeadingText = "hText";
- public const string Highlight = "highlight";
- public const string HighlightContent = "h";
- public const string HorizontalRule = "horizontalRule";
- public const string HorizontalRuleContent = "hr";
- public const string HtmlBody = "htmlBody";
- public const string HtmlPost = "htmlPost";
- public const string HtmlPre = "htmlPre";
- public const string Italic = "italic";
- public const string ItalicContent = "i";
- public const string Link = "link";
- public const string LinkBang = "lnBang";
- public const string LinkHref = "lnHref";
- public const string LinkModifiers = "lnMods";
- public const string LinkText = "lnText";
- public const string LinkTitle = "lnTitle";
- public const string List = "list";
- public const string ListBody = "lBody";
- public const string ListHead = "lHead";
- public const string ListIdentifier = "lsId";
- public const string ListIndex = "lIndex";
- public const string ListItemLeadingSpaces = "lSpace";
- public const string ListTask = "lTask";
- public const string ListTaskItemLeadingSpaces = "lTaskSpace";
- public const string NewLine = "newLine";
- public const string Paragraph = "paragraph";
- public const string ParagraphContent = "p";
- public const string SpanBody = "spanBody";
- public const string SpanTagAttrs = "spanTagAttrs";
- public const string Strike = "strike";
- public const string StrikeContent = "s";
- public const string SubScript = "subScript";
- public const string SubScriptContent = "sb";
- public const string SuperScript = "supScript";
- public const string SuperScriptContent = "sp";
- public const string Table = "table";
- public const string TableBody = "tBody";
- public const string TableHead = "tHead";
- public const string TableSeparator = "tSep";
- public const string Tag = "tag";
- public const string TagText = "tText";
- public const string Template = "template";
- public const string TemplateContent = "t";
- public const string Underline = "underline";
- public const string UnderlineContent = "u";
- public const string User = "user";
- public const string UserName = "uName";
- public const string WikiLink = "wikiLink";
- public const string WikiLinkHref = "wHref";
- public const string Wrapper = "wrapper";
- public const string WrapperContent = "w";
- public const string WrapperMods = "wMods";
-}
diff --git a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/RegexLib/MdRegexLib.cs b/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/RegexLib/MdRegexLib.cs
deleted file mode 100644
index b50c672f..00000000
--- a/src/InfiniBlazor.Core.Markdown/Parsers/Markdown/Serializer/RegexLib/MdRegexLib.cs
+++ /dev/null
@@ -1,141 +0,0 @@
-// ---------------------------------------------------------------------------------------------------------------------
-// Imports
-// ---------------------------------------------------------------------------------------------------------------------
-using CodeOfChaos.SpanLINQ;
-using System.Collections.Frozen;
-using System.Text.RegularExpressions;
-
-namespace InfiniBlazor.Markdown.Parsers.Markdown.Serializer.RegexLib;
-// ---------------------------------------------------------------------------------------------------------------------
-// Code
-// ---------------------------------------------------------------------------------------------------------------------
-public static partial class MdRegexLib {
- [GeneratedRegex("""
- (?\\\S)
- | (?\*\*(?(?>[^\\\*]+|\\\*|\*|(?\*\*)|(?<-open>\*\*))+?\*?)(?(open)(?!))\*\*)
- | (?\*(?(?>[^\\\*]+|\\\*|\*\*|(?\*)|(?<-open>\*))+)(?(open)(?!))\*)
- | (?\^(?(?>[^\\\^]+|\\\^|\^\^|(?\^)|(?<-open>\^))+)(?(open)(?!))\^)
- | (?~(?(?>[^\\~]+|\\~|~~|(?~)|(?<-open>~))+)(?(open)(?!))~)
- | (?(?`+)(?(?>[^`\\]+|\\.|`(?!\k))+?)\k)
- | (?~~(?(?>[^\\~]+|\\~|~|(?~~)|(?<-open>~~))+?~?)(?(open)(?!))~~)
- | (?_(?.+?)(?==(?.+?)(?:(?[\p{L}\p{N}_]+):)
- | (?\[\[(?[^\]\[\ ]+)\]\])
- | (?(?\{)+(?[^\s{}]+)(?<-open>\})+(?(open)(?!)))
- | (?
- (?!)?
- \[(? (?:\ *!?\[.+?\]\(.+?\)\ *)|(?:[^\\\]]|\\\]|\\[^\]])*?)\]
- \(
- (?\ *https?[^\ |]+)
- (?:\ ?\"(?.+)\")?
- (?\|.*)?
- \)
- )
- | (?\#(?[\p{L}\p{N}\-_\/\.]+))
- | (?\@(?[\p{L}\p{N}\-_\/\.]+))
- | (?\[\^(?[\d\p{L}\p{N}]+)\])
- | (?<(?\|.*?)>(?.*)>)
- | (?<[Bb][Rr]/?>)
- """, RegexOptions.IgnorePatternWhitespace | RegexOptions.ExplicitCapture | RegexOptions.Compiled)]
- public static partial Regex SinglelineStructuresRegex { get; }
-
- [GeneratedRegex("""
- (?^(?\#{1,6})[\ ]+(?[^\n]+)$)
- | (?^(?