Browse Source

Added poll for blogpost as well

It will be made refactor
pull/13082/head
malik masis 4 years ago
parent
commit
349471af5e
  1. 3
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostPublicDto.cs
  2. 6
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/ContentFragment.cs
  3. 6
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/MarkdownContentFragment.cs
  4. 18
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/WidgetContentFragment.cs
  5. 14
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml
  6. 17
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs
  7. 18
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/CmsKitContentWidgetOptions.cs
  8. 96
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/ContentParser.cs
  9. 15
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/ContentWidgetConfig.cs
  10. 10
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/IContentParser.cs

3
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostPublicDto.cs

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using Volo.Abp.Application.Dtos;
using Volo.CmsKit.Users;
@ -15,6 +16,8 @@ public class BlogPostPublicDto : AuditedEntityDto<Guid>
public string ShortDescription { get; set; }
public List<ContentFragment> ContentFragments { get; set; }
public string Content { get; set; }
public Guid? CoverImageMediaId { get; set; }

6
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/ContentFragment.cs

@ -0,0 +1,6 @@
namespace Volo.CmsKit.Public.Blogs;
public abstract class ContentFragment
{
}

6
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/MarkdownContentFragment.cs

@ -0,0 +1,6 @@
namespace Volo.CmsKit.Public.Blogs;
public class MarkdownContentFragment : ContentFragment
{
public string Content { get; set; }
}

18
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/WidgetContentFragment.cs

@ -0,0 +1,18 @@
using System.Collections.Generic;
namespace Volo.CmsKit.Public.Blogs;
public class WidgetContentFragment : ContentFragment
{
public string Name { get; }
public string ViewComponentName { get; set; }
public IDictionary<string, object> Properties { get; }
public WidgetContentFragment(string name)
{
Name = name;
Properties = new Dictionary<string, object>();
}
}

14
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml

@ -1,5 +1,6 @@
@page
@using Volo.CmsKit.Public.Blogs
@using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Blogs.BlogPostComment
@using Volo.CmsKit.Public.Web.Pages
@using Volo.Abp.GlobalFeatures
@ -65,11 +66,18 @@
</a>
<small style="opacity:.65;">@Model.BlogPost.CreationTime</small>
</p>
@if (!Model.BlogPost.Content.IsNullOrEmpty())
@foreach (var contentFragment in Model.BlogPost.ContentFragments)
{
@Html.Raw(await MarkdownRenderer.RenderAsync(Model.BlogPost.Content))
if (contentFragment is MarkdownContentFragment markdownContentFragment)
{
@Html.Raw(await MarkdownRenderer.RenderAsync(markdownContentFragment.Content))
}
else if (contentFragment is WidgetContentFragment widgetContentFragment)
{
@await Component.InvokeAsync(widgetContentFragment.Name, widgetContentFragment.Properties)
}
}
<p class="mb-3">
@if (Model.BlogPost.LastModificationTime != null)
{

17
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs

@ -1,11 +1,5 @@
using Markdig;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.Blogs;
using Volo.CmsKit.GlobalFeatures;
@ -37,17 +31,24 @@ public class BlogPostModel : CmsKitPublicPageModelBase
protected IBlogFeatureAppService BlogFeatureAppService { get; }
private readonly IContentParser _contentParser;
public BlogPostModel(
IBlogPostPublicAppService blogPostPublicAppService,
IBlogFeatureAppService blogFeaturePublicAppService)
IBlogFeatureAppService blogFeaturePublicAppService
,
IContentParser contentParser)
{
BlogPostPublicAppService = blogPostPublicAppService;
BlogFeatureAppService = blogFeaturePublicAppService;
_contentParser = contentParser;
}
public virtual async Task OnGetAsync()
{
BlogPost = await BlogPostPublicAppService.GetAsync(BlogSlug, BlogPostSlug);
BlogPost.ContentFragments = await _contentParser.ParseAsync(BlogPost.Content);
if (GlobalFeatureManager.Instance.IsEnabled<CommentsFeature>())
{

18
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/CmsKitContentWidgetOptions.cs

@ -0,0 +1,18 @@
using System.Collections.Generic;
namespace Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs;
public class CmsKitContentWidgetOptions
{
public Dictionary<string, ContentWidgetConfig> WidgetConfigs { get; }
public CmsKitContentWidgetOptions()
{
WidgetConfigs = new();
}
public void AddWidgetConfig(string name, ContentWidgetConfig contentWidgetConfig)
{
WidgetConfigs.Add(name, contentWidgetConfig);
}
}

96
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/ContentParser.cs

@ -0,0 +1,96 @@
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
using Volo.CmsKit.Public.Blogs;
namespace Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs;
public class ContentParser : IContentParser, ITransientDependency
{
private const string delimeter = "----";
private readonly CmsKitContentWidgetOptions _options;
public ContentParser(IOptions<CmsKitContentWidgetOptions> options)
{
_options = options.Value;
}
public async Task<List<ContentFragment>> ParseAsync(string content)
{
if (!_options.WidgetConfigs.Any())
{
return new List<ContentFragment>()
{
new MarkdownContentFragment() { Content = content }
};
}
var replacedText = Regex.Replace(content, @"\[.*?\]", delimeter);
var parsedList = new List<string>();
if (!replacedText.Contains(delimeter))
{
parsedList.Add(replacedText);
}
while (replacedText.Contains(delimeter))
{
//For parsing delimeter
var index = replacedText.IndexOf(delimeter);
if (index != 0)
{
parsedList.Add(replacedText.Substring(0, index));
replacedText = replacedText.Substring(index, replacedText.Length - index);
index = 0;
}
parsedList.Add(replacedText.Substring(index, delimeter.Length));
replacedText = replacedText.Substring(delimeter.Length, replacedText.Length - delimeter.Length);
//for parsing the other side
index = replacedText.IndexOf(delimeter);
if (index != -1)
{
parsedList.Add(replacedText.Substring(0, index));
replacedText = replacedText.Substring(index, replacedText.Length - index);
}
else
{
parsedList.Add(replacedText);
}
}
var pollNames = Regex.Matches(content, @"(?<=PollName="")(.*?)(?="")").Select(p => p.Value).ToList();
var polls = Regex.Matches(content, @"(?<=Widget Type="")(.*?)(?="")").Select(p => p.Value).ToList();
var contentFragments = new List<ContentFragment>();
for (int i = 0, k = 0; i < parsedList.Count; i++)
{
if (parsedList[i] == delimeter)
{
var name = _options.WidgetConfigs.Where(p => p.Key == polls[k]).Select(p => p.Value.Name).FirstOrDefault();
if (name is not null)
{
contentFragments.Add(new WidgetContentFragment(name)
{
Properties =
{
{ "Name", pollNames[k]}
}
});
}
k++;
}
else
{
contentFragments.Add(new MarkdownContentFragment() { Content = parsedList[i] });
}
}
return contentFragments;
}
}

15
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/ContentWidgetConfig.cs

@ -0,0 +1,15 @@
using System;
namespace Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs;
public class ContentWidgetConfig
{
public string Name { get; }
public Type ViewComponentType { get; set; }
public ContentWidgetConfig(string name)
{
Name = name;
}
}

10
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/IContentParser.cs

@ -0,0 +1,10 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.CmsKit.Public.Blogs;
namespace Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs;
public interface IContentParser
{
Task<List<ContentFragment>> ParseAsync(string content);
}
Loading…
Cancel
Save