从 Markdown 文件中解析 YAML

pls*_*pls 4 html python markdown yaml pyyaml

我正在处理一些我继承的遗留代码(即,许多设计决策不是我的)。

该代码将一个目录组织成带有 markdown 文件的子目录,并将它们编译成一个大的 markdown 文件(使用 Markdown-PP: https: //github.com/jreese/markdown-pp)。然后它将此文件转换为 HTML(使用 pandoc: https: //pandoc.org/),最后转换为 PDF(使用 wkhtmltopdf:https://wkhtmltopdf.org/)。

我遇到的问题是许多原始 Markdown 文件都有 YAML 元数据标头。当通过 Markdown-PP 拼接在一起时,大型 Markdown 最终会散布大量 YAML 元数据块。由于 pandoc 处理 YAML 的方式(许多标头使用相同的键名称,并且 pandoc 组合了单独的 YAML 标头并且仅保留相应键的第一个值),在转换为 HTML 时,大部分元数据都会丢失。

我最初在 HTML 中没有出现 YAML,但能够通过正确修改 pandoc 的 HTML 模板来改变这一点。但我只得到每个相应键的第一个值。目前尚不清楚 pandoc 中是否有解决此问题的方法,因此我转而考虑在 pandoc 步骤之前尝试将 YAML 处理为 HTML。我尝试使用 PyYAML (yaml.load_all()) 解析组合降价中的 YAML,但只显示第一个 YAML 块。

YAML 块的示例:

---
author: foo
size_minimum: 100
time_req_minutes: 120
# and so on
---
Run Code Online (Sandbox Code Playgroud)

问题在于最终文档中的 20 多个模块中的每一个都具有相关的元数据。

为了尝试解析 YAML,我使用了从这篇文章借用的代码:Is it possible to use PyYAML to read a text file write with a "YAML front Matter" block inside?

经过一些修改。

import yaml
import sys

def get_yaml(f):
  pointer = f.tell()
  if f.readline() != '---\n':
    f.seek(pointer)
    return ''
  readline = iter(f.readline, '')
  readline = iter(readline.__next__, '---\n') #underscores needed for Python3?
  return ''.join(readline)

# Remove sys.argv, not sure what it was doing
with open(filepath, encoding='UTF-8') as f:
    config = list(yaml.load_all(get_yaml(f), Loader=yaml.SafeLoader)) # Load all to get all the YAML documents, Loader option required for most recent PyYAML, and list because it was originally returning a generator object
    text = f.read()
    print("TEXT from", f)
    #print(text)
    print("CONFIG from", f)
    print(config)
Run Code Online (Sandbox Code Playgroud)

但即使这样也只会导致第一个 YAML 块被读取和输出。

我希望能够从大型 Markdown 文件中解析 YAML,并将其替换为相应的 HTML 在正确的位置。我只是不确定这些(或任何)软件包是否有能力这样做。可能我只需要手动将原始 Markdown 文件中的 YAML 更改为 HTML(耗时,但如果我开始这样做的话,我可能已经完成了)。

rio*_*ter 8

这个库怎么样: https: //github.com/eyeseast/python-frontmatter

它解析文件中的 front-matter 和 Markdown,将 Markdown 部分放置在content结果对象的属性中。

适用于包含 front-matter 和 front-matterless(有这样一个词吗?)的文件。