为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信