hexo/node_modules/hexo-cli/lib/console/help.js

119 lines
3.2 KiB
JavaScript

'use strict';
const chalk = require('chalk');
const { readFile } = require('hexo-fs');
const { join } = require('path');
const Promise = require('bluebird');
const COMPLETION_DIR = join(__dirname, '../../completion');
function helpConsole(args) {
if (args.v || args.version) {
return this.call('version');
} else if (args.consoleList) {
return printConsoleList(this.extend.console.list());
} else if (typeof args.completion === 'string') {
return printCompletion(args.completion);
}
const command = args._[0];
if (typeof command === 'string' && command !== 'help') {
const c = this.extend.console.get(command);
if (c) return printHelpForCommand(this.extend.console.alias[command], c);
}
return printAllHelp(this.extend.console.list());
}
function printHelpForCommand(command, data) {
const { options } = data;
const desc = options.description || options.desc || data.description || data.desc;
console.log('Usage: hexo', command, options.usage || '');
console.log('\nDescription:');
console.log(`${desc}\n`);
if (options.arguments) printList('Arguments', options.arguments);
if (options.commands) printList('Commands', options.commands);
if (options.options) printList('Options', options.options);
return Promise.resolve();
}
function printAllHelp(list) {
const keys = Object.keys(list);
const commands = [];
const { length } = keys;
for (let i = 0; i < length; i++) {
const key = keys[i];
commands.push({
name: key,
desc: list[key].desc
});
}
console.log('Usage: hexo <command>\n');
printList('Commands', commands);
printList('Global Options', [
{name: '--config', desc: 'Specify config file instead of using _config.yml'},
{name: '--cwd', desc: 'Specify the CWD'},
{name: '--debug', desc: 'Display all verbose messages in the terminal'},
{name: '--draft', desc: 'Display draft posts'},
{name: '--safe', desc: 'Disable all plugins and scripts'},
{name: '--silent', desc: 'Hide output on console'}
]);
console.log('For more help, you can use \'hexo help [command]\' for the detailed information');
console.log('or you can check the docs:', chalk.underline('http://hexo.io/docs/'));
return Promise.resolve();
}
function printList(title, list) {
list.sort((a, b) => {
const nameA = a.name;
const nameB = b.name;
if (nameA < nameB) return -1;
if (nameA > nameB) return 1;
return 0;
});
const lengths = list.map(item => item.name.length);
const maxLen = lengths.reduce((prev, current) => Math.max(prev, current));
let str = `${title}:\n`;
const { length } = list;
for (let i = 0; i < length; i++) {
const { description = list[i].desc } = list[i];
const pad = ' '.repeat(maxLen - lengths[i] + 2);
str += ` ${chalk.bold(list[i].name)}${pad}${description}\n`;
}
console.log(str);
return Promise.resolve();
}
function printConsoleList(list) {
console.log(Object.keys(list).join('\n'));
return Promise.resolve();
}
function printCompletion(type) {
return readFile(join(COMPLETION_DIR, type)).then(content => {
console.log(content);
});
}
module.exports = helpConsole;