用正则表达式重写YAML frontmatter

2024-04-30

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

我使用了一个插件,将我的 62 篇帖子以 Markdown 形式导出到 GitHub。我现在在每个文件的开头都有这些带有额外 frontmatter 的帖子。它看起来像这样:

---
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"
---

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 部分上将其作为无关的东西而拒绝),要么期望在文件中包含多个 YAML 文档(并且因为 Markdown 不是 YAML 而拒绝) )。此外,大多数 YAML 解析器会丢弃有用的东西,例如注释和重新排序映射键。

多年来,我一直在为我的 ToDo 项目使用类似的格式(YAML 标头,后跟 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

这个程序 1:

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线路得到妥善保存。


¹ This was done using ruamel.yaml https://pypi.python.org/pypi/ruamel.yaml a YAML 1.2 parser, which tries to preserve as much information as possible on round-trips, of which I am the author.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用正则表达式重写YAML frontmatter 的相关文章

随机推荐

  • RecyclerView 中的单选

    我知道没有默认的选择方法RecyclerView类 但我尝试过以下方式 public void onBindViewHolder ViewHolder holder final int position holder mTextView s
  • 为 SharePoint 2010 Web 部件创建图表

    我已创建从 Web 部件到 Oracle 数据库的连接 其中包含日期和数字 我想在图表中显示这些数据 我在互联网上查找过任何示例 但我很困惑 任何人都可以向我指出一些简单的说明 详细说明如何在 C Sharp 中创建可在 Web 部件上使用
  • 在 ASP.NET MVC 中返回不同的视图同一控制器

    我想根据以下值将用户发送到两个不同页面之一isCustomerEligible 当该变量的值设置为 false 时 它 会调用 Index 但随后返回视图Customer而不是视图Index public ViewResult Index
  • textarea根据内容js或jquery设置高度

    这是我的代码 保持简单
  • 具有单变量优化的 NLopt

    任何人都知道 NLopt 是否适用于单变量优化 尝试运行以下代码 using NLopt function myfunc x grad x 2 end opt Opt LD MMA 1 min objective opt myfunc mi
  • 如何在 pytest 中测试类层次结构?

    我已经使用 pytest 一段时间了 并学会了喜欢参数化和固定装置 我第一次想测试一些具有分支继承结构的类 当然 我想为子类重用测试用例 假设我有以下包结构 mock pkg child py grandchild py parent py
  • EC2 增加大小后无法调整卷大小

    我已按照调整 EC2 卷大小的步骤进行操作 停止实例 拍摄当前卷的快照 在同一区域中从上一个快照创建了一个更大大小的新卷 从实例中分离旧卷 将新卷附加到同一安装点的实例 旧卷是 5GB 我创建的卷是 100GB 现在 当我重新启动实例并运行
  • C 中未声明的标识符

    我正在尝试在 Visual Studio 2012 Express 中用 C 语言编译一个小型银行程序 它向我显示了几乎所有变量的 未声明标识符 错误 以及 语法错误 缺少 在 类型 之前 请告诉我正确的语法 谢谢 include
  • 如何让文字显示5秒然后消失并显示按钮?

    我正在努力做到这一点 以便当您在我的问答游戏中得到正确答案时 它会摆脱您看到的大问题并说 干得好 5秒钟 然后返回到主菜单 其中随机有4个选定的问题 问题从 quizfile csv 加载并包含 What colour is elon mu
  • C#,Process.Start 隐藏?

    public static void Main string args SearchGoogle Test Console ReadKey true static void SearchGoogle string t Process Sta
  • ~/.R/Makevars 文件是什么/在哪里?

    我正在尝试安装包 glmnet 我收到此错误 ld warning directory not found for option L usr local gfortran lib gcc x86 64 apple darwin15 6 1
  • ORA-01722-无效号码

    我在包中有一个查询抛出错误 ORA 01722 无效号码 我尝试了很多方法但没有运气 select h column from table1 h table2 c where c created date 17 MAY 17 and nvl
  • 禁用进度输出 aws s3sync 而不禁用所有输出

    有什么办法可以禁用 Completed 1 of 12 part s with 11 file s remaining 进度输出aws s3 sync命令 来自 aws cli 工具 我知道有一个 quiet选项 但我不想使用它 因为我仍然
  • R包:写入内部数据,但不是一次全部写入

    我正在使用 R 包usethis devtools 该包中有一些我想保留在内部的对象 只是为了避免混乱 我使用的结构是根据源在不同文件中创建对象 所有这些都在我的data raw文件夹 例如 文件make laus codes R准备两个来
  • 使用 Spring MVC 4.0 Multipart 上传图像

    我正在尝试使用下面的代码在线上传图像 但是 由于某种原因 图像似乎没有在图像文件夹中创建 不确定 我在这里做错了什么 RequestMapping value add method RequestMethod POST public Str
  • 使用R中usmap包中的plot_usmap在同一张地图上绘制州和县边界

    我想创建一张显示州和县边界 即不同颜色的州边界 的美国地图 我通常使用导入或使用的形状文件来执行此操作ggplot2 s map data功能 然而 我面临三个障碍 1 我无法安装gdal and geos在我的计算环境中 以便排除使用任何
  • Xcode 项目文件未出现在项目导航器中

    这里有一个奇怪的问题 我的项目的 Swift 文件 Main Storyboard 附加图像 委托等文件在 Xcodes Project Navigator 中都丢失了 真正奇怪的是 项目构建得很好 我也可以从主编辑器窗口的顶部选择它们 即
  • 为什么 i2c_smbus 函数不可用? (I2C——嵌入式Linux)

    有很多参考使用i2c smbus 开发嵌入式 Linux 软件时在 I2C 总线上进行通信的函数 什么时候i2c smbus函数如i2c smbus read word data在软件项目中引用了 ARM8 处理器错误 例如 i2c smb
  • 在 Mac OS X 10.7.4 上使用 OpenCL 禁用 Nvidia 看门狗

    我有一个 OpenCL 程序 对于小问题运行良好 但是当运行较大的问题超过 Nvidia 硬件上运行内核的 8 10 秒时间限制时 虽然我没有将显示器连接到我正在计算的 GPU Nvidia GTX580 上 但一旦内核运行大约 8 10
  • 用正则表达式重写YAML frontmatter

    我想使用 Jekyll 将我的 WordPress 网站转换为 GitHub 上的静态网站 我使用了一个插件 将我的 62 篇帖子以 Markdown 形式导出到 GitHub 我现在在每个文件的开头都有这些带有额外 frontmatter