comparison vendor/pear/console_commandline/Console/CommandLine/Renderer/Default.php @ 0:1e000243b222

vanilla 1.3.3 distro, I hope
author Charlie Root
date Thu, 04 Jan 2018 15:50:29 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:1e000243b222
1 <?php
2
3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5 /**
6 * This file is part of the PEAR Console_CommandLine package.
7 *
8 * PHP version 5
9 *
10 * LICENSE: This source file is subject to the MIT license that is available
11 * through the world-wide-web at the following URI:
12 * http://opensource.org/licenses/mit-license.php
13 *
14 * @category Console
15 * @package Console_CommandLine
16 * @author David JEAN LOUIS <izimobil@gmail.com>
17 * @copyright 2007 David JEAN LOUIS
18 * @license http://opensource.org/licenses/mit-license.php MIT License
19 * @version CVS: $Id$
20 * @link http://pear.php.net/package/Console_CommandLine
21 * @since File available since release 0.1.0
22 * @filesource
23 */
24
25 /**
26 * The renderer interface.
27 */
28 require_once 'Console/CommandLine/Renderer.php';
29
30 /**
31 * Console_CommandLine default renderer.
32 *
33 * @category Console
34 * @package Console_CommandLine
35 * @author David JEAN LOUIS <izimobil@gmail.com>
36 * @copyright 2007 David JEAN LOUIS
37 * @license http://opensource.org/licenses/mit-license.php MIT License
38 * @version Release: @package_version@
39 * @link http://pear.php.net/package/Console_CommandLine
40 * @since Class available since release 0.1.0
41 */
42 class Console_CommandLine_Renderer_Default implements Console_CommandLine_Renderer
43 {
44 // Properties {{{
45
46 /**
47 * Integer that define the max width of the help text.
48 *
49 * @var integer $line_width Line width
50 */
51 public $line_width = 75;
52
53 /**
54 * Integer that define the max width of the help text.
55 *
56 * @var integer $line_width Line width
57 */
58 public $options_on_different_lines = false;
59
60 /**
61 * An instance of Console_CommandLine.
62 *
63 * @var Console_CommandLine $parser The parser
64 */
65 public $parser = false;
66
67 // }}}
68 // __construct() {{{
69
70 /**
71 * Constructor.
72 *
73 * @param object $parser A Console_CommandLine instance
74 *
75 * @return void
76 */
77 public function __construct($parser = false)
78 {
79 $this->parser = $parser;
80 }
81
82 // }}}
83 // usage() {{{
84
85 /**
86 * Returns the full usage message.
87 *
88 * @return string The usage message
89 */
90 public function usage()
91 {
92 $ret = '';
93 if (!empty($this->parser->description)) {
94 $ret .= $this->description() . "\n\n";
95 }
96 $ret .= $this->usageLine() . "\n";
97 if (count($this->parser->commands) > 0) {
98 $ret .= $this->commandUsageLine() . "\n";
99 }
100 if (count($this->parser->options) > 0) {
101 $ret .= "\n" . $this->optionList() . "\n";
102 }
103 if (count($this->parser->args) > 0) {
104 $ret .= "\n" . $this->argumentList() . "\n";
105 }
106 if (count($this->parser->commands) > 0) {
107 $ret .= "\n" . $this->commandList() . "\n";
108 }
109 $ret .= "\n";
110 return $ret;
111 }
112 // }}}
113 // error() {{{
114
115 /**
116 * Returns a formatted error message.
117 *
118 * @param string $error The error message to format
119 *
120 * @return string The error string
121 */
122 public function error($error)
123 {
124 $ret = 'Error: ' . $error . "\n";
125 if ($this->parser->add_help_option) {
126 $name = $this->name();
127 $ret .= $this->wrap($this->parser->message_provider->get('PROG_HELP_LINE',
128 array('progname' => $name))) . "\n";
129 if (count($this->parser->commands) > 0) {
130 $ret .= $this->wrap($this->parser->message_provider->get('COMMAND_HELP_LINE',
131 array('progname' => $name))) . "\n";
132 }
133 }
134 return $ret;
135 }
136
137 // }}}
138 // version() {{{
139
140 /**
141 * Returns the program version string.
142 *
143 * @return string The version string
144 */
145 public function version()
146 {
147 return $this->parser->message_provider->get('PROG_VERSION_LINE', array(
148 'progname' => $this->name(),
149 'version' => $this->parser->version
150 )) . "\n";
151 }
152
153 // }}}
154 // name() {{{
155
156 /**
157 * Returns the full name of the program or the sub command
158 *
159 * @return string The name of the program
160 */
161 protected function name()
162 {
163 $name = $this->parser->name;
164 $parent = $this->parser->parent;
165 while ($parent) {
166 if (count($parent->options) > 0) {
167 $name = '['
168 . strtolower($this->parser->message_provider->get('OPTION_WORD',
169 array('plural' => 's')))
170 . '] ' . $name;
171 }
172 $name = $parent->name . ' ' . $name;
173 $parent = $parent->parent;
174 }
175 return $this->wrap($name);
176 }
177
178 // }}}
179 // description() {{{
180
181 /**
182 * Returns the command line description message.
183 *
184 * @return string The description message
185 */
186 protected function description()
187 {
188 return $this->wrap($this->parser->description);
189 }
190
191 // }}}
192 // usageLine() {{{
193
194 /**
195 * Returns the command line usage message
196 *
197 * @return string the usage message
198 */
199 protected function usageLine()
200 {
201 $usage = $this->parser->message_provider->get('USAGE_WORD') . ":\n";
202 $ret = $usage . ' ' . $this->name();
203 if (count($this->parser->options) > 0) {
204 $ret .= ' ['
205 . strtolower($this->parser->message_provider->get('OPTION_WORD'))
206 . ']';
207 }
208 if (count($this->parser->args) > 0) {
209 foreach ($this->parser->args as $name=>$arg) {
210 $arg_str = $arg->help_name;
211 if ($arg->multiple) {
212 $arg_str .= '1 ' . $arg->help_name . '2 ...';
213 }
214 if ($arg->optional) {
215 $arg_str = '[' . $arg_str . ']';
216 }
217 $ret .= ' ' . $arg_str;
218 }
219 }
220 return $this->columnWrap($ret, 2);
221 }
222
223 // }}}
224 // commandUsageLine() {{{
225
226 /**
227 * Returns the command line usage message for subcommands.
228 *
229 * @return string The usage line
230 */
231 protected function commandUsageLine()
232 {
233 if (count($this->parser->commands) == 0) {
234 return '';
235 }
236 $ret = ' ' . $this->name();
237 if (count($this->parser->options) > 0) {
238 $ret .= ' ['
239 . strtolower($this->parser->message_provider->get('OPTION_WORD'))
240 . ']';
241 }
242 $ret .= " <command>";
243 $hasArgs = false;
244 $hasOptions = false;
245 foreach ($this->parser->commands as $command) {
246 if (!$hasArgs && count($command->args) > 0) {
247 $hasArgs = true;
248 }
249 if (!$hasOptions && ($command->add_help_option ||
250 $command->add_version_option || count($command->options) > 0)) {
251 $hasOptions = true;
252 }
253 }
254 if ($hasOptions) {
255 $ret .= ' [options]';
256 }
257 if ($hasArgs) {
258 $ret .= ' [args]';
259 }
260 return $this->columnWrap($ret, 2);
261 }
262
263 // }}}
264 // argumentList() {{{
265
266 /**
267 * Render the arguments list that will be displayed to the user, you can
268 * override this method if you want to change the look of the list.
269 *
270 * @return string The formatted argument list
271 */
272 protected function argumentList()
273 {
274 $col = 0;
275 $args = array();
276 foreach ($this->parser->args as $arg) {
277 $argstr = ' ' . $arg->toString();
278 $args[] = array($argstr, $arg->description);
279 $ln = strlen($argstr);
280 if ($col < $ln) {
281 $col = $ln;
282 }
283 }
284 $ret = $this->parser->message_provider->get('ARGUMENT_WORD') . ":";
285 foreach ($args as $arg) {
286 $text = str_pad($arg[0], $col) . ' ' . $arg[1];
287 $ret .= "\n" . $this->columnWrap($text, $col+2);
288 }
289 return $ret;
290 }
291
292 // }}}
293 // optionList() {{{
294
295 /**
296 * Render the options list that will be displayed to the user, you can
297 * override this method if you want to change the look of the list.
298 *
299 * @return string The formatted option list
300 */
301 protected function optionList()
302 {
303 $col = 0;
304 $options = array();
305 foreach ($this->parser->options as $option) {
306 $delim = $this->options_on_different_lines ? "\n" : ', ';
307 $optstr = $option->toString($delim);
308 $lines = explode("\n", $optstr);
309 $lines[0] = ' ' . $lines[0];
310 if (count($lines) > 1) {
311 $lines[1] = ' ' . $lines[1];
312 $ln = strlen($lines[1]);
313 } else {
314 $ln = strlen($lines[0]);
315 }
316 $options[] = array($lines, $option->description);
317 if ($col < $ln) {
318 $col = $ln;
319 }
320 }
321 $ret = $this->parser->message_provider->get('OPTION_WORD') . ":";
322 foreach ($options as $option) {
323 if (count($option[0]) > 1) {
324 $text = str_pad($option[0][1], $col) . ' ' . $option[1];
325 $pre = $option[0][0] . "\n";
326 } else {
327 $text = str_pad($option[0][0], $col) . ' ' . $option[1];
328 $pre = '';
329 }
330 $ret .= "\n" . $pre . $this->columnWrap($text, $col+2);
331 }
332 return $ret;
333 }
334
335 // }}}
336 // commandList() {{{
337
338 /**
339 * Render the command list that will be displayed to the user, you can
340 * override this method if you want to change the look of the list.
341 *
342 * @return string The formatted subcommand list
343 */
344 protected function commandList()
345 {
346
347 $commands = array();
348 $col = 0;
349 foreach ($this->parser->commands as $cmdname=>$command) {
350 $cmdname = ' ' . $cmdname;
351 $commands[] = array($cmdname, $command->description, $command->aliases);
352 $ln = strlen($cmdname);
353 if ($col < $ln) {
354 $col = $ln;
355 }
356 }
357 $ret = $this->parser->message_provider->get('COMMAND_WORD') . ":";
358 foreach ($commands as $command) {
359 $text = str_pad($command[0], $col) . ' ' . $command[1];
360 if ($aliasesCount = count($command[2])) {
361 $pad = '';
362 $text .= ' (';
363 $text .= $aliasesCount > 1 ? 'aliases: ' : 'alias: ';
364 foreach ($command[2] as $alias) {
365 $text .= $pad . $alias;
366 $pad = ', ';
367 }
368 $text .= ')';
369 }
370 $ret .= "\n" . $this->columnWrap($text, $col+2);
371 }
372 return $ret;
373 }
374
375 // }}}
376 // wrap() {{{
377
378 /**
379 * Wraps the text passed to the method.
380 *
381 * @param string $text The text to wrap
382 * @param int $lw The column width (defaults to line_width property)
383 *
384 * @return string The wrapped text
385 */
386 protected function wrap($text, $lw=null)
387 {
388 if ($this->line_width > 0) {
389 if ($lw === null) {
390 $lw = $this->line_width;
391 }
392 return wordwrap($text, $lw, "\n", false);
393 }
394 return $text;
395 }
396
397 // }}}
398 // columnWrap() {{{
399
400 /**
401 * Wraps the text passed to the method at the specified width.
402 *
403 * @param string $text The text to wrap
404 * @param int $cw The wrap width
405 *
406 * @return string The wrapped text
407 */
408 protected function columnWrap($text, $cw)
409 {
410 $tokens = explode("\n", $this->wrap($text));
411 $ret = $tokens[0];
412 $text = trim(substr($text, strlen($ret)));
413 if (empty($text)) {
414 return $ret;
415 }
416
417 $chunks = $this->wrap($text, $this->line_width - $cw);
418 $tokens = explode("\n", $chunks);
419 foreach ($tokens as $token) {
420 if (!empty($token)) {
421 $ret .= "\n" . str_repeat(' ', $cw) . $token;
422 } else {
423 $ret .= "\n";
424 }
425 }
426 return $ret;
427 }
428
429 // }}}
430 }