hexo-adsense 1.0.21 → 1.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +20 -6
- package/lib/index.js +8 -1
- package/lib/source/adblock.css +2 -83
- package/lib/source/adblock.js +1 -31
- package/lib/source/article-ads.css +2 -11
- package/lib/source/article-ads.js +1 -270
- package/lib/source/blogger-redirect.html +1 -14
- package/lib/source/https.js +1 -4
- package/lib/src/article-ads.d.ts +1 -1
- package/lib/src/article-ads.js +6 -6
- package/lib/src/config.d.ts +12 -19
- package/lib/src/config.js +3 -5
- package/lib/src/utils.d.ts +9 -1
- package/lib/src/utils.js +2 -2
- package/package.json +20 -5
- package/packages/hexo-cli-extras/.eslintrc +13 -0
- package/packages/hexo-cli-extras/LICENSE.md +20 -0
- package/packages/hexo-cli-extras/README.md +146 -0
- package/packages/hexo-cli-extras/docs/basic.gif +0 -0
- package/packages/hexo-cli-extras/docs/gui.gif +0 -0
- package/packages/hexo-cli-extras/docs/remove.png +0 -0
- package/packages/hexo-cli-extras/docs/rename.png +0 -0
- package/packages/hexo-cli-extras/index.js +48 -0
- package/packages/hexo-cli-extras/lib/edit.js +209 -0
- package/packages/hexo-cli-extras/lib/env.js +52 -0
- package/packages/hexo-cli-extras/lib/extensions.js +23 -0
- package/packages/hexo-cli-extras/lib/integrate.js +87 -0
- package/packages/hexo-cli-extras/lib/isolate.js +179 -0
- package/packages/hexo-cli-extras/lib/remove.js +145 -0
- package/packages/hexo-cli-extras/lib/rename.js +171 -0
- package/packages/hexo-cli-extras/package.json +34 -0
- package/packages/hexo-extend-injector2/.eslintrc +4 -0
- package/packages/hexo-extend-injector2/.github/workflows/linter.yml +27 -0
- package/packages/hexo-extend-injector2/.github/workflows/tester.yml +24 -0
- package/packages/hexo-extend-injector2/.vscode/settings.json +10 -0
- package/packages/hexo-extend-injector2/LICENSE +165 -0
- package/packages/hexo-extend-injector2/README-ZH.md +189 -0
- package/packages/hexo-extend-injector2/README.md +191 -0
- package/packages/hexo-extend-injector2/USAGE.md +38 -0
- package/packages/hexo-extend-injector2/index.js +13 -0
- package/packages/hexo-extend-injector2/lib/bundle/css-bundle.js +79 -0
- package/packages/hexo-extend-injector2/lib/bundle/css-generator.js +13 -0
- package/packages/hexo-extend-injector2/lib/bundle/handle-data-pre.js +29 -0
- package/packages/hexo-extend-injector2/lib/bundle/js-bundle.js +42 -0
- package/packages/hexo-extend-injector2/lib/bundle/js-generator.js +10 -0
- package/packages/hexo-extend-injector2/lib/default-config.js +52 -0
- package/packages/hexo-extend-injector2/lib/filter.js +24 -0
- package/packages/hexo-extend-injector2/lib/helper/injector.js +6 -0
- package/packages/hexo-extend-injector2/lib/helper/next-inject.js +14 -0
- package/packages/hexo-extend-injector2/lib/injector.js +128 -0
- package/packages/hexo-extend-injector2/lib/load.js +45 -0
- package/packages/hexo-extend-injector2/lib/next-point.js +19 -0
- package/packages/hexo-extend-injector2/lib/next.js +87 -0
- package/packages/hexo-extend-injector2/lib/order.js +9 -0
- package/packages/hexo-extend-injector2/package.json +49 -0
- package/packages/hexo-extend-injector2/renovate.json +6 -0
- package/packages/hexo-extend-injector2/test/.eslintrc +3 -0
- package/packages/hexo-extend-injector2/test/index.js +18 -0
- package/packages/hexo-extend-injector2/test/lib/bundle/bundle-css.js +86 -0
- package/packages/hexo-extend-injector2/test/lib/bundle/bundle-js.js +36 -0
- package/packages/hexo-extend-injector2/test/lib/bundle/test.css +3 -0
- package/packages/hexo-extend-injector2/test/lib/bundle/test.js +5 -0
- package/packages/hexo-extend-injector2/test/lib/helper/injector.js +45 -0
- package/packages/hexo-extend-injector2/test/lib/helper/next-inject.js +69 -0
- package/packages/hexo-extend-injector2/test/lib/hexo-compatible.js +250 -0
- package/packages/hexo-extend-injector2/test/lib/hexo-injector.js +37 -0
- package/packages/hexo-extend-injector2/test/lib/injector.js +93 -0
- package/packages/memoize/CHANGELOG.md +82 -0
- package/packages/memoize/CHANGES +124 -0
- package/packages/memoize/LICENSE +15 -0
- package/packages/memoize/README.md +503 -0
- package/packages/memoize/ext/async.js +154 -0
- package/packages/memoize/ext/dispose.js +33 -0
- package/packages/memoize/ext/max-age.js +90 -0
- package/packages/memoize/ext/max.js +27 -0
- package/packages/memoize/ext/promise.js +147 -0
- package/packages/memoize/ext/ref-counter.js +48 -0
- package/packages/memoize/index.js +34 -0
- package/packages/memoize/lib/configure-map.js +182 -0
- package/packages/memoize/lib/methods.js +32 -0
- package/packages/memoize/lib/registered-extensions.js +1 -0
- package/packages/memoize/lib/resolve-length.js +15 -0
- package/packages/memoize/lib/resolve-normalize.js +17 -0
- package/packages/memoize/lib/resolve-resolve.js +21 -0
- package/packages/memoize/lib/weak.js +134 -0
- package/packages/memoize/methods-plain.js +3 -0
- package/packages/memoize/methods.js +3 -0
- package/packages/memoize/normalizers/get-1.js +29 -0
- package/packages/memoize/normalizers/get-fixed.js +71 -0
- package/packages/memoize/normalizers/get-primitive-fixed.js +16 -0
- package/packages/memoize/normalizers/get.js +90 -0
- package/packages/memoize/normalizers/primitive.js +9 -0
- package/packages/memoize/package.json +60 -0
- package/packages/memoize/plain.js +37 -0
- package/packages/memoize/profile.js +107 -0
- package/packages/memoize/repository.md +1 -0
- package/packages/memoize/weak-plain.js +3 -0
- package/packages/memoize/weak.js +3 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Promise = require('bluebird');
|
|
4
|
+
var chalk = require('chalk');
|
|
5
|
+
var inquirer = require('inquirer');
|
|
6
|
+
var fsStat = Promise.promisify(require('fs').stat);
|
|
7
|
+
var fsRename = Promise.promisify(require('fs').rename);
|
|
8
|
+
var fsMkdir = Promise.promisify(require('fs').mkdir);
|
|
9
|
+
var path = require('path');
|
|
10
|
+
|
|
11
|
+
module.exports = function modExports(args) {
|
|
12
|
+
// set up -a/--all option and searchTerms
|
|
13
|
+
var doWholeFolder = !!args.a || !!args.all;
|
|
14
|
+
var searchTerms = [];
|
|
15
|
+
|
|
16
|
+
if (!doWholeFolder) {
|
|
17
|
+
searchTerms = args._.map(function makeRE(arg) {
|
|
18
|
+
return new RegExp(arg, 'i');
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
this.load().then(function loadDB() {
|
|
23
|
+
|
|
24
|
+
var locals = this.locals;
|
|
25
|
+
var exileDir = path.join(this.source_dir, '_posts', '_exile');
|
|
26
|
+
var allPosts;
|
|
27
|
+
|
|
28
|
+
// if the _exile dir doesn't exist yet, make it
|
|
29
|
+
isDir(exileDir).then(function checkExileDir(exists) {
|
|
30
|
+
if (!exists) {
|
|
31
|
+
makeDir(exileDir);
|
|
32
|
+
}
|
|
33
|
+
}).then(function loadArticles() {
|
|
34
|
+
return getArticles(locals);
|
|
35
|
+
}).then(function selectArticle(arts) {
|
|
36
|
+
allPosts = arts;
|
|
37
|
+
return selectIsolated(arts, doWholeFolder);
|
|
38
|
+
}).then(function splitPosts(isolated) {
|
|
39
|
+
// split into { isolated, articlesToStash }
|
|
40
|
+
return makeIsoObject(allPosts, isolated);
|
|
41
|
+
}).then(function isolateArticles(articlesObject) {
|
|
42
|
+
return doIsolate(articlesObject);
|
|
43
|
+
}).then(function allDone(isolated) {
|
|
44
|
+
console.log(chalk.gray(isolated), 'successfully isolated.\nTo restore the exiled posts, run', chalk.yellow('hexo integrate'));
|
|
45
|
+
}).catch(function catchUncaught(err) {
|
|
46
|
+
console.log(err.stack ? chalk.red(err.stack) : chalk.gray(err));
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
function isDir(dir) {
|
|
50
|
+
return fsStat(dir).then(function doCheckDir(stats) {
|
|
51
|
+
if (stats.isFile() && /_exile/.test(dir)) {
|
|
52
|
+
console.log(chalk.gray(dir), 'seems to be a file on your filesystem! It needs to be either non-existent or a directory, so please rename your _exile post before using this command.');
|
|
53
|
+
process.exit();
|
|
54
|
+
} else if (stats.isDirectory()) {
|
|
55
|
+
// console.log('%s is a directory', dir);
|
|
56
|
+
return true;
|
|
57
|
+
} else {
|
|
58
|
+
console.log(chalk.gray(dir), 'seems to be neither a file nor a directory! This really shouldn\'t be happening, please issue a bug report.');
|
|
59
|
+
process.exit();
|
|
60
|
+
}
|
|
61
|
+
}).catch(function catchCheckDir() {
|
|
62
|
+
// The directory doesn't exist (which is not a bad thing)
|
|
63
|
+
// console.log('%s doesn\'t exist', dir);
|
|
64
|
+
return false;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function makeDir(dir) {
|
|
69
|
+
return fsMkdir(dir).then(function doMakeDir() {
|
|
70
|
+
console.log(chalk.gray(dir), 'created');
|
|
71
|
+
}).catch(function catchMakeDir(err) {
|
|
72
|
+
console.log(chalk.gray(dir), 'could not be created: ', chalk.red(err));
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function getArticles(data) {
|
|
77
|
+
return Promise.resolve(data.get('posts').sort('-date').toArray());
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function filterOnName(arts, terms) {
|
|
81
|
+
return arts.filter(function filterArts(article) {
|
|
82
|
+
return terms.every(function testRE(term) {
|
|
83
|
+
return term.test(article.title) || term.test(article.slug);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function selectIsolated(items, doAll) {
|
|
89
|
+
// narrow down the post to isolate based on the user's inputted search terms (if available)
|
|
90
|
+
var isolated = filterOnName(items, searchTerms);
|
|
91
|
+
|
|
92
|
+
// stash everything if run with the -a/--all option
|
|
93
|
+
if (doAll) {
|
|
94
|
+
return Promise.resolve(isolated);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (isolated.length === 0) {
|
|
98
|
+
console.log(chalk.red('No posts matched. Exiting.'));
|
|
99
|
+
process.exit();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (isolated.length === 1) {
|
|
103
|
+
return Promise.resolve(isolated[0].full_source);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// set up menu for selecting a post in case multiple match the search terms
|
|
107
|
+
var entries = isolated.map(function mapTitles(article) {
|
|
108
|
+
return [article.title, ' (', chalk.green(article.updated.format('YYYY-MM-DD')), ')'].join('');
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
return inquirer.prompt([
|
|
112
|
+
{
|
|
113
|
+
type: 'list',
|
|
114
|
+
name: 'selected',
|
|
115
|
+
message: 'Select the post you want to isolate.',
|
|
116
|
+
choices: entries,
|
|
117
|
+
},
|
|
118
|
+
]).then(function getAnswer(answer) {
|
|
119
|
+
var pos = entries.indexOf(answer.selected);
|
|
120
|
+
return isolated[pos].full_source;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function makeIsoObject(items, iso) {
|
|
125
|
+
var toStash = items.map(function mapSource(item) {
|
|
126
|
+
return item.full_source;
|
|
127
|
+
}).filter(function filterOutIsolated(item) {
|
|
128
|
+
return item !== iso;
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
isolated: iso,
|
|
133
|
+
articlesToStash: toStash,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function doIsolate(itemObj) {
|
|
138
|
+
var newName;
|
|
139
|
+
var isolated = itemObj.isolated;
|
|
140
|
+
var toStash = itemObj.articlesToStash;
|
|
141
|
+
|
|
142
|
+
var movePromises = toStash.map(function makePromise(article) {
|
|
143
|
+
newName = path.join(exileDir, article.substr(article.lastIndexOf(path.sep)));
|
|
144
|
+
return new Promise(function returnPromise(resolve) {
|
|
145
|
+
resolve(move(article, newName));
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// just for outputting a completed message
|
|
150
|
+
var thePost = (isolated) ? isolated : 'All posts';
|
|
151
|
+
|
|
152
|
+
return Promise.all(movePromises).then(function allDone() {
|
|
153
|
+
return thePost;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function move(origin, destination) {
|
|
158
|
+
// setting up the moving of the asset dirs in case they exist
|
|
159
|
+
var assetDir = path.join(path.parse(origin).dir, path.parse(origin).name);
|
|
160
|
+
var assetDirDestination = path.join(path.parse(destination).dir, path.parse(destination).name);
|
|
161
|
+
Promise.resolve(isDir(assetDir)).then(function checkAssetDir(exists) {
|
|
162
|
+
if (exists) {
|
|
163
|
+
fsRename(assetDir, assetDirDestination).then(function doAssetDirMove() {
|
|
164
|
+
// console.log('%s moved to %s', assetDir, assetDirDestination);
|
|
165
|
+
}).catch(function catchAssetDirMove(err) {
|
|
166
|
+
console.log('%s could not be moved to %s: %s', assetDir, assetDirDestination, err);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
return fsRename(origin, destination).then(function doMove() {
|
|
171
|
+
// console.log('%s moved to %s', origin, destination);
|
|
172
|
+
}).catch(function catchMove(err) {
|
|
173
|
+
console.log('%s could not be moved to %s: %s', origin, destination, err);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
}.bind(this));
|
|
178
|
+
};
|
|
179
|
+
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Promise = require('bluebird');
|
|
4
|
+
var chalk = require('chalk');
|
|
5
|
+
var inquirer = require('inquirer');
|
|
6
|
+
var fsStat = Promise.promisify(require('fs').stat);
|
|
7
|
+
var fsUnlink = Promise.promisify(require('fs').unlink);
|
|
8
|
+
var fsRmdir = Promise.promisify(require('rimraf'));
|
|
9
|
+
|
|
10
|
+
module.exports = function modExports(args) {
|
|
11
|
+
var searchTerms;
|
|
12
|
+
|
|
13
|
+
if (!args._.join('')) {
|
|
14
|
+
console.log(chalk.red('You need to search for a specific post before you can remove it. Check `hexo help remove` for usage details.'));
|
|
15
|
+
process.exit();
|
|
16
|
+
} else {
|
|
17
|
+
// every whitespace-separated word in the input search is a case-insensitive regular expression
|
|
18
|
+
searchTerms = args._.map(function mapSearchTerms(arg) {
|
|
19
|
+
return new RegExp(arg, 'i');
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// load database
|
|
24
|
+
this.load().then(function loadDb() {
|
|
25
|
+
var locals = this.locals;
|
|
26
|
+
|
|
27
|
+
// load posts and pages
|
|
28
|
+
getArticles(locals).then(function loadArticles(articles) {
|
|
29
|
+
return selectArticle(articles);
|
|
30
|
+
}).then(function processSelected(selected) {
|
|
31
|
+
return confirmRemove(selected);
|
|
32
|
+
}).catch(function failProcessSelected(err) {
|
|
33
|
+
console.log(err.stack ? chalk.red(err.stack) : chalk.gray(err));
|
|
34
|
+
process.exit();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
function getArticles(data) {
|
|
38
|
+
return Promise.resolve(data.get('posts').toArray().concat(locals.get('pages').toArray()));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function filterOnName(articles, terms) {
|
|
42
|
+
return articles.filter(function filterArticles(article) {
|
|
43
|
+
return terms.every(function checkRE(term) {
|
|
44
|
+
return term.test(article.title) || term.test(article.slug);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function selectArticle(items) {
|
|
50
|
+
var filtered = filterOnName(items, searchTerms);
|
|
51
|
+
|
|
52
|
+
if (filtered.length === 0) {
|
|
53
|
+
return Promise.reject(chalk.red('No posts or pages found using your query.'));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (filtered.length === 1) {
|
|
57
|
+
return Promise.resolve(filtered[0]);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
var entries = filtered.map(function mapEntries(article) {
|
|
61
|
+
return [article.title, ' (', chalk.green(article.source), ')'].join('');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
return inquirer.prompt([
|
|
65
|
+
{
|
|
66
|
+
type: 'list',
|
|
67
|
+
name: 'selected',
|
|
68
|
+
message: 'Select the post or page you wish to rename.',
|
|
69
|
+
choices: entries,
|
|
70
|
+
},
|
|
71
|
+
]).then(function getAnswer(answer) {
|
|
72
|
+
var pos = entries.indexOf(answer.selected);
|
|
73
|
+
return filtered[pos];
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function confirmRemove(post) {
|
|
78
|
+
var message = '\n - Remove ' + chalk.green.underline(post.title) + '?\n' + chalk.red.bgBlack('Warning: this action is irreversible!');
|
|
79
|
+
var del = chalk.red('Delete it!');
|
|
80
|
+
var can = chalk.green('Cancel');
|
|
81
|
+
|
|
82
|
+
return inquirer.prompt([
|
|
83
|
+
{
|
|
84
|
+
type: 'list',
|
|
85
|
+
message: message,
|
|
86
|
+
name: 'answer',
|
|
87
|
+
choices: [
|
|
88
|
+
del,
|
|
89
|
+
can,
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
]).then(function getResponse(response) {
|
|
93
|
+
var ans = response.answer;
|
|
94
|
+
|
|
95
|
+
switch (ans) {
|
|
96
|
+
case del:
|
|
97
|
+
remove(post);
|
|
98
|
+
break;
|
|
99
|
+
case can:
|
|
100
|
+
console.log(chalk.gray('OK. See you later.'));
|
|
101
|
+
process.exit();
|
|
102
|
+
break;
|
|
103
|
+
default:
|
|
104
|
+
console.log(chalk.red('This shouldn\'t happen, please file a bug report.'));
|
|
105
|
+
process.exit();
|
|
106
|
+
}
|
|
107
|
+
return chalk.gray('Done.');
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function remove(post) {
|
|
112
|
+
var src = post.full_source;
|
|
113
|
+
|
|
114
|
+
// first check if the file exists
|
|
115
|
+
fsStat(src).then(function getStats(stats) {
|
|
116
|
+
if (stats.isFile()) {
|
|
117
|
+
|
|
118
|
+
// delete the file
|
|
119
|
+
fsUnlink(src).then(function unlinkFile() {
|
|
120
|
+
var assetDir = src.substr(0, src.lastIndexOf('.'));
|
|
121
|
+
console.log(chalk.red.underline(src + ' deleted.'));
|
|
122
|
+
|
|
123
|
+
// check for the asset directory
|
|
124
|
+
fsStat(assetDir).then(function getAssetDirStats(adStats) {
|
|
125
|
+
if (adStats.isDirectory()) {
|
|
126
|
+
|
|
127
|
+
// delete the asset dir
|
|
128
|
+
fsRmdir(assetDir).then(function unlinkAssetDir() {
|
|
129
|
+
console.log(chalk.red.underline(assetDir + ' (asset directory) deleted.'));
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}).catch(function failAssetDir() {
|
|
133
|
+
console.log(chalk.gray('No asset dir found.'));
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}).catch(function failRemove(err) {
|
|
138
|
+
console.log(chalk.red('Problem deleting article :', err));
|
|
139
|
+
process.exit();
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
}.bind(this));
|
|
144
|
+
};
|
|
145
|
+
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Promise = require('bluebird');
|
|
4
|
+
var chalk = require('chalk');
|
|
5
|
+
var inquirer = require('inquirer');
|
|
6
|
+
var fsReadFile = Promise.promisify(require('fs').readFile);
|
|
7
|
+
var fsStat = Promise.promisify(require('fs').stat);
|
|
8
|
+
var fsWriteFile = Promise.promisify(require('fs').writeFile);
|
|
9
|
+
var fsRename = Promise.promisify(require('fs').rename);
|
|
10
|
+
var slugize = require('hexo-util').slugize;
|
|
11
|
+
var path = require('path');
|
|
12
|
+
|
|
13
|
+
module.exports = function modExports(args) {
|
|
14
|
+
var oldName;
|
|
15
|
+
var newName = args.n || args.new || '';
|
|
16
|
+
|
|
17
|
+
if (!args._.join('') || !newName) {
|
|
18
|
+
console.log(chalk.red('Both a new and an old filename/title are required. `hexo rename help` to display help.'));
|
|
19
|
+
process.exit();
|
|
20
|
+
} else {
|
|
21
|
+
// every whitespace-separated word in the input search is a case-insensitive regular expression
|
|
22
|
+
oldName = args._.map(function makeRE(arg) {
|
|
23
|
+
return new RegExp(arg, 'i');
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// load database
|
|
28
|
+
this.load().then(function loadDB() {
|
|
29
|
+
var selectedPost;
|
|
30
|
+
|
|
31
|
+
loadArticles(this.locals).then(function select(arts) {
|
|
32
|
+
return selectArticle(arts);
|
|
33
|
+
}).then(function selectRename(selected) {
|
|
34
|
+
selectedPost = selected;
|
|
35
|
+
return chooseRenameStyle(selectedPost);
|
|
36
|
+
}).then(function process(renameStyle) {
|
|
37
|
+
if (renameStyle === 'filename') {
|
|
38
|
+
return renameFile(selectedPost, newName);
|
|
39
|
+
} else if (renameStyle === 'title') {
|
|
40
|
+
return renameTitle(selectedPost, newName);
|
|
41
|
+
} else {
|
|
42
|
+
return renameTitle(selectedPost, newName).then(function alsoFilename() {
|
|
43
|
+
return renameFile(selectedPost, newName);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}).catch(function catchAll(err) {
|
|
47
|
+
console.log(err.stack ? chalk.red(err.stack) : chalk.red('Error: ') + chalk.gray(err));
|
|
48
|
+
process.exit();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
function selectArticle(items) {
|
|
52
|
+
var articles = filterOnName(items, oldName);
|
|
53
|
+
|
|
54
|
+
if (articles.length === 0) {
|
|
55
|
+
return Promise.reject('No posts or pages found using your query.');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (articles.length === 1) {
|
|
59
|
+
// no menu if there is only one result
|
|
60
|
+
return Promise.resolve(articles[0]);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
var entries = articles.map(function mapArts(article) {
|
|
64
|
+
return [article.title, ' (', chalk.green(article.source), ')'].join('');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
return inquirer.prompt([
|
|
68
|
+
{
|
|
69
|
+
type: 'list',
|
|
70
|
+
name: 'selected',
|
|
71
|
+
message: 'Select the post or page you wish to rename.',
|
|
72
|
+
choices: entries,
|
|
73
|
+
},
|
|
74
|
+
]).then(function getAnswer(answer) {
|
|
75
|
+
var pos = entries.indexOf(answer.selected);
|
|
76
|
+
return articles[pos];
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function chooseRenameStyle(post) {
|
|
81
|
+
var message = '\n - Rename title (' + chalk.green.underline(post.title) + ') to ' +
|
|
82
|
+
chalk.cyan.underline(newName) + ' ?\n - Rename filename (' +
|
|
83
|
+
chalk.green.underline(post.source.substr(post.source.lastIndexOf(path.sep))) + ') to ' +
|
|
84
|
+
chalk.cyan.underline(slugize(newName, {transform: 1}) + '.md') + ' ?';
|
|
85
|
+
|
|
86
|
+
return inquirer.prompt([
|
|
87
|
+
{
|
|
88
|
+
type: 'list',
|
|
89
|
+
message: message,
|
|
90
|
+
name: 'answer',
|
|
91
|
+
choices: [
|
|
92
|
+
'Yes, rename both',
|
|
93
|
+
'Title only please (don\'t rename the file!)',
|
|
94
|
+
'Filename only please (don\'t rename the title!)',
|
|
95
|
+
'No, forget it, cancel everything.',
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
]).then(function processRes(response) {
|
|
99
|
+
var ans = response.answer;
|
|
100
|
+
|
|
101
|
+
switch (ans) {
|
|
102
|
+
case 'Yes, rename both':
|
|
103
|
+
return 'both';
|
|
104
|
+
case 'Title only please (don\'t rename the file!)':
|
|
105
|
+
return 'title';
|
|
106
|
+
case 'Filename only please (don\'t rename the title!)':
|
|
107
|
+
return 'filename';
|
|
108
|
+
default:
|
|
109
|
+
return Promise.reject('User cancelled rename operation');
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function renameFile(art, renamed) {
|
|
115
|
+
|
|
116
|
+
var src = art.full_source;
|
|
117
|
+
var newSrc = path.join(src.substr(0, src.lastIndexOf(path.sep)), slugize(renamed, {transform: 1}));
|
|
118
|
+
|
|
119
|
+
// first the markdown file
|
|
120
|
+
return fsRename(src, newSrc + '.md').then(function doRenameMd() {
|
|
121
|
+
var fldr;
|
|
122
|
+
|
|
123
|
+
console.log(chalk.red(src) + ' renamed to ' + chalk.green(newSrc) + '.md');
|
|
124
|
+
|
|
125
|
+
fldr = src.substr(0, src.lastIndexOf('.'));
|
|
126
|
+
|
|
127
|
+
// then the folder if it exists
|
|
128
|
+
return fsStat(fldr).then(function doCheckDir(stats) {
|
|
129
|
+
if (stats.isDirectory()) {
|
|
130
|
+
return fsRename(fldr, newSrc).then(function doRenameDir() {
|
|
131
|
+
console.log(chalk.underline('Asset folder renamed as well.'));
|
|
132
|
+
});
|
|
133
|
+
} else {
|
|
134
|
+
return 'Done';
|
|
135
|
+
}
|
|
136
|
+
}).catch(function catchCheckDir() {
|
|
137
|
+
return console.log(chalk.underline('No asset folder found.'));
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function renameTitle(art, newTitle) {
|
|
144
|
+
var oldTitle = art.title;
|
|
145
|
+
var oldTitleString = new RegExp('title:.*');
|
|
146
|
+
|
|
147
|
+
// change the title through the file system because changing it in the db caused issues
|
|
148
|
+
return fsReadFile(art.full_source, 'utf8').then(function doReadArt(data) {
|
|
149
|
+
var cont = data.replace(oldTitleString, 'title: "' + newTitle + '"');
|
|
150
|
+
|
|
151
|
+
return fsWriteFile(art.full_source, cont, 'utf8').then(function doWriteArt() {
|
|
152
|
+
console.log(chalk.red(oldTitle) + ' renamed to ' + chalk.green(newTitle));
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function loadArticles(locals) {
|
|
158
|
+
return Promise.resolve(locals.get('posts').toArray().concat(locals.get('pages').toArray()));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function filterOnName(articles, terms) {
|
|
162
|
+
return articles.filter(function filterArts(article) {
|
|
163
|
+
return terms.every(function testRE(term) {
|
|
164
|
+
return term.test(article.title) || term.test(article.slug);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
}.bind(this));
|
|
170
|
+
};
|
|
171
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hexo-cli-extras",
|
|
3
|
+
"description": "Hexo plugin that adds an edit, rename, remove, isolate and integrate command for easier command line administration of your Hexo-powered website.",
|
|
4
|
+
"keywords": [
|
|
5
|
+
"hexo",
|
|
6
|
+
"plugin",
|
|
7
|
+
"cli",
|
|
8
|
+
"command line"
|
|
9
|
+
],
|
|
10
|
+
"version": "1.0.4",
|
|
11
|
+
"main": "index",
|
|
12
|
+
"author": "Gregory Scheerlinck <gregory.scheerlinck@gmail.com> (http://gregjs.com)",
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "https://github.com/greg-js/hexo-cli-extras.git"
|
|
16
|
+
},
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"scripts": {
|
|
19
|
+
"lint": "eslint index.js lib/*.js"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"bluebird": "^3.0.5",
|
|
23
|
+
"chalk": "^2.4.2",
|
|
24
|
+
"hexo-util": "^0.6.3",
|
|
25
|
+
"inquirer": "^6.2.2",
|
|
26
|
+
"moment": "^2.10.6",
|
|
27
|
+
"opn": "^5.4.0",
|
|
28
|
+
"rimraf": "^2.4.3",
|
|
29
|
+
"minimist": "^1.2.5"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"eslint": "^2.11.0"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
name: Linter
|
|
2
|
+
|
|
3
|
+
on: [push, pull_request]
|
|
4
|
+
|
|
5
|
+
jobs:
|
|
6
|
+
linter:
|
|
7
|
+
runs-on: ubuntu-latest
|
|
8
|
+
steps:
|
|
9
|
+
- uses: actions/checkout@v1
|
|
10
|
+
- name: Use Node.js 12.x
|
|
11
|
+
uses: actions/setup-node@v2
|
|
12
|
+
with:
|
|
13
|
+
node-version: '12.x'
|
|
14
|
+
- name: Cache NPM dependencies
|
|
15
|
+
uses: actions/cache@v1
|
|
16
|
+
with:
|
|
17
|
+
path: node_modules
|
|
18
|
+
key: ${{ runner.OS }}-npm-cache
|
|
19
|
+
restore-keys: |
|
|
20
|
+
${{ runner.OS }}-npm-cache
|
|
21
|
+
- name: Install Dependencies
|
|
22
|
+
run: npm install
|
|
23
|
+
- name: Lint
|
|
24
|
+
run: |
|
|
25
|
+
npm run eslint
|
|
26
|
+
env:
|
|
27
|
+
CI: true
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: Tester
|
|
2
|
+
|
|
3
|
+
on: [push, pull_request]
|
|
4
|
+
|
|
5
|
+
jobs:
|
|
6
|
+
tester:
|
|
7
|
+
runs-on: ${{ matrix.os }}
|
|
8
|
+
strategy:
|
|
9
|
+
matrix:
|
|
10
|
+
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
11
|
+
node-version: ['10.x', '12.x', '14.x']
|
|
12
|
+
fail-fast: false
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v2
|
|
15
|
+
- name: Use Node.js ${{ matrix.node-version }}
|
|
16
|
+
uses: actions/setup-node@v2
|
|
17
|
+
with:
|
|
18
|
+
node-version: ${{ matrix.node-version }}
|
|
19
|
+
- name: Install Dependencies
|
|
20
|
+
run: npm install
|
|
21
|
+
- name: Test
|
|
22
|
+
run: npm run test
|
|
23
|
+
env:
|
|
24
|
+
CI: true
|