前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >转移jekyll主题chirpy后降级博客标题

转移jekyll主题chirpy后降级博客标题

作者头像
无敌清风蓝
发布2024-06-04 19:51:32
970
发布2024-06-04 19:51:32
举报
文章被收录于专栏:无敌清风蓝无敌清风蓝

1.起源

由于我要迁移主题到chirpy,而chirpy显示目录的最高标题是从二级标题开始,所以就要修改我所有的文章,那我就想,能不能自己写个cpp程序,自动将标题降级呢,比如一级标题降到二级之类的

2.设计方案

既然打算用cpp写,这又是个查找替换的问题,所以想到了采用正则表达式来做

代码语言:javascript
复制
std::regex pattern(R"(^(#+)(\s\d+))");

这是把# 1.1这种的先捕获出来,分为两个捕获组,一个是(#+),一个是((\s\d+)),前者代表有好几个#号,后者代表\s一个空格\d+是指一堆数字,最前面的^代表是找每行的行头,用R是为了避免转义,否则就要这样写了

代码语言:javascript
复制
std::regex pattern("(^(#+)(\\s\\d+))")

现在既然找到了原来的标题,那接下来就是替换了

1找到第一个捕获组,2找到第二个捕获组

代码语言:javascript
复制
$1#$2

这样的话,就在原来的每个标题的#后面多加了一个#

以上正则就搞好了,接下来就是读取当前文件夹的所有文件,因为C++11并没有直接提供操作文件系统的库,所以要么用std::stream来调用操作系统的命令行工具,要么用第三方库,boost库中的Filesystem,但后来查了下发现C++17已经把它加进来了,所以果断上C++17,std::filesystem

果然还是C++新特性更好用

3.源码

所以完整的代码是这样的

代码语言:javascript
复制
#include <iostream>
#include <fstream>
#include <string>
#include <regex>
#include <filesystem>

namespace fs = std::filesystem;

int main() {
	std::regex pattern(R"(^(#+)(\s\d+))");
	std::string replacement = "$1#$2";

	for (const auto& entry : fs::directory_iterator(fs::current_path())) {
		if (entry.is_regular_file() && entry.path().extension() == ".md") {
			std::ifstream input(entry.path());
			std::string content((std::istreambuf_iterator<char>(input)), std::istreambuf_iterator<char>());
			input.close();

			content = std::regex_replace(content, pattern, replacement);

			std::ofstream output(entry.path());
			output << content;
			output.close();
		}
	}

	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023/09/11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.起源
  • 2.设计方案
  • 3.源码
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档