Skip to main content

md文件处理

替换所有图片后缀保证img标签

import fs from 'fs';
import path from 'path';
import fse from 'fs-extra';

/**
* @Description - 替换md文件中的图片链接后缀
*
* @param {params} filePath - {description}
* @param {string} outputPath= - {description}
*
* @returns {number} - 返回最终修改的条数,如果失败或者没有找到都会返回0
*
*/
async function replaceImageExtensions(filePath, outputPath = '', linkPrefix = 'http://localhost:45462/image/', targetExtension = '.webp') {
try {
// 读取Markdown文件内容
const markdownContent = await fse.readFile(filePath, 'utf8');

// 构建匹配的正则表达式,用于提取图片链接
const linkRegex = new RegExp(`(](\\()${linkPrefix}[^\\s)]+)`, 'gm');
const links = markdownContent.match(linkRegex);

if (!links || links.length === 0) return 0;

// 构建匹配的正则表达式,用于替换链接后缀名
const extensionRegex = new RegExp(`\\.(png|jpeg|jpg|tiff|gif)$`, 'i');

// 替换链接后缀名
const replacedLinks = links.map(link => link.replace(extensionRegex, targetExtension));

// 替换正文中的旧链接为新链接
let modifiedContent = markdownContent;
for (let i = 0; i < links.length; i++) {
modifiedContent = modifiedContent.replace(links[i], replacedLinks[i]);
}

// 构建匹配的正则表达式,用于提取<img>标签的src属性
const imgRegex = new RegExp(`(<img[^>]+src=["'])(${linkPrefix}[^"']+)`, 'gm');
const imgLinks = modifiedContent.match(imgRegex);

if (imgLinks && imgLinks.length > 0) {
// 替换<img>标签的src属性后缀名
for (let i = 0; i < imgLinks.length; i++) {
const imgLink = imgLinks[i];
const replacedImgLink = imgLink.replace(extensionRegex, targetExtension);
modifiedContent = modifiedContent.replace(imgLink, replacedImgLink);
}
}

// 决定写入的目标路径
const targetPath = outputPath ? outputPath : filePath;

// 将修改后的内容写入目标路径
await fse.writeFile(targetPath, modifiedContent, 'utf8');

console.log('替换完成并已保存到文件中。');
return links.length;
} catch (error) {
console.error('替换图片链接时出现错误:', error);
return 0;
}
}

/**
* @Description - 遍历指定目录下的所有md文件
*
* @param {params} directory - {description}
*
* @returns {string[]} - {description}
*
*/
async function getMdFiles(directory, targetExtension = '.md') {
try {
const files = [];

const filesInDirectory = await fs.promises.readdir(directory);
for (const file of filesInDirectory) {
const filePath = path.join(directory, file);
const stat = await fs.promises.stat(filePath);

if (stat.isFile() && path.extname(filePath) === targetExtension) {
files.push(filePath);
} else if (stat.isDirectory()) {
const nestedFiles = await getMdFiles(filePath);
files.push(...nestedFiles);
}
}

return files;
} catch (error) {
console.error('Error occurred while retrieving MD files:', error);
return [];
}
}

async function test() {
const directoryPath = 'Z:/cache/docs';

const mdFiles = await getMdFiles(directoryPath);

const taskList = mdFiles.map(async mdFile => await replaceImageExtensions(mdFile));

const res = await Promise.all(taskList);

console.log('res: ', res.length);
}

test();