Migrate Hexo Posts to Hugo

2023年10月26日 · 511 字 · 2 分钟 · Posts Hexo Hugo

最近实在被hexo的构建速度感动到了,我就几十篇posts就给我卡半天,果断润到hugo了。

但是很多基于hexo Butterfly主题的posts需要重新按照hugo ladder主题的字段进行修改,不然不能正常渲染构建,于是便有了下面的python脚本。

我只修改了frontmatter的部分字段,请按需修改,谨慎使用!

  1. 配置环境
pip install frontmatter
pip install pyyaml
  1. 原神,启动!
import os
import re
import shutil
import yaml
from datetime import datetime, timezone, timedelta

# 输入文件夹和输出文件夹的路径
input_folder = './posts/'
output_folder = './posts_n/'

# 遍历输入文件夹中的所有Markdown文件
for filename in os.listdir(input_folder):
    if filename.endswith('.md'):
        # 构建输入和输出文件的完整路径
        input_file_path = os.path.join(input_folder, filename)
        output_file_path = os.path.join(output_folder, filename)

        # 打开输入文件并读取内容
        with open(input_file_path, 'r', encoding='utf-8') as input_file:
            content = input_file.read()

        # 使用正则表达式找到frontmatter
        frontmatter_match = re.match(r'---\n(.*?)\n---', content, re.DOTALL)
        if frontmatter_match:
            frontmatter_text = frontmatter_match.group(1)
            post = yaml.load(frontmatter_text, Loader=yaml.FullLoader)

            # 保留需要的字段
            post = {
                # 这里date的算法出问题了,用的是当前时间,应该用源文档中的date,但我懒得改了
                'date': datetime.now(timezone(timedelta(hours=8))).strftime('%Y-%m-%dT%H:%M:%S%z').replace('+0800', '+08:00'),
                'title': f'"{post["title"]}"',
                'description': post.get('description', ''),
                'tags': post.get('tags', []),
                'slug': post.get('abbrlink', ''),
                'featured': True
            }

            # 构建修改后的frontmatter文本
            new_frontmatter = '---\n'
            for key, value in post.items():
                new_frontmatter += f'{key}: {value}\n'
            new_frontmatter += '---\n'

            # 将修改后的内容写入输出文件
            with open(output_file_path, 'w', encoding='utf-8') as output_file:
                output_file.write(new_frontmatter + content[len(frontmatter_match.group(0)):])

碎碎念:以后还是尽量用基本markdown语法吧,很多语法,例如toggle,好用倒是非常好用,但是一旦迁移框架的时候简直是蛋疼🤣