425 lines
12 KiB
PHP
425 lines
12 KiB
PHP
<?php
|
|
|
|
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
|
|
|
/**
|
|
* This file is part of the PEAR Console_CommandLine package.
|
|
*
|
|
* PHP version 5
|
|
*
|
|
* LICENSE: This source file is subject to the MIT license that is available
|
|
* through the world-wide-web at the following URI:
|
|
* http://opensource.org/licenses/mit-license.php
|
|
*
|
|
* @category Console
|
|
* @package Console_CommandLine
|
|
* @author David JEAN LOUIS <izimobil@gmail.com>
|
|
* @copyright 2007 David JEAN LOUIS
|
|
* @license http://opensource.org/licenses/mit-license.php MIT License
|
|
* @version CVS: $Id$
|
|
* @link http://pear.php.net/package/Console_CommandLine
|
|
* @since File available since release 0.1.0
|
|
* @filesource
|
|
*/
|
|
|
|
/**
|
|
* The renderer interface.
|
|
*/
|
|
require_once 'Console/CommandLine/Renderer.php';
|
|
|
|
/**
|
|
* Console_CommandLine default renderer.
|
|
*
|
|
* @category Console
|
|
* @package Console_CommandLine
|
|
* @author David JEAN LOUIS <izimobil@gmail.com>
|
|
* @copyright 2007 David JEAN LOUIS
|
|
* @license http://opensource.org/licenses/mit-license.php MIT License
|
|
* @version Release: 1.2.0
|
|
* @link http://pear.php.net/package/Console_CommandLine
|
|
* @since Class available since release 0.1.0
|
|
*/
|
|
class Console_CommandLine_Renderer_Default implements Console_CommandLine_Renderer
|
|
{
|
|
// Properties {{{
|
|
|
|
/**
|
|
* Integer that define the max width of the help text.
|
|
*
|
|
* @var integer $line_width Line width
|
|
*/
|
|
public $line_width = 75;
|
|
|
|
/**
|
|
* Integer that define the max width of the help text.
|
|
*
|
|
* @var integer $line_width Line width
|
|
*/
|
|
public $options_on_different_lines = false;
|
|
|
|
/**
|
|
* An instance of Console_CommandLine.
|
|
*
|
|
* @var Console_CommandLine $parser The parser
|
|
*/
|
|
public $parser = false;
|
|
|
|
// }}}
|
|
// __construct() {{{
|
|
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @param object $parser A Console_CommandLine instance
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __construct($parser = false)
|
|
{
|
|
$this->parser = $parser;
|
|
}
|
|
|
|
// }}}
|
|
// usage() {{{
|
|
|
|
/**
|
|
* Returns the full usage message.
|
|
*
|
|
* @return string The usage message
|
|
*/
|
|
public function usage()
|
|
{
|
|
$ret = '';
|
|
if (!empty($this->parser->description)) {
|
|
$ret .= $this->description() . "\n\n";
|
|
}
|
|
$ret .= $this->usageLine() . "\n";
|
|
if (count($this->parser->commands) > 0) {
|
|
$ret .= $this->commandUsageLine() . "\n";
|
|
}
|
|
if (count($this->parser->options) > 0) {
|
|
$ret .= "\n" . $this->optionList() . "\n";
|
|
}
|
|
if (count($this->parser->args) > 0) {
|
|
$ret .= "\n" . $this->argumentList() . "\n";
|
|
}
|
|
if (count($this->parser->commands) > 0) {
|
|
$ret .= "\n" . $this->commandList() . "\n";
|
|
}
|
|
$ret .= "\n";
|
|
return $ret;
|
|
}
|
|
// }}}
|
|
// error() {{{
|
|
|
|
/**
|
|
* Returns a formatted error message.
|
|
*
|
|
* @param string $error The error message to format
|
|
*
|
|
* @return string The error string
|
|
*/
|
|
public function error($error)
|
|
{
|
|
$ret = 'Error: ' . $error . "\n";
|
|
if ($this->parser->add_help_option) {
|
|
$name = $this->name();
|
|
$ret .= $this->wrap($this->parser->message_provider->get('PROG_HELP_LINE',
|
|
array('progname' => $name))) . "\n";
|
|
if (count($this->parser->commands) > 0) {
|
|
$ret .= $this->wrap($this->parser->message_provider->get('COMMAND_HELP_LINE',
|
|
array('progname' => $name))) . "\n";
|
|
}
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
// }}}
|
|
// version() {{{
|
|
|
|
/**
|
|
* Returns the program version string.
|
|
*
|
|
* @return string The version string
|
|
*/
|
|
public function version()
|
|
{
|
|
return $this->parser->message_provider->get('PROG_VERSION_LINE', array(
|
|
'progname' => $this->name(),
|
|
'version' => $this->parser->version
|
|
)) . "\n";
|
|
}
|
|
|
|
// }}}
|
|
// name() {{{
|
|
|
|
/**
|
|
* Returns the full name of the program or the sub command
|
|
*
|
|
* @return string The name of the program
|
|
*/
|
|
protected function name()
|
|
{
|
|
$name = $this->parser->name;
|
|
$parent = $this->parser->parent;
|
|
while ($parent) {
|
|
if (count($parent->options) > 0) {
|
|
$name = '['
|
|
. strtolower($this->parser->message_provider->get('OPTION_WORD',
|
|
array('plural' => 's')))
|
|
. '] ' . $name;
|
|
}
|
|
$name = $parent->name . ' ' . $name;
|
|
$parent = $parent->parent;
|
|
}
|
|
return $this->wrap($name);
|
|
}
|
|
|
|
// }}}
|
|
// description() {{{
|
|
|
|
/**
|
|
* Returns the command line description message.
|
|
*
|
|
* @return string The description message
|
|
*/
|
|
protected function description()
|
|
{
|
|
return $this->wrap($this->parser->description);
|
|
}
|
|
|
|
// }}}
|
|
// usageLine() {{{
|
|
|
|
/**
|
|
* Returns the command line usage message
|
|
*
|
|
* @return string the usage message
|
|
*/
|
|
protected function usageLine()
|
|
{
|
|
$usage = $this->parser->message_provider->get('USAGE_WORD') . ":\n";
|
|
$ret = $usage . ' ' . $this->name();
|
|
if (count($this->parser->options) > 0) {
|
|
$ret .= ' ['
|
|
. strtolower($this->parser->message_provider->get('OPTION_WORD'))
|
|
. ']';
|
|
}
|
|
if (count($this->parser->args) > 0) {
|
|
foreach ($this->parser->args as $name=>$arg) {
|
|
$arg_str = $arg->help_name;
|
|
if ($arg->multiple) {
|
|
$arg_str .= '1 ' . $arg->help_name . '2 ...';
|
|
}
|
|
if ($arg->optional) {
|
|
$arg_str = '[' . $arg_str . ']';
|
|
}
|
|
$ret .= ' ' . $arg_str;
|
|
}
|
|
}
|
|
return $this->columnWrap($ret, 2);
|
|
}
|
|
|
|
// }}}
|
|
// commandUsageLine() {{{
|
|
|
|
/**
|
|
* Returns the command line usage message for subcommands.
|
|
*
|
|
* @return string The usage line
|
|
*/
|
|
protected function commandUsageLine()
|
|
{
|
|
if (count($this->parser->commands) == 0) {
|
|
return '';
|
|
}
|
|
$ret = ' ' . $this->name();
|
|
if (count($this->parser->options) > 0) {
|
|
$ret .= ' ['
|
|
. strtolower($this->parser->message_provider->get('OPTION_WORD'))
|
|
. ']';
|
|
}
|
|
$ret .= " <command>";
|
|
$hasArgs = false;
|
|
$hasOptions = false;
|
|
foreach ($this->parser->commands as $command) {
|
|
if (!$hasArgs && count($command->args) > 0) {
|
|
$hasArgs = true;
|
|
}
|
|
if (!$hasOptions && ($command->add_help_option ||
|
|
$command->add_version_option || count($command->options) > 0)) {
|
|
$hasOptions = true;
|
|
}
|
|
}
|
|
if ($hasOptions) {
|
|
$ret .= ' [options]';
|
|
}
|
|
if ($hasArgs) {
|
|
$ret .= ' [args]';
|
|
}
|
|
return $this->columnWrap($ret, 2);
|
|
}
|
|
|
|
// }}}
|
|
// argumentList() {{{
|
|
|
|
/**
|
|
* Render the arguments list that will be displayed to the user, you can
|
|
* override this method if you want to change the look of the list.
|
|
*
|
|
* @return string The formatted argument list
|
|
*/
|
|
protected function argumentList()
|
|
{
|
|
$col = 0;
|
|
$args = array();
|
|
foreach ($this->parser->args as $arg) {
|
|
$argstr = ' ' . $arg->toString();
|
|
$args[] = array($argstr, $arg->description);
|
|
$ln = strlen($argstr);
|
|
if ($col < $ln) {
|
|
$col = $ln;
|
|
}
|
|
}
|
|
$ret = $this->parser->message_provider->get('ARGUMENT_WORD') . ":";
|
|
foreach ($args as $arg) {
|
|
$text = str_pad($arg[0], $col) . ' ' . $arg[1];
|
|
$ret .= "\n" . $this->columnWrap($text, $col+2);
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
// }}}
|
|
// optionList() {{{
|
|
|
|
/**
|
|
* Render the options list that will be displayed to the user, you can
|
|
* override this method if you want to change the look of the list.
|
|
*
|
|
* @return string The formatted option list
|
|
*/
|
|
protected function optionList()
|
|
{
|
|
$col = 0;
|
|
$options = array();
|
|
foreach ($this->parser->options as $option) {
|
|
$delim = $this->options_on_different_lines ? "\n" : ', ';
|
|
$optstr = $option->toString($delim);
|
|
$lines = explode("\n", $optstr);
|
|
$lines[0] = ' ' . $lines[0];
|
|
if (count($lines) > 1) {
|
|
$lines[1] = ' ' . $lines[1];
|
|
$ln = strlen($lines[1]);
|
|
} else {
|
|
$ln = strlen($lines[0]);
|
|
}
|
|
$options[] = array($lines, $option->description);
|
|
if ($col < $ln) {
|
|
$col = $ln;
|
|
}
|
|
}
|
|
$ret = $this->parser->message_provider->get('OPTION_WORD') . ":";
|
|
foreach ($options as $option) {
|
|
if (count($option[0]) > 1) {
|
|
$text = str_pad($option[0][1], $col) . ' ' . $option[1];
|
|
$pre = $option[0][0] . "\n";
|
|
} else {
|
|
$text = str_pad($option[0][0], $col) . ' ' . $option[1];
|
|
$pre = '';
|
|
}
|
|
$ret .= "\n" . $pre . $this->columnWrap($text, $col+2);
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
// }}}
|
|
// commandList() {{{
|
|
|
|
/**
|
|
* Render the command list that will be displayed to the user, you can
|
|
* override this method if you want to change the look of the list.
|
|
*
|
|
* @return string The formatted subcommand list
|
|
*/
|
|
protected function commandList()
|
|
{
|
|
|
|
$commands = array();
|
|
$col = 0;
|
|
foreach ($this->parser->commands as $cmdname=>$command) {
|
|
$cmdname = ' ' . $cmdname;
|
|
$commands[] = array($cmdname, $command->description, $command->aliases);
|
|
$ln = strlen($cmdname);
|
|
if ($col < $ln) {
|
|
$col = $ln;
|
|
}
|
|
}
|
|
$ret = $this->parser->message_provider->get('COMMAND_WORD') . ":";
|
|
foreach ($commands as $command) {
|
|
$text = str_pad($command[0], $col) . ' ' . $command[1];
|
|
if ($aliasesCount = count($command[2])) {
|
|
$pad = '';
|
|
$text .= ' (';
|
|
$text .= $aliasesCount > 1 ? 'aliases: ' : 'alias: ';
|
|
foreach ($command[2] as $alias) {
|
|
$text .= $pad . $alias;
|
|
$pad = ', ';
|
|
}
|
|
$text .= ')';
|
|
}
|
|
$ret .= "\n" . $this->columnWrap($text, $col+2);
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
// }}}
|
|
// wrap() {{{
|
|
|
|
/**
|
|
* Wraps the text passed to the method.
|
|
*
|
|
* @param string $text The text to wrap
|
|
* @param int $lw The column width (defaults to line_width property)
|
|
*
|
|
* @return string The wrapped text
|
|
*/
|
|
protected function wrap($text, $lw=null)
|
|
{
|
|
if ($this->line_width > 0) {
|
|
if ($lw === null) {
|
|
$lw = $this->line_width;
|
|
}
|
|
return wordwrap($text, $lw, "\n", false);
|
|
}
|
|
return $text;
|
|
}
|
|
|
|
// }}}
|
|
// columnWrap() {{{
|
|
|
|
/**
|
|
* Wraps the text passed to the method at the specified width.
|
|
*
|
|
* @param string $text The text to wrap
|
|
* @param int $cw The wrap width
|
|
*
|
|
* @return string The wrapped text
|
|
*/
|
|
protected function columnWrap($text, $cw)
|
|
{
|
|
$tokens = explode("\n", $this->wrap($text));
|
|
$ret = $tokens[0];
|
|
$chunks = $this->wrap(trim(substr($text, strlen($ret))),
|
|
$this->line_width - $cw);
|
|
$tokens = explode("\n", $chunks);
|
|
foreach ($tokens as $token) {
|
|
if (!empty($token)) {
|
|
$ret .= "\n" . str_repeat(' ', $cw) . $token;
|
|
}
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
// }}}
|
|
}
|