UNPKG

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
"use strict"; 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