From 890fef4f276ec44312eb936583adbbf47d7cfe9d Mon Sep 17 00:00:00 2001 From: crupest Date: Sat, 6 Mar 2021 22:51:53 +0800 Subject: feat: Auto translate url in markdown post. --- BackEnd/Timeline/Services/MarkdownProcessor.cs | 52 ++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 BackEnd/Timeline/Services/MarkdownProcessor.cs (limited to 'BackEnd/Timeline/Services/MarkdownProcessor.cs') diff --git a/BackEnd/Timeline/Services/MarkdownProcessor.cs b/BackEnd/Timeline/Services/MarkdownProcessor.cs new file mode 100644 index 00000000..f34432cd --- /dev/null +++ b/BackEnd/Timeline/Services/MarkdownProcessor.cs @@ -0,0 +1,52 @@ +using System; +using System.IO; +using System.Linq; +using System.Text; +using Markdig; +using Markdig.Renderers.Normalize; +using Markdig.Syntax; +using Markdig.Syntax.Inlines; +using Microsoft.AspNetCore.Mvc; +using Timeline.Controllers; + +namespace Timeline.Services +{ + public class MarkdownProcessor + { + public string Process(string text, Func urlGenerator) + { + MarkdownDocument markdown = Markdown.Parse(text); + foreach (var link in markdown.Descendants().Where(e => e is LinkInline).Cast()) + { + if (int.TryParse(link.Url, out var dataIndex)) + { + link.Url = urlGenerator(dataIndex); + } + } + + var writer = new StringWriter(); + NormalizeRenderer renderer = new NormalizeRenderer(writer); + renderer.Render(markdown); + + return writer.ToString(); + } + + /// Convert data url to true url with post id. + public string Process(string text, IUrlHelper url, string timeline, long post) + { + return Process( + text, + dataIndex => url.ActionLink( + nameof(TimelinePostController.DataGet), + nameof(TimelinePostController)[0..^nameof(Controller).Length], + new { timeline, post, data_index = dataIndex } + ) + ); + } + + public byte[] Process(byte[] data, IUrlHelper url, string timeline, long post) + { + return Encoding.UTF8.GetBytes(Process(Encoding.UTF8.GetString(data), url, timeline, post)); + } + } +} -- cgit v1.2.3