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)); } } }