Markdown元数据格式

96

在Markdown格式的文章中嵌入元数据(例如发布日期或帖子作者),以便渲染器进行条件呈现,是否有标准或常规做法?

看起来Yaml元数据格式可能是其中之一。

有各种策略,例如伴随文件mypost.meta.edn,但我希望将所有内容都保留在一个文件中。

8个回答

117

有两种常见的格式看起来非常相似,但实际上在某些非常具体的方面是不同的。还有一种非常不同的格式。

YAML前置元数据

Jekyll静态网站生成器推广了YAML前置元数据,其由YAML部分标记分隔。是的,破折号实际上是YAML语法的一部分。并且可以使用任何有效的YAML语法定义元数据。这里是一个来自Jekyll文档的示例:

---
layout: post
title: Blogging Like a Hacker
---
请注意,YAML前置内容不会被Markdown解析器解析,但在Jekyll(或您使用的任何工具)解析之前将其删除,并且实际上可以用于请求与该页面的默认Markdown解析器不同的解析器(我不记得Jekyll是否这样做,但我已经看到一些工具这样做)。
多重Markdown元数据是较旧和简单的MultiMarkdown Metadata实际上已经被合并到了一些Markdown解析器中。虽然最近更新了可选支持YAML分隔符,但传统上,在第一个空行(如果第一行为空,则没有元数据)后,元数据结束并开始Markdown文档。虽然语法非常类似于YAML,但仅支持键值对,没有暗示类型。以下是来自MultiMarkdown文档的示例:
Title:    A Sample MultiMarkdown Document  
Author:   Fletcher T. Penney  
Date:     February 9, 2011  
Comment:  This is a comment intended to demonstrate  
          metadata that spans multiple lines, yet  
          is treated as a single value.  
CSS:      http://example.com/standard.css

MultiMarkdown解析器包括一堆其他选项,这些选项是该解析器独有的,但键值元数据在多个解析器中使用。不幸的是,我从未见过任何两个解析器完全相同。没有Markdown规则来定义这种格式,每个人都使用了自己略微不同的解释,导致了很多变化。

更常见的是支持YAML分隔符和基本键值定义。

Pandoc标题块

为了完整起见,还有Pandoc标题块。它有非常不同的语法,不容易与其他两个混淆。据我所知,它仅由Pandoc(如果启用)支持,并且仅支持三种类型的数据:标题、作者和日期。以下是来自Pandoc文档的示例:

% title
% author(s) (separated by semicolons)
% date

请注意,Pandoc标题块是Pandoc支持的两种样式之一。Pandoc还支持如上所述的YAML元数据

Pandoc 标题块中的自问链接怎么了?另外,%title 等示例对我不起作用。 - isomorphismes
1
@isomorphismes 感谢您指出链接错误,现已修复。此外,我添加了一些澄清内容。您需要显式启用 Pandoc 扩展才能使其正常工作。 - Waylan
另外需要注意的是:Hexo 同样支持 JSON 前置数据和 YAML。 - Константин Ван
JSON是有效的YAML。因此,任何支持YAML(并使用完整的YAML解析器)的实现也支持JSON。 - Waylan
@Waylan 是的,这是我今年学到的。当时我不知道它。 - Константин Ван

42

一种解决方法,使用标准语法并与所有其他查看器兼容。

我也在寻找一种方法,可以向markdown文件添加特定于应用程序的元数据,同时确保现有的查看器(如vscode和github页面)将忽略添加的元数据。另外,使用扩展的markdown语法不是一个好主意,因为我想确保我的文件在不同的查看器上可以正确呈现。

所以这是我的解决方案:在markdown文件开始处使用以下语法来添加元数据:

  [_metadata_:author]:- "daveying"
  [_metadata_:tags]:- "markdown metadata"

这是链接引用的标准语法,它们不会被呈现,而您的应用程序可以提取这些数据。

:之后的-只是url的占位符,我不使用url作为值,因为url中不能有空格,但我有需要数组值的场景。


我最喜欢这个 - 能够兼容所有平台 - 并且自我描述。 - monojohnny
完全保持在Markdown空间内是一个很大的优势。 - tsdorsey
1
参考式链接是最标准的方式。我不明白为什么需要开发YAML/Pandoc头部样式。可以用#代替-,以避免链接到不存在的页面。对于标识符,我们应该附加到当前标准,如html本身。例如:[head.title]:# "My Site Title"[head.script.1]:https://..... "Jquery version ...."[head.style.1]:https://.... "css style for my site"等。 - DiegoJArg
这种方法的另一个不错的特点是元数据可以放在文件末尾。在纯文本编辑时,我想先看到内容。这还可以更轻松地提取前 n 个字符以进行预览摘要。 - matt wilkie

11

大多数Markdown渲染器似乎支持在文件顶部使用这种YAML格式来添加元数据:

---
layout: post
published-on: 1 January 2000
title: Blogging Like a Boss
---

Content goes here.

谢谢,这个是适合我的,使用了VS Code中的Pandoc扩展。 - Bluebird45
1
@Bluebird45,"VS Code中的Pandoc扩展"是什么?搜索Pandoc列表包括17个扩展,其中包括3个版本的vscode-pandoc... - A. Donda

9

我发现在Markdown中最一致的元数据格式实际上是HTML元标签,因为大多数Markdown解释器都认识HTML标签,并且不会渲染元标签,这意味着可以以不显示在渲染后的HTML中的方式存储元数据。

<title>Hello World</title>
<meta name="description" content="The quick brown fox jumped over the lazy dog.">
<meta name="author" content="John Smith">

## Heading
Markdown content begins here

你可以在类似GitHub Gist或StackEdit的平台上尝试此操作。


这在我的IntelliJ MD查看器和Github中都适用。谢谢! - Radu

6

正确。

使用yaml前置语法的键值对形式,就像MultiMarkdown支持的那样,但(滥用)官方markdown URL语法来添加元数据。

我的解决方法看起来像这样:

---
[//]: # (Title: My Awesome Title)
[//]: # (Author: Alan Smithee)
[//]: # (Date: 2018-04-27)
[//]: # (Comment: This is my awesome comment. Oh yah.) 
[//]: # (Tags: #foo, #bar)  
[//]: # (CSS: https://path-to-css)  
---

将此代码块放置在您的 .md 文件的顶部,在文档顶部和第一个 --- 之间不要留空行。
渲染成 HTML 等格式时,您伪造的 yaml 不会被包含在内,它仅出现在 .md 中。
您还可以使用此技术在 markdown 文档的正文中添加注释。

7
这是对 @DavidDa 答案的一种变体,使用了 Markdown 的引用链接。我喜欢将您们两个人的语法混合在一起:[:author]: # "JohnDoe" - v.nivuahc
1
@v.nivuahc,你的解决方案甚至更简单,我喜欢它 :) - Rowe Morehouse

1
这不是标准的方法,但适用于Markdown Extra。我想要的是在解析器中运行的东西,但也不会在我存储文件的Bitbucket上留下任何杂物。因此,我使用Markdown Extra语法中的缩写
*[blog-date]: 2018-04-27
*[blog-tags]: foo,bar

然后我使用正则表达式对它们进行解析:
 ^\*\[blog-date\]:\s*(.+)\s*$

只要我在文本中不写入确切的关键词,它们就不会留下任何痕迹。因此,请使用一些足够模糊的前缀来隐藏它们。

0

我在这里或在各种讨论此主题的博客中没有看到这个提到,但在我的个人网站项目中,我决定在每个markdown文件的顶部使用一个简单的JSON对象来存储元数据。与上面一些更文本化的格式相比,它打字起来有点麻烦,但解析起来非常容易。基本上,我只需执行正则表达式,例如^\s*({.*?})\s*(.*)$(使用s选项将.视为\n),以捕获json和markdown内容,然后使用语言的标准方法解析json。它允许任意元字段相当容易。


0
如果你使用Typora-
在Typora的Markdown参考中介绍:
Typora现在支持YAML Front Matter。在文章顶部输入---,然后按回车键引入元数据块。或者,你可以从Typora的顶部菜单插入元数据块。 YAML Front Matter
---
layout: post
title: Blogging Like a Hacker
---

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接