当前位置: 首页 > article >正文

Markdown转换器中间件

目录

需求

文本编码检测

Markdown→HTML

注意

实现


需求

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

文本编码检测

Nuget:Install-Package UTF.Unknown

DetectionResult result = CharsetDetector.DetectFromStream(stream);
string charset = result.Detected.EncodingName

CharsetDetector/UTF-unknown: Character set detector build in C# - .NET 5+, .NET Core 2+, .NET standard 1+ & .NET 4+https://github.com/CharsetDetector/UTF-unknownhttps://github.com/CharsetDetector/UTF-unknown

Markdown→HTML

Nuget:Install-Package MarkdownSharp

Markdown markdown = new Markdown();
string html = markdown.Transform(mdText);

注意

app.UseMiddleware<MarkdownMiddleware>();需在app.UseStaticFiles();之前注册,如果先注册了静态文件中间件,那么所有对静态文件的请求都会直接由静态文件中间件处理,而不会经过你的自定义中间件。

app.UseMiddleware<MarkdownMiddleware>();
//配置服务器为静态文件提供服务
app.UseStaticFiles();

实现

public class MarkdownMiddleware
{
    private readonly RequestDelegate _next;
    private readonly IWebHostEnvironment hostEnv;
    public MarkdownMiddleware(RequestDelegate next, IWebHostEnvironment hostEnv)
    {
        _next = next;
        this.hostEnv = hostEnv;
    }
    public async Task InvokeAsync(HttpContext context)
    {
        //获取请求路径
        var path = context.Request.Path.Value;
        //判断请求路径是否以.md结尾
        if (!path.EndsWith(".md", true, null))
        {
            await _next(context);
            return;
        }
        //判断请求路径是否存在
        var file = hostEnv.WebRootFileProvider.GetFileInfo(path);
        if (!file.Exists)
        {
            await _next(context);
            return;
        }
        //读取文件流
        using var stream = file.CreateReadStream();
        //UTF.Unknown检测文件编码,获取检测结果
        DetectionResult result = CharsetDetector.DetectFromStream(stream);
        string charset = result.Detected.EncodingName ?? "UTF-8";
        //流的位置重置
        stream.Position = 0;
        //读取文件内容,并指定编码
        using StreamReader reader = new StreamReader(stream, Encoding.GetEncoding(charset));
        string mdText = await reader.ReadToEndAsync();
        //将Markdown转换为HTML
        Markdown markdown = new Markdown();
        string html = markdown.Transform(mdText);
        //设置响应头
        context.Response.ContentType = "text/html;charset=UTF-8";
        await context.Response.WriteAsync(html);
    }
}

http://www.kler.cn/a/533174.html

相关文章:

  • 【MySQL】MySQL经典面试题深度解析
  • Vue 图片引用方式详解:静态资源与动态路径访问
  • 我们来学人工智能 -- 感悟DeepSeek
  • Go学习:类型转换需注意的点 以及 类型别名
  • kubernetes(二)
  • Leetcode—1427. 字符串的左右移【简单】Plus
  • AI协助探索AI新构型自动化创新的技术实现
  • 【现代深度学习技术】深度学习计算 | 延后初始化自定义层
  • 决策规划概述
  • C# 数组、索引器与集合介绍
  • 面向智慧农业的物联网监测系统设计(论文+源码+实物)
  • [LeetCode] 栈与队列 I — 232#用栈实现队列 | 225#用队列实现栈 | 20#有效的括号 | 1047#删除字符串中的所有相邻重复项
  • ES6-rest参数、数组扩展中的扩展运算符
  • CPU、MCU、MPU、SOC、DSP、ECU、GPU、FPGA傻傻分不清楚?一文讲清它们的区别
  • (十一)机器人系统的仿真——建造机器人模型
  • 4. k8s二进制集群之ETCD集群证书生成
  • Vue.js组件开发-实现右下角浮动层可以最大化最小化效果
  • RGB565转BITMAP[C#---2]
  • Vim的基础命令
  • Go语言中结构体字面量
  • 2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题2)-网络部分解析-附详细代码
  • 【人工智能】掌握图像风格迁移:使用Python实现艺术风格的自动化迁移
  • ChatGPT提问技巧:行业热门应用提示词案例--咨询法律知识
  • git进阶--5---git reset 和 git revert 的区别与联系
  • TypeScript 学习指南
  • 【Python深入浅出】解锁Python3模块:从入门到实战的进阶指南