Browse Source

Refactored ContentParser

pull/13082/head
malik masis 4 years ago
parent
commit
09b59e220a
  1. 86
      modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentParser.cs

86
modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentParser.cs

@ -19,20 +19,28 @@ public class ContentParser : ITransientDependency
_options = options.Value; _options = options.Value;
} }
public async Task<List<ContentFragment>> ParseAsync(string content) public Task<List<ContentFragment>> ParseAsync(string content)
{ {
if (!_options.WidgetConfigs.Any()) if (!_options.WidgetConfigs.Any())
{ {
return new List<ContentFragment> return Task.FromResult(new List<ContentFragment>
{ {
new ContentFragment() { Type = "Markdown" }.SetProperty("Content", content), new ContentFragment() { Type = "Markdown" }.SetProperty("Content", content),
}; });
} }
var replacedText = Regex.Replace(content, @"\[.*?\]", delimeter);
var parsedList = new List<string>(); var parsedList = new List<string>();
ParseContent(content, parsedList);
var contentFragments = new List<ContentFragment>();
FillContentFragment(content, parsedList, contentFragments);
return Task.FromResult(contentFragments);
}
private void ParseContent(string content, List<string> parsedList)
{
var replacedText = Regex.Replace(content, @"\[.*?\]", delimeter);
if (!replacedText.Contains(delimeter)) if (!replacedText.Contains(delimeter))
{ {
parsedList.Add(replacedText); parsedList.Add(replacedText);
@ -64,34 +72,40 @@ public class ContentParser : ITransientDependency
parsedList.Add(replacedText); parsedList.Add(replacedText);
} }
} }
}
private void FillContentFragment(string content, List<string> parsedList, List<ContentFragment> contentFragments)
Dictionary<string, List<KeyValuePair<string, string>>> parsedWidgets = new(); {
ParseWidgets(content, parsedWidgets); content = Regex.Replace(content, @"=\s*""", @"=""");
content = Regex.Replace(content, @"""\s*=", @"""=");
var contentFragments = new List<ContentFragment>(); var widgets = Regex.Matches(content, @"(?<=\[Widget)(.*?)(?=\])").Cast<Match>().Select(p => p.Value).ToList();
for (int i = 0, k = 0; i < parsedList.Count; i++) for (int i = 0, k = 0; i < parsedList.Count; i++)
{ {
if (parsedList[i] == delimeter) if (parsedList[i] == delimeter)
{ {
var values = parsedWidgets.GetOrDefault($"{k}.Widget").Select(p => p.Value).ToList(); if (widgets.Count > k)
var keys = parsedWidgets.GetOrDefault($"{k}.Widget").Select(p => p.Key).ToList();
if (parsedWidgets.Count > k)
{ {
var widgetType = values[0]; var preparedContent = string.Join("", widgets[k]);
var name = _options.WidgetConfigs.Where(p => p.Key == widgetType).Select(p => p.Value.Name).FirstOrDefault(); var keys = Regex.Matches(preparedContent, @"(?<=\s)(.*?)(?==\s*"")").Cast<Match>()
if (name is not null && parsedWidgets.Count > k) .Select(p => p.Value).Where(p => p != string.Empty).ToList();
var values = Regex.Matches(preparedContent, @"(?<=\s*[a-zA-Z]*=\s*"")(.*?)(?="")").Cast<Match>()
.Select(p => p.Value).ToList();
var widgetTypeIndex = keys.IndexOf("Type");
if (widgetTypeIndex != -1)
{ {
values[0] = name; var widgetType = values[widgetTypeIndex];
var contentFragment = new ContentFragment() { Type = "Widget" }; var name = _options.WidgetConfigs.Where(p => p.Key == widgetType).Select(p => p.Value.Name).FirstOrDefault();
contentFragments.Add(contentFragment); if (name is not null && widgets.Count > k)
for (int kv = 0; kv < values.Count; kv++)
{ {
values[0] = name;
contentFragments.FindLast(p=>p == contentFragment) var contentFragment = new ContentFragment() { Type = "Widget" };
.SetProperty(keys[kv], values[kv]); 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])); .SetProperty("Content", parsedList[i]));
} }
} }
return contentFragments;
} }
private void ParseWidgets(string content, Dictionary<string, List<KeyValuePair<string, string>>> parsedWidgets)
{
var widgets = Regex.Matches(content, @"(?<=\[Widget)(.*?)(?=\])").Cast<Match>().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<Match>()
.Select(p => p.Value).Where(p => p != string.Empty).ToList();
var values = Regex.Matches(preparedContent, @"(?<=\s*[a-zA-Z]*=\s*"")(.*?)(?="")").Cast<Match>()
.Select(p => p.Value).ToList();
var list = new List<KeyValuePair<string, string>>();
for (int kv = 0; kv < keys.Count; kv++)
{
list.Add(new KeyValuePair<string, string>(keys[kv], values[kv]));
}
parsedWidgets.Add($"{p}.Widget", list);
}
}
} }
Loading…
Cancel
Save