如何在markdown中检查键值元数据

时间:2015-01-15 11:50:47

标签: python markdown

我需要检查我的输入(使用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

1 个答案:

答案 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中的功能。这可能会让您更清楚地了解可能包含元数据的内容。