Mercurial > hg > isophonics-drupal-site
diff vendor/psy/psysh/src/Psy/Command/WhereamiCommand.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 7a779792577d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/psy/psysh/src/Psy/Command/WhereamiCommand.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,152 @@ +<?php + +/* + * This file is part of Psy Shell. + * + * (c) 2012-2017 Justin Hileman + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Psy\Command; + +use JakubOnderka\PhpConsoleHighlighter\Highlighter; +use Psy\Configuration; +use Psy\ConsoleColorFactory; +use Psy\Output\ShellOutput; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Show the context of where you opened the debugger. + */ +class WhereamiCommand extends Command +{ + private $colorMode; + + /** + * @param null|string $colorMode (default: null) + */ + public function __construct($colorMode = null) + { + $this->colorMode = $colorMode ?: Configuration::COLOR_MODE_AUTO; + + if (version_compare(PHP_VERSION, '5.3.6', '>=')) { + $this->backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + } else { + $this->backtrace = debug_backtrace(); + } + + return parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this + ->setName('whereami') + ->setDefinition(array( + new InputOption('num', 'n', InputOption::VALUE_OPTIONAL, 'Number of lines before and after.', '5'), + )) + ->setDescription('Show where you are in the code.') + ->setHelp( + <<<'HELP' +Show where you are in the code. + +Optionally, include how many lines before and after you want to display. + +e.g. +<return>> whereami </return> +<return>> whereami -n10</return> +HELP + ); + } + + /** + * Obtains the correct stack frame in the full backtrace. + * + * @return array + */ + protected function trace() + { + foreach (array_reverse($this->backtrace) as $stackFrame) { + if ($this->isDebugCall($stackFrame)) { + return $stackFrame; + } + } + + return end($this->backtrace); + } + + private static function isDebugCall(array $stackFrame) + { + $class = isset($stackFrame['class']) ? $stackFrame['class'] : null; + $function = isset($stackFrame['function']) ? $stackFrame['function'] : null; + + return ($class === null && $function === 'Psy\debug') || + ($class === 'Psy\Shell' && in_array($function, array('__construct', 'debug'))); + } + + /** + * Determine the file and line based on the specific backtrace. + * + * @return array + */ + protected function fileInfo() + { + $stackFrame = $this->trace(); + if (preg_match('/eval\(/', $stackFrame['file'])) { + preg_match_all('/([^\(]+)\((\d+)/', $stackFrame['file'], $matches); + $file = $matches[1][0]; + $line = (int) $matches[2][0]; + } else { + $file = $stackFrame['file']; + $line = $stackFrame['line']; + } + + return compact('file', 'line'); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $info = $this->fileInfo(); + $num = $input->getOption('num'); + $factory = new ConsoleColorFactory($this->colorMode); + $colors = $factory->getConsoleColor(); + $highlighter = new Highlighter($colors); + $contents = file_get_contents($info['file']); + + $output->startPaging(); + $output->writeln(''); + $output->writeln(sprintf('From <info>%s:%s</info>:', $this->replaceCwd($info['file']), $info['line'])); + $output->writeln(''); + $output->write($highlighter->getCodeSnippet($contents, $info['line'], $num, $num), ShellOutput::OUTPUT_RAW); + $output->stopPaging(); + } + + /** + * Replace the given directory from the start of a filepath. + * + * @param string $file + * + * @return string + */ + private function replaceCwd($file) + { + $cwd = getcwd(); + if ($cwd === false) { + return $file; + } + + $cwd = rtrim($cwd, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; + + return preg_replace('/^' . preg_quote($cwd, '/') . '/', '', $file); + } +}