【问题标题】:Markdown parsing/pre-processors - support for enhancing/modifying arbitrary markdown filesMarkdown 解析/预处理器 - 支持增强/修改任意 Markdown 文件
【发布时间】:2020-06-02 17:44:17
【问题描述】:

我正在尝试从文件系统中获取 .md 文件,并为基于 Vuepress 的托管做好准备。为此,我想保持 markdown 格式,调整一些文件内容,并将其保存到不同名称的 .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/&lt;slug-based-name-for-md-file&gt;/02.issue.png

所以,我需要一个 hook 来处理 markdown 文档中的每个图像引用。我可以很容易地编写它,我正在寻找的是一个解析器,它告诉我 Markdown 文件中存在哪些图像。

是的,我知道查找图像只需几个正则表达式,但我们确实拥有强大的 Markdown 解析器,所以我想知道我是否遗漏了他们文档中的某些内容。另外,更多嵌套的 Markdown 结构可能不容易通过正则表达式进行分类。

【问题讨论】:

    标签: python markdown


    【解决方案1】:

    似乎对将 Markdown 呈现为 HTML 更感兴趣

    这是正确的。这就是 Markdown 解析器所做的;将 Markdown 转换为 HTML。

    但是,Markdown 解析器的一个子集通过两步过程实现,其中第一步将 Markdown 解析为抽象语法树 (AST),第二步将该 AST 呈现为 HTML。通常,第二步可以替换为可以输出不同格式的替代渲染器。如果存在 Markdown 渲染器,那么您可以从 AST 输出 Markdown。执行此操作的一些实现是 misune (Python) 和标记 (JavaScript) 等。但是,AFAIK 都没有附带 Markdown 渲染器,因此您需要找到第三方渲染器或构建自己的渲染器。

    假设存在第三方 Markdown 渲染器,您可以将其子类化并覆盖相关部分。例如。使用 misune,您可以 customize 一个理论上的 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 strings,这需要更新版本的 Python。如果使用旧版本,您可能需要进行调整。

    【讨论】:

    • 那些手工制作的正则表达式突然看起来更有吸引力了 :-) 我会接受这一点,因为你已经告诉我我现在可以停止查看解析器了。奇怪的是,在我看来,在最后阶段到 html 之前自动增强/注释 Markdown 本身有时会很有用。也许作为在文档中注入诸如基于 doxygen 的注释之类的东西的一个步骤。
    • @JLPeyret 您使用了哪条路径 - 使用降价处理器修改降价文件还是使用正则表达式?谢谢。
    • @jim70 正则表达式。太糟糕了,处理器似乎真的没有针对这个。在大多数情况下,使用正则表达式并不复杂,但它有点脆弱——也就是说,很容易看出稍微改变格式会破坏手动调整的正则表达式。
    • @JLPeyret 感谢您的评论。看看我能用它做什么。我认为将 Markdown 转换为 HTML 然后从 Markdown 文件中提取部分可能是有意义的,如果我需要在适当的位置编写一些东西,那么在 HTML 中修改然后转换回 Markdown 可能是有意义的。正则表达式令人生畏,正如你所说,很脆弱。
    猜你喜欢
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    相关资源
    最近更新 更多