- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 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/
如何在帖子前言中使用站点 _config.yml 中的变量? 我想做这样的事情 --- github-id: site.github-id --- 然而,这实际上将其设置为字符串“site.githu
我想使用 Jekyll 将我的 WordPress 网站转换为 GitHub 上的静态网站。 我使用一个插件将我的 62 篇文章作为 Markdown 导出到 GitHub。我现在有这些帖子,每个文件
我有一个定义了 frontmatter 的 mdx gatsby 页面。 --- title: About Me path: /about description: Some information
我想使用 ' 或易于从键盘输入的东西而不是 ' 关于如何做到这一点的任何想法?我试图逃脱,但仍然无济于事。 --- title: 'that's great' --- 此外,如果某些页面存在此错误,构
我最近开始尝试使用 Jekyll(v 3.0.1,在 Ubuntu 上使用 Ruby 2.2.3p173),我不确定我是否发现了错误或者它是某种 PEBKAC。 我有几篇文章,我想使用它们在 fron
好的,所以我想要完成的是在我的主页上显示我最新的漫画,它的标题和描述。我所有的漫画都在 "/comics/#" 中。漫画的标题和描述在首页,并通过布局添加到页面。我在 _config.yml 文件中保
我已经使用 mdx 建立了一个 next.js markdown 博客:https://mdxjs.com/ . 我希望能够在 mdx 文件本身的 frontmatter 部分中引用数据。像这样: /
根据Jekyll's frontmatter在文档中,date 变量可用于指定发布帖子的日期和时间。 Jekyll 在这里期望哪种日期格式?我见过的一些例子,例如: date: 2010-09-15
在子布局中,是否可以定义一个 frontmatter 变量,其范围仅限于使用该布局的模板? 例如,给定一个子布局child.hbs: --- layout: parent.hbs layout_scr
在 ruby 中是否有某种方法可以编辑 markdown 文件顶部的 YAML Frontmatter,就像 Jekyll 和 Middleman 中使用的那样? 类似于: def update_
我有一堆 Markdown 文件,我想在我的网站上发布它们。我用 Jekyll 摆弄了一段时间,这似乎是一个很好的工具,但我的问题是我想在其他网站(如 Medium)上发布我的文件,而 FrontMa
我希望最外层的 Liquid 模板文件仅在页面需要时才引用 JavaScript 文件。我创建了一个页面变量,page.slideshow ,它控制这个: 默认.html: {% if page.sl
第一次尝试 Gatsby ,很高兴。但是我遇到了一个奇怪的 GraphQL 问题: 我正在使用 gatsby-source-filesystem 和 gatsby-transformer-remark
我想将 gulp frontmatters 输出传递给我在 Gulp(gulp 模板)中使用的另一个函数。我想我的语法是正确的,但一定是做错了什么,因为它不起作用。 我使用的 gulp 插件是:Gul
好的...我有一个项目,我在其中使用 Jekyll 进行播客项目。我选择通过 YAML Front Matter 项目在 shownotes 中列出主机: hosts: - Name A -
我需要加载来自 Markdown 元数据的图像 --- title: 'First Blog' description: 'First blog description' image: ../../c
我正在尝试使用以下 graphQL 查询: { allMarkdownRemark( limit: 1000 ) { edges {
我还是 React 的新手。我只是想让我的投资组合用好的技术构建。我对 gatsbyjs 很感兴趣。现在,我得到了一个错误。它说 未知论点'frontmatter'我对此一无所知。这与 graphql
有没有一种简单的方法可以在 Gatsby 上将 frontmatter 内容转换为 html,而不仅仅是在 Markdown 时将该内容设置为 html 本身? 所以在这个例子中: --- about
我想使用 emacs 的 org-mode 为我的 Jekyll 驱动的博客写博文。读书Using org to Blog with Jekyll , 通常所做的是将您的前端内容放在 #+BEGIN_
我是一名优秀的程序员,十分优秀!