import fs from 'fs';
import path from 'path';
import fse from 'fs-extra';
async function replaceImageExtensions(filePath, outputPath = '', linkPrefix = 'http://localhost:45462/image/', targetExtension = '.webp') {
try {
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]);
}
const imgRegex = new RegExp(`(<img[^>]+src=["'])(${linkPrefix}[^"']+)`, 'gm');
const imgLinks = modifiedContent.match(imgRegex);
if (imgLinks && imgLinks.length > 0) {
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;
}
}
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();