From 9510153940a08a84c85af5fa4332e7291e83bfe2 Mon Sep 17 00:00:00 2001 From: Salih Date: Mon, 23 Jan 2023 13:50:14 +0300 Subject: [PATCH 1/5] CMS-KIT: add link types to links in comments as optional --- .../Volo.CmsKit.Web.Unified/Pages/Index.cshtml | 2 +- .../Renderers/IMarkdownToHtmlRenderer.cs | 2 +- .../Renderers/MarkdownToHtmlRenderer.cs | 17 ++++++++++++++++- .../Commenting/CommentingViewComponent.cs | 9 +++++++-- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml index eee29c4cbb..8cf7ea242a 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml @@ -60,7 +60,7 @@ @if (GlobalFeatureManager.Instance.IsEnabled()) { - @await Component.InvokeAsync(typeof(CommentingViewComponent), new {entityType = "quote", entityId = "1"}) + @await Component.InvokeAsync(typeof(CommentingViewComponent), new {entityType = "quote", entityId = "1", rels = new [] {"nofollow"}}) } diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs index 565437af7e..f8316cc537 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs @@ -4,5 +4,5 @@ namespace Volo.CmsKit.Web.Renderers; public interface IMarkdownToHtmlRenderer { - Task RenderAsync(string rawMarkdown, bool allowHtmlTags = true, bool preventXSS = true); + Task RenderAsync(string rawMarkdown, bool allowHtmlTags = true, bool preventXSS = true, string[] rels = null); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs index 83317c2111..0a548722b3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs @@ -20,7 +20,7 @@ public class MarkdownToHtmlRenderer : IMarkdownToHtmlRenderer, ITransientDepende _htmlSanitizer = new HtmlSanitizer(); } - public Task RenderAsync(string rawMarkdown, bool allowHtmlTags = true, bool preventXSS = true) + public Task RenderAsync(string rawMarkdown, bool allowHtmlTags = true, bool preventXSS = true, string[] rels = null) { if (!allowHtmlTags) { @@ -33,10 +33,25 @@ public class MarkdownToHtmlRenderer : IMarkdownToHtmlRenderer, ITransientDepende { html = _htmlSanitizer.Sanitize(html); } + + if(rels != null && rels.Any()) + { + html = AddRelToLinks(html, rels); + } return Task.FromResult(html); } + private string AddRelToLinks(string html, string[] rels) + { + var rel = string.Join(" ", rels); + var regex = new Regex(")", RegexOptions.IgnoreCase | + RegexOptions.Singleline | + RegexOptions.Multiline | + RegexOptions.Compiled); + return regex.Replace(html, $" GetCodeBlockIndices(string markdownText) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs index bdf8d3ffa0..f8f0e5f43f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs @@ -59,7 +59,8 @@ public class CommentingViewComponent : AbpViewComponent public virtual async Task InvokeAsync( string entityType, - string entityId) + string entityId, + IEnumerable rels = null) { var comments = (await CommentPublicAppService .GetListAsync(entityType, entityId)).Items; @@ -70,6 +71,7 @@ public class CommentingViewComponent : AbpViewComponent { EntityId = entityId, EntityType = entityType, + Rels = rels, LoginUrl = loginUrl, Comments = comments.OrderByDescending(i => i.CreationTime).ToList() }; @@ -98,11 +100,12 @@ public class CommentingViewComponent : AbpViewComponent private async Task ConvertMarkdownTextsToHtml(CommentingViewModel viewModel) { viewModel.RawCommentTexts = new Dictionary(); + var rels = viewModel.Rels?.ToArray(); foreach (var comment in viewModel.Comments) { viewModel.RawCommentTexts.Add(comment.Id, comment.Text); - comment.Text = await MarkdownToHtmlRenderer.RenderAsync(comment.Text, allowHtmlTags: false, preventXSS: true); + comment.Text = await MarkdownToHtmlRenderer.RenderAsync(comment.Text, allowHtmlTags: false, preventXSS: true, rels: rels); foreach (var reply in comment.Replies) { @@ -117,6 +120,8 @@ public class CommentingViewComponent : AbpViewComponent public string EntityType { get; set; } public string EntityId { get; set; } + + public IEnumerable Rels { get; set; } public string LoginUrl { get; set; } From 71af7639450a4d7bed3831ae8017a575a4b5f7e1 Mon Sep 17 00:00:00 2001 From: Salih Date: Mon, 23 Jan 2023 14:42:47 +0300 Subject: [PATCH 2/5] "rels" replace to "referralLinks" --- .../host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml | 2 +- .../Renderers/IMarkdownToHtmlRenderer.cs | 2 +- .../Renderers/MarkdownToHtmlRenderer.cs | 11 +++++------ .../Components/Commenting/CommentingViewComponent.cs | 11 ++++++----- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml index 8cf7ea242a..1b3f3ff94c 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml @@ -60,7 +60,7 @@ @if (GlobalFeatureManager.Instance.IsEnabled()) { - @await Component.InvokeAsync(typeof(CommentingViewComponent), new {entityType = "quote", entityId = "1", rels = new [] {"nofollow"}}) + @await Component.InvokeAsync(typeof(CommentingViewComponent), new {entityType = "quote", entityId = "1", referralLinks = new [] {"nofollow"}}) } diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs index f8316cc537..7a3c91db6f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs @@ -4,5 +4,5 @@ namespace Volo.CmsKit.Web.Renderers; public interface IMarkdownToHtmlRenderer { - Task RenderAsync(string rawMarkdown, bool allowHtmlTags = true, bool preventXSS = true, string[] rels = null); + Task RenderAsync(string rawMarkdown, bool allowHtmlTags = true, bool preventXSS = true, string referralLinks = null); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs index 0a548722b3..d2e485a693 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs @@ -20,7 +20,7 @@ public class MarkdownToHtmlRenderer : IMarkdownToHtmlRenderer, ITransientDepende _htmlSanitizer = new HtmlSanitizer(); } - public Task RenderAsync(string rawMarkdown, bool allowHtmlTags = true, bool preventXSS = true, string[] rels = null) + public Task RenderAsync(string rawMarkdown, bool allowHtmlTags = true, bool preventXSS = true, string referralLinks = null) { if (!allowHtmlTags) { @@ -34,22 +34,21 @@ public class MarkdownToHtmlRenderer : IMarkdownToHtmlRenderer, ITransientDepende html = _htmlSanitizer.Sanitize(html); } - if(rels != null && rels.Any()) + if(referralLinks != null) { - html = AddRelToLinks(html, rels); + html = SetReferralLinks(html, referralLinks); } return Task.FromResult(html); } - private string AddRelToLinks(string html, string[] rels) + private string SetReferralLinks(string html, string referralLinks) { - var rel = string.Join(" ", rels); var regex = new Regex(")", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Multiline | RegexOptions.Compiled); - return regex.Replace(html, $" InvokeAsync( string entityType, string entityId, - IEnumerable rels = null) + IEnumerable referralLinks = null) { + referralLinks ??= Enumerable.Empty(); var comments = (await CommentPublicAppService .GetListAsync(entityType, entityId)).Items; @@ -71,7 +72,7 @@ public class CommentingViewComponent : AbpViewComponent { EntityId = entityId, EntityType = entityType, - Rels = rels, + ReferralLinks = referralLinks, LoginUrl = loginUrl, Comments = comments.OrderByDescending(i => i.CreationTime).ToList() }; @@ -100,12 +101,12 @@ public class CommentingViewComponent : AbpViewComponent private async Task ConvertMarkdownTextsToHtml(CommentingViewModel viewModel) { viewModel.RawCommentTexts = new Dictionary(); - var rels = viewModel.Rels?.ToArray(); + var referralLinks = viewModel.ReferralLinks?.ToArray(); foreach (var comment in viewModel.Comments) { viewModel.RawCommentTexts.Add(comment.Id, comment.Text); - comment.Text = await MarkdownToHtmlRenderer.RenderAsync(comment.Text, allowHtmlTags: false, preventXSS: true, rels: rels); + comment.Text = await MarkdownToHtmlRenderer.RenderAsync(comment.Text, allowHtmlTags: false, preventXSS: true, referralLinks: referralLinks.JoinAsString(" ")); foreach (var reply in comment.Replies) { @@ -121,7 +122,7 @@ public class CommentingViewComponent : AbpViewComponent public string EntityId { get; set; } - public IEnumerable Rels { get; set; } + public IEnumerable ReferralLinks { get; set; } public string LoginUrl { get; set; } From 341be3b53040b7002f9813d65b7523a2ca3a630a Mon Sep 17 00:00:00 2001 From: Salih Date: Mon, 23 Jan 2023 15:49:21 +0300 Subject: [PATCH 3/5] Update Comments.md --- docs/en/Modules/Cms-Kit/Comments.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/en/Modules/Cms-Kit/Comments.md b/docs/en/Modules/Cms-Kit/Comments.md index ac8853a4d8..f4bc9990c9 100644 --- a/docs/en/Modules/Cms-Kit/Comments.md +++ b/docs/en/Modules/Cms-Kit/Comments.md @@ -35,11 +35,12 @@ The comment system provides a commenting [widget](../../UI/AspNetCore/Widgets.md @await Component.InvokeAsync(typeof(CommentingViewComponent), new { entityType = "Product", - entityId = "..." + entityId = "...", + referralLinks = new [] {"nofollow"} }) ``` -`entityType` was explained in the previous section. `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here. +`entityType` was explained in the previous section. `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here. `referralLinks` is an optional parameter. You can use it to add `nofollow` or `noreferrer` links to the comment links. ## User Interface From fe543fb7f3b438810c18c6303eb5fbddb44f07d3 Mon Sep 17 00:00:00 2001 From: Salih Date: Mon, 23 Jan 2023 17:26:12 +0300 Subject: [PATCH 4/5] Update Comments.md --- docs/en/Modules/Cms-Kit/Comments.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Modules/Cms-Kit/Comments.md b/docs/en/Modules/Cms-Kit/Comments.md index f4bc9990c9..ef476600eb 100644 --- a/docs/en/Modules/Cms-Kit/Comments.md +++ b/docs/en/Modules/Cms-Kit/Comments.md @@ -40,7 +40,7 @@ The comment system provides a commenting [widget](../../UI/AspNetCore/Widgets.md }) ``` -`entityType` was explained in the previous section. `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here. `referralLinks` is an optional parameter. You can use it to add `nofollow` or `noreferrer` links to the comment links. +`entityType` was explained in the previous section. `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here. `referralLinks` is an optional parameter. You can use this parameter to add values (such as "nofollow", "noreferrer", or any other values) to the [rel attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel) of links. ## User Interface From 840829ed52af164b5fed6fdd5ef18f5afa0491d7 Mon Sep 17 00:00:00 2001 From: Salih Date: Mon, 23 Jan 2023 18:12:20 +0300 Subject: [PATCH 5/5] Refactoring --- .../Renderers/MarkdownToHtmlRenderer.cs | 5 +++-- .../Shared/Components/Commenting/CommentingViewComponent.cs | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs index d2e485a693..9dd5555051 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; @@ -34,7 +35,7 @@ public class MarkdownToHtmlRenderer : IMarkdownToHtmlRenderer, ITransientDepende html = _htmlSanitizer.Sanitize(html); } - if(referralLinks != null) + if(!referralLinks.IsNullOrWhiteSpace()) { html = SetReferralLinks(html, referralLinks); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs index c1d1ed4a4a..304cfec687 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs @@ -101,12 +101,12 @@ public class CommentingViewComponent : AbpViewComponent private async Task ConvertMarkdownTextsToHtml(CommentingViewModel viewModel) { viewModel.RawCommentTexts = new Dictionary(); - var referralLinks = viewModel.ReferralLinks?.ToArray(); + var referralLinks = viewModel.ReferralLinks?.JoinAsString(" "); foreach (var comment in viewModel.Comments) { viewModel.RawCommentTexts.Add(comment.Id, comment.Text); - comment.Text = await MarkdownToHtmlRenderer.RenderAsync(comment.Text, allowHtmlTags: false, preventXSS: true, referralLinks: referralLinks.JoinAsString(" ")); + comment.Text = await MarkdownToHtmlRenderer.RenderAsync(comment.Text, allowHtmlTags: false, preventXSS: true, referralLinks: referralLinks); foreach (var reply in comment.Replies) {