sbg-api
Version:
Pre-processing all source posts before rendering from hexo. Useful for low-end devices to prevent using large number of hexo plugins.
291 lines • 14.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.processSinglePost = exports.pipeProcessPost = exports.copyAllPosts = exports.copySinglePost = void 0;
var tslib_1 = require("tslib");
var ansi_colors_1 = tslib_1.__importDefault(require("ansi-colors"));
var fs_1 = tslib_1.__importDefault(require("fs"));
var gulp_1 = tslib_1.__importDefault(require("gulp"));
var hexoPostParser = tslib_1.__importStar(require("hexo-post-parser"));
var moment_timezone_1 = tslib_1.__importDefault(require("moment-timezone"));
var sbg_utility_1 = require("sbg-utility");
var through2_1 = tslib_1.__importDefault(require("through2"));
var upath_1 = require("upath");
var permalink_1 = require("./permalink");
/**
* log debug
*
* @example
* cross-env-shell DEBUG=* "your commands"
*/
var log = (0, sbg_utility_1.debug)('post');
var logErr = log.extend('error');
var logLabel = log.extend('label');
/**
* Copy single post from src-posts folder to source/_posts
* @param identifier
* @param callback
*/
function copySinglePost(identifier, callback) {
identifier = identifier.replace((0, upath_1.extname)(identifier), '');
var config = (0, sbg_utility_1.getConfig)();
var sourcePostDir = (0, upath_1.join)(config.cwd, config.post_dir);
var generatedPostDir = (0, upath_1.join)(config.cwd, config.source_dir, '_posts');
///const fileList = [];
gulp_1.default
.src(['**/*' + identifier + '*/*', '**/*' + identifier + '*'], {
cwd: sourcePostDir
})
.pipe(gulp_1.default.dest(generatedPostDir))
.on('end', function () {
//Logger.log(fileList);
if (typeof callback === 'function')
callback();
});
}
exports.copySinglePost = copySinglePost;
/**
* copy all posts from src-posts to source/_posts
* @returns
*/
function copyAllPosts(_callback, config) {
if (!config)
config = (0, sbg_utility_1.getConfig)();
var excludes = config.exclude || [];
var sourcePostDir = (0, upath_1.join)(config.cwd, config.post_dir);
var generatedPostDir = (0, upath_1.join)(config.cwd, config.source_dir, '_posts');
// console.log(excludes, sourcePostDir);
return (gulp_1.default
.src(['**/*.*', '*.*', '**/*'], {
cwd: sourcePostDir,
ignore: excludes,
dot: true,
noext: true
})
//.pipe(gulpLog('before'))
.pipe((0, sbg_utility_1.gulpCached)({ name: 'post-copy' }))
.pipe(pipeProcessPost(config))
.pipe(gulp_1.default.dest(generatedPostDir)));
}
exports.copyAllPosts = copyAllPosts;
/**
* pipeable function to process post
* @param config
* @returns
*/
function pipeProcessPost(config) {
var logname = 'post:' + ansi_colors_1.default.blueBright('processing');
if (config.generator.verbose) {
sbg_utility_1.Logger.log(logname, 'cache=' + (config.generator.cache ? ansi_colors_1.default.green('true') : ansi_colors_1.default.red('false')));
}
return through2_1.default.obj(function (file, _enc, callback) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var compile;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (file.isDirectory()) {
return [2 /*return*/, callback()];
}
if (file.isNull()) {
logErr(file.path + ' is null');
return [2 /*return*/, callback()];
}
if (file.isStream()) {
logErr(file.path + ' is stream');
return [2 /*return*/, callback()];
}
if (!config) return [3 /*break*/, 4];
if (!(file.extname === '.md')) return [3 /*break*/, 2];
return [4 /*yield*/, processSinglePost(file.path)];
case 1:
compile = _a.sent();
if (typeof compile === 'string') {
file.contents = Buffer.from(compile);
this.push(file);
callback();
}
else {
callback();
}
return [3 /*break*/, 3];
case 2:
this.push(file);
callback();
_a.label = 3;
case 3: return [3 /*break*/, 5];
case 4:
sbg_utility_1.Logger.log('options not configured');
callback();
_a.label = 5;
case 5: return [2 /*return*/];
}
});
});
}
/*function (cb) {
this.emit('end', 2);
cb();
}*/
);
}
exports.pipeProcessPost = pipeProcessPost;
/**
* process single markdown post
* @param file file path
* @param callback
* @returns
*/
function processSinglePost(file, callback) {
var _a, _b, _c, _d, _e;
return tslib_1.__awaiter(this, void 0, void 0, function () {
var contents, config, dfile, parse, createdDate, today, diff, array, i, groupLabel, _loop_1, oldLabel, _loop_2, oldLabel, build, e_1;
return tslib_1.__generator(this, function (_f) {
switch (_f.label) {
case 0:
contents = fs_1.default.readFileSync(file, 'utf-8');
config = (0, sbg_utility_1.getConfig)();
dfile = ansi_colors_1.default.yellowBright((0, upath_1.toUnix)(file.replace(config.cwd, '')));
log('processing', dfile);
// drop empty body
if (contents.trim().length === 0) {
logErr('content empty', dfile);
return [2 /*return*/];
}
_f.label = 1;
case 1:
_f.trys.push([1, 3, , 4]);
return [4 /*yield*/, hexoPostParser
.parsePost(fs_1.default.readFileSync(file, 'utf-8'), {
shortcodes: {
youtube: true,
css: true,
include: true,
link: true,
now: true,
script: true,
text: true,
codeblock: true
},
cache: false,
//config: <any>getConfig(),
formatDate: true,
fix: true,
sourceFile: file
})
.catch(function (e) { return sbg_utility_1.Logger.log(e); })];
case 2:
parse = _f.sent();
if (parse && parse.metadata) {
if (parse.metadata.date) {
createdDate = (0, moment_timezone_1.default)(String(parse.metadata.date));
today = (0, moment_timezone_1.default)(new Date());
diff = today.diff(createdDate);
// log('today=' + today.format(), 'created=' + createdDate.format(), 'isGreater=' + String(diff));
// if creation date greater than now
// if (moment(new Date()).isAfter(createdDate)) {
if (diff < 0) {
log('skip scheduled post ' + dfile);
// otherwise return null
return [2 /*return*/];
}
}
// fix permalink
log.extend('permalink').extend('pattern')(config.permalink);
//parse.metadata.permalink = hexoPostParser.parsePermalink(parse);
if (!parse.metadata.permalink) {
parse.metadata.permalink = (0, permalink_1.parsePermalink)(file, {
title: parse.metadata.title,
date: String(parse.metadata.date || new Date()),
permalink_pattern: (0, sbg_utility_1.getConfig)().permalink
});
}
if ((_a = parse.metadata.permalink) === null || _a === void 0 ? void 0 : _a.startsWith('/')) {
parse.metadata.permalink = parse.metadata.permalink.replace(/^\//, '');
}
log.extend('permalink')(parse.metadata.permalink);
// fix uuid and id
if (parse.metadata.uuid) {
if (!parse.metadata.id)
parse.metadata.id = parse.metadata.uuid;
delete parse.metadata.uuid;
}
array = ['tags', 'categories'];
for (i = 0; i < array.length; i++) {
groupLabel = array[i];
if (parse.metadata[groupLabel]) {
// label assign
if ((_b = config[groupLabel]) === null || _b === void 0 ? void 0 : _b.assign) {
_loop_1 = function (oldLabel) {
var index = parse.metadata[groupLabel].findIndex(function (str) { return str == oldLabel; });
if (index !== -1) {
logLabel(groupLabel, parse.metadata[groupLabel], ansi_colors_1.default.yellowBright('+'), config[groupLabel].assign[oldLabel]);
parse.metadata[groupLabel] = parse.metadata[groupLabel].concat(config[groupLabel].assign[oldLabel]);
logLabel.extend('result')(groupLabel, parse.metadata[groupLabel]);
}
};
for (oldLabel in config[groupLabel].assign) {
_loop_1(oldLabel);
}
}
// label mapper
if ((_c = config[groupLabel]) === null || _c === void 0 ? void 0 : _c.mapper) {
_loop_2 = function (oldLabel) {
var index = parse.metadata[groupLabel].findIndex(function (str) { return str === oldLabel; });
if (index !== -1) {
parse.metadata[groupLabel][index] = config[groupLabel].mapper[oldLabel];
if (config.generator.verbose) {
sbg_utility_1.Logger.log(ansi_colors_1.default.redBright(parse.metadata[groupLabel][index]), '~>', ansi_colors_1.default.greenBright(config[groupLabel].mapper[oldLabel]));
}
}
};
for (oldLabel in config[groupLabel].mapper) {
_loop_2(oldLabel);
}
}
// label lowercase
if ((_d = config.tags) === null || _d === void 0 ? void 0 : _d.lowercase) {
parse.metadata[groupLabel] =
((_e = parse.metadata[groupLabel]) === null || _e === void 0 ? void 0 : _e.map(function (str) {
if (typeof str === 'string')
return str.toLowerCase();
if (Array.isArray(str)) {
return str.map(function (s) {
if (typeof s === 'string')
return s.toLowerCase();
return s;
});
}
return str;
})) || [];
log.extend('label').extend('lowercase')(groupLabel, parse.metadata[groupLabel]);
}
}
else if (config.generator.verbose) {
sbg_utility_1.Logger.log(groupLabel, 'not found');
}
// Logger.log(groupLabel + '-' + ansiColors.greenBright('assign'), parse.metadata[groupLabel]);
}
if (typeof callback === 'function') {
callback(parse);
}
build = hexoPostParser.buildPost(parse);
if (typeof build === 'string') {
return [2 /*return*/, build];
}
}
else {
logErr(String(parse), file);
}
return [3 /*break*/, 4];
case 3:
e_1 = _f.sent();
sbg_utility_1.Logger.log(e_1);
return [3 /*break*/, 4];
case 4: return [2 /*return*/];
}
});
});
}
exports.processSinglePost = processSinglePost;
gulp_1.default.task('post:copy', copyAllPosts);
//# sourceMappingURL=copy.js.map