gpt4 book ai didi

regex - 用正则表达式重写 YAML frontmatter

转载 作者:行者123 更新时间:2023-12-01 02:43:08 27 4
gpt4 key购买 nike

我想使用 Jekyll 将我的 WordPress 网站转换为 GitHub 上的静态网站。

我使用一个插件将我的 62 篇文章作为 Markdown 导出到 GitHub。我现在有这些帖子,每个文件的开头都有额外的前言。它看起来像这样:

---
ID: 51
post_title: Here's my post title
author: Frank Meeuwsen
post_date: 2014-07-03 22:10:11
post_excerpt: ""
layout: post
permalink: >
https://myurl.com/slug
published: true
sw_timestamp:
- "399956"
sw_open_thumbnail_url:
- >
https://myurl.com/wp-content/uploads/2014/08/Featured_image.jpg
sw_cache_timestamp:
- "408644"
swp_open_thumbnail_url:
- >
https://myurl.com/wp-content/uploads/2014/08/Featured_image.jpg
swp_open_graph_image_data:
- '["https://i0.wp.com/myurl.com/wp-content/uploads/2014/08/Featured_image.jpg?fit=800%2C400&ssl=1",800,400,false]'
swp_cache_timestamp:
- "410228"
---

这个 block 没有被 Jekyll 正确解析,而且我不需要所有这些 frontmatter。我想将每个文件的 frontmatter 转换为

---
ID: 51
post_title: Here's my post title
author: Frank Meeuwsen
post_date: 2014-07-03 22:10:11
layout: post
published: true
---

我想用正则表达式来做到这一点。但是我对正则表达式的了解并不多。在这个论坛和大量谷歌搜索的帮助下,我并没有走得太远。我知道如何找到完整的 frontmatter,但如何将其替换为上面指定的一部分?

我可能必须分步执行此操作,但我不知道如何执行此操作。

我使用 Textwrangler 作为编辑器来进行搜索和替换。

最佳答案

YAML(以及其他相对自由的格式,如 HTML、JSON、XML)最好不要使用正则表达式进行转换,它很容易处理一个示例并在下一个具有额外空格、不同缩进等的示例中中断。

在这种情况下使用 YAML 解析器并非易事,因为许多人要么期望文件中有单个 YAML 文档(并且 Markdown 部分上的 barf 作为无关内容),要么期望文件中有多个 YAML 文档(并且 barf 因为 Markdown不是 YAML)。此外,大多数 YAML 解析器会丢弃有用的东西,例如注释和重新排序映射键。

多年来,我一直为我的 ToDo 项目使用类似的格式(YAML header ,后接 reStructuredText),并使用一个小的 Python 程序来提取和更新这些文件。给定这样的输入:

---
ID: 51 # one of the key/values to preserve
post_title: Here's my post title
author: Frank Meeuwsen
post_date: 2014-07-03 22:10:11
post_excerpt: ""
layout: post
permalink: >
https://myurl.com/slug
published: true
sw_timestamp:
- "399956"
sw_open_thumbnail_url:
- >
https://myurl.com/wp-content/uploads/2014/08/Featured_image.jpg
sw_cache_timestamp:
- "408644"
swp_open_thumbnail_url:
- >
https://myurl.com/wp-content/uploads/2014/08/Featured_image.jpg
swp_open_graph_image_data:
- '["https://i0.wp.com/myurl.com/wp-content/uploads/2014/08/Featured_image.jpg?fit=800%2C400&ssl=1",800,400,false]'
swp_cache_timestamp:
- "410228"
---
additional stuff that is not YAML
and more
and more

这个程序¹:

import sys
import ruamel.yaml

from pathlib import Path


def extract(file_name, position=0):
doc_nr = 0
if not isinstance(file_name, Path):
file_name = Path(file_name)
yaml_str = ""
with file_name.open() as fp:
for line_nr, line in enumerate(fp):
if line.startswith('---'):
if line_nr == 0: # don't count --- on first line as next document
continue
else:
doc_nr += 1
if position == doc_nr:
yaml_str += line
return ruamel.yaml.round_trip_load(yaml_str, preserve_quotes=True)


def reinsert(ofp, file_name, data, position=0):
doc_nr = 0
inserted = False
if not isinstance(file_name, Path):
file_name = Path(file_name)
with file_name.open() as fp:
for line_nr, line in enumerate(fp):
if line.startswith('---'):
if line_nr == 0:
ofp.write(line)
continue
else:
doc_nr += 1
if position == doc_nr:
if inserted:
continue
ruamel.yaml.round_trip_dump(data, ofp)
inserted = True
continue
ofp.write(line)


data = extract('input.yaml')
for k in list(data.keys()):
if k not in ['ID', 'post_title', 'author', 'post_date', 'layout', 'published']:
del data[k]

reinsert(sys.stdout, 'input.yaml', data)

你得到这个输出:

---
ID: 51 # one of the key/values to preserve
post_title: Here's my post title
author: Frank Meeuwsen
post_date: 2014-07-03 22:10:11
layout: post
published: true
---
additional stuff that is not YAML
and more
and more

请注意,ID 行的注释已妥善保留。


¹ 这是使用 ruamel.yaml 完成的一个 YAML 1.2 解析器,它试图在往返过程中保留尽可能多的信息,我是作者。

关于regex - 用正则表达式重写 YAML frontmatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40333083/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com