Chris@13: setName('doc') Chris@13: ->setAliases(['rtfm', 'man']) Chris@13: ->setDefinition([ Chris@13: new CodeArgument('target', CodeArgument::REQUIRED, 'Function, class, instance, constant, method or property to document.'), Chris@13: ]) Chris@13: ->setDescription('Read the documentation for an object, class, constant, method or property.') Chris@13: ->setHelp( Chris@13: <<>>> doc preg_replace Chris@13: >>> doc Psy\Shell Chris@13: >>> doc Psy\Shell::debug Chris@13: >>> \$s = new Psy\Shell Chris@13: >>> doc \$s->run Chris@13: HELP Chris@13: ); Chris@13: } Chris@13: Chris@13: /** Chris@13: * {@inheritdoc} Chris@13: */ Chris@13: protected function execute(InputInterface $input, OutputInterface $output) Chris@13: { Chris@13: $value = $input->getArgument('target'); Chris@13: if (ReflectionLanguageConstruct::isLanguageConstruct($value)) { Chris@13: $reflector = new ReflectionLanguageConstruct($value); Chris@13: $doc = $this->getManualDocById($value); Chris@13: } else { Chris@13: list($target, $reflector) = $this->getTargetAndReflector($value); Chris@13: $doc = $this->getManualDoc($reflector) ?: DocblockFormatter::format($reflector); Chris@13: } Chris@13: Chris@13: $db = $this->getApplication()->getManualDb(); Chris@13: Chris@13: $output->page(function ($output) use ($reflector, $doc, $db) { Chris@13: $output->writeln(SignatureFormatter::format($reflector)); Chris@13: $output->writeln(''); Chris@13: Chris@13: if (empty($doc) && !$db) { Chris@13: $output->writeln('PHP manual not found'); Chris@13: $output->writeln(' To document core PHP functionality, download the PHP reference manual:'); Chris@13: $output->writeln(' https://github.com/bobthecow/psysh/wiki/PHP-manual'); Chris@13: } else { Chris@13: $output->writeln($doc); Chris@13: } Chris@13: }); Chris@13: Chris@13: // Set some magic local variables Chris@13: $this->setCommandScopeVariables($reflector); Chris@13: } Chris@13: Chris@13: private function getManualDoc($reflector) Chris@13: { Chris@17: switch (\get_class($reflector)) { Chris@13: case 'ReflectionClass': Chris@13: case 'ReflectionObject': Chris@13: case 'ReflectionFunction': Chris@13: $id = $reflector->name; Chris@13: break; Chris@13: Chris@13: case 'ReflectionMethod': Chris@13: $id = $reflector->class . '::' . $reflector->name; Chris@13: break; Chris@13: Chris@13: case 'ReflectionProperty': Chris@13: $id = $reflector->class . '::$' . $reflector->name; Chris@13: break; Chris@13: Chris@16: case 'ReflectionClassConstant': Chris@16: case 'Psy\Reflection\ReflectionClassConstant': Chris@16: // @todo this is going to collide with ReflectionMethod ids Chris@16: // someday... start running the query by id + type if the DB Chris@16: // supports it. Chris@16: $id = $reflector->class . '::' . $reflector->name; Chris@16: break; Chris@16: Chris@16: case 'Psy\Reflection\ReflectionConstant_': Chris@16: $id = $reflector->name; Chris@16: break; Chris@16: Chris@13: default: Chris@13: return false; Chris@13: } Chris@13: Chris@13: return $this->getManualDocById($id); Chris@13: } Chris@13: Chris@13: private function getManualDocById($id) Chris@13: { Chris@13: if ($db = $this->getApplication()->getManualDb()) { Chris@13: return $db Chris@17: ->query(\sprintf('SELECT doc FROM php_manual WHERE id = %s', $db->quote($id))) Chris@13: ->fetchColumn(0); Chris@13: } Chris@13: } Chris@13: }