亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Markdown 解析/預處理器 - 支持增強/修改任意 markdown 文件

Markdown 解析/預處理器 - 支持增強/修改任意 markdown 文件

慕桂英546537 2022-12-20 11:29:59
我正在嘗試.md從文件系統中獲取文件并為基于 Vuepress 的托管做好準備。為此,我想保留降價格式,調整一些文件內容,并將其保存到一個不同名稱的.md. 原始文件在文件系統上應保持原樣,并且在工作站上應保持可見。Vuepress 的構建系統可以處理.md=>.html轉換,這是我想避免的一步。我看過mistune和Python-markdown,但它們似乎都對將 Markdown 呈現為 HTML 更感興趣,我想將這一步完全留給 Vuepress。是否有某種模式 a) 讀取 markdown b) 通過用戶插件修改它 c)將它寫回 Markdown?非 Python 實用程序呢?我可以處理 JS 或 Ruby,盡管在任何地方都不如 Python。例如:Vuepress 使用 Frontmatter (YAML) 來限定文檔中的內容。---title: Blogging Like a Hackerlang: en-US---我想將它們添加到文件的前面。圖片鏈接需要更新假設我在與.md文件相同的目錄中有一個圖像。Markdown 查看器可以使用下面的標記輕松顯示。### My image:![](./02.issue.png)但是,要使 Vuepress 工作,需要發生以下事情:### My image:![](/<slug-based-name-for-md-file>/02.issue.png)slug-based-name-for-md-file.md 的唯一名稱在哪里并且02.issue.png需要將文件復制到.vuepress/public/<slug-based-name-for-md-file>/02.issue.png.所以,我需要的是一個鉤子來處理 markdown 文檔中的每個圖像引用。我可以很容易地編寫它,我正在尋找的是一個解析器,它告訴我降價文件中存在哪些圖像。是的,我知道找到圖像只需要幾個正則表達式,但我們確實有那些強大的 Markdown 解析器,所以我想知道我是否遺漏了他們文檔中的某些內容。此外,更多嵌套的 Markdown 結構可能不容易通過正則表達式進行分類。
查看完整描述

1 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

似乎對將 Markdown 呈現為 HTML 更感興趣


這是對的。這就是 Markdown 解析器所做的;將 Markdown 轉換為 HTML。


然而,Markdown 解析器的一個子集是通過兩步過程實現的,其中第一步將 Markdown 解析為抽象語法樹 (AST),第二步將該 AST 呈現為 HTML。通常,第二步可以用可以輸出不同格式的替代渲染器代替。如果存在 Markdown 渲染器,則可以從 AST 輸出 Markdown。執行此操作的一些實現包括 mistune (Python) 和 marked (JavaScript),等等。但是,AFAIK 都沒有附帶 Markdown 渲染器,因此您需要尋找第三方渲染器或構建自己的渲染器。


假設存在第三方 Markdown 渲染器,您可以將其子類化并覆蓋相關部分。例如。使用 mistune,你可以定制一個理論上的 Markdown 渲染器來改變圖像元素,如下所示:


from somelib import MdRenderer


class CustomRenderer(MdRenderer):

    def image(self, src, alt="", title=None):

        src = get_link(src)

        return super().image(self, src, alt, title)

請注意,圖像src是由函數修改的get_link。您將需要創建該函數或可能進行內聯修改。您還需要根據找到的庫調整導入語句。


要使用您的自定義渲染器,請執行以下操作:


markdown = mistune.create_markdown(renderer=CustomRenderer())

output = markdown(input)

如果你要創建自己的 Markdown 渲染器,它可能看起來像這樣:


from mistune.renderers import BaseRenderer


class MdRenderer(BaseRenderer):

    NAME = 'md'


    # other elements defined here


    def image(self, src, alt="", title=""):

        src = get_link(src)

        if title:

            title = f' "{title}"'

        return f'![{alt}]({src}{title})'


    # other elements defined here

當然,您需要為 Markdown 文檔中的每種元素定義方法。


請注意,我在示例中使用了 Python f 字符串,這需要更新版本的 Python。如果使用舊版本,您可能需要進行調整。


查看完整回答
反對 回復 2022-12-20
  • 1 回答
  • 0 關注
  • 231 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號