【问题标题】:Markdown metadata formatMarkdown 元数据格式
【发布时间】:2017-10-28 04:37:57
【问题描述】:

是否有在 Markdown 格式的帖子中嵌入元数据的标准或约定,例如发布日期或帖子作者以供渲染器进行条件渲染?

看起来可能是这种Yaml metadata 格式。

有各种各样的策略,例如随附文件mypost.meta.edn,但我希望将其全部保存在一个文件中。

【问题讨论】:

    标签: metadata markdown


    【解决方案1】:

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

    YAML 前言

    Jekyll 静态站点生成器普及了由YAML section markers 分隔的 YAML 前端。是的,破折号实际上是 YAML 语法的一部分。元数据是使用任何有效的 YAML 语法定义的。这是来自Jekyll docs 的示例:

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

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

    MultiMarkdown 元数据

    更老更简单的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 Title Block。 If 具有非常不同的语法,并且不容易与其他两个混淆。据我所知,它仅受 Pandoc 支持(如果启用),并且仅支持三种类型的数据:标题、作者和日期。这是 Pandoc 文档中的一个示例:

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

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

    【讨论】:

    • Pandoc title block 中的自问链接是怎么回事?此外,%title 等示例不适用于我。
    • @isomorphismes 感谢您指出损坏的链接,现已修复。另外,我添加了一些说明。您需要显式启用 Pandoc 扩展才能使其工作。
    • @КонстантинВан JSON 是有效的 YAML。因此,任何支持 YAML(并使用完整的 YAML 解析器)的实现也支持 JSON。
    • @Waylan 是的,这是我今年学到的。那时我不知道。
    【解决方案2】:

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

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

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

    [_元数据_:作者]:-“daveying” [_metadata_:tags]:- “降价元数据”

    这是link references 的标准语法,当您的应用程序可以提取这些数据时,它们不会被渲染。

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

    【讨论】:

    • 我最喜欢这个 - 全面工作 - 并且是自我描述的。
    • 100% 保持在降价空间内是一大优势。
    【解决方案3】:

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

    ---
    layout: post
    published-on: 1 January 2000
    title: Blogging Like a Boss
    ---
    
    Content goes here.
    

    【讨论】:

    • 谢谢,这对我有用,在 VS Code 中有 Pandoc 扩展。
    【解决方案4】:

    正确。

    使用 yaml 前端键值语法——就像 MultiMarkdown 支持的那样——但(ab)使用官方 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 文档的正文中添加 cmets。

    【讨论】:

    • 这是@DavidDa 答案的变体,使用降价参考链接。我喜欢混合使用这两种语法:[:author]: # "JohnDoe".
    • @v.nivuahc 你的解决方案更简单,我喜欢 :)
    【解决方案5】:

    我为 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 之类的地方尝试一下。

    【讨论】:

      【解决方案6】:

      这不是标准方式,但适用于 Markdown Extra。

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

      所以我使用 Markdown Extra 语法中的Abbreviations

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

      然后我用正则表达式解析它们:

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

      只要我不在文中写出确切的关键字,它们就不会留下任何痕迹。所以使用一些足够隐蔽的前缀来隐藏它们。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-15
          • 2022-07-15
          • 1970-01-01
          • 1970-01-01
          • 2021-02-09
          • 1970-01-01
          • 1970-01-01
          • 2021-05-31
          相关资源
          最近更新 更多