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(耗时,但如果我开始这样做的话,我可能已经完成了)。
这个库怎么样: https: //github.com/eyeseast/python-frontmatter
它解析文件中的 front-matter 和 Markdown,将 Markdown 部分放置在content结果对象的属性中。
适用于包含 front-matter 和 front-matterless(有这样一个词吗?)的文件。
| 归档时间: |
|
| 查看次数: |
9216 次 |
| 最近记录: |