从Markdown文件中解析YAML

时间:2019-07-23 16:52:41

标签: python html yaml markdown pyyaml

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

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

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

我最初没有在HTML中显示YAML,但是能够通过正确修改pandoc的HTML模板来更改它。但是我只获得每个对应键的第一个值。尚不清楚pandoc中是否有解决此问题的方法,因此我研究了在pandoc步骤之前尝试将YAML处理为HTML的方法。我曾尝试使用PyYAML(yaml.load_all())在组合的markdown中解析YAML,但只能使第一个YAML块出现。

YAML块的示例:

---
author: foo
size_minimum: 100
time_req_minutes: 120
# and so on
---

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

要尝试解析YAML,我使用了从这篇文章中借来的代码:Is it possible to use PyYAML to read a text file written 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)

但是,即使如此,也只会导致读取并输出第一个YAML块。

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

1 个答案:

答案 0 :(得分:0)

这个库呢:https://github.com/eyeseast/python-frontmatter

它同时解析文件中的前题和Markdown,并将Markdown部分放置在结果对象的content属性中。

可同时处理包含和不包含(是否有这样的词?)文件的文件。