From 7b7a6c9218d91cb6a1f33b9392c818c4f319960b Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sat, 22 Nov 2025 17:40:17 +0800 Subject: [PATCH] :sparkles: Extend the ability of the hosted page markdown parser --- DysonNetwork.Zone/Pages/About.cshtml.cs | 7 +++--- DysonNetwork.Zone/Pages/Index.cshtml.cs | 8 ++++--- DysonNetwork.Zone/Pages/Posts.cshtml.cs | 12 +++++++--- .../Pages/Posts/Details.cshtml.cs | 7 +++--- .../Publication/MarkdownConverter.cs | 23 +++++++++++++++++++ DysonNetwork.Zone/SEO/RssController.cs | 7 +++--- .../Startup/ServiceCollectionExtensions.cs | 3 +++ DysonNetwork.sln.DotSettings.user | 2 ++ 8 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 DysonNetwork.Zone/Publication/MarkdownConverter.cs diff --git a/DysonNetwork.Zone/Pages/About.cshtml.cs b/DysonNetwork.Zone/Pages/About.cshtml.cs index ed034bf..298ae7f 100644 --- a/DysonNetwork.Zone/Pages/About.cshtml.cs +++ b/DysonNetwork.Zone/Pages/About.cshtml.cs @@ -2,14 +2,14 @@ using DysonNetwork.Shared.Models; using DysonNetwork.Shared.Proto; using DysonNetwork.Shared.Registry; using DysonNetwork.Zone.Publication; -using Markdig; +// Add this using statement using Microsoft.AspNetCore.Mvc.RazorPages; using NodaTime; namespace DysonNetwork.Zone.Pages; -public class AboutModel(RemoteAccountService ras) : PageModel +public class AboutModel(RemoteAccountService ras, MarkdownConverter markdownConverter) : PageModel { public SnPublicationSite? Site { get; set; } public Account? UserAccount { get; set; } @@ -32,8 +32,7 @@ public class AboutModel(RemoteAccountService ras) : PageModel if (UserAccount?.Profile?.Bio != null) { - var pipeline = new MarkdownPipelineBuilder().Build(); - HtmlBio = Markdown.ToHtml(UserAccount.Profile.Bio, pipeline); + HtmlBio = markdownConverter.ToHtml(UserAccount.Profile.Bio); } } } diff --git a/DysonNetwork.Zone/Pages/Index.cshtml.cs b/DysonNetwork.Zone/Pages/Index.cshtml.cs index f24e910..519ea5e 100644 --- a/DysonNetwork.Zone/Pages/Index.cshtml.cs +++ b/DysonNetwork.Zone/Pages/Index.cshtml.cs @@ -2,7 +2,7 @@ using DysonNetwork.Shared.Models; using DysonNetwork.Shared.Proto; using DysonNetwork.Shared.Registry; using DysonNetwork.Zone.Publication; -using Markdig; +// Add this using statement using Microsoft.AspNetCore.Mvc.RazorPages; using NodaTime; @@ -11,9 +11,11 @@ namespace DysonNetwork.Zone.Pages; public class IndexModel( PostService.PostServiceClient postClient, RemotePublisherService rps, - RemoteAccountService ras + RemoteAccountService ras, + MarkdownConverter markdownConverter // Inject MarkdownConverter ) : PageModel { + private readonly MarkdownConverter _markdownConverter = markdownConverter; // Store the injected service public SnPublicationSite? Site { get; set; } public SnPublisher? Publisher { get; set; } public Account? UserAccount { get; set; } @@ -60,7 +62,7 @@ public class IndexModel( foreach ( var post in FeaturedPosts.Where(post => !string.IsNullOrEmpty(post.Content)) ) - post.Content = Markdown.ToHtml(post.Content!); + post.Content = _markdownConverter.ToHtml(post.Content!); } } } diff --git a/DysonNetwork.Zone/Pages/Posts.cshtml.cs b/DysonNetwork.Zone/Pages/Posts.cshtml.cs index de7e3eb..9b52a26 100644 --- a/DysonNetwork.Zone/Pages/Posts.cshtml.cs +++ b/DysonNetwork.Zone/Pages/Posts.cshtml.cs @@ -1,14 +1,20 @@ -using Markdig; using DysonNetwork.Shared.Models; using DysonNetwork.Shared.Proto; using DysonNetwork.Shared.Registry; using DysonNetwork.Zone.Publication; +// Add this using statement using Microsoft.AspNetCore.Mvc.RazorPages; +using PostType = DysonNetwork.Shared.Models.PostType; namespace DysonNetwork.Zone.Pages; -public class PostsModel(PostService.PostServiceClient postClient, RemotePublisherService rps) : PageModel +public class PostsModel( + PostService.PostServiceClient postClient, + RemotePublisherService rps, + MarkdownConverter markdownConverter // Inject MarkdownConverter +) : PageModel { + private readonly MarkdownConverter _markdownConverter = markdownConverter; // Store the injected service public SnPublicationSite? Site { get; set; } public SnPublisher? Publisher { get; set; } public List Posts { get; set; } = []; @@ -43,7 +49,7 @@ public class PostsModel(PostService.PostServiceClient postClient, RemotePublishe // Convert the markdown content to HTML foreach (var post in Posts.Where(post => !string.IsNullOrEmpty(post.Content))) - post.Content = Markdown.ToHtml(post.Content!); + post.Content = _markdownConverter.ToHtml(post.Content!, softBreaks: post.Type != PostType.Article); } } } \ No newline at end of file diff --git a/DysonNetwork.Zone/Pages/Posts/Details.cshtml.cs b/DysonNetwork.Zone/Pages/Posts/Details.cshtml.cs index a3aaac0..3e5052d 100644 --- a/DysonNetwork.Zone/Pages/Posts/Details.cshtml.cs +++ b/DysonNetwork.Zone/Pages/Posts/Details.cshtml.cs @@ -1,14 +1,15 @@ -using Markdig; using DysonNetwork.Shared.Models; using DysonNetwork.Shared.Proto; using DysonNetwork.Zone.Publication; +// Add this using statement using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace DysonNetwork.Zone.Pages.Posts; -public class DetailsModel(PostService.PostServiceClient postClient) : PageModel +public class DetailsModel(PostService.PostServiceClient postClient, MarkdownConverter markdownConverter) : PageModel { + private readonly MarkdownConverter _markdownConverter = markdownConverter; [FromRoute] public string Slug { get; set; } = null!; public SnPublicationSite? Site { get; set; } @@ -35,7 +36,7 @@ public class DetailsModel(PostService.PostServiceClient postClient) : PageModel // Convert markdown content to HTML if (Post != null && !string.IsNullOrEmpty(Post.Content)) - Post.Content = Markdown.ToHtml(Post.Content); + Post.Content = _markdownConverter.ToHtml(Post.Content); return Page(); } diff --git a/DysonNetwork.Zone/Publication/MarkdownConverter.cs b/DysonNetwork.Zone/Publication/MarkdownConverter.cs new file mode 100644 index 0000000..252d2c7 --- /dev/null +++ b/DysonNetwork.Zone/Publication/MarkdownConverter.cs @@ -0,0 +1,23 @@ +using Markdig; + +namespace DysonNetwork.Zone.Publication; + +public class MarkdownConverter +{ + private readonly MarkdownPipeline _pipelineSoftBreak = new MarkdownPipelineBuilder() + .UseAdvancedExtensions() + .UseSoftlineBreakAsHardlineBreak() + .Build(); + + private readonly MarkdownPipeline _pipeline = new MarkdownPipelineBuilder() + .UseAdvancedExtensions() + .Build(); + + public string ToHtml(string markdown, bool softBreaks = true) + { + var procMarkdown = markdown.Replace("solian://files/", "/drive/files"); + return string.IsNullOrEmpty(procMarkdown) + ? string.Empty + : Markdown.ToHtml(markdown, softBreaks ? _pipelineSoftBreak : _pipeline); + } +} \ No newline at end of file diff --git a/DysonNetwork.Zone/SEO/RssController.cs b/DysonNetwork.Zone/SEO/RssController.cs index 68bdf8f..a5e51e4 100644 --- a/DysonNetwork.Zone/SEO/RssController.cs +++ b/DysonNetwork.Zone/SEO/RssController.cs @@ -2,13 +2,14 @@ using System.ServiceModel.Syndication; using System.Xml; using DysonNetwork.Shared.Models; using DysonNetwork.Shared.Proto; -using Markdig; +using DysonNetwork.Zone.Publication; +// Add this using statement using Microsoft.AspNetCore.Mvc; namespace DysonNetwork.Zone.SEO; [ApiController] -public class RssController(PostService.PostServiceClient postClient) : ControllerBase +public class RssController(PostService.PostServiceClient postClient, MarkdownConverter markdownConverter) : ControllerBase { [HttpGet("rss")] [Produces("application/rss+xml")] @@ -42,7 +43,7 @@ public class RssController(PostService.PostServiceClient postClient) : Controlle var item = new SyndicationItem( post.Title, - post.Content is not null ? Markdown.ToHtml(post.Content!) : "No content", // Convert Markdown to HTML + post.Content is not null ? markdownConverter.ToHtml(post.Content!) : "No content", // Convert Markdown to HTML new Uri(postUrl), post.Id.ToString(), post.EditedAt?.ToDateTimeOffset() ?? diff --git a/DysonNetwork.Zone/Startup/ServiceCollectionExtensions.cs b/DysonNetwork.Zone/Startup/ServiceCollectionExtensions.cs index b9f4ec2..c60d126 100644 --- a/DysonNetwork.Zone/Startup/ServiceCollectionExtensions.cs +++ b/DysonNetwork.Zone/Startup/ServiceCollectionExtensions.cs @@ -7,6 +7,8 @@ using DysonNetwork.Zone.Publication; using NodaTime; using NodaTime.Serialization.SystemTextJson; +// Add this using statement + namespace DysonNetwork.Zone.Startup; public static class ServiceCollectionExtensions @@ -19,6 +21,7 @@ public static class ServiceCollectionExtensions services.AddSingleton(SystemClock.Instance); services.AddHttpContextAccessor(); services.AddSingleton(); + services.AddSingleton(); services.AddHttpClient(); diff --git a/DysonNetwork.sln.DotSettings.user b/DysonNetwork.sln.DotSettings.user index 1150cff..8debb0d 100644 --- a/DysonNetwork.sln.DotSettings.user +++ b/DysonNetwork.sln.DotSettings.user @@ -103,6 +103,8 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded