From 09b59e220ae64f315350f45c6a94f8a2b92d158b Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 14 Jun 2022 16:47:46 +0300 Subject: [PATCH] Refactored ContentParser --- .../Volo/CmsKit/Contents/ContentParser.cs | 86 +++++++++---------- 1 file changed, 39 insertions(+), 47 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentParser.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentParser.cs index 3b34c66346..9badeab8d3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentParser.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentParser.cs @@ -19,20 +19,28 @@ public class ContentParser : ITransientDependency _options = options.Value; } - public async Task> ParseAsync(string content) + public Task> ParseAsync(string content) { if (!_options.WidgetConfigs.Any()) { - return new List + return Task.FromResult(new List { new ContentFragment() { Type = "Markdown" }.SetProperty("Content", content), - }; + }); } - var replacedText = Regex.Replace(content, @"\[.*?\]", delimeter); - var parsedList = new List(); + ParseContent(content, parsedList); + + var contentFragments = new List(); + FillContentFragment(content, parsedList, contentFragments); + return Task.FromResult(contentFragments); + } + + private void ParseContent(string content, List parsedList) + { + var replacedText = Regex.Replace(content, @"\[.*?\]", delimeter); if (!replacedText.Contains(delimeter)) { parsedList.Add(replacedText); @@ -64,34 +72,40 @@ public class ContentParser : ITransientDependency parsedList.Add(replacedText); } } + } - - Dictionary>> parsedWidgets = new(); - ParseWidgets(content, parsedWidgets); - - var contentFragments = new List(); - + private void FillContentFragment(string content, List parsedList, List contentFragments) + { + content = Regex.Replace(content, @"=\s*""", @"="""); + content = Regex.Replace(content, @"""\s*=", @"""="); + var widgets = Regex.Matches(content, @"(?<=\[Widget)(.*?)(?=\])").Cast().Select(p => p.Value).ToList(); for (int i = 0, k = 0; i < parsedList.Count; i++) { if (parsedList[i] == delimeter) { - var values = parsedWidgets.GetOrDefault($"{k}.Widget").Select(p => p.Value).ToList(); - var keys = parsedWidgets.GetOrDefault($"{k}.Widget").Select(p => p.Key).ToList(); - - if (parsedWidgets.Count > k) + if (widgets.Count > k) { - var widgetType = values[0]; - var name = _options.WidgetConfigs.Where(p => p.Key == widgetType).Select(p => p.Value.Name).FirstOrDefault(); - if (name is not null && parsedWidgets.Count > k) + var preparedContent = string.Join("", widgets[k]); + var keys = Regex.Matches(preparedContent, @"(?<=\s)(.*?)(?==\s*"")").Cast() + .Select(p => p.Value).Where(p => p != string.Empty).ToList(); + var values = Regex.Matches(preparedContent, @"(?<=\s*[a-zA-Z]*=\s*"")(.*?)(?="")").Cast() + .Select(p => p.Value).ToList(); + + var widgetTypeIndex = keys.IndexOf("Type"); + if (widgetTypeIndex != -1) { - values[0] = name; - var contentFragment = new ContentFragment() { Type = "Widget" }; - contentFragments.Add(contentFragment); - for (int kv = 0; kv < values.Count; kv++) + var widgetType = values[widgetTypeIndex]; + var name = _options.WidgetConfigs.Where(p => p.Key == widgetType).Select(p => p.Value.Name).FirstOrDefault(); + if (name is not null && widgets.Count > k) { - - contentFragments.FindLast(p=>p == contentFragment) - .SetProperty(keys[kv], values[kv]); + values[0] = name; + var contentFragment = new ContentFragment() { Type = "Widget" }; + contentFragments.Add(contentFragment); + for (int kv = 0; kv < values.Count; kv++) + { + contentFragments.FindLast(p => p == contentFragment) + .SetProperty(keys[kv], values[kv]); + } } } } @@ -103,28 +117,6 @@ public class ContentParser : ITransientDependency .SetProperty("Content", parsedList[i])); } } - - return contentFragments; } - private void ParseWidgets(string content, Dictionary>> parsedWidgets) - { - var widgets = Regex.Matches(content, @"(?<=\[Widget)(.*?)(?=\])").Cast().Select(p => p.Value).ToList(); - for (int p = 0; p < widgets.Count; p++) - { - var preparedContent = string.Join("", widgets[p]); - var keys = Regex.Matches(preparedContent, @"(?<=[\[Widget]?\s)(.*?)(?=="")").Cast() - .Select(p => p.Value).Where(p => p != string.Empty).ToList(); - var values = Regex.Matches(preparedContent, @"(?<=\s*[a-zA-Z]*=\s*"")(.*?)(?="")").Cast() - .Select(p => p.Value).ToList(); - - var list = new List>(); - for (int kv = 0; kv < keys.Count; kv++) - { - list.Add(new KeyValuePair(keys[kv], values[kv])); - } - - parsedWidgets.Add($"{p}.Widget", list); - } - } } \ No newline at end of file