harshadyeola
9 years ago
4 changed files with 187 additions and 90 deletions
@ -0,0 +1,161 @@ |
|||
<?php |
|||
|
|||
use \EE_CLI\Utils; |
|||
use \EE_CLI\Dispatcher; |
|||
|
|||
class Help_Command extends EE_CLI_Command { |
|||
|
|||
/** |
|||
* Get help on WP-CLI, or on a specific. command. |
|||
* |
|||
* [<command>...] |
|||
* : Get help on a specific command. |
|||
* |
|||
* ## EXAMPLES |
|||
* |
|||
* # get help for `core` command |
|||
* wp help core |
|||
* |
|||
* # get help for `core download` subcommand |
|||
* wp help core download |
|||
*/ |
|||
function __invoke( $args, $assoc_args ) { |
|||
$command = self::find_subcommand( $args ); |
|||
|
|||
if ( $command ) { |
|||
|
|||
// if ( EE_CLI::get_runner()->is_command_disabled( $command ) ) { |
|||
// $path = implode( ' ', array_slice( \EE_CLI\Dispatcher\get_path( $command ), 1 ) ); |
|||
// EE_CLI::error( sprintf( |
|||
// "The '%s' command has been disabled from the config file.", |
|||
// $path |
|||
// ) ); |
|||
// } |
|||
|
|||
self::show_help( $command ); |
|||
exit; |
|||
} |
|||
|
|||
// WordPress is already loaded, so there's no chance we'll find the command |
|||
if ( function_exists( 'add_filter' ) ) { |
|||
$command_string = implode( ' ', $args ); |
|||
\EE_CLI::error( sprintf( "'%s' is not a registered wp command.", $command_string ) ); |
|||
} |
|||
} |
|||
|
|||
private static function find_subcommand( $args ) { |
|||
$command = \EE_CLI::get_root_command(); |
|||
|
|||
while ( !empty( $args ) && $command && $command->can_have_subcommands() ) { |
|||
$command = $command->find_subcommand( $args ); |
|||
} |
|||
|
|||
return $command; |
|||
} |
|||
|
|||
private static function show_help( $command ) { |
|||
$out = self::get_initial_markdown( $command ); |
|||
|
|||
$longdesc = $command->get_longdesc(); |
|||
if ( $longdesc ) { |
|||
$out .= wordwrap( $longdesc, 90 ) . "\n"; |
|||
} |
|||
|
|||
// definition lists |
|||
$out = preg_replace_callback( '/([^\n]+)\n: (.+?)(\n\n|$)/s', array( __CLASS__, 'rewrap_param_desc' ), $out ); |
|||
|
|||
// Ensure all non-section headers are indented |
|||
$out = preg_replace( '#^([^\s^\#])#m', "\t$1", $out ); |
|||
|
|||
// section headers |
|||
$out = preg_replace( '/^## ([A-Z ]+)/m', EE_CLI::colorize( '%9\1%n' ), $out ); |
|||
|
|||
$out = str_replace( "\t", ' ', $out ); |
|||
|
|||
self::pass_through_pager( $out ); |
|||
} |
|||
|
|||
private static function rewrap_param_desc( $matches ) { |
|||
$param = $matches[1]; |
|||
$desc = self::indent( "\t\t", wordwrap( $matches[2] ) ); |
|||
return "\t$param\n$desc\n\n"; |
|||
} |
|||
|
|||
private static function indent( $whitespace, $text ) { |
|||
$lines = explode( "\n", $text ); |
|||
foreach ( $lines as &$line ) { |
|||
$line = $whitespace . $line; |
|||
} |
|||
return implode( $lines, "\n" ); |
|||
} |
|||
|
|||
private static function pass_through_pager( $out ) { |
|||
|
|||
$pager = Utils\is_windows() ? 'more' : 'less -r'; |
|||
|
|||
// convert string to file handle |
|||
$fd = fopen( "php://temp", "r+" ); |
|||
fputs( $fd, $out ); |
|||
rewind( $fd ); |
|||
|
|||
$descriptorspec = array( |
|||
0 => $fd, |
|||
1 => STDOUT, |
|||
2 => STDERR |
|||
); |
|||
|
|||
return proc_close( proc_open( $pager, $descriptorspec, $pipes ) ); |
|||
} |
|||
|
|||
private static function get_initial_markdown( $command ) { |
|||
$name = implode( ' ', Dispatcher\get_path( $command ) ); |
|||
|
|||
$binding = array( |
|||
'name' => $name, |
|||
'shortdesc' => $command->get_shortdesc(), |
|||
); |
|||
|
|||
$binding['synopsis'] = wordwrap( "$name " . $command->get_synopsis(), 79 ); |
|||
|
|||
if ( $command->can_have_subcommands() ) { |
|||
$binding['has-subcommands']['subcommands'] = self::render_subcommands( $command ); |
|||
} |
|||
|
|||
return Utils\mustache_render( 'man.mustache', $binding ); |
|||
} |
|||
|
|||
private static function render_subcommands( $command ) { |
|||
$subcommands = array(); |
|||
foreach ( $command->get_subcommands() as $subcommand ) { |
|||
|
|||
// if ( EE_CLI::get_runner()->is_command_disabled( $subcommand ) ) { |
|||
// continue; |
|||
// } |
|||
|
|||
$subcommands[ $subcommand->get_name() ] = $subcommand->get_shortdesc(); |
|||
} |
|||
|
|||
$max_len = self::get_max_len( array_keys( $subcommands ) ); |
|||
|
|||
$lines = array(); |
|||
foreach ( $subcommands as $name => $desc ) { |
|||
$lines[] = str_pad( $name, $max_len ) . "\t\t\t" . $desc; |
|||
} |
|||
|
|||
return $lines; |
|||
} |
|||
|
|||
private static function get_max_len( $strings ) { |
|||
$max_len = 0; |
|||
foreach ( $strings as $str ) { |
|||
$len = strlen( $str ); |
|||
if ( $len > $max_len ) |
|||
$max_len = $len; |
|||
} |
|||
|
|||
return $max_len; |
|||
} |
|||
|
|||
} |
|||
|
|||
EE_CLI::add_command( 'help', 'Help_Command' ); |
@ -0,0 +1,20 @@ |
|||
## NAME |
|||
|
|||
{{name}} |
|||
|
|||
## DESCRIPTION |
|||
|
|||
{{shortdesc}} |
|||
|
|||
## SYNOPSIS |
|||
|
|||
{{synopsis}} |
|||
|
|||
{{#has-subcommands}} |
|||
## SUBCOMMANDS |
|||
|
|||
{{#subcommands}} |
|||
{{.}} |
|||
{{/subcommands}} |
|||
|
|||
{{/has-subcommands}} |
Loading…
Reference in new issue