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