标记元数据格式

在 Markdown 格式的文章中嵌入元数据是否有一个标准或约定,比如出版日期或文章作者,由渲染器进行条件渲染?

看起来这个 亚美尔元数据格式可能就是了。

有各种各样的策略,例如附带的文件 mypost.meta.edn,但我希望将它们都保存在一个文件中。

53569 次浏览

大多数 Markdown 渲染器似乎都支持这种 YAML 格式,用于文件顶部的元数据:

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


Content goes here.

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

YAML 前期物料

采用 YAML 剖面标记。是的,破折号实际上是 YAML 语法的一部分。并且使用任何有效的 YAML 语法定义元数据。下面是来自 化身博士的一个例子:

---
layout: post
title: Blogging Like a Hacker
---

请注意,YAML 的前台内容不会被 Markdown 解析器解析,但是在 Jekyll (或者你正在使用的任何工具)解析之前会被删除,并且实际上可以用来请求一个不同于该页面默认 Markdown 解析器的解析器(我不记得 Jekyll 是否这样做,但是我见过一些工具这样做)。

多重标记元数据

旧的和更简单的 多重标记元数据实际上被合并到一些 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 Title Block

为了完整起见,还有 Pandoc Title Block。如果有一个非常不同的语法,不容易与其他两个混淆。据我所知,它只支持 Pandoc (如果启用的话) ,并且它只支持三种类型的数据: title、 author 和 date。下面是 Pandoc 文档中的一个例子:

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

请注意,Pandoc 标题块是 Pandoc 支持的两种样式之一。

这不是一个标准的方式,但与 Markdown 额外工作。

我想要一些能够在解析器中工作的东西,但是当我在 Bitbucket 上浏览存储文件的文件时,也不会留下任何混乱。

因此,我使用 Markdown Ultra 语法中的 缩写

*[blog-date]: 2018-04-27
*[blog-tags]: foo,bar

然后我用 regexp 解析它们:

 ^\*\[blog-date\]:\s*(.+)\s*$

只要我没有在文本中写出精确的关键字,它们就不会留下任何痕迹。所以用一些不明显的前缀来隐藏它们。

变通方法使用标准语法并与所有其他查看器兼容。

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

因此,我的解决方案是: 在标记文件的开头,使用以下语法添加元数据:



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


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

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

我没有在其他地方看到过这个,也没有在讨论这个主题的各种博客中看到过,但是在我个人网站的一个项目中,我决定在每个标记文件的顶部使用一个简单的 JSON 对象来存储元数据。与上面的一些文本格式相比,它的输入稍微麻烦一些,但是它非常容易解析。基本上,我只是执行一个 regex,比如 ^\s*({.*?})\s*(.*)$(打开 s选项,将 .视为 \n)来捕获 json 和 markdown 内容,然后使用该语言的标准方法解析 json。它非常容易地允许任意的元字段。

我为 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 中尝试这样做。

没错。

使用 yaml前端事项键-值语法(如 MultiMarkdown 支持) ,但是(ab)使用官方标记 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文档的顶部,在文档的顶部和第一个 ---之间没有空行。

你的假 yaml不会被包括当你渲染到 HTML,等等... 它只出现在 .md

您还可以使用这种技术在降价文档的正文中添加注释。