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.
Files changed (99) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +20 -6
  3. package/lib/index.js +8 -1
  4. package/lib/source/adblock.css +2 -83
  5. package/lib/source/adblock.js +1 -31
  6. package/lib/source/article-ads.css +2 -11
  7. package/lib/source/article-ads.js +1 -270
  8. package/lib/source/blogger-redirect.html +1 -14
  9. package/lib/source/https.js +1 -4
  10. package/lib/src/article-ads.d.ts +1 -1
  11. package/lib/src/article-ads.js +6 -6
  12. package/lib/src/config.d.ts +12 -19
  13. package/lib/src/config.js +3 -5
  14. package/lib/src/utils.d.ts +9 -1
  15. package/lib/src/utils.js +2 -2
  16. package/package.json +20 -5
  17. package/packages/hexo-cli-extras/.eslintrc +13 -0
  18. package/packages/hexo-cli-extras/LICENSE.md +20 -0
  19. package/packages/hexo-cli-extras/README.md +146 -0
  20. package/packages/hexo-cli-extras/docs/basic.gif +0 -0
  21. package/packages/hexo-cli-extras/docs/gui.gif +0 -0
  22. package/packages/hexo-cli-extras/docs/remove.png +0 -0
  23. package/packages/hexo-cli-extras/docs/rename.png +0 -0
  24. package/packages/hexo-cli-extras/index.js +48 -0
  25. package/packages/hexo-cli-extras/lib/edit.js +209 -0
  26. package/packages/hexo-cli-extras/lib/env.js +52 -0
  27. package/packages/hexo-cli-extras/lib/extensions.js +23 -0
  28. package/packages/hexo-cli-extras/lib/integrate.js +87 -0
  29. package/packages/hexo-cli-extras/lib/isolate.js +179 -0
  30. package/packages/hexo-cli-extras/lib/remove.js +145 -0
  31. package/packages/hexo-cli-extras/lib/rename.js +171 -0
  32. package/packages/hexo-cli-extras/package.json +34 -0
  33. package/packages/hexo-extend-injector2/.eslintrc +4 -0
  34. package/packages/hexo-extend-injector2/.github/workflows/linter.yml +27 -0
  35. package/packages/hexo-extend-injector2/.github/workflows/tester.yml +24 -0
  36. package/packages/hexo-extend-injector2/.vscode/settings.json +10 -0
  37. package/packages/hexo-extend-injector2/LICENSE +165 -0
  38. package/packages/hexo-extend-injector2/README-ZH.md +189 -0
  39. package/packages/hexo-extend-injector2/README.md +191 -0
  40. package/packages/hexo-extend-injector2/USAGE.md +38 -0
  41. package/packages/hexo-extend-injector2/index.js +13 -0
  42. package/packages/hexo-extend-injector2/lib/bundle/css-bundle.js +79 -0
  43. package/packages/hexo-extend-injector2/lib/bundle/css-generator.js +13 -0
  44. package/packages/hexo-extend-injector2/lib/bundle/handle-data-pre.js +29 -0
  45. package/packages/hexo-extend-injector2/lib/bundle/js-bundle.js +42 -0
  46. package/packages/hexo-extend-injector2/lib/bundle/js-generator.js +10 -0
  47. package/packages/hexo-extend-injector2/lib/default-config.js +52 -0
  48. package/packages/hexo-extend-injector2/lib/filter.js +24 -0
  49. package/packages/hexo-extend-injector2/lib/helper/injector.js +6 -0
  50. package/packages/hexo-extend-injector2/lib/helper/next-inject.js +14 -0
  51. package/packages/hexo-extend-injector2/lib/injector.js +128 -0
  52. package/packages/hexo-extend-injector2/lib/load.js +45 -0
  53. package/packages/hexo-extend-injector2/lib/next-point.js +19 -0
  54. package/packages/hexo-extend-injector2/lib/next.js +87 -0
  55. package/packages/hexo-extend-injector2/lib/order.js +9 -0
  56. package/packages/hexo-extend-injector2/package.json +49 -0
  57. package/packages/hexo-extend-injector2/renovate.json +6 -0
  58. package/packages/hexo-extend-injector2/test/.eslintrc +3 -0
  59. package/packages/hexo-extend-injector2/test/index.js +18 -0
  60. package/packages/hexo-extend-injector2/test/lib/bundle/bundle-css.js +86 -0
  61. package/packages/hexo-extend-injector2/test/lib/bundle/bundle-js.js +36 -0
  62. package/packages/hexo-extend-injector2/test/lib/bundle/test.css +3 -0
  63. package/packages/hexo-extend-injector2/test/lib/bundle/test.js +5 -0
  64. package/packages/hexo-extend-injector2/test/lib/helper/injector.js +45 -0
  65. package/packages/hexo-extend-injector2/test/lib/helper/next-inject.js +69 -0
  66. package/packages/hexo-extend-injector2/test/lib/hexo-compatible.js +250 -0
  67. package/packages/hexo-extend-injector2/test/lib/hexo-injector.js +37 -0
  68. package/packages/hexo-extend-injector2/test/lib/injector.js +93 -0
  69. package/packages/memoize/CHANGELOG.md +82 -0
  70. package/packages/memoize/CHANGES +124 -0
  71. package/packages/memoize/LICENSE +15 -0
  72. package/packages/memoize/README.md +503 -0
  73. package/packages/memoize/ext/async.js +154 -0
  74. package/packages/memoize/ext/dispose.js +33 -0
  75. package/packages/memoize/ext/max-age.js +90 -0
  76. package/packages/memoize/ext/max.js +27 -0
  77. package/packages/memoize/ext/promise.js +147 -0
  78. package/packages/memoize/ext/ref-counter.js +48 -0
  79. package/packages/memoize/index.js +34 -0
  80. package/packages/memoize/lib/configure-map.js +182 -0
  81. package/packages/memoize/lib/methods.js +32 -0
  82. package/packages/memoize/lib/registered-extensions.js +1 -0
  83. package/packages/memoize/lib/resolve-length.js +15 -0
  84. package/packages/memoize/lib/resolve-normalize.js +17 -0
  85. package/packages/memoize/lib/resolve-resolve.js +21 -0
  86. package/packages/memoize/lib/weak.js +134 -0
  87. package/packages/memoize/methods-plain.js +3 -0
  88. package/packages/memoize/methods.js +3 -0
  89. package/packages/memoize/normalizers/get-1.js +29 -0
  90. package/packages/memoize/normalizers/get-fixed.js +71 -0
  91. package/packages/memoize/normalizers/get-primitive-fixed.js +16 -0
  92. package/packages/memoize/normalizers/get.js +90 -0
  93. package/packages/memoize/normalizers/primitive.js +9 -0
  94. package/packages/memoize/package.json +60 -0
  95. package/packages/memoize/plain.js +37 -0
  96. package/packages/memoize/profile.js +107 -0
  97. package/packages/memoize/repository.md +1 -0
  98. package/packages/memoize/weak-plain.js +3 -0
  99. 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,4 @@
1
+ {
2
+ "extends": "hexo",
3
+ "root": true
4
+ }
@@ -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
@@ -0,0 +1,10 @@
1
+ {
2
+ "eslint.options": {
3
+ "rules": {
4
+ "linebreak-style": "off"
5
+ }
6
+ },
7
+ "editor.codeActionsOnSave": {
8
+ "source.fixAll.eslint": true
9
+ }
10
+ }