diff --git a/extensions/apidoc/commands/RenderController.php b/extensions/apidoc/commands/RenderController.php index d6ae80f970..3c676e1da8 100644 --- a/extensions/apidoc/commands/RenderController.php +++ b/extensions/apidoc/commands/RenderController.php @@ -128,7 +128,7 @@ class RenderController extends Controller return new $rendererClass(); } - protected function findFiles($path, $except = ['/vendor/', '/tests/']) + protected function findFiles($path, $except = ['vendor/', 'tests/']) { $path = FileHelper::normalizePath($path); $options = [ diff --git a/extensions/apidoc/templates/bootstrap/Renderer.php b/extensions/apidoc/templates/bootstrap/Renderer.php index b40426dd5b..ef8d37b45a 100644 --- a/extensions/apidoc/templates/bootstrap/Renderer.php +++ b/extensions/apidoc/templates/bootstrap/Renderer.php @@ -28,6 +28,103 @@ class Renderer extends \yii\apidoc\templates\html\Renderer public $guideUrl; + public $extensions = [ + 'apidoc', + 'authclient', + 'bootstrap', + 'codeception', + 'composer', + 'debug', + 'elasticsearch', + 'faker', + 'gii', + 'imagine', + 'jui', + 'mongodb', + 'redis', + 'smarty', + 'sphinx', + 'swiftmailer', + 'twig', + ]; + + /** + * Renders a given [[Context]]. + * + * @param Context $context the api documentation context to render. + * @param Controller $controller the apidoc controller instance. Can be used to control output. + */ + public function renderApi($context, $controller) + { + parent::renderApi($context, $controller); + $dir = Yii::getAlias($this->targetDir); + $types = array_merge($context->classes, $context->interfaces, $context->traits); + + $controller->stdout('generating extension index files...'); + foreach($this->extensions as $ext) { + $readme = @file_get_contents("https://raw.github.com/yiisoft/yii2-$ext/master/README.md"); + $indexFileContent = $this->renderWithLayout($this->indexView, [ + 'docContext' => $context, + 'types' => $this->filterTypes($types, $ext), + 'readme' => $readme ?: null, + ]); + file_put_contents($dir . "/ext_{$ext}_index.html", $indexFileContent); + } + $controller->stdout('done.' . PHP_EOL, Console::FG_GREEN); + } + + public function getNavTypes($type, $types) + { + if ($type === null) { + return $types; + } + $extensions = $this->extensions; + $navClasses = 'app'; + if (isset($type)) { + if ($type->name == 'Yii') { + $navClasses = 'yii'; + } elseif (strncmp($type->name, 'yii\\', 4) == 0) { + $subName = substr($type->name, 4); + if (($pos = strpos($subName, '\\')) !== false) { + $subNamespace = substr($subName, 0, $pos); + if (in_array($subNamespace, $extensions)) { + $navClasses = $subNamespace; + } else { + $navClasses = 'yii'; + } + } + } + } + return $this->filterTypes($types, $navClasses); + } + + protected function filterTypes($types, $navClasses) + { + switch ($navClasses) + { + case 'app': + $types = array_filter($types, function($val) { + return strncmp($val->name, 'yii\\', 4) !== 0; + }); + break; + case 'yii': + $self = $this; + $types = array_filter($types, function($val) use ($self) { + if (strlen($val->name) < 5) { + return false; + } + $subName = substr($val->name, 4, strpos($val->name, '\\', 5) - 4); + return strncmp($val->name, 'yii\\', 4) === 0 && !in_array($subName, $self->extensions); + }); + break; + default: + $types = array_filter($types, function($val) use ($navClasses) { + return strncmp($val->name, "yii\\$navClasses\\", strlen("yii\\$navClasses\\")) === 0; + }); + } + return $types; + } + /** * Renders a given [[Context]]. * diff --git a/extensions/apidoc/templates/bootstrap/layouts/api.php b/extensions/apidoc/templates/bootstrap/layouts/api.php index 157e7fdb3e..935705d590 100644 --- a/extensions/apidoc/templates/bootstrap/layouts/api.php +++ b/extensions/apidoc/templates/bootstrap/layouts/api.php @@ -11,6 +11,7 @@ $this->beginContent('@yii/apidoc/templates/bootstrap/layouts/main.php'); ?>