|
|
|
|
@ -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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|