Refactored ContentParser

pull/13082/head
malik masis 3 years ago
parent a07eaf4c45
commit 09b59e220a

@ -19,20 +19,28 @@ public class ContentParser : ITransientDependency
_options = options.Value;
}
public async Task<List<ContentFragment>> ParseAsync(string content)
public Task<List<ContentFragment>> ParseAsync(string content)
{
if (!_options.WidgetConfigs.Any())
{
return new List<ContentFragment>
return Task.FromResult(new List<ContentFragment>
{
new ContentFragment() { Type = "Markdown" }.SetProperty("Content", content),
};
});
}
var replacedText = Regex.Replace(content, @"\[.*?\]", delimeter);
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))
{
parsedList.Add(replacedText);
@ -64,34 +72,40 @@ public class ContentParser : ITransientDependency
parsedList.Add(replacedText);
}
}
}
Dictionary<string, List<KeyValuePair<string, string>>> parsedWidgets = new();
ParseWidgets(content, parsedWidgets);
var contentFragments = new List<ContentFragment>();
private void FillContentFragment(string content, List<string> parsedList, List<ContentFragment> contentFragments)
{
content = Regex.Replace(content, @"=\s*""", @"=""");
content = Regex.Replace(content, @"""\s*=", @"""=");
var widgets = Regex.Matches(content, @"(?<=\[Widget)(.*?)(?=\])").Cast<Match>().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<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 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<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