从Markdown文件中解析YAML

问题描述 投票:0回答:1

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

代码将目录整理成包含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(这是耗时的,但是如果我以这种方式开始,我可能已经完成了它)。

我正在使用一些继承的遗留代码(即,许多设计决策都不属于我)。该代码将目录组织成带有Markdown文件的子目录,并且...

python html yaml markdown pyyaml
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.