From 783e31b308e85e484195565f3f24aa90dd5bc22f Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 24 Mar 2021 18:32:14 +0300 Subject: [PATCH] CmsKit - Render markdown at public site --- .../CmsKitPublicWebModule.cs | 11 ++++++- .../Shared/Components/Pages/Default.cshtml | 7 +++- .../Pages/DefaultPageViewComponent.cs | 23 ++++++++++--- .../Pages/Public/CmsKit/Blogs/BlogPost.cshtml | 33 ++++++++++++++----- .../Public/CmsKit/Blogs/BlogPost.cshtml.cs | 20 ++++++++++- .../Pages/Public/CmsKit/Pages/Index.cshtml | 4 +++ .../Pages/Public/CmsKit/highlightOnLoad.js | 8 +++++ .../Renderers/IMarkdownToHtmlRenderer.cs | 9 +++++ .../Renderers/MarkdownToHtmlRenderer.cs | 22 +++++++++++++ .../Volo.CmsKit.Public.Web.csproj | 8 ++--- 10 files changed, 123 insertions(+), 22 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/highlightOnLoad.js create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/IMarkdownToHtmlRenderer.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/MarkdownToHtmlRenderer.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs index c8519b33f0..970dd15db5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Mvc.RazorPages; +using Markdig; +using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AutoMapper; @@ -55,6 +56,14 @@ namespace Volo.CmsKit.Public.Web { options.AddMaps(validate: true); }); + + context.Services + .AddSingleton(_ => new MarkdownPipelineBuilder() + .UseAutoLinks() + .UseBootstrap() + .UseGridTables() + .UsePipeTables() + .Build()); } public override void PostConfigureServices(ServiceConfigurationContext context) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Pages/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Pages/Default.cshtml index e2be15233f..d78fb5035c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Pages/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Pages/Default.cshtml @@ -1,9 +1,14 @@ @addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap +@using Volo.CmsKit.Public.Web.Renderers +@using Volo.Abp.AspNetCore.Mvc.UI.Packages.HighlightJs + +@inject IMarkdownToHtmlRenderer MarkdownRenderer + @model Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Pages.PageViewModel - @Html.Raw(Model.Content) + @Html.Raw(await MarkdownRenderer.RenderAsync(Model.Content)) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Pages/DefaultPageViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Pages/DefaultPageViewComponent.cs index 3c8be1c2c3..4545a366c1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Pages/DefaultPageViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Pages/DefaultPageViewComponent.cs @@ -3,10 +3,25 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc; using Volo.CmsKit.Public.Pages; +using Volo.CmsKit.Public.Web.Renderers; +using Volo.Abp.AspNetCore.Mvc.UI.Packages.HighlightJs; +using Volo.Abp.AspNetCore.Mvc.UI.Widgets; namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Pages { - [ViewComponent(Name = "CmsDefaultPage")] + [Widget( + StyleTypes = new[] + { + typeof(HighlightJsStyleContributor) + }, + ScriptTypes = new[] + { + typeof(HighlightJsScriptContributor) + }, + ScriptFiles = new[] + { + "/Pages/Public/CmsKit/highlightOnLoad.js" + })] public class DefaultPageViewComponent : AbpViewComponent { protected IPagePublicAppService PagePublicAppService { get; } @@ -15,7 +30,7 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Pages { PagePublicAppService = pagePublicAppService; } - + public virtual async Task InvokeAsync(Guid pageId, string title, string content) { var model = new PageViewModel @@ -24,7 +39,7 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Pages Title = title, Content = content }; - + return View("~/Pages/CmsKit/Shared/Components/Pages/Default.cshtml", model); } } @@ -32,7 +47,7 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Pages public class PageViewModel { public Guid Id { get; set; } - + public string Title { get; set; } public string Content { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml index 491ae75e8d..d876744a31 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml @@ -7,14 +7,27 @@ @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.ReactionSelection @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Tags +@using Volo.CmsKit.Public.Web.Renderers +@using Volo.Abp.AspNetCore.Mvc.UI.Packages.HighlightJs @inherits CmsKitPublicPageBase @model Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs.BlogPostModel +@inject IMarkdownToHtmlRenderer MarkdownRenderer @section styles{ + + + +} + +@section scripts{ + + + + } @{ @@ -31,7 +44,9 @@ @@@Model.BlogPost.Author?.UserName @Model.BlogPost.CreationTime

- @Html.Raw(Model.BlogPost.Content) + + @Html.Raw(await MarkdownRenderer.RenderAsync(Model.BlogPost.Content)) +

@if (Model.BlogPost.LastModificationTime != null) { @@ -45,10 +60,10 @@ if (Model.TagsFeature?.IsEnabled == true) { @await Component.InvokeAsync(typeof(TagViewComponent), new - { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() - }) + { + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.BlogPost.Id.ToString() + }) } } @@ -62,8 +77,8 @@ { @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.BlogPost.Id.ToString() }) } } @@ -76,8 +91,8 @@ { @await Component.InvokeAsync(typeof(RatingViewComponent), new { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.BlogPost.Id.ToString() }) } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs index 6683f02cc8..bc3e1c85dc 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Mvc; +using Markdig; +using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; @@ -66,5 +67,22 @@ namespace Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs TagsFeature = await BlogFeatureAppService.GetOrDefaultAsync(BlogPost.BlogId, GlobalFeatures.TagsFeature.Name); } } + + + public string RenderMarkdownToHtmlAsString(string content) + { + if (content.IsNullOrWhiteSpace()) + { + return ""; + } + + return Markdig.Markdown.ToHtml(Encoding.UTF8.GetString(Encoding.Default.GetBytes(content)), + new MarkdownPipelineBuilder() + .UseAutoLinks() + .UseBootstrap() + .UseGridTables() + .UsePipeTables() + .Build()); + } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml index 5fc0511dc5..a3f1d0c95e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml @@ -2,11 +2,15 @@ @using Microsoft.AspNetCore.Mvc.Localization @using Volo.CmsKit.Localization @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Pages + @model Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Pages.IndexModel + @inject IHtmlLocalizer L @section styles{ + + diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/highlightOnLoad.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/highlightOnLoad.js new file mode 100644 index 0000000000..4c7df9ede9 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/highlightOnLoad.js @@ -0,0 +1,8 @@ +$(function () { + + document.querySelectorAll('code').forEach(block => { + $(block).addClass('hljs'); // Put in gray box even language is not supported + hljs.highlightBlock(block); + }); + +}) \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/IMarkdownToHtmlRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/IMarkdownToHtmlRenderer.cs new file mode 100644 index 0000000000..61d2139ccf --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/IMarkdownToHtmlRenderer.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Volo.CmsKit.Public.Web.Renderers +{ + public interface IMarkdownToHtmlRenderer + { + Task RenderAsync(string rawMarkdown); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/MarkdownToHtmlRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/MarkdownToHtmlRenderer.cs new file mode 100644 index 0000000000..8224cfb7dc --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/MarkdownToHtmlRenderer.cs @@ -0,0 +1,22 @@ +using Markdig; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.CmsKit.Public.Web.Renderers +{ + public class MarkdownToHtmlRenderer : IMarkdownToHtmlRenderer, ITransientDependency + { + protected MarkdownPipeline MarkdownPipeline { get; } + + public MarkdownToHtmlRenderer(MarkdownPipeline markdownPipeline) + { + MarkdownPipeline = markdownPipeline; + } + + public Task RenderAsync(string rawMarkdown) + { + return Task.FromResult( + Markdown.ToHtml(rawMarkdown, MarkdownPipeline)); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj index 2003412559..29e1bab213 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj @@ -1,4 +1,4 @@ - + @@ -16,6 +16,7 @@ + @@ -29,9 +30,4 @@ - - - - -