完美:C# Blazor中显示Markdown并添加代码高亮

昨天发了一篇介绍这个库:C# Blazor中显示Markdown文件,介绍怎么在Blazor中显示Markdown内容的文章,文章内的代码是没有高亮的,思来相去,还是要做好,于是百度到这篇文章.NET C# Blazor 服务端渲染Markdown,现在渲染效果如下:

fd478cfb365dd1a1b57af0595cbd204d.gif

自认为应该是比较完美了,下面说说怎么做的。

一、准备工具

1.1 添加Markdown转html包:Markdig

Markdig:Markdig 是一个快速、强大、符合CommonMark标准、可扩展的 .NET Markdown 处理器。

<PackageReference Include="Markdig" Version="0.27.0" />

1.2 引入Prism插件

此Prism非彼Prism,是一个JS插件:Prism 是一个轻量级、健壮且优雅的语法高亮库。这是Dabblet的一个衍生项目。

_Layout.cshtmlhead中引入:

<head>
....
<!--重置浏览器样式-->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/normalize.css@8.0.1/normalize.css">
<!--代码块主题-->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1.27.0/themes/prism-coy.min.css">
<!--工具栏插件-->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1.27.0/plugins/toolbar/prism-toolbar.min.css">
<!--行号插件-->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1.27.0/plugins/line-numbers/prism-line-numbers.min.css">
...
</head>
<body>
...
<!--prism核心js (用于渲染代码块)-->
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.27.0/prism.min.js"></script>
<!--显示代码块行号-->
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.27.0/plugins/line-numbers/prism-line-numbers.min.js"></script>
<!--工具栏(一些插件的前置依赖)-->
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.27.0/plugins/toolbar/prism-toolbar.min.js"></script>
<!--代码块显示语言名称-->
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.27.0/plugins/show-language/prism-show-language.min.js"></script>
<!--复制代码-->
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.27.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
<!--自动去cdn加载对应语言的代码高亮js-->
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.27.0/plugins/autoloader/prism-autoloader.min.js"></script>
</body>

二、使用

我将Markdown展示单独提取成了组件MarkdownComponent.razor,将加载的Markdown文件相对路径、需要链接的文章链接和源码链接做成参数,方便后面其他工具复用,下面的代码片段主要在这个文件内。

组件参数定义:

@code {[Parameter]public string LocalPostFilePath { get; set; } = null!;[Parameter]public string RemotePostUrl { get; set; } = null!;[Parameter]public string SourceCodeUrl { get; set; } = null!;
}

Markdown内容读取,Markdown格式转htmlOnInitializedAsync()方法中定义:

protected override async Task OnInitializedAsync()
{var markdownData = await File.ReadAllTextAsync(LocalPostFilePath);// markdown 转为 htmlvar htmlData = Markdown.ToHtml(markdownData);// 转为 prism 支持的语言标记(不是必须,可以删除)htmlData = htmlData.Replace("language-golang", "language-go");// TODO: 使用 https://github.com/mganss/HtmlSanitizer 清洗html中的xssif (htmlData.Contains("<script") || htmlData.Contains("<link")){_hasXss = true;}// 将 普通文本 转为 可以渲染的html的类型_postHtmlContent = (MarkupString) htmlData;
}

最后一步,需要在组件完成后,调用Prism插件方法,写在方法OnAfterRenderAsync(bool firstRender)中,这是做代码高亮的关键代码:

protected override async Task OnAfterRenderAsync(bool firstRender)
{await _jsRuntime.InvokeVoidAsync("Prism.highlightAll");
}

渲染相对来说就简单了(只针对我们使用),见下面的代码:

<div class="line-numbers">@{if (_hasXss){@_postHtmlContent.ToString()}else{@_postHtmlContent}}
</div>

IcoTool.razor调用该组件:

<MarkdownComponentLocalPostFilePath="wwwroot/2022/02/2022-02-22_02.md"RemotePostUrl="https://dotnet9.com/1715"SourceCodeUrl="https://github.com/dotnet9/dotnet9.com/blob/develop/src/Dotnet9.Tools.Web/Pages/Public/ImageTools/IcoTool.razor"/>

当然组件封装看个人需求,大致思路是上面的,就不贴详细代码了,有兴趣看看Dotnet9工具箱源码。

参考文章:

  • .NET C# Blazor 服务端渲染Markdown

1d8e5eb92316774165696db7b74ffc88.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务架构成功之路

本文来源于我在InfoQ中文站翻译的文章&#xff0c;原文地址是&#xff1a;http://www.infoq.com/cn/news/2015/07/success-of-microservices近年来&#xff0c;在软件开发领域关于微服务的讨论呈现出火爆的局面&#xff0c;有人倾向于在系统设计与开发中採用微服务方式实现软件…

读《一个程序猿的生命周期》有感

《一个程序猿的生命周期》中的作者来自贫困家庭&#xff0c;可以说是一个从大山里走出来的人。他深知&#xff0c;只有刻苦学习才能改变现状&#xff0c;所以他学习非常努力。 但人生总不是这样一帆风顺的&#xff0c;总会在我们的人生路上给与我们一些打击。意想不到的事情发生…

ymPrompt

ymPrompt消息提示组件4.0 组件调用方式1(传统参数传入方式)&#xff1a;示例调用方法 ymPrompt.alert(http://www.qq.com,null,null,确认要提交吗?,handler) ymPrompt.succeedInfo(document.getElementById(txt).innerHTML,400,260,null,handler2) ymPrompt.errorInfo(操作失败…

html点击关闭代码,怎样开放和关闭html代码?

如何使ASP输出结果不支持html语法&#xff1f;整理编辑&#xff1a;China ASP网友aspboy1原创有时候我们会为这样一个问题而烦恼,就是如何在asp页面中避免支持html语法.例如: 下面一句话"这是一个表单语句"当我们在ASP文件中用response.write"这是一个表单语句&…

linux之如何复制文件夹所有文件到其它文件夹

1、复制文件夹所有文件到其他文件夹 比如复制文件夹test1里面的所有文件到文件夹test2里面去,test1和test2都在同一个路径下面 cd test1cp * ../test2/ 如果是复制文件夹里面的所有内容到另外一个文件夹 cp -rf Android/* ../../chenyu/ 2、如果解决一开始运行项目没问题&…

使用 FieldMask 提高 C# gRpc 服务性能

前言想象一下&#xff0c;有一个服务提供个多个客户端调用&#xff0c;但不是所有客户端都需要全部的返回参数:比如商品列表服务返回商品的所有信息&#xff0c;而订单服务调用商品列表服务&#xff0c;但它其实只需要商品的编码和名称就够了。当然&#xff0c;我们可以为这个需…

HTML accesskey 属性

2019独角兽企业重金招聘Python工程师标准>>> 带有指定快捷键的超链接&#xff1a; <a href"http://www.w3school.com.cn/html/" accesskey"h">HTML</a><br /> <a href"http://www.w3school.com.cn/css/" access…

python 生成排列、组合以及选择

from <python cookbook> 19.15 任务 需要对一个序列的排列&#xff08;permutation&#xff09;、组合&#xff08;combination&#xff09;或选择&#xff08;selection&#xff09;进行迭代操作。即使初始的序列长度并不长&#xff0c;组合计算的规则却显示生成的序列可…

html5制作线路图,HTML5绘制上海地铁线路图

某市政项目用到地铁图展示&#xff0c;展示地铁站点以及相关信息流&#xff0c;使用Qunee组件可以很好的解决这类需求&#xff0c;做出优美的展现&#xff0c;下面以上海2012地铁图为例&#xff0c;效果如下&#xff1a;上海2012地铁图效果示例讲解首先需要解决数据问题&#x…

Cocos2d-x VS. OGEngine,联盟与部落的战争

在近期的全球移动开发者大会上&#xff0c;Unity发布了2D引擎&#xff0c;触控在同时发布了Cocos 3D引擎&#xff1b;而在差不多同时间&#xff0c;以安卓为主的OGEngine也发布了新版本&#xff0c;并宣布将支持跨平台。各大引擎频频大动作并不是巧合&#xff0c;这代表着移动游…

Android之获取设备的型号和手机厂商

1. 获取手机型号&#xff1a; String model android.os.Build.MODEL; 2. 获取手机厂商&#xff1a; String carrier android.os.Build.MANUFACTURER;

C#中的var理解

从 C# 3.0 开始&#xff0c;在方法范围内声明的变量可以具有隐式“类型”var。隐式类型本地变量为强类型&#xff0c;就像用户已经自行声明该类型&#xff0c;但编译器决定类型一样。i 的以下两个声明在功能上是等效的&#xff1a;var i 10; int i 10;var 关键字的常见用途是…

发布版本步骤

1&#xff0c;修改版本号 -eclipse中安卓工程的AndroidManifest.xml文件中修改 android:versionName"V1.0.1.170413.31"<日期-版本号1>2.获得软件APK &#xff0c;eclipse下windows-Android-build-取消勾选Atomatically refresh Force Skip packag…

Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler) 分析

转会http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/index.html?cadrs-cn-0125 Linux 调度器简史 早期的 Linux 调度器使用了最低的设计&#xff0c;它显然不关注具有非常多处理器的大型架构&#xff0c;更不用说是超线程了。1.2 Linux 调度器使用了…

在计算机技术方面用英语怎么说,“计算机应用技术”用英语怎么说?

计算机应用技术 :1. Computer Applications Technology中国搜学网-学苑论坛 - 教育话题 - 学习交流 ... ...专利文献检索 The Searches of Patent Literature计算机应用技术 Computer Applications Technology精密电磁测量 Precise Electromagnetic Measurement ...2. Computer…

同页面多UpdatePanel的单独刷新

<!--UpdateMode"Conditional"设置为不共用的UpdatePanel--><asp:UpdatePanel runat"server" ID"up1" UpdateMode"Conditional"><ContentTemplate><asp:Button runat"server" ID"Button1" On…

linux之nautilus .命令浏览当前文件目录

1、比如我们在终端目前想打开这个路径下的文件目录&#xff0c;我们如果再去更加路径一个一个的打&#xff0c;就太浪费时间了&#xff0c;我们可以在终端这个路径下输入下面的命令就可以 ~/Desktop$ nautilus . 2、效果如下图

C# 异步与Windows应用程序

把 async 关键字用于 UWP 应用程序&#xff0c;需要注意&#xff0c;在 UI 线程中调用 await 之后&#xff0c;当异步方法返回时&#xff0c;将默认返回到 UI 线程中。这便于在异步方法完成后更新 UI 元素。注意为了创建 UWP 应用程序&#xff0c;需要 Windows 10&#xff0c;W…

重装系统后恢复oracle数据

2019独角兽企业重金招聘Python工程师标准>>> 由于前段时间重装了系统&#xff0c;今天重装了数据库oracle XE版本&#xff0c;用“移花接木”的手段将新装oracle的目录用原有目录直接给覆盖&#xff0c;于是顺利的启动了oracle服务&#xff0c;然后又打开plsql deve…

使用eclipse运行mapreduce程序

今天使用http://www.cnblogs.com/xia520pi/archive/2012/05/16/2504205.html上的方式搭建一个基于Eclipse的mapreduce开发环境&#xff0c;在运行WordCount例子时出现错误&#xff0c;经过检查后才发现&#xff0c;装了hadoop2.0插件的Eclipse在右击选择“run on hadoop”时不会…