[Asp.Net Core]C#解析Markdown文档

Posted 厦门德仔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Asp.Net Core]C#解析Markdown文档相关的知识,希望对你有一定的参考价值。

C#解析Markdown文档

通常我们写博客时候通常可以markdown类似写代码的方式又可以呈现html的效果。也很多离线的markdown编辑器然后写好之后导入到网站,或者在线markdown编写。

C#如何解析markdown文档呢?

1.什么时候Markdown;不被浏览器支持;所以,编写一个在服务器端把markdown转换为HTML的中间件。
2,我们开发的中间件是构建在ASP.NET Core内置的staticFiles中间之上,并且在它之前运行,所有的md文件都被放到wwwroot文件夹下,当我们请求wwwroot下其他的静态文件的时候,StaticFiles中间件会把他们返回给浏览器,而当我们请求wwwroot下的.md文件的时候,我们编写的中间件会读取对应的.*文件并且把它们转化为HTML格式返回给浏览器。

需要探测文件的编码格式:
文本编码检测
NuGet包:Ude NetStandard
调用charsetDetector类来探测文件的编码

    /// <summary>
    /// 检测流的编码
    /// </summary>
    /// <param name="stream"></param>
    /// <returns></returns>
    private static string DetectCharset(Stream stream)
    
        CharsetDetector charDetector = new();
        charDetector.Feed(stream);
        charDetector.DataEnd();
        string charset = charDetector.Charset ?? "UTF-8";
        stream.Position = 0;
        return charset;
    


MD->HTML
引入NuGet包:MarkdownSharp(也可以搜索其他的包)
Markdown markdown=new Markdown();
String html=markdown.Transform(text);

自定义MarkDownViewerMiddleware中间类

 public class MarkDownViewerMiddleware
    
        private readonly RequestDelegate next;
        private readonly IWebHostEnvironment hostEnv;
        private readonly IMemoryCache memCache;

        public MarkDownViewerMiddleware(RequestDelegate next,
            IWebHostEnvironment hostEnv, IMemoryCache memCache)
        
            this.next = next;
            this.hostEnv = hostEnv;
            this.memCache = memCache;
        

        /// <summary>
        /// 检测流的编码
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        private static string DetectCharset(Stream stream)
        
            CharsetDetector charDetector = new();
            charDetector.Feed(stream);
            charDetector.DataEnd();
            string charset = charDetector.Charset ?? "UTF-8";
            stream.Position = 0;
            return charset;
        

        /// <summary>
        /// 读取文本内容
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        private static async Task<string> ReadText(Stream stream)
        
            string charset = DetectCharset(stream);
            using var reader = new StreamReader(stream, Encoding.GetEncoding(charset));
            return await reader.ReadToEndAsync();
        

        public async Task InvokeAsync(HttpContext context)
        
            string path = context.Request.Path.Value ?? "";
            if (!path.EndsWith(".md"))
            
                await next(context);
                return;
            
            var file = hostEnv.WebRootFileProvider.GetFileInfo(path);
            if (!file.Exists)
            
                await next(context);
                return;
            
            context.Response.ContentType = $"text/html;charset=UTF-8";
            context.Response.StatusCode = 200;
            string cacheKey = nameof(MarkDownViewerMiddleware)
                + path + file.LastModified;
            var html = await memCache.GetOrCreateAsync(cacheKey, async ce => 
                ce.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1);
                using var stream = file.CreateReadStream();
                string text = await ReadText(stream);
                Markdown markdown = new Markdown();
                return markdown.Transform(text);
            );
            await context.Response.WriteAsync(html);
        
    

use自定义中间

注意:需要app.UseStaticFiles();之前。

app.UseMiddleware<MarkDownViewerMiddleware>();

测试

1.md 文档格式

2. 程序解析

资料参考:
1.https://vimsky.com/examples/detail/csharp-ex-MarkdownSharp-Markdown-Parse-method.html
2.

以上是关于[Asp.Net Core]C#解析Markdown文档的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 在启动时解析 url?

更改 ASP.NET Core 中 DateTime 解析的默认格式

Mediatr 无法解析 ASP.Net Core 中的 UserManager

ASP.NET Core Web API使用静态swagger.json文件

ASP.NET Core Web API InvalidOperationException:无法解析服务 [重复]

ASP.NET Core Web API:尝试激活时无法解析服务类型