日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C#解析Markdown文档,实现替换图片链接操作

發(fā)布時(shí)間:2023/12/4 C# 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#解析Markdown文档,实现替换图片链接操作 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

又是好久沒(méi)寫(xiě)博客了

其實(shí)也不是沒(méi)寫(xiě),是最近在「做一個(gè)博客」,從2月21日開(kāi)始,大概一個(gè)多星期的時(shí)間,瘋狂刷進(jìn)度,邊寫(xiě)代碼邊寫(xiě)了一整系列的博客開(kāi)發(fā)筆記,目前為止已經(jīng)寫(xiě)了16篇了,然后上3月之后工作有點(diǎn)忙加上有點(diǎn)沉迷原神,然后進(jìn)度就暫時(shí)慢下來(lái)了

事實(shí)證明做什么事情一旦停下來(lái)就會(huì)產(chǎn)生惰性,于是停了這么久,我終于下定決心繼續(xù)更新!

這次開(kāi)發(fā)的博客用的是C#語(yǔ)言,搭配.netcore技術(shù)棧;前端繼續(xù)用我比較熟悉的Bootstrap做布局,然后稍微折騰一下;管理端用的是Vue…… 過(guò)程中總能遇到一些技術(shù)問(wèn)題,除了在博客開(kāi)發(fā)筆記系列里記錄,還是把一些普適性的解決方案單獨(dú)拿出來(lái)。

我的博客采用程序員最愛(ài)的Markdown語(yǔ)法書(shū)寫(xiě),而眾所周知markdown有一個(gè)缺點(diǎn)就是關(guān)聯(lián)圖片資源麻煩

因?yàn)槲业牟┛托枰獙?shí)現(xiàn)本地用Typora寫(xiě)的Markdown文檔導(dǎo)入,所以解析markdown文檔并處理導(dǎo)入圖片資源是一個(gè)繞不過(guò)的坎。

如題,本文介紹的是C#解析Markdown文檔。

Markdig庫(kù)

之前我用Python實(shí)現(xiàn)過(guò)解析Markdown文檔,Python生態(tài)里相關(guān)的庫(kù)太多了,有很多很好的選擇,之前我寫(xiě)的用Python實(shí)現(xiàn)解析Markdown的文章:python實(shí)現(xiàn)解析markdown文檔中的圖片,并且保存到本地~

然而C#這邊基本沒(méi)啥可選的,官方的Markdown庫(kù)也標(biāo)記為棄用狀態(tài),推薦遷移到Markdig這個(gè)庫(kù)……

所以就沒(méi)得選了,只能用這個(gè)Markdig。

官方介紹:

Markdig is a fast, powerful, CommonMark compliant, extensible Markdown processor for .NET.

其實(shí)這個(gè)庫(kù)也不難用,但注意官方介紹里有這么一句話:

NOTE: The repository is under construction. There will be a dedicated website and proper documentation at some point!

喵的!就是完全沒(méi)文檔,用法基本靠猜和啃源碼 ヽ(ー_ー)ノ

為了實(shí)現(xiàn)這個(gè)markdown圖片導(dǎo)入,我只能硬著頭皮搞起來(lái)

實(shí)現(xiàn)思路

Markdig有一個(gè)管道機(jī)制

舉個(gè)例子的偽代碼如下:

var?pipeline?=?new?MarkdownPipelineBuilder().UseExt1().UseExt2().UseExt3().Build(); var?result?=?Markdown.ToHtml("This?is?a?text?with?some?*emphasis*",?pipeline);

可以在解析Markdown過(guò)程中對(duì)Markdown文檔做一些修飾處理

一開(kāi)始我想到自己寫(xiě)一個(gè)管道來(lái)實(shí)現(xiàn)將Markdown里的圖片鏈接做替換處理

然而(可能因?yàn)樘?#xff09;看了好幾個(gè)官方的管道代碼,也沒(méi)琢磨出怎么實(shí)現(xiàn)我要的效果

直到我回想起官方介紹里的一個(gè)關(guān)鍵詞:CommonMark compliant,就是說(shuō)這玩意是兼容CommonMark 的

靈光一閃,Markdig因?yàn)槭切马?xiàng)目還沒(méi)文檔,那作為老項(xiàng)目的CommonMark總有文檔吧,于是我去找到了CommonMark.NET項(xiàng)目,一看果然有文檔,雖然兩者的API并不完全一致,但經(jīng)過(guò)我的半蒙半猜的探索,終于是把要的功能搞定了~ ( ̄▽ ̄)~*

實(shí)現(xiàn)代碼

終于上代碼啦~

首先讀取一個(gè)Markdown文檔,得到MarkdownDocument對(duì)象

//?引入需要用到的命名空間 using?Markdig; using?Markdig.Renderers.Normalize; using?Markdig.Syntax; using?Markdig.Syntax.Inlines;var?filepath?=?"temp/blog/機(jī)器學(xué)習(xí)/多個(gè)約束條件下的二維裝箱問(wèn)題——尋找《開(kāi)羅拉面店》最優(yōu)布局.md"; var?md?=?File.ReadAllText(filepath); var?document?=?Markdown.Parse(md);

這個(gè)文檔的部分內(nèi)容如下:

##?前言 前段時(shí)間無(wú)聊回坑玩《開(kāi)羅拉面店》,這是一款模擬經(jīng)營(yíng)類的小游戲,不管是畫(huà)風(fēng)還是游戲性都很對(duì)我胃口。![](多個(gè)約束條件下的二維裝箱問(wèn)題——尋找《開(kāi)羅拉面店》最優(yōu)布局.assets/8869373-ea70bbc1e5c28b62.png)![](多個(gè)約束條件下的二維裝箱問(wèn)題——尋找《開(kāi)羅拉面店》最優(yōu)布局.assets/8869373-3dd13511e9063800.png)![](多個(gè)約束條件下的二維裝箱問(wèn)題——尋找《開(kāi)羅拉面店》最優(yōu)布局.assets/8869373-8fcc0475f92cfc84.png)里面有一個(gè)玩法是拉面店布局,就給你一塊地,還有幾家店鋪,你可以隨便鋪隨便擺,當(dāng)然肯定是擺的越多家店鋪越好。![](多個(gè)約束條件下的二維裝箱問(wèn)題——尋找《開(kāi)羅拉面店》最優(yōu)布局.assets/8869373-f2c6578cb8f77c31.png)我一開(kāi)始玩的時(shí)候也沒(méi)想那么多,隨便擺了擺就完事了,但玩到后期人氣上不去,我就突發(fā)奇想,能不能把所有店鋪擺進(jìn)去?或者能不能盡可能多地去鋪滿這塊地?

Markdig會(huì)把Markdown文檔解析成一個(gè)文檔樹(shù),接下來(lái)可以像DOM操作那樣遍歷文檔節(jié)點(diǎn)了~

下面的代碼是找出Markdown中的圖片鏈接節(jié)點(diǎn),并給圖片鏈接加上前綴

foreach?(var?node?in?document.AsEnumerable())?{if?(node?is?ParagraphBlock?{?Inline:?{?}?}?paragraphBlock)?{foreach?(var?inline?in?paragraphBlock.Inline)?{if?(inline?is?LinkInline?{IsImage:?true}?linkInline)?{//?這里就是圖片鏈接了//?實(shí)現(xiàn)給圖片鏈接加上前綴linkInline.Url?=?$"http://127.0.0.1:5038/assets/blog/{linkInline.Url}";Console.WriteLine(linkInline.Url);}}} }

然后把修改完的Markdown文檔重新輸出:

using?(var?writer?=?new?StringWriter())?{var?render?=?new?NormalizeRenderer(writer);render.Render(document);Console.WriteLine(writer.ToString()); }

最終實(shí)現(xiàn)的效果就是這樣

##?前言前段時(shí)間無(wú)聊回坑玩《開(kāi)羅拉面店》,這是一款模擬經(jīng)營(yíng)類的小游戲,不管是畫(huà)風(fēng)還是游戲性都很對(duì)我胃口。![](http://127.0.0.1:5038/assets/blog/多個(gè)約束條件下的二維裝箱問(wèn)題——尋找《開(kāi)羅拉面店》最優(yōu)布局.assets/8869373-ea70bbc1e5c28b62.png)![](http://127.0.0.1:5038/assets/blog/多個(gè)約束條件下的二維裝箱問(wèn)題——尋找《開(kāi)羅拉面店》最優(yōu)布局.assets/8869373-3dd13511e9063800.png)![](http://127.0.0.1:5038/assets/blog/多個(gè)約束條件下的二維裝箱問(wèn)題——尋找《開(kāi)羅拉面店》最優(yōu)布局.assets/8869373-8fcc0475f92cfc84.png)里面有一個(gè)玩法是拉面店布局,就給你一塊地,還有幾家店鋪,你可以隨便鋪隨便擺,當(dāng)然肯定是擺的越多家店鋪越好。

后續(xù)

能實(shí)現(xiàn)把markdown文檔里的圖片鏈接拿出來(lái),那后續(xù)的圖片導(dǎo)入、鏈接替換就好辦了,當(dāng)然這是博客開(kāi)發(fā)筆記里的內(nèi)容,本文就不寫(xiě)了。

C#語(yǔ)言很不錯(cuò),可惜第三方庫(kù)的生態(tài)還是差了點(diǎn),這個(gè)問(wèn)題如果我用Python的話早就解決了,但C#的話就只能折騰,我甚至一度想要自己造個(gè)輪子來(lái)解析了……

其實(shí)應(yīng)該不難,我想到的辦法就是每一行遍歷文檔,然后用正則表達(dá)式把圖片鏈接匹配出來(lái),后續(xù)處理完成再用正則做替換,不過(guò)不太優(yōu)雅就是了,在這個(gè)寫(xiě)代碼靠copy的時(shí)代還是要有點(diǎn)追求,不然跟咸魚(yú)有什么區(qū)別呢……

然后再嘮一下最近在搞的好玩的東西:

  • 受俄烏戰(zhàn)爭(zhēng)警醒的「去Windows化」

  • 尋找國(guó)內(nèi)的微信替代品「去騰訊化」

OK,接下來(lái)應(yīng)該會(huì)開(kāi)始更新博客開(kāi)發(fā)筆記系列文章~(*^▽^*)

參考資料

  • CommonMark.NET Wiki:https://github.com/Knagis/CommonMark.NET/wiki

  • Markdig項(xiàng)目主頁(yè):https://github.com/xoofx/markdig

  • 相關(guān)issues:https://github.com/xoofx/markdig/issues/599

  • 相關(guān)源碼:https://github.com/xoofx/markdig/blob/master/src/Markdig/Renderers/Normalize/NormalizeRenderer.cs

  • 微軟文檔:https://docs.microsoft.com/en-us/windows/communitytoolkit/parsers/markdownparser

  • https://www.songshizhao.com/blog/blogPage/1044.html

總結(jié)

以上是生活随笔為你收集整理的C#解析Markdown文档,实现替换图片链接操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。