/** * Main * * @param string[] $args * @return int */ public static function main(array $args) { $command = null; if (empty($args)) { $class = new XPClass(self::class); $source = $class->getClassLoader(); $markdown = $class->getComment(); } else { if ('@' === $args[0][0]) { $resource = substr($args[0], 1); if (null === ($source = ClassLoader::getDefault()->findResource($resource))) { Console::$err->writeLine('No help topic named ', $resource); return 2; } $markdown = $source->getResource($resource); } else { $class = $args[0]; if (null === ($source = ClassLoader::getDefault()->findClass($class))) { Console::$err->writeLine('No class named ', $class); return 2; } $markdown = $source->loadClass($class)->getComment(); } } self::render(Console::$out, $markdown, $source); return 1; }
/** * Show usage * * @param lang.XPClass class */ public static function showUsage(XPClass $class) { // Description if (NULL !== ($comment = $class->getComment())) { self::$err->writeLine(self::textOf($comment)); self::$err->writeLine(str_repeat('=', 72)); } $extra = $details = $positional = array(); foreach ($class->getMethods() as $method) { if (!$method->hasAnnotation('arg')) { continue; } $arg = $method->getAnnotation('arg'); $name = strtolower(preg_replace('/^set/', '', $method->getName())); $comment = self::textOf($method->getComment()); if (0 == $method->numParameters()) { $optional = TRUE; } else { list($first, ) = $method->getParameters(); $optional = $first->isOptional(); } if (isset($arg['position'])) { $details['#' . ($arg['position'] + 1)] = $comment; $positional[$arg['position']] = $name; } else { if (isset($arg['name'])) { $details['--' . $arg['name'] . ' | -' . (isset($arg['short']) ? $arg['short'] : $arg['name'][0])] = $comment; $extra[$arg['name']] = $optional; } else { $details['--' . $name . ' | -' . (isset($arg['short']) ? $arg['short'] : $name[0])] = $comment; $extra[$name] = $optional; } } } // Usage asort($positional); self::$err->write('Usage: $ xpcli ', $class->getName(), ' '); foreach ($positional as $name) { self::$err->write('<', $name, '> '); } foreach ($extra as $name => $optional) { self::$err->write($optional ? '[' : '', '--', $name, $optional ? '] ' : ' '); } self::$err->writeLine(); // Argument details self::$err->writeLine('Arguments:'); foreach ($details as $which => $comment) { self::$err->writeLine('* ', $which, "\n ", str_replace("\n", "\n ", $comment), "\n"); } }
/** * Displays usage * * @param lang.XPClass class * @return int */ protected static function usage(XPClass $class) { Console::$err->writeLine(self::textOf($class->getComment())); return 1; }