annotate vendor/psy/psysh/src/Psy/Output/ShellOutput.php @ 7:848c88cfe644

More layout
author Chris Cannam
date Fri, 05 Jan 2018 13:59:44 +0000
parents 4c8ae668cc8c
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /*
Chris@0 4 * This file is part of Psy Shell.
Chris@0 5 *
Chris@0 6 * (c) 2012-2017 Justin Hileman
Chris@0 7 *
Chris@0 8 * For the full copyright and license information, please view the LICENSE
Chris@0 9 * file that was distributed with this source code.
Chris@0 10 */
Chris@0 11
Chris@0 12 namespace Psy\Output;
Chris@0 13
Chris@0 14 use Symfony\Component\Console\Formatter\OutputFormatterInterface;
Chris@0 15 use Symfony\Component\Console\Formatter\OutputFormatterStyle;
Chris@0 16 use Symfony\Component\Console\Output\ConsoleOutput;
Chris@0 17
Chris@0 18 /**
Chris@0 19 * A ConsoleOutput subclass specifically for Psy Shell output.
Chris@0 20 */
Chris@0 21 class ShellOutput extends ConsoleOutput
Chris@0 22 {
Chris@0 23 const NUMBER_LINES = 128;
Chris@0 24
Chris@0 25 private $paging = 0;
Chris@0 26 private $pager;
Chris@0 27
Chris@0 28 /**
Chris@0 29 * Construct a ShellOutput instance.
Chris@0 30 *
Chris@0 31 * @param mixed $verbosity (default: self::VERBOSITY_NORMAL)
Chris@0 32 * @param bool $decorated (default: null)
Chris@0 33 * @param OutputFormatterInterface $formatter (default: null)
Chris@0 34 * @param null|string|OutputPager $pager (default: null)
Chris@0 35 */
Chris@0 36 public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null, $pager = null)
Chris@0 37 {
Chris@0 38 parent::__construct($verbosity, $decorated, $formatter);
Chris@0 39
Chris@0 40 $this->initFormatters();
Chris@0 41
Chris@0 42 if ($pager === null) {
Chris@0 43 $this->pager = new PassthruPager($this);
Chris@0 44 } elseif (is_string($pager)) {
Chris@0 45 $this->pager = new ProcOutputPager($this, $pager);
Chris@0 46 } elseif ($pager instanceof OutputPager) {
Chris@0 47 $this->pager = $pager;
Chris@0 48 } else {
Chris@0 49 throw new \InvalidArgumentException('Unexpected pager parameter: ' . $pager);
Chris@0 50 }
Chris@0 51 }
Chris@0 52
Chris@0 53 /**
Chris@0 54 * Page multiple lines of output.
Chris@0 55 *
Chris@0 56 * The output pager is started
Chris@0 57 *
Chris@0 58 * If $messages is callable, it will be called, passing this output instance
Chris@0 59 * for rendering. Otherwise, all passed $messages are paged to output.
Chris@0 60 *
Chris@0 61 * Upon completion, the output pager is flushed.
Chris@0 62 *
Chris@0 63 * @param string|array|\Closure $messages A string, array of strings or a callback
Chris@0 64 * @param int $type (default: 0)
Chris@0 65 */
Chris@0 66 public function page($messages, $type = 0)
Chris@0 67 {
Chris@0 68 if (is_string($messages)) {
Chris@0 69 $messages = (array) $messages;
Chris@0 70 }
Chris@0 71
Chris@0 72 if (!is_array($messages) && !is_callable($messages)) {
Chris@0 73 throw new \InvalidArgumentException('Paged output requires a string, array or callback.');
Chris@0 74 }
Chris@0 75
Chris@0 76 $this->startPaging();
Chris@0 77
Chris@0 78 if (is_callable($messages)) {
Chris@0 79 $messages($this);
Chris@0 80 } else {
Chris@0 81 $this->write($messages, true, $type);
Chris@0 82 }
Chris@0 83
Chris@0 84 $this->stopPaging();
Chris@0 85 }
Chris@0 86
Chris@0 87 /**
Chris@0 88 * Start sending output to the output pager.
Chris@0 89 */
Chris@0 90 public function startPaging()
Chris@0 91 {
Chris@0 92 $this->paging++;
Chris@0 93 }
Chris@0 94
Chris@0 95 /**
Chris@0 96 * Stop paging output and flush the output pager.
Chris@0 97 */
Chris@0 98 public function stopPaging()
Chris@0 99 {
Chris@0 100 $this->paging--;
Chris@0 101 $this->closePager();
Chris@0 102 }
Chris@0 103
Chris@0 104 /**
Chris@0 105 * Writes a message to the output.
Chris@0 106 *
Chris@0 107 * Optionally, pass `$type | self::NUMBER_LINES` as the $type parameter to
Chris@0 108 * number the lines of output.
Chris@0 109 *
Chris@0 110 * @throws \InvalidArgumentException When unknown output type is given
Chris@0 111 *
Chris@0 112 * @param string|array $messages The message as an array of lines or a single string
Chris@0 113 * @param bool $newline Whether to add a newline or not
Chris@0 114 * @param int $type The type of output
Chris@0 115 */
Chris@0 116 public function write($messages, $newline = false, $type = 0)
Chris@0 117 {
Chris@0 118 if ($this->getVerbosity() === self::VERBOSITY_QUIET) {
Chris@0 119 return;
Chris@0 120 }
Chris@0 121
Chris@0 122 $messages = (array) $messages;
Chris@0 123
Chris@0 124 if ($type & self::NUMBER_LINES) {
Chris@0 125 $pad = strlen((string) count($messages));
Chris@0 126 $template = $this->isDecorated() ? "<aside>%{$pad}s</aside>: %s" : "%{$pad}s: %s";
Chris@0 127
Chris@0 128 if ($type & self::OUTPUT_RAW) {
Chris@0 129 $messages = array_map(array('Symfony\Component\Console\Formatter\OutputFormatter', 'escape'), $messages);
Chris@0 130 }
Chris@0 131
Chris@0 132 foreach ($messages as $i => $line) {
Chris@0 133 $messages[$i] = sprintf($template, $i, $line);
Chris@0 134 }
Chris@0 135
Chris@0 136 // clean this up for super.
Chris@0 137 $type = $type & ~self::NUMBER_LINES & ~self::OUTPUT_RAW;
Chris@0 138 }
Chris@0 139
Chris@0 140 parent::write($messages, $newline, $type);
Chris@0 141 }
Chris@0 142
Chris@0 143 /**
Chris@0 144 * Writes a message to the output.
Chris@0 145 *
Chris@0 146 * Handles paged output, or writes directly to the output stream.
Chris@0 147 *
Chris@0 148 * @param string $message A message to write to the output
Chris@0 149 * @param bool $newline Whether to add a newline or not
Chris@0 150 */
Chris@0 151 public function doWrite($message, $newline)
Chris@0 152 {
Chris@0 153 if ($this->paging > 0) {
Chris@0 154 $this->pager->doWrite($message, $newline);
Chris@0 155 } else {
Chris@0 156 parent::doWrite($message, $newline);
Chris@0 157 }
Chris@0 158 }
Chris@0 159
Chris@0 160 /**
Chris@0 161 * Flush and close the output pager.
Chris@0 162 */
Chris@0 163 private function closePager()
Chris@0 164 {
Chris@0 165 if ($this->paging <= 0) {
Chris@0 166 $this->pager->close();
Chris@0 167 }
Chris@0 168 }
Chris@0 169
Chris@0 170 /**
Chris@0 171 * Initialize output formatter styles.
Chris@0 172 */
Chris@0 173 private function initFormatters()
Chris@0 174 {
Chris@0 175 $formatter = $this->getFormatter();
Chris@0 176
Chris@0 177 $formatter->setStyle('warning', new OutputFormatterStyle('black', 'yellow'));
Chris@0 178 $formatter->setStyle('error', new OutputFormatterStyle('black', 'red', array('bold')));
Chris@0 179 $formatter->setStyle('aside', new OutputFormatterStyle('blue'));
Chris@0 180 $formatter->setStyle('strong', new OutputFormatterStyle(null, null, array('bold')));
Chris@0 181 $formatter->setStyle('return', new OutputFormatterStyle('cyan'));
Chris@0 182 $formatter->setStyle('urgent', new OutputFormatterStyle('red'));
Chris@0 183 $formatter->setStyle('hidden', new OutputFormatterStyle('black'));
Chris@0 184
Chris@0 185 // Visibility
Chris@0 186 $formatter->setStyle('public', new OutputFormatterStyle(null, null, array('bold')));
Chris@0 187 $formatter->setStyle('protected', new OutputFormatterStyle('yellow'));
Chris@0 188 $formatter->setStyle('private', new OutputFormatterStyle('red'));
Chris@0 189 $formatter->setStyle('global', new OutputFormatterStyle('cyan', null, array('bold')));
Chris@0 190 $formatter->setStyle('const', new OutputFormatterStyle('cyan'));
Chris@0 191 $formatter->setStyle('class', new OutputFormatterStyle('blue', null, array('underscore')));
Chris@0 192 $formatter->setStyle('function', new OutputFormatterStyle(null));
Chris@0 193 $formatter->setStyle('default', new OutputFormatterStyle(null));
Chris@0 194
Chris@0 195 // Types
Chris@0 196 $formatter->setStyle('number', new OutputFormatterStyle('magenta'));
Chris@0 197 $formatter->setStyle('string', new OutputFormatterStyle('green'));
Chris@0 198 $formatter->setStyle('bool', new OutputFormatterStyle('cyan'));
Chris@0 199 $formatter->setStyle('keyword', new OutputFormatterStyle('yellow'));
Chris@0 200 $formatter->setStyle('comment', new OutputFormatterStyle('blue'));
Chris@0 201 $formatter->setStyle('object', new OutputFormatterStyle('blue'));
Chris@0 202 $formatter->setStyle('resource', new OutputFormatterStyle('yellow'));
Chris@0 203 }
Chris@0 204 }