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;
 | 
						|
    }
 | 
						|
 | 
						|
    // }}}
 | 
						|
}
 |