369 lines
11 KiB
PHP
Executable File
369 lines
11 KiB
PHP
Executable File
<?php
|
||
// +----------------------------------------------------------------------
|
||
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
|
||
// +----------------------------------------------------------------------
|
||
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
|
||
// +----------------------------------------------------------------------
|
||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||
// +----------------------------------------------------------------------
|
||
// | Author: yunwuxin <448901948@qq.com>
|
||
// +----------------------------------------------------------------------
|
||
|
||
namespace think\console\output\driver;
|
||
|
||
use think\console\Output;
|
||
use think\console\output\Formatter;
|
||
|
||
class Console
|
||
{
|
||
|
||
/** @var Resource */
|
||
private $stdout;
|
||
|
||
/** @var Formatter */
|
||
private $formatter;
|
||
|
||
private $terminalDimensions;
|
||
|
||
/** @var Output */
|
||
private $output;
|
||
|
||
public function __construct(Output $output)
|
||
{
|
||
$this->output = $output;
|
||
$this->formatter = new Formatter();
|
||
$this->stdout = $this->openOutputStream();
|
||
$decorated = $this->hasColorSupport($this->stdout);
|
||
$this->formatter->setDecorated($decorated);
|
||
}
|
||
|
||
public function setDecorated($decorated)
|
||
{
|
||
$this->formatter->setDecorated($decorated);
|
||
}
|
||
|
||
public function write($messages, $newline = false, $type = Output::OUTPUT_NORMAL, $stream = null)
|
||
{
|
||
if (Output::VERBOSITY_QUIET === $this->output->getVerbosity()) {
|
||
return;
|
||
}
|
||
|
||
$messages = (array) $messages;
|
||
|
||
foreach ($messages as $message) {
|
||
switch ($type) {
|
||
case Output::OUTPUT_NORMAL:
|
||
$message = $this->formatter->format($message);
|
||
break;
|
||
case Output::OUTPUT_RAW:
|
||
break;
|
||
case Output::OUTPUT_PLAIN:
|
||
$message = strip_tags($this->formatter->format($message));
|
||
break;
|
||
default:
|
||
throw new \InvalidArgumentException(sprintf('Unknown output type given (%s)', $type));
|
||
}
|
||
|
||
$this->doWrite($message, $newline, $stream);
|
||
}
|
||
}
|
||
|
||
public function renderException(\Exception $e)
|
||
{
|
||
$stderr = $this->openErrorStream();
|
||
$decorated = $this->hasColorSupport($stderr);
|
||
$this->formatter->setDecorated($decorated);
|
||
|
||
do {
|
||
$title = sprintf(' [%s] ', get_class($e));
|
||
|
||
$len = $this->stringWidth($title);
|
||
|
||
$width = $this->getTerminalWidth() ? $this->getTerminalWidth() - 1 : PHP_INT_MAX;
|
||
|
||
if (defined('HHVM_VERSION') && $width > 1 << 31) {
|
||
$width = 1 << 31;
|
||
}
|
||
$lines = [];
|
||
foreach (preg_split('/\r?\n/', $e->getMessage()) as $line) {
|
||
foreach ($this->splitStringByWidth($line, $width - 4) as $line) {
|
||
|
||
$lineLength = $this->stringWidth(preg_replace('/\[[^m]*m/', '', $line)) + 4;
|
||
$lines[] = [$line, $lineLength];
|
||
|
||
$len = max($lineLength, $len);
|
||
}
|
||
}
|
||
|
||
$messages = ['', ''];
|
||
$messages[] = $emptyLine = sprintf('<error>%s</error>', str_repeat(' ', $len));
|
||
$messages[] = sprintf('<error>%s%s</error>', $title, str_repeat(' ', max(0, $len - $this->stringWidth($title))));
|
||
foreach ($lines as $line) {
|
||
$messages[] = sprintf('<error> %s %s</error>', $line[0], str_repeat(' ', $len - $line[1]));
|
||
}
|
||
$messages[] = $emptyLine;
|
||
$messages[] = '';
|
||
$messages[] = '';
|
||
|
||
$this->write($messages, true, Output::OUTPUT_NORMAL, $stderr);
|
||
|
||
if (Output::VERBOSITY_VERBOSE <= $this->output->getVerbosity()) {
|
||
$this->write('<comment>Exception trace:</comment>', true, Output::OUTPUT_NORMAL, $stderr);
|
||
|
||
// exception related properties
|
||
$trace = $e->getTrace();
|
||
array_unshift($trace, [
|
||
'function' => '',
|
||
'file' => $e->getFile() !== null ? $e->getFile() : 'n/a',
|
||
'line' => $e->getLine() !== null ? $e->getLine() : 'n/a',
|
||
'args' => [],
|
||
]);
|
||
|
||
for ($i = 0, $count = count($trace); $i < $count; ++$i) {
|
||
$class = isset($trace[$i]['class']) ? $trace[$i]['class'] : '';
|
||
$type = isset($trace[$i]['type']) ? $trace[$i]['type'] : '';
|
||
$function = $trace[$i]['function'];
|
||
$file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a';
|
||
$line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a';
|
||
|
||
$this->write(sprintf(' %s%s%s() at <info>%s:%s</info>', $class, $type, $function, $file, $line), true, Output::OUTPUT_NORMAL, $stderr);
|
||
}
|
||
|
||
$this->write('', true, Output::OUTPUT_NORMAL, $stderr);
|
||
$this->write('', true, Output::OUTPUT_NORMAL, $stderr);
|
||
}
|
||
} while ($e = $e->getPrevious());
|
||
|
||
}
|
||