我正在使用一些继承的遗留代码(即,许多设计决策不是我的)。
代码将目录整理成带有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(这是耗时的,但是如果我以这种方式开始,我可能已经做完了。)
答案 0 :(得分:0)
这个库呢:https://github.com/eyeseast/python-frontmatter
它同时解析文件中的前题和Markdown,并将Markdown部分放置在结果对象的content
属性中。
可同时处理包含和不包含(是否有这样的词?)文件的文件。