0%

Hexo使用技巧:使用Node.js实现批量替换图片链接前缀

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**
* 替换文件夹下所有md文件的图片链接
*/
const path = require('path');
const fs = require('fs');

const addImageUrlPreffix = (dirName, preffix = '/images') => {
// 过滤非.md
let fileNames = fs.readdirSync(dirName).filter(val => {
return /[\w|\W]*\.md/.test(val);
});

for (let fName of fileNames) {
let fileStr = fs.readFileSync(`${dirName}/${fName}`).toString();
let fileStrBak = fileStr;
let urls = [];
let beginAt = 0;
let endAt = 0;
let matchResult;

// 查找图片链接
while (matchResult = fileStr.match(/(!\[[\w|\W]*?\]\()(\/?[\w|\W]*?)(\))/)) {
let firstBlock = matchResult[1];
let imgUrl = matchResult[2];
beginAt = endAt + matchResult.index + firstBlock.length;
endAt = beginAt + imgUrl.length;

fileStr = fileStr.substr(matchResult.index + firstBlock.length + imgUrl.length, fileStr.length);

// 加上绝对路径
if (!/^\//.test(imgUrl)) {
imgUrl = `/${imgUrl}`;
}

urls.push({
imgUrl,
beginAt,
endAt
});
}

if (urls.length == 0) continue;

// 从字符串尾部写上来
urls.reverse();

// 批量替换
for (let { imgUrl, beginAt, endAt }
of urls) {
let str1 = fileStrBak.substr(0, beginAt);
let str2 = fileStrBak.substr(endAt, fileStrBak.length);
fileStrBak = str1 + preffix + imgUrl + str2;
}

// 写入文件
fs.writeFileSync(`${dirName}/${fName}`, fileStrBak);
console.log(`${dirName}/${fName}, number: ${urls.length}`);
}
}


const dPath = path.resolve(__dirname, './source/_drafts');
const pPath = path.resolve(__dirname, './source/_posts');

addImageUrlPreffix(dPath);
addImageUrlPreffix(pPath);