Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 标记解析/预处理器-支持增强/修改任意标记文件_Python_Markdown - Fatal编程技术网

Python 标记解析/预处理器-支持增强/修改任意标记文件

Python 标记解析/预处理器-支持增强/修改任意标记文件,python,markdown,Python,Markdown,我正在尝试从文件系统中获取.md文件,并为基于Vuepress的托管做好准备。为此,我希望保持标记格式,调整一些文件内容,并将其保存到另一个名为.md的文件中。原始文件应保持在文件系统上的原样,并在工作站上保持可见 Vuepress的构建系统可以处理.md=>.html转换,这是我想要避免的步骤 我已经看过了,但它们似乎对将标记呈现为HTML更感兴趣,我想把这一步完全留给Vuepress来完成 a)读取标记b)通过用户插件修改它c)将其写回标记中是否存在某种模式?非Python实用程序呢?我可以

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

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

我已经看过了,但它们似乎对将标记呈现为HTML更感兴趣,我想把这一步完全留给Vuepress来完成

a)读取标记b)通过用户插件修改它c)将其写回标记中是否存在某种模式?非Python实用程序呢?我可以处理JS或Ruby,尽管没有比Python更好的了

例如:

Vuepress使用Frontmatter(YAML)来限定文档中的内容。 我想把它们添加到文件的前面

图像链接需要更新 假设我的图像与
.md
文件位于同一目录中。标记查看器可以使用下面的标记轻松显示

### My image:

![](./02.issue.png)

但是,Vuepress需要执行以下操作才能正常工作:

### My image:

![](/<slug-based-name-for-md-file>/02.issue.png)

####我的图像:
![](//02.issue.png)
其中,
md文件基于slug的名称
是.md文件的唯一名称

文件
02.issue.png
需要复制到
.vuepress/public//02.issue.png

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

是的,我知道找到图像只需要几个正则表达式,但是我们有那些强大的Markdown解析器,所以我想知道我是否在它们的文档中遗漏了一些东西。此外,更多嵌套的降价结构可能不容易通过正则表达式进行分类

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

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

然而,标记解析器的子集是通过两步过程实现的,其中第一步将标记解析为抽象语法树(AST),第二步将该AST呈现为HTML。通常,第二步可以替换为可输出不同格式的替代渲染器。如果存在标记渲染器,则可以从AST输出标记。其中一些实现是mistune(Python)和marked(JavaScript)。不过,顺便说一句,两者都没有提供降价渲染器,因此您需要找到第三方渲染器或构建自己的渲染器

假设存在第三方降价渲染器,则可以将其子类化并覆盖相关部分。例如使用mistune,您可以使用一个理论标记渲染器来更改图像元素,如下所示:

从somelib导入MdRenderer
类CustomRenderer(MdRenderer):
def图像(self,src,alt=”“,title=None):
src=获取链接(src)
return super().image(self、src、alt、title)
请注意,图像
src
由函数
get\u link
修改。您将需要创建该函数,或者可能进行内联修改。您还需要根据找到的库调整import语句

要使用自定义渲染器,请执行以下操作:

markdown=mistune.create_markdown(renderer=CustomRenderer())
输出=降价(输入)
如果要创建自己的标记渲染器,它可能会如下所示:

从mistune.renders导入BaseRenderer
类MdRenderer(BaseRenderer):
名称='md'
#此处定义的其他元素
def图像(self,src,alt=“”,title=“”):
src=获取链接(src)
如果标题为:
title=f'{title}'
返回f'![{alt}]({src}{title})]
#此处定义的其他元素
当然,您需要为标记文档中的每种类型的元素定义方法


请注意,我在示例中使用了Python,这需要Python的最新版本。如果使用较旧的版本,您可能需要进行调整。

那些手动滚动的正则表达式突然看起来更具吸引力:-)我接受这一点,因为您已经告诉我现在可以停止查看解析器了。奇怪的是,在我看来,在html的最后阶段开始之前,自动增强/注释标记本身偶尔会有用。可能是在文档中注入基于doxygen的注释之类的内容的一个步骤。@JLPeyret您使用了哪条路径-使用标记处理器修改标记文件还是使用正则表达式?谢谢。@jim70正则表达式。很遗憾,处理器似乎并没有针对这一点。在大多数情况下,使用正则表达式并没有那么复杂,但它有点脆弱——也就是说,很容易看出稍微更改格式会破坏手动调整的正则表达式。@JLPeyret感谢您的评论。我会看看我能做些什么。我认为将标记转换为HTML然后从标记文件中提取部分可能是有意义的,如果我需要在适当的位置编写一些内容,那么用HTML修改然后转换回标记可能是有意义的。正则表达式很吓人,就像你说的,很脆弱。
### My image:

![](/<slug-based-name-for-md-file>/02.issue.png)