Markdown 解析/预处理器 - 支持增强/修改任意 markdown 文件

我正在尝试.md从文件系统中获取文件并为基于 Vuepress 的托管做好准备。为此,我想保留降价格式,调整一些文件内容,并将其保存到一个不同名称的.md. 原始文件在文件系统上应保持原样,并且在工作站上应保持可见。

Vuepress 的构建系统可以处理.md=>.html转换,这是我想避免的一步。

我看过mistunePython-markdown,但它们似乎都对将 Markdown 呈现为 HTML 更感兴趣,我想将这一步完全留给 Vuepress。

是否有某种模式 a) 读取 markdown b) 通过用户插件修改它 c)将它写回 Markdown?非 Python 实用程序呢?我可以处理 JS 或 Ruby,尽管在任何地方都不如 Python。

例如:

Vuepress 使用 Frontmatter (YAML) 来限定文档中的内容。

---

title: Blogging Like a Hacker

lang: 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 结构可能不容易通过正则表达式进行分类。


慕桂英546537
浏览 181回答 1
1回答

慕标5832272

似乎对将 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 MdRendererclass CustomRenderer(MdRenderer):&nbsp; &nbsp; def image(self, src, alt="", title=None):&nbsp; &nbsp; &nbsp; &nbsp; src = get_link(src)&nbsp; &nbsp; &nbsp; &nbsp; return super().image(self, src, alt, title)请注意,图像src是由函数修改的get_link。您将需要创建该函数或可能进行内联修改。您还需要根据找到的库调整导入语句。要使用您的自定义渲染器,请执行以下操作:markdown = mistune.create_markdown(renderer=CustomRenderer())output = markdown(input)如果你要创建自己的 Markdown 渲染器,它可能看起来像这样:from mistune.renderers import BaseRendererclass MdRenderer(BaseRenderer):&nbsp; &nbsp; NAME = 'md'&nbsp; &nbsp; # other elements defined here&nbsp; &nbsp; def image(self, src, alt="", title=""):&nbsp; &nbsp; &nbsp; &nbsp; src = get_link(src)&nbsp; &nbsp; &nbsp; &nbsp; if title:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; title = f' "{title}"'&nbsp; &nbsp; &nbsp; &nbsp; return f'![{alt}]({src}{title})'&nbsp; &nbsp; # other elements defined here当然,您需要为 Markdown 文档中的每种元素定义方法。请注意,我在示例中使用了 Python f 字符串,这需要更新版本的 Python。如果使用旧版本,您可能需要进行调整。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python