aboutsummaryrefslogtreecommitdiff
path: root/BackEnd/Timeline/Services/MarkdownProcessor.cs
blob: f34432cd093dc717937e94b666efcdb33c1a406f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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<long, string> urlGenerator)
        {
            MarkdownDocument markdown = Markdown.Parse(text);
            foreach (var link in markdown.Descendants().Where(e => e is LinkInline).Cast<LinkInline>())
            {
                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();
        }

        /// <summary>Convert data url to true url with post id.</summary>
        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));
        }
    }
}