我需要检查我的输入(使用markdown格式化)是否在开头具有键值对元数据,然后在整个元数据块之后插入文本。
我在第一行找到:
,如果找到,请在第一个换行符处拆分输入字符串并添加我的东西。
现在,if markdown_content.splitlines()[0].find(':') >= 0:
显然在开头没有元数据时会失败,而是包含:
的其他内容。
使用元数据输入:
page title: fancypagetitle
something else: another value
# Heading
Text
输入没有元数据,但带有:
This is a [link](http://www.stackoverflow.com)
# Heading
Text
我的问题是:如何检查是否存在元数据块,如果存在,则在元数据和剩余的降价之间添加一些内容。
关键字不区分大小写,可能由字母,数字,下划线和短划线组成,并且必须以冒号结尾。这些值由行上冒号后面的任何内容组成,甚至可能是空白的。
如果一行缩进4个或更多个空格,则该行被假定为前一个关键字的值的附加行。关键字可以包含所需的行数。
第一个空白行结束文档的所有元数据。因此,文档的第一行不能为空。在Markdown进行任何进一步处理之前,所有元数据都会从文档中删除。
来源:https://pythonhosted.org/Markdown/extensions/meta_data.html
答案 0 :(得分:2)
您是否考虑过查看元数据扩展的源代码以了解它是如何完成的?
使用的regex是:
META_RE = re.compile(r'^[ ]{0,3}(?P<key>[A-Za-z0-9_-]+):\s*(?P<value>.*)')
当然,辅助线路也有regex:
META_MORE_RE = re.compile(r'^[ ]{4,}(?P<value>.*)')
如果你注意到,那些正则表达式比你的更具体,并且不太可能匹配假阳性。然后,扩展程序将文档拆分为行loops,通过每行与这些正则表达式进行比较,并在不匹配的第一行(可能是也可能不是空行)上跳出循环。
如果您注意到该代码,则会添加一个new feature,该版本将在下一个版本中提供。正在为可选的YAML样式分隔符添加支持。如果您习惯使用最新的(未发布的)开发代码,则可以将元数据包装在YAML分隔符中,这样可以更容易地找到元数据的结尾。
例如,上面的示例文档将如下所示(注意我使用了可选的结束特定的分隔符(...
),这更明确地标记了结束):
---
page title: fancypagetitle
something else: another value
...
# Heading
Text
那就是说,你仍然需要小心你没有得到错误的匹配(例如<hr>
)。我想无论哪种方式,您都需要根据自己的需要重新实现元数据扩展中的所有内容。当然,它是开源的,所以只要你尊重license。
很抱歉,但我不能给你时间表,确定下一个版本何时会发生。
哦,它也可能有助于查看MultiMarkdown提供的此功能的描述,它启发了Python-Markdown中的功能。这可能会让您更清楚地了解可能包含元数据的内容。