Qiang Xue
11 years ago
43 changed files with 2688 additions and 4 deletions
@ -0,0 +1,7 @@
|
||||
Yii Framework 2 apidoc extension Change Log |
||||
=========================================== |
||||
|
||||
2.0.0 beta under development |
||||
---------------------------- |
||||
|
||||
- Initial release. |
@ -0,0 +1,32 @@
|
||||
The Yii framework is free software. It is released under the terms of |
||||
the following BSD License. |
||||
|
||||
Copyright © 2008 by Yii Software LLC (http://www.yiisoft.com) |
||||
All rights reserved. |
||||
|
||||
Redistribution and use in source and binary forms, with or without |
||||
modification, are permitted provided that the following conditions |
||||
are met: |
||||
|
||||
* Redistributions of source code must retain the above copyright |
||||
notice, this list of conditions and the following disclaimer. |
||||
* Redistributions in binary form must reproduce the above copyright |
||||
notice, this list of conditions and the following disclaimer in |
||||
the documentation and/or other materials provided with the |
||||
distribution. |
||||
* Neither the name of Yii Software LLC nor the names of its |
||||
contributors may be used to endorse or promote products derived |
||||
from this software without specific prior written permission. |
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
||||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
||||
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||
POSSIBILITY OF SUCH DAMAGE. |
@ -0,0 +1,48 @@
|
||||
API documentation generator for Yii 2 |
||||
===================================== |
||||
|
||||
This extension provides an API documentation generator for the Yii framework 2.0. |
||||
|
||||
Installation |
||||
------------ |
||||
|
||||
The preferred way to install this extension is through [composer](http://getcomposer.org/download/). |
||||
|
||||
Either run |
||||
|
||||
``` |
||||
php composer.phar require yiisoft/yii2-apidoc "*" |
||||
``` |
||||
|
||||
or add |
||||
|
||||
```json |
||||
"yiisoft/yii2-apidoc": "*" |
||||
``` |
||||
|
||||
to the require section of your composer.json. |
||||
|
||||
Usage |
||||
----- |
||||
|
||||
To generate API documentation, run the `apidoc` command. |
||||
|
||||
``` |
||||
vendor/bin/apidoc source/directory ./output |
||||
``` |
||||
|
||||
By default the `offline` template will be used. You can choose a different templates with the `--template=name` parameter. |
||||
Currently there is only the `offline` template available. |
||||
|
||||
You may also add the `yii\apidoc\commands\RenderController` to your console application class map and |
||||
run it inside of your applications console app. |
||||
|
||||
Creating your own templates |
||||
--------------------------- |
||||
|
||||
TDB |
||||
|
||||
Using the model layer |
||||
--------------------- |
||||
|
||||
TDB |
@ -0,0 +1,49 @@
|
||||
#!/usr/bin/env php |
||||
<?php |
||||
/** |
||||
* Yii Framework 2.0 API documentation generator |
||||
* |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
defined('YII_DEBUG') or define('YII_DEBUG', false); |
||||
|
||||
$composerAutoload = [ |
||||
__DIR__ . '/vendor/autoload.php', // standalone with "composer install" run |
||||
__DIR__ . '/../../../../autoload.php', // script is installed as a composer binary |
||||
]; |
||||
foreach($composerAutoload as $autoload) { |
||||
if (file_exists($autoload)) { |
||||
require($autoload); |
||||
break; |
||||
} |
||||
} |
||||
$yiiDirs = [ |
||||
__DIR__ . '/../../../framework', // in yii2-dev repo |
||||
__DIR__ . '/vendor/yiisoft/yii2', // standalone with "composer install" run |
||||
__DIR__ . '/../../../../yiisoft/yii2', // script is installed as a composer binary |
||||
]; |
||||
foreach($yiiDirs as $dir) { |
||||
if (file_exists($dir . '/yii/Yii.php')) { |
||||
require($dir . '/yii/Yii.php'); |
||||
break; |
||||
} |
||||
} |
||||
if (!class_exists('Yii')) { |
||||
echo PHP_EOL . "The Yii Framework 2.0 does not seem to be installed. Try running composer install." . PHP_EOL . PHP_EOL; |
||||
exit(1); |
||||
} |
||||
|
||||
Yii::setAlias('@yii/apidoc', __DIR__); |
||||
|
||||
$application = new yii\console\Application([ |
||||
'id' => 'yii2-apidoc', |
||||
'basePath' => __DIR__, |
||||
'enableCoreCommands' => false, |
||||
'controllerNamespace' => 'yii\\apidoc\\commands', |
||||
'controllerPath' => '@yii/apidoc/commands', |
||||
]); |
||||
$exitCode = $application->run(); |
||||
exit($exitCode); |
@ -0,0 +1,20 @@
|
||||
@echo off |
||||
|
||||
rem ------------------------------------------------------------- |
||||
rem Yii command line bootstrap script for Windows. |
||||
rem |
||||
rem @author Qiang Xue <qiang.xue@gmail.com> |
||||
rem @link http://www.yiiframework.com/ |
||||
rem @copyright Copyright © 2012 Yii Software LLC |
||||
rem @license http://www.yiiframework.com/license/ |
||||
rem ------------------------------------------------------------- |
||||
|
||||
@setlocal |
||||
|
||||
set YII_PATH=%~dp0 |
||||
|
||||
if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe |
||||
|
||||
"%PHP_COMMAND%" "%YII_PATH%apidoc" %* |
||||
|
||||
@endlocal |
@ -0,0 +1,144 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\commands; |
||||
|
||||
use phpDocumentor\Reflection\FileReflector; |
||||
use TokenReflection\ReflectionFile; |
||||
use yii\apidoc\templates\BaseRenderer; |
||||
use yii\console\Controller; |
||||
use yii\helpers\Console; |
||||
use yii\helpers\FileHelper; |
||||
use yii\apidoc\components\OfflineRenderer; |
||||
use yii\apidoc\models\Context; |
||||
use Yii; |
||||
|
||||
/** |
||||
* Command to render API Documentation files |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class RenderController extends Controller |
||||
{ |
||||
public $template = 'offline'; |
||||
|
||||
/** |
||||
* Renders API documentation files |
||||
* @param array $sourceDirs |
||||
* @param string $targetDir |
||||
* @return int |
||||
*/ |
||||
public function actionIndex(array $sourceDirs, $targetDir) |
||||
{ |
||||
$targetDir = rtrim(Yii::getAlias($targetDir), '\\/'); |
||||
if (is_dir($targetDir) && !$this->confirm('TargetDirectory already exists. Overwrite?')) { |
||||
return 2; |
||||
} |
||||
if (!is_dir($targetDir)) { |
||||
mkdir($targetDir); |
||||
} |
||||
|
||||
$renderer = $this->findRenderer(); |
||||
$renderer->targetDir = $targetDir; |
||||
|
||||
$this->stdout('Searching files to process... '); |
||||
$files = []; |
||||
foreach($sourceDirs as $source) { |
||||
foreach($this->findFiles($source) as $fileName) { |
||||
$files[$fileName] = $fileName; |
||||
} |
||||
} |
||||
|
||||
$this->stdout('done.' . PHP_EOL, Console::FG_GREEN); |
||||
|
||||
$context = new Context(); |
||||
|
||||
$cacheFile = $targetDir . '/cache/' . md5(serialize($files)) . '.tmp'; |
||||
if (file_exists($cacheFile)) { |
||||
$this->stdout('Loading processed data from cache... '); |
||||
$context = unserialize(file_get_contents($cacheFile)); |
||||
$this->stdout('done.' . PHP_EOL, Console::FG_GREEN); |
||||
|
||||
$this->stdout('Checking for updated files... '); |
||||
foreach($context->files as $file => $sha) { |
||||
if (sha1_file($file) === $sha) { |
||||
unset($files[$file]); |
||||
} |
||||
} |
||||
$this->stdout('done.' . PHP_EOL, Console::FG_GREEN); |
||||
} |
||||
|
||||
$fileCount = count($files); |
||||
$this->stdout($fileCount . ' file' . ($fileCount == 1 ? '' : 's') . ' to update.' . PHP_EOL); |
||||
Console::startProgress(0, $fileCount, 'Processing files... ', false); |
||||
$done = 0; |
||||
foreach($files as $file) { |
||||
$context->addFile($file); |
||||
Console::updateProgress(++$done, $fileCount); |
||||
} |
||||
Console::endProgress(true); |
||||
$this->stdout('done.' . PHP_EOL, Console::FG_GREEN); |
||||
|
||||
// save processed data to cache |
||||
if (!is_dir(dirname($cacheFile))) { |
||||
mkdir(dirname($cacheFile)); |
||||
} |
||||
file_put_contents($cacheFile, serialize($context)); |
||||
|
||||
$this->stdout('Updating cross references and backlinks... '); |
||||
$context->updateReferences(); |
||||
$this->stdout('done.' . PHP_EOL, Console::FG_GREEN); |
||||
|
||||
// render models |
||||
$renderer->render($context, $this); |
||||
} |
||||
|
||||
/** |
||||
* @return BaseRenderer |
||||
*/ |
||||
protected function findRenderer() |
||||
{ |
||||
$file = Yii::getAlias('@yii/apidoc/templates/' . $this->template . '/Renderer.php'); |
||||
$reflection = new FileReflector($file, true); |
||||
$reflection->process(); |
||||
$classes = $reflection->getClasses(); |
||||
if (empty($classes)) { |
||||
$this->stderr('Renderer not found.' . PHP_EOL); |
||||
} |
||||
$rendererClass = reset($classes)->getName(); |
||||
require($file); |
||||
return new $rendererClass(); |
||||
} |
||||
|
||||
protected function findFiles($path, $except = []) |
||||
{ |
||||
$path = FileHelper::normalizePath($path); |
||||
$options = [ |
||||
'filter' => function ($path) { |
||||
if (is_file($path)) { |
||||
$file = basename($path); |
||||
if ($file[0] < 'A' || $file[0] > 'Z') { |
||||
return false; |
||||
} |
||||
} |
||||
return null; |
||||
}, |
||||
'only' => ['.php'], |
||||
'except' => $except, |
||||
]; |
||||
return FileHelper::findFiles($path, $options); |
||||
} |
||||
|
||||
/** |
||||
* @inheritdoc |
||||
*/ |
||||
public function globalOptions() |
||||
{ |
||||
return array_merge(parent::globalOptions(), ['template']); |
||||
} |
||||
} |
@ -0,0 +1,30 @@
|
||||
{ |
||||
"name": "yiisoft/yii2-apidoc", |
||||
"description": "API Documentation generator for the Yii framework 2.0", |
||||
"keywords": ["yii", "phpdoc", "apidoc", "api", "documentation"], |
||||
"type": "yii2-extension", |
||||
"license": "BSD-3-Clause", |
||||
"support": { |
||||
"issues": "https://github.com/yiisoft/yii2/issues?labels=ext%3Aapidoc", |
||||
"forum": "http://www.yiiframework.com/forum/", |
||||
"wiki": "http://www.yiiframework.com/wiki/", |
||||
"irc": "irc://irc.freenode.net/yii", |
||||
"source": "https://github.com/yiisoft/yii2" |
||||
}, |
||||
"authors": [ |
||||
{ |
||||
"name": "Carsten Brandt", |
||||
"email": "mail@cebe.cc" |
||||
} |
||||
], |
||||
"minimum-stability": "dev", |
||||
"require": { |
||||
"yiisoft/yii2": "*", |
||||
"phpdocumentor/reflection": "1.0.2" |
||||
}, |
||||
"autoload": { |
||||
"psr-0": { "yii\\apidoc\\": "" } |
||||
}, |
||||
"target-dir": "yii/apidoc", |
||||
"bin": ["apidoc"] |
||||
} |
@ -0,0 +1,80 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\helpers; |
||||
|
||||
use phpDocumentor\Reflection\DocBlock\Type\Collection; |
||||
use yii\apidoc\models\MethodDoc; |
||||
use yii\apidoc\models\TypeDoc; |
||||
use yii\apidoc\templates\BaseRenderer; |
||||
|
||||
/** |
||||
* A Markdown helper with support for class reference links. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class Markdown extends \yii\helpers\Markdown |
||||
{ |
||||
/** |
||||
* @var BaseRenderer |
||||
*/ |
||||
public static $renderer; |
||||
|
||||
/** |
||||
* Converts markdown into HTML |
||||
* |
||||
* @param string $content |
||||
* @param TypeDoc $context |
||||
* @return string |
||||
*/ |
||||
public static function process($content, $context) |
||||
{ |
||||
$content = trim(parent::process($content, [])); |
||||
if (!strncmp($content, '<p>', 3) && substr($content, -4, 4) == '</p>') { |
||||
$content = substr($content, 3, -4); |
||||
} |
||||
|
||||
$content = preg_replace_callback('/\[\[([\w\d\\\\\(\):]+)(\|[\w\d ]*)?\]\]/xm', function($matches) use ($context) { |
||||
$object = $matches[1]; |
||||
$title = (empty($matches[2]) || $matches[2] == '|') ? null : substr($matches[2], 1); |
||||
|
||||
if (($pos = strpos($object, '::')) !== false) { |
||||
$typeName = substr($object, 0, $pos); |
||||
$subjectName = substr($object, $pos + 2); |
||||
// Collection resolves relative types |
||||
$typeName = (new Collection([$typeName], $context->phpDocContext))->__toString(); |
||||
$type = static::$renderer->context->getType($typeName); |
||||
if ($type === null) { |
||||
return '<span style="background: #f00;">' . $typeName . '::' . $subjectName . '</span>'; |
||||
} else { |
||||
if (($subject = $type->findSubject($subjectName)) !== null) { |
||||
if ($title === null) { |
||||
$title = $type->name . '::' . $subject->name; |
||||
if ($subject instanceof MethodDoc) { |
||||
$title .= '()'; |
||||
} |
||||
} |
||||
return static::$renderer->subjectLink($subject, $title); |
||||
} else { |
||||
return '<span style="background: #ff0;">' . $type->name . '</span><span style="background: #f00;">::' . $subjectName . '</span>'; |
||||
} |
||||
} |
||||
} elseif (($subject = $context->findSubject($object)) !== null) { |
||||
return static::$renderer->subjectLink($subject, $title); |
||||
} |
||||
// Collection resolves relative types |
||||
$object = (new Collection([$object], $context->phpDocContext))->__toString(); |
||||
if (($type = static::$renderer->context->getType($object)) !== null) { |
||||
return static::$renderer->typeLink($type, $title); |
||||
} |
||||
return '<span style="background: #f00;">' . $object . '</span>'; |
||||
}, $content); |
||||
|
||||
return $content; |
||||
} |
||||
} |
@ -0,0 +1,41 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\helpers; |
||||
|
||||
use PHPParser_Node_Expr; |
||||
use PHPParser_Node_Expr_Array; |
||||
|
||||
/** |
||||
* Enhances the phpDocumentor PrettyPrinter with short array syntax |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class PrettyPrinter extends \phpDocumentor\Reflection\PrettyPrinter |
||||
{ |
||||
public function pExpr_Array(PHPParser_Node_Expr_Array $node) |
||||
{ |
||||
return '[' . $this->pCommaSeparated($node->items) . ']'; |
||||
} |
||||
|
||||
/** |
||||
* Returns a simple human readable output for a value. |
||||
* |
||||
* @param PHPParser_Node_Expr $value The value node as provided by PHP-Parser. |
||||
* @return string |
||||
*/ |
||||
public static function getRepresentationOfValue(PHPParser_Node_Expr $value) |
||||
{ |
||||
if ($value === null) { |
||||
return ''; |
||||
} |
||||
|
||||
$printer = new static(); |
||||
return $printer->prettyPrintExpr($value); |
||||
} |
||||
} |
@ -0,0 +1,105 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\models; |
||||
|
||||
use phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag; |
||||
use phpDocumentor\Reflection\DocBlock\Tag\SinceTag; |
||||
use yii\base\Object; |
||||
|
||||
/** |
||||
* Base class for API documentation information. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class BaseDoc extends Object |
||||
{ |
||||
/** |
||||
* @var \phpDocumentor\Reflection\DocBlock\Context |
||||
*/ |
||||
public $phpDocContext; |
||||
|
||||
public $name; |
||||
|
||||
public $sourceFile; |
||||
public $startLine; |
||||
public $endLine; |
||||
|
||||
public $shortDescription; |
||||
public $description; |
||||
public $since; |
||||
public $deprecatedSince; |
||||
public $deprecatedReason; |
||||
|
||||
/** |
||||
* @var \phpDocumentor\Reflection\DocBlock\Tag[] |
||||
*/ |
||||
public $tags = []; |
||||
|
||||
|
||||
/** |
||||
* @param \phpDocumentor\Reflection\BaseReflector $reflector |
||||
* @param array $config |
||||
*/ |
||||
public function __construct($reflector = null, $config = []) |
||||
{ |
||||
parent::__construct($config); |
||||
|
||||
if ($reflector === null) { |
||||
return; |
||||
} |
||||
|
||||
// base properties |
||||
$this->name = ltrim($reflector->getName(), '\\'); |
||||
$this->startLine = $reflector->getNode()->getAttribute('startLine'); |
||||
$this->endLine = $reflector->getNode()->getAttribute('endLine'); |
||||
|
||||
$docblock = $reflector->getDocBlock(); |
||||
if ($docblock !== null) { |
||||
$this->shortDescription = ucfirst($docblock->getShortDescription()); |
||||
$this->description = $docblock->getLongDescription(); |
||||
|
||||
$this->phpDocContext = $docblock->getContext(); |
||||
|
||||
$this->tags = $docblock->getTags(); |
||||
foreach($this->tags as $i => $tag) { |
||||
if ($tag instanceof SinceTag) { |
||||
$this->since = $tag->getVersion(); |
||||
unset($this->tags[$i]); |
||||
} elseif ($tag instanceof DeprecatedTag) { |
||||
$this->deprecatedSince = $tag->getVersion(); |
||||
$this->deprecatedReason = $tag->getDescription(); |
||||
unset($this->tags[$i]); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// TODO |
||||
public function loadSource($reflection) |
||||
{ |
||||
$this->sourcePath=str_replace('\\','/',str_replace(YII_PATH,'',$reflection->getFileName())); |
||||
$this->startLine=$reflection->getStartLine(); |
||||
$this->endLine=$reflection->getEndLine(); |
||||
} |
||||
|
||||
public function getSourceUrl($baseUrl,$line=null) |
||||
{ |
||||
if($line===null) |
||||
return $baseUrl.$this->sourcePath; |
||||
else |
||||
return $baseUrl.$this->sourcePath.'#'.$line; |
||||
} |
||||
|
||||
public function getSourceCode() |
||||
{ |
||||
$lines=file(YII_PATH.$this->sourcePath); |
||||
return implode("",array_slice($lines,$this->startLine-1,$this->endLine-$this->startLine+1)); |
||||
} |
||||
} |
@ -0,0 +1,109 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\models; |
||||
|
||||
/** |
||||
* Represents API documentation information for a `class`. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class ClassDoc extends TypeDoc |
||||
{ |
||||
public $parentClass; |
||||
|
||||
public $isAbstract; |
||||
public $isFinal; |
||||
|
||||
public $interfaces = []; |
||||
public $traits = []; |
||||
// will be set by Context::updateReferences() |
||||
public $subclasses = []; |
||||
|
||||
/** |
||||
* @var EventDoc[] |
||||
*/ |
||||
public $events = []; |
||||
/** |
||||
* @var ConstDoc[] |
||||
*/ |
||||
public $constants = []; |
||||
|
||||
|
||||
public function findSubject($subjectName) |
||||
{ |
||||
if (($subject = parent::findSubject($subjectName)) !== null) { |
||||
return $subject; |
||||
} |
||||
foreach($this->events as $name => $event) { |
||||
if ($subjectName == $name) { |
||||
return $event; |
||||
} |
||||
} |
||||
foreach($this->constants as $name => $constant) { |
||||
if ($subjectName == $name) { |
||||
return $constant; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* @return EventDoc[] |
||||
*/ |
||||
public function getNativeEvents() |
||||
{ |
||||
$events = []; |
||||
foreach($this->events as $name => $event) { |
||||
if ($event->definedBy != $this->name) { |
||||
continue; |
||||
} |
||||
$events[$name] = $event; |
||||
} |
||||
return $events; |
||||
} |
||||
|
||||
/** |
||||
* @param \phpDocumentor\Reflection\ClassReflector $reflector |
||||
* @param array $config |
||||
*/ |
||||
public function __construct($reflector = null, $config = []) |
||||
{ |
||||
parent::__construct($reflector, $config); |
||||
|
||||
if ($reflector === null) { |
||||
return; |
||||
} |
||||
|
||||
$this->parentClass = ltrim($reflector->getParentClass(), '\\'); |
||||
if (empty($this->parentClass)) { |
||||
$this->parentClass = null; |
||||
} |
||||
$this->isAbstract = $reflector->isAbstract(); |
||||
$this->isFinal = $reflector->isFinal(); |
||||
|
||||
foreach($reflector->getInterfaces() as $interface) { |
||||
$this->interfaces[] = ltrim($interface, '\\'); |
||||
} |
||||
foreach($reflector->getTraits() as $trait) { |
||||
$this->traits[] = ltrim($trait, '\\'); |
||||
} |
||||
foreach($reflector->getConstants() as $constantReflector) { |
||||
$docblock = $constantReflector->getDocBlock(); |
||||
if ($docblock !== null && count($docblock->getTagsByName('event')) > 0) { |
||||
$event = new EventDoc($constantReflector); |
||||
$event->definedBy = $this->name; |
||||
$this->events[$event->name] = $event; |
||||
} else { |
||||
$constant = new ConstDoc($constantReflector); |
||||
$constant->definedBy = $this->name; |
||||
$this->constants[$constant->name] = $constant; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,35 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\models; |
||||
|
||||
/** |
||||
* Represents API documentation information for a `constant`. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class ConstDoc extends BaseDoc |
||||
{ |
||||
public $definedBy; |
||||
public $value; |
||||
|
||||
/** |
||||
* @param \phpDocumentor\Reflection\ClassReflector\ConstantReflector $reflector |
||||
* @param array $config |
||||
*/ |
||||
public function __construct($reflector = null, $config = []) |
||||
{ |
||||
parent::__construct($reflector, $config); |
||||
|
||||
if ($reflector === null) { |
||||
return; |
||||
} |
||||
|
||||
$this->value = $reflector->getValue(); |
||||
} |
||||
} |
@ -0,0 +1,258 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\models; |
||||
|
||||
use phpDocumentor\Reflection\FileReflector; |
||||
use yii\base\Component; |
||||
use yii\base\Exception; |
||||
|
||||
/** |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class Context extends Component |
||||
{ |
||||
/** |
||||
* @var array list of php files that have been added to this context. |
||||
*/ |
||||
public $files = []; |
||||
/** |
||||
* @var ClassDoc[] |
||||
*/ |
||||
public $classes = []; |
||||
/** |
||||
* @var InterfaceDoc[] |
||||
*/ |
||||
public $interfaces = []; |
||||
/** |
||||
* @var TraitDoc[] |
||||
*/ |
||||
public $traits = []; |
||||
|
||||
|
||||
public function getType($type) |
||||
{ |
||||
$type = ltrim($type, '\\'); |
||||
if (isset($this->classes[$type])) { |
||||
return $this->classes[$type]; |
||||
} elseif (isset($this->interfaces[$type])) { |
||||
return $this->interfaces[$type]; |
||||
} elseif (isset($this->traits[$type])) { |
||||
return $this->traits[$type]; |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
public function addFile($fileName) |
||||
{ |
||||
$this->files[$fileName] = sha1_file($fileName); |
||||
|
||||
$reflection = new FileReflector($fileName, true); |
||||
$reflection->process(); |
||||
|
||||
foreach($reflection->getClasses() as $class) { |
||||
$class = new ClassDoc($class); |
||||
$class->sourceFile = $fileName; |
||||
$this->classes[$class->name] = $class; |
||||
} |
||||
foreach($reflection->getInterfaces() as $interface) { |
||||
$interface = new InterfaceDoc($interface); |
||||
$interface->sourceFile = $fileName; |
||||
$this->interfaces[$interface->name] = $interface; |
||||
} |
||||
foreach($reflection->getTraits() as $trait) { |
||||
$trait = new TraitDoc($trait); |
||||
$trait->sourceFile = $fileName; |
||||
$this->traits[$trait->name] = $trait; |
||||
} |
||||
} |
||||
|
||||
public function updateReferences() |
||||
{ |
||||
// update all subclass references |
||||
foreach($this->classes as $class) { |
||||
$className = $class->name; |
||||
while (isset($this->classes[$class->parentClass])) { |
||||
$class = $this->classes[$class->parentClass]; |
||||
$class->subclasses[] = $className; |
||||
} |
||||
} |
||||
// update interfaces of subclasses |
||||
foreach($this->classes as $class) { |
||||
$this->updateSubclassInferfacesTraits($class); |
||||
} |
||||
// update implementedBy and usedBy for interfaces and traits |
||||
foreach($this->classes as $class) { |
||||
foreach($class->interfaces as $interface) { |
||||
if (isset($this->interfaces[$interface])) { |
||||
$this->interfaces[$interface]->implementedBy[] = $class->name; |
||||
} |
||||
} |
||||
foreach($class->traits as $trait) { |
||||
if (isset($this->traits[$trait])) { |
||||
$trait = $this->traits[$trait]; |
||||
$trait->usedBy[] = $class->name; |
||||
$class->properties = array_merge($trait->properties, $class->properties); |
||||
$class->methods = array_merge($trait->methods, $class->methods); |
||||
} |
||||
} |
||||
} |
||||
// inherit properties, methods, contants and events to subclasses |
||||
foreach($this->classes as $class) { |
||||
$this->updateSubclassInheritance($class); |
||||
} |
||||
// add properties from getters and setters |
||||
foreach($this->classes as $class) { |
||||
$this->handlePropertyFeature($class); |
||||
} |
||||
|
||||
// TODO reference exceptions to methods where they are thrown |
||||
} |
||||
|
||||
/** |
||||
* Add implemented interfaces and used traits to subclasses |
||||
* @param ClassDoc $class |
||||
*/ |
||||
protected function updateSubclassInferfacesTraits($class) |
||||
{ |
||||
foreach($class->subclasses as $subclass) { |
||||
$subclass = $this->classes[$subclass]; |
||||
$subclass->interfaces = array_unique(array_merge($subclass->interfaces, $class->interfaces)); |
||||
$subclass->traits = array_unique(array_merge($subclass->traits, $class->traits)); |
||||
$this->updateSubclassInferfacesTraits($subclass); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Add implemented interfaces and used traits to subclasses |
||||
* @param ClassDoc $class |
||||
*/ |
||||
protected function updateSubclassInheritance($class) |
||||
{ |
||||
foreach($class->subclasses as $subclass) { |
||||
$subclass = $this->classes[$subclass]; |
||||
$subclass->events = array_merge($class->events, $subclass->events); |
||||
$subclass->constants = array_merge($class->constants, $subclass->constants); |
||||
$subclass->properties = array_merge($class->properties, $subclass->properties); |
||||
$subclass->methods = array_merge($class->methods, $subclass->methods); |
||||
$this->updateSubclassInheritance($subclass); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Add properties for getters and setters if class is subclass of [[yii\base\Object]]. |
||||
* @param ClassDoc $class |
||||
*/ |
||||
protected function handlePropertyFeature($class) |
||||
{ |
||||
if (!$this->isSubclassOf($class, 'yii\base\Object')) { |
||||
return; |
||||
} |
||||
foreach($class->getPublicMethods() as $name => $method) { |
||||
if (!strncmp($name, 'get', 3) && $this->paramsOptional($method)) { |
||||
$propertyName = '$' . lcfirst(substr($method->name, 3)); |
||||
if (isset($class->properties[$propertyName])) { |
||||
$property = $class->properties[$propertyName]; |
||||
if ($property->getter === null && $property->setter === null) { |
||||
echo "Property $propertyName conflicts with a defined getter {$method->name} in {$class->name}.\n"; // TODO log these messages somewhere |
||||
} |
||||
$property->getter = $method; |
||||
} else { |
||||
$class->properties[$propertyName] = new PropertyDoc(null, [ |
||||
'name' => $propertyName, |
||||
'definedBy' => $class->name, |
||||
'visibility' => 'public', |
||||
'isStatic' => false, |
||||
'type' => $method->returnType, |
||||
'types' => $method->returnTypes, |
||||
'shortDescription' => (($pos = strpos($method->return, '.')) !== false) ? |
||||
substr($method->return, 0, $pos) : $method->return, |
||||
'description' => $method->return, |
||||
'getter' => $method |
||||
// TODO set default value |
||||
]); |
||||
} |
||||
} |
||||
if (!strncmp($name, 'set', 3) && $this->paramsOptional($method, 1)) { |
||||
$propertyName = '$' . lcfirst(substr($method->name, 3)); |
||||
if (isset($class->properties[$propertyName])) { |
||||
$property = $class->properties[$propertyName]; |
||||
if ($property->getter === null && $property->setter === null) { |
||||
echo "Property $propertyName conflicts with a defined setter {$method->name} in {$class->name}.\n"; // TODO log these messages somewhere |
||||
} |
||||
$property->setter = $method; |
||||
} else { |
||||
$param = $this->getFirstNotOptionalParameter($method); |
||||
$class->properties[$propertyName] = new PropertyDoc(null, [ |
||||
'name' => $propertyName, |
||||
'definedBy' => $class->name, |
||||
'visibility' => 'public', |
||||
'isStatic' => false, |
||||
'type' => $param->type, |
||||
'types' => $param->types, |
||||
'shortDescription' => (($pos = strpos($param->description, '.')) !== false) ? |
||||
substr($param->description, 0, $pos) : $param->description, |
||||
'description' => $param->description, |
||||
'setter' => $method |
||||
]); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* @param MethodDoc $method |
||||
* @param integer $number number of not optional parameters |
||||
* @return bool |
||||
*/ |
||||
private function paramsOptional($method, $number = 0) |
||||
{ |
||||
foreach($method->params as $param) { |
||||
if (!$param->isOptional && $number-- <= 0) { |
||||
return false; |
||||
} |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
/** |
||||
* @param MethodDoc $method |
||||
* @return ParamDoc |
||||
*/ |
||||
private function getFirstNotOptionalParameter($method) |
||||
{ |
||||
foreach($method->params as $param) { |
||||
if (!$param->isOptional) { |
||||
return $param; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* @param ClassDoc $classA |
||||
* @param ClassDoc $classB |
||||
*/ |
||||
protected function isSubclassOf($classA, $classB) |
||||
{ |
||||
if (is_object($classB)) { |
||||
$classB = $classB->name; |
||||
} |
||||
if ($classA->name == $classB) { |
||||
return true; |
||||
} |
||||
while($classA->parentClass !== null && isset($this->classes[$classA->parentClass])) { |
||||
$classA = $this->classes[$classA->parentClass]; |
||||
if ($classA->name == $classB) { |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
} |
@ -0,0 +1,51 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\models; |
||||
|
||||
use phpDocumentor\Reflection\DocBlock\Tag\ParamTag; |
||||
use phpDocumentor\Reflection\DocBlock\Tag\ReturnTag; |
||||
|
||||
/** |
||||
* Represents API documentation information for an `event`. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class EventDoc extends ConstDoc |
||||
{ |
||||
public $type; |
||||
public $types; |
||||
|
||||
/** |
||||
* @param \phpDocumentor\Reflection\ClassReflector\ConstantReflector $reflector |
||||
* @param array $config |
||||
*/ |
||||
public function __construct($reflector = null, $config = []) |
||||
{ |
||||
parent::__construct($reflector, $config); |
||||
|
||||
if ($reflector === null) { |
||||
return; |
||||
} |
||||
|
||||
foreach($this->tags as $i => $tag) { |
||||
if ($tag->getName() == 'event') { |
||||
$eventTag = new ReturnTag('event', $tag->getContent(), $tag->getDocBlock(), $tag->getLocation()); |
||||
$this->type = $eventTag->getType(); |
||||
$this->types = $eventTag->getTypes(); |
||||
$this->description = ucfirst($eventTag->getDescription()); |
||||
if (($pos = strpos($this->description, '.')) !== false) { |
||||
$this->shortDescription = substr($this->description, 0, $pos); |
||||
} else { |
||||
$this->shortDescription = $this->description; |
||||
} |
||||
unset($this->tags[$i]); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,77 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\models; |
||||
|
||||
use phpDocumentor\Reflection\DocBlock\Tag\ParamTag; |
||||
use phpDocumentor\Reflection\DocBlock\Tag\PropertyTag; |
||||
use phpDocumentor\Reflection\DocBlock\Tag\ReturnTag; |
||||
use phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag; |
||||
use yii\base\Exception; |
||||
|
||||
/** |
||||
* Represents API documentation information for a `function`. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class FunctionDoc extends BaseDoc |
||||
{ |
||||
/** |
||||
* @var ParamDoc[] |
||||
*/ |
||||
public $params = []; |
||||
public $exceptions = []; |
||||
public $return; |
||||
public $returnType; |
||||
public $returnTypes; |
||||
public $isReturnByReference; |
||||
|
||||
/** |
||||
* @param \phpDocumentor\Reflection\FunctionReflector $reflector |
||||
* @param array $config |
||||
*/ |
||||
public function __construct($reflector = null, $config = []) |
||||
{ |
||||
parent::__construct($reflector, $config); |
||||
|
||||
if ($reflector === null) { |
||||
return; |
||||
} |
||||
|
||||
$this->isReturnByReference = $reflector->isByRef(); |
||||
|
||||
foreach($reflector->getArguments() as $arg) { |
||||
$arg = new ParamDoc($arg); |
||||
$this->params[$arg->name] = $arg; |
||||
} |
||||
|
||||
foreach($this->tags as $i => $tag) { |
||||
if ($tag instanceof ThrowsTag) { |
||||
$this->exceptions[$tag->getType()] = $tag->getDescription(); |
||||
unset($this->tags[$i]); |
||||
} elseif ($tag instanceof PropertyTag) { |
||||
// ignore property tag |
||||
} elseif ($tag instanceof ParamTag) { |
||||
$paramName = $tag->getVariableName(); |
||||
if (!isset($this->params[$paramName])) { |
||||
echo 'undefined parameter documented: ' . $paramName . ' in ' . $this->name . "()\n"; // TODO log these messages somewhere |
||||
continue; |
||||
} |
||||
$this->params[$paramName]->description = ucfirst($tag->getDescription()); |
||||
$this->params[$paramName]->type = $tag->getType(); |
||||
$this->params[$paramName]->types = $tag->getTypes(); |
||||
unset($this->tags[$i]); |
||||
} elseif ($tag instanceof ReturnTag) { |
||||
$this->returnType = $tag->getType(); |
||||
$this->returnTypes = $tag->getTypes(); |
||||
$this->return = $tag->getDescription(); |
||||
unset($this->tags[$i]); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,42 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\models; |
||||
|
||||
/** |
||||
* Represents API documentation information for an `interface`. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class InterfaceDoc extends TypeDoc |
||||
{ |
||||
public $parentInterfaces = []; |
||||
|
||||
// will be set by Context::updateReferences() |
||||
public $implementedBy = []; |
||||
|
||||
/** |
||||
* @param \phpDocumentor\Reflection\InterfaceReflector $reflector |
||||
* @param array $config |
||||
*/ |
||||
public function __construct($reflector = null, $config = []) |
||||
{ |
||||
parent::__construct($reflector, $config); |
||||
|
||||
if ($reflector === null) { |
||||
return; |
||||
} |
||||
|
||||
foreach($reflector->getParentInterfaces() as $interface) { |
||||
$this->parentInterfaces[] = ltrim($interface, '\\'); |
||||
} |
||||
|
||||
// interface can not have properties |
||||
$this->properties = null; |
||||
} |
||||
} |
@ -0,0 +1,46 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\models; |
||||
|
||||
/** |
||||
* Represents API documentation information for a `method`. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class MethodDoc extends FunctionDoc |
||||
{ |
||||
public $isAbstract; |
||||
public $isFinal; |
||||
|
||||
public $isStatic; |
||||
|
||||
public $visibility; |
||||
|
||||
// will be set by creating class |
||||
public $definedBy; |
||||
|
||||
/** |
||||
* @param \phpDocumentor\Reflection\ClassReflector\MethodReflector $reflector |
||||
* @param array $config |
||||
*/ |
||||
public function __construct($reflector = null, $config = []) |
||||
{ |
||||
parent::__construct($reflector, $config); |
||||
|
||||
if ($reflector === null) { |
||||
return; |
||||
} |
||||
|
||||
$this->isAbstract = $reflector->isAbstract(); |
||||
$this->isFinal = $reflector->isFinal(); |
||||
$this->isStatic = $reflector->isStatic(); |
||||
|
||||
$this->visibility = $reflector->getVisibility(); |
||||
} |
||||
} |
@ -0,0 +1,54 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\models; |
||||
|
||||
use yii\apidoc\helpers\PrettyPrinter; |
||||
use yii\base\Object; |
||||
|
||||
/** |
||||
* Represents API documentation information for a [[FunctionDoc|function]] or [[MethodDoc|method]] `param`. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class ParamDoc extends Object |
||||
{ |
||||
public $name; |
||||
public $typeHint; |
||||
public $isOptional; |
||||
public $defaultValue; |
||||
public $isPassedByReference; |
||||
|
||||
// will be set by creating class |
||||
public $description; |
||||
public $type; |
||||
public $types; |
||||
|
||||
/** |
||||
* @param \phpDocumentor\Reflection\FunctionReflector\ArgumentReflector $reflector |
||||
* @param array $config |
||||
*/ |
||||
public function __construct($reflector = null, $config = []) |
||||
{ |
||||
parent::__construct($config); |
||||
|
||||
if ($reflector === null) { |
||||
return; |
||||
} |
||||
|
||||
$this->name = $reflector->getName(); |
||||
$this->typeHint = $reflector->getType(); |
||||
$this->isOptional = $reflector->getDefault() !== null; |
||||
|
||||
// bypass $reflector->getDefault() for short array syntax |
||||
if ($reflector->getNode()->default) { |
||||
$this->defaultValue = PrettyPrinter::getRepresentationOfValue($reflector->getNode()->default); |
||||
} |
||||
$this->isPassedByReference = $reflector->isByRef(); |
||||
} |
||||
} |
@ -0,0 +1,78 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\models; |
||||
|
||||
use phpDocumentor\Reflection\DocBlock\Tag\VarTag; |
||||
use yii\apidoc\helpers\PrettyPrinter; |
||||
|
||||
/** |
||||
* Represents API documentation information for a `property`. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class PropertyDoc extends BaseDoc |
||||
{ |
||||
public $visibility; |
||||
public $isStatic; |
||||
|
||||
public $type; |
||||
public $types; |
||||
public $defaultValue; |
||||
|
||||
// will be set by creating class |
||||
public $getter; |
||||
public $setter; |
||||
|
||||
// will be set by creating class |
||||
public $definedBy; |
||||
|
||||
public function getIsReadOnly() |
||||
{ |
||||
return $this->getter !== null && $this->setter === null; |
||||
} |
||||
|
||||
public function getIsWriteOnly() |
||||
{ |
||||
return $this->getter === null && $this->setter !== null; |
||||
} |
||||
|
||||
/** |
||||
* @param \phpDocumentor\Reflection\ClassReflector\PropertyReflector $reflector |
||||
* @param array $config |
||||
*/ |
||||
public function __construct($reflector = null, $config = []) |
||||
{ |
||||
parent::__construct($reflector, $config); |
||||
|
||||
if ($reflector === null) { |
||||
return; |
||||
} |
||||
|
||||
$this->visibility = $reflector->getVisibility(); |
||||
$this->isStatic = $reflector->isStatic(); |
||||
|
||||
// bypass $reflector->getDefault() for short array syntax |
||||
if ($reflector->getNode()->default) { |
||||
$this->defaultValue = PrettyPrinter::getRepresentationOfValue($reflector->getNode()->default); |
||||
} |
||||
|
||||
foreach($this->tags as $i => $tag) { |
||||
if ($tag instanceof VarTag) { |
||||
$this->type = $tag->getType(); |
||||
$this->types = $tag->getTypes(); |
||||
$this->description = ucfirst($tag->getDescription()); |
||||
if (($pos = strpos($this->description, '.')) !== false) { |
||||
$this->shortDescription = substr($this->description, 0, $pos); |
||||
} else { |
||||
$this->shortDescription = $this->description; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,40 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\models; |
||||
|
||||
/** |
||||
* Represents API documentation information for a `trait`. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class TraitDoc extends TypeDoc |
||||
{ |
||||
// classes using the trait |
||||
// will be set by Context::updateReferences() |
||||
public $usedBy = []; |
||||
|
||||
public $traits = []; |
||||
|
||||
/** |
||||
* @param \phpDocumentor\Reflection\TraitReflector $reflector |
||||
* @param array $config |
||||
*/ |
||||
public function __construct($reflector = null, $config = []) |
||||
{ |
||||
parent::__construct($reflector, $config); |
||||
|
||||
if ($reflector === null) { |
||||
return; |
||||
} |
||||
|
||||
foreach($reflector->getTraits() as $trait) { |
||||
$this->traits[] = ltrim($trait, '\\'); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,186 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\models; |
||||
|
||||
use phpDocumentor\Reflection\DocBlock\Tag\AuthorTag; |
||||
use yii\base\Exception; |
||||
use yii\helpers\StringHelper; |
||||
|
||||
/** |
||||
* Base class for API documentation information for classes, interfaces and traits. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class TypeDoc extends BaseDoc |
||||
{ |
||||
public $authors = []; |
||||
/** |
||||
* @var MethodDoc[] |
||||
*/ |
||||
public $methods = []; |
||||
/** |
||||
* @var PropertyDoc[] |
||||
*/ |
||||
public $properties = []; |
||||
|
||||
public $namespace; |
||||
|
||||
|
||||
public function findSubject($subjectName) |
||||
{ |
||||
if ($subjectName[0] != '$') { |
||||
foreach($this->methods as $name => $method) { |
||||
if (rtrim($subjectName, '()') == $name) { |
||||
return $method; |
||||
} |
||||
} |
||||
} |
||||
if (substr($subjectName, -2, 2) == '()') { |
||||
return null; |
||||
} |
||||
if ($this->properties === null) { |
||||
return null; |
||||
} |
||||
foreach($this->properties as $name => $property) { |
||||
if (ltrim($subjectName, '$') == ltrim($name, '$')) { |
||||
return $property; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* @return MethodDoc[] |
||||
*/ |
||||
public function getNativeMethods() |
||||
{ |
||||
return $this->getFilteredMethods(null, $this->name); |
||||
} |
||||
|
||||
/** |
||||
* @return MethodDoc[] |
||||
*/ |
||||
public function getPublicMethods() |
||||
{ |
||||
return $this->getFilteredMethods('public'); |
||||
} |
||||
|
||||
/** |
||||
* @return MethodDoc[] |
||||
*/ |
||||
public function getProtectedMethods() |
||||
{ |
||||
return $this->getFilteredMethods('protected'); |
||||
} |
||||
|
||||
/** |
||||
* @param null $visibility |
||||
* @param null $definedBy |
||||
* @return MethodDoc[] |
||||
*/ |
||||
private function getFilteredMethods($visibility = null, $definedBy = null) |
||||
{ |
||||
$methods = []; |
||||
foreach($this->methods as $name => $method) { |
||||
if ($visibility !== null && $method->visibility != $visibility) { |
||||
continue; |
||||
} |
||||
if ($definedBy !== null && $method->definedBy != $definedBy) { |
||||
continue; |
||||
} |
||||
$methods[$name] = $method; |
||||
} |
||||
return $methods; |
||||
} |
||||
|
||||
/** |
||||
* @return PropertyDoc[] |
||||
*/ |
||||
public function getNativeProperties() |
||||
{ |
||||
return $this->getFilteredProperties(null, $this->name); |
||||
} |
||||
|
||||
/** |
||||
* @return PropertyDoc[] |
||||
*/ |
||||
public function getPublicProperties() |
||||
{ |
||||
return $this->getFilteredProperties('public'); |
||||
} |
||||
|
||||
/** |
||||
* @return PropertyDoc[] |
||||
*/ |
||||
public function getProtectedProperties() |
||||
{ |
||||
return $this->getFilteredProperties('protected'); |
||||
} |
||||
|
||||
/** |
||||
* @param null $visibility |
||||
* @param null $definedBy |
||||
* @return PropertyDoc[] |
||||
*/ |
||||
private function getFilteredProperties($visibility = null, $definedBy = null) |
||||
{ |
||||
if ($this->properties === null) { |
||||
return []; |
||||
} |
||||
$properties = []; |
||||
foreach($this->properties as $name => $property) { |
||||
if ($visibility !== null && $property->visibility != $visibility) { |
||||
continue; |
||||
} |
||||
if ($definedBy !== null && $property->definedBy != $definedBy) { |
||||
continue; |
||||
} |
||||
$properties[$name] = $property; |
||||
} |
||||
return $properties; |
||||
} |
||||
|
||||
/** |
||||
* @param \phpDocumentor\Reflection\InterfaceReflector $reflector |
||||
* @param array $config |
||||
*/ |
||||
public function __construct($reflector = null, $config = []) |
||||
{ |
||||
parent::__construct($reflector, $config); |
||||
|
||||
$this->namespace = StringHelper::basename($this->name); |
||||
|
||||
if ($reflector === null) { |
||||
return; |
||||
} |
||||
|
||||
foreach($this->tags as $i => $tag) { |
||||
if ($tag instanceof AuthorTag) { |
||||
$this->authors[$tag->getAuthorName()] = $tag->getAuthorEmail(); |
||||
unset($this->tags[$i]); |
||||
} |
||||
} |
||||
|
||||
foreach($reflector->getProperties() as $propertyReflector) { |
||||
if ($propertyReflector->getVisibility() != 'private') { |
||||
$property = new PropertyDoc($propertyReflector); |
||||
$property->definedBy = $this->name; |
||||
$this->properties[$property->name] = $property; |
||||
} |
||||
} |
||||
|
||||
foreach($reflector->getMethods() as $methodReflector) { |
||||
if ($methodReflector->getVisibility() != 'private') { |
||||
$method = new MethodDoc($methodReflector); |
||||
$method->definedBy = $this->name; |
||||
$this->methods[$method->name] = $method; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,59 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\templates; |
||||
|
||||
use Yii; |
||||
use yii\apidoc\models\ClassDoc; |
||||
use yii\apidoc\models\ConstDoc; |
||||
use yii\apidoc\models\Context; |
||||
use yii\apidoc\models\EventDoc; |
||||
use yii\apidoc\models\InterfaceDoc; |
||||
use yii\apidoc\models\MethodDoc; |
||||
use yii\apidoc\models\PropertyDoc; |
||||
use yii\apidoc\models\TraitDoc; |
||||
use yii\base\Component; |
||||
use yii\console\Controller; |
||||
|
||||
/** |
||||
* Base class for all API documentation renderers |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
abstract class BaseRenderer extends Component |
||||
{ |
||||
/** |
||||
* @var Context the [[Context]] currently being rendered. |
||||
*/ |
||||
public $context; |
||||
|
||||
|
||||
/** |
||||
* 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 abstract function render($context, $controller); |
||||
|
||||
/** |
||||
* creates a link to a type (class, interface or trait) |
||||
* @param ClassDoc|InterfaceDoc|TraitDoc $types |
||||
* @param string $title |
||||
* @return string |
||||
*/ |
||||
public abstract function typeLink($types, $title = null); |
||||
|
||||
/** |
||||
* creates a link to a subject |
||||
* @param PropertyDoc|MethodDoc|ConstDoc|EventDoc $subject |
||||
* @param string $title |
||||
* @return string |
||||
*/ |
||||
public abstract function subjectLink($subject, $title = null); |
||||
} |
@ -0,0 +1,4 @@
|
||||
The html API doc template |
||||
------------------------- |
||||
|
||||
This templates provides view files and a Renderer class that can be reused in other html templates. |
@ -0,0 +1,353 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\templates\html; |
||||
|
||||
use yii\apidoc\helpers\Markdown; |
||||
use yii\apidoc\models\BaseDoc; |
||||
use yii\apidoc\models\ConstDoc; |
||||
use yii\apidoc\models\EventDoc; |
||||
use yii\apidoc\models\MethodDoc; |
||||
use yii\apidoc\models\PropertyDoc; |
||||
use yii\apidoc\models\TypeDoc; |
||||
use yii\apidoc\models\ClassDoc; |
||||
use yii\apidoc\models\Context; |
||||
use yii\apidoc\models\InterfaceDoc; |
||||
use yii\apidoc\models\TraitDoc; |
||||
use yii\apidoc\templates\BaseRenderer; |
||||
use yii\base\ViewContextInterface; |
||||
use yii\console\Controller; |
||||
use yii\helpers\Console; |
||||
use yii\helpers\Html; |
||||
use Yii; |
||||
use yii\web\AssetManager; |
||||
use yii\web\View; |
||||
|
||||
/** |
||||
* The base class for HTML API documentation renderers. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
abstract class Renderer extends BaseRenderer implements ViewContextInterface |
||||
{ |
||||
/** |
||||
* @var string directory to use for output of html files. Can be a path alias. |
||||
*/ |
||||
public $targetDir; |
||||
/** |
||||
* @var string string to use as the title of the generated page. |
||||
*/ |
||||
public $pageTitle = 'Yii Framework 2.0 API Documentation'; |
||||
/** |
||||
* @var string path or alias of the layout file to use. |
||||
*/ |
||||
public $layout; |
||||
/** |
||||
* @var string path or alias of the view file to use for rendering types (classes, interfaces, traits). |
||||
*/ |
||||
public $typeView = '@yii/apidoc/templates/html/views/type.php'; |
||||
/** |
||||
* @var string path or alias of the view file to use for rendering the index page. |
||||
*/ |
||||
public $indexView = '@yii/apidoc/templates/html/views/index.php'; |
||||
/** |
||||
* @var View |
||||
*/ |
||||
private $_view; |
||||
|
||||
|
||||
public function init() |
||||
{ |
||||
Markdown::$renderer = $this; |
||||
} |
||||
|
||||
/** |
||||
* @return View the view instance |
||||
*/ |
||||
public function getView() |
||||
{ |
||||
if ($this->_view === null) { |
||||
$this->_view = new View(); |
||||
$assetPath = Yii::getAlias($this->targetDir) . '/assets'; |
||||
if (!is_dir($assetPath)) { |
||||
mkdir($assetPath); |
||||
} |
||||
$this->_view->assetManager = new AssetManager([ |
||||
'basePath' => $assetPath, |
||||
'baseUrl' => './assets', |
||||
]); |
||||
} |
||||
return $this->_view; |
||||
} |
||||
|
||||
/** |
||||
* 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 render($context, $controller) |
||||
{ |
||||
$this->context = $context; |
||||
$dir = Yii::getAlias($this->targetDir); |
||||
if (!is_dir($dir)) { |
||||
mkdir($dir); |
||||
} |
||||
|
||||
$types = array_merge($context->classes, $context->interfaces, $context->traits); |
||||
$typeCount = count($types) + 1; |
||||
Console::startProgress(0, $typeCount, 'Rendering files: ', false); |
||||
$done = 0; |
||||
foreach($types as $type) { |
||||
$fileContent = $this->renderWithLayout($this->typeView, [ |
||||
'type' => $type, |
||||
'docContext' => $context, |
||||
]); |
||||
file_put_contents($dir . '/' . $this->generateFileName($type->name), $fileContent); |
||||
Console::updateProgress(++$done, $typeCount); |
||||
} |
||||
$indexFileContent = $this->renderWithLayout($this->indexView, [ |
||||
'docContext' => $context, |
||||
'types' => $types, |
||||
]); |
||||
file_put_contents($dir . '/index.html', $indexFileContent); |
||||
Console::updateProgress(++$done, $typeCount); |
||||
Console::endProgress(true); |
||||
$controller->stdout('done.' . PHP_EOL, Console::FG_GREEN); |
||||
} |
||||
|
||||
protected function renderWithLayout($viewFile, $params) |
||||
{ |
||||
$output = $this->getView()->render($viewFile, $params, $this); |
||||
if ($this->layout !== false) { |
||||
$params['content'] = $output; |
||||
return $this->getView()->renderFile($this->layout, $params, $this); |
||||
} else { |
||||
return $output; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* creates a link to a type (class, interface or trait) |
||||
* @param ClassDoc|InterfaceDoc|TraitDoc $types |
||||
* @param BaseDoc $context |
||||
* @return string |
||||
*/ |
||||
public function typeLink($types, $context = null) |
||||
{ |
||||
if (!is_array($types)) { |
||||
$types = [$types]; |
||||
} |
||||
$links = []; |
||||
foreach($types as $type) { |
||||
$postfix = ''; |
||||
if (!is_object($type)) { |
||||
if (substr($type, -2, 2) == '[]') { |
||||
$postfix = '[]'; |
||||
$type = substr($type, 0, -2); |
||||
} |
||||
|
||||
if (($t = $this->context->getType(ltrim($type, '\\'))) !== null) { |
||||
$type = $t; |
||||
} elseif ($type[0] !== '\\' && ($t = $this->context->getType($this->resolveNamespace($context) . '\\' . ltrim($type, '\\'))) !== null) { |
||||
$type = $t; |
||||
} else { |
||||
ltrim($type, '\\'); |
||||
} |
||||
} |
||||
if (!is_object($type)) { |
||||
$links[] = $type; |
||||
} else { |
||||
$links[] = Html::a( |
||||
$type->name, |
||||
null, |
||||
['href' => $this->generateFileName($type->name)] |
||||
) . $postfix; |
||||
} |
||||
} |
||||
return implode('|', $links); |
||||
} |
||||
|
||||
/** |
||||
* creates a link to a subject |
||||
* @param PropertyDoc|MethodDoc|ConstDoc|EventDoc $subject |
||||
* @param string $title |
||||
* @return string |
||||
*/ |
||||
public function subjectLink($subject, $title = null) |
||||
{ |
||||
if ($title === null) { |
||||
if ($subject instanceof MethodDoc) { |
||||
$title = $subject->name . '()'; |
||||
} else { |
||||
$title = $subject->name; |
||||
} |
||||
} |
||||
if (($type = $this->context->getType($subject->definedBy)) === null) { |
||||
return $subject->name; |
||||
} else { |
||||
$link = $this->generateFileName($type->name); |
||||
if ($subject instanceof MethodDoc) { |
||||
$link .= '#' . $subject->name . '()'; |
||||
} else { |
||||
$link .= '#' . $subject->name; |
||||
} |
||||
$link .= '-detail'; |
||||
return Html::a($title, null, ['href' => $link]); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* @param BaseDoc $context |
||||
*/ |
||||
private function resolveNamespace($context) |
||||
{ |
||||
// TODO use phpdoc Context for this |
||||
if ($context === null) { |
||||
return ''; |
||||
} |
||||
if ($context instanceof TypeDoc) { |
||||
return $context->namespace; |
||||
} |
||||
if ($context->hasProperty('definedBy')) { |
||||
$type = $this->context->getType($context); |
||||
if ($type !== null) { |
||||
return $type->namespace; |
||||
} |
||||
} |
||||
return ''; |
||||
} |
||||
|
||||
/** |
||||
* @param ClassDoc $class |
||||
* @return string |
||||
*/ |
||||
public function renderInheritance($class) |
||||
{ |
||||
$parents[] = $this->typeLink($class); |
||||
while ($class->parentClass !== null) { |
||||
if(isset($this->context->classes[$class->parentClass])) { |
||||
$class = $this->context->classes[$class->parentClass]; |
||||
$parents[] = $this->typeLink($class); |
||||
} else { |
||||
$parents[] = $class->parentClass; // TODO link to php.net |
||||
break; |
||||
} |
||||
} |
||||
return implode(" »\n",$parents); |
||||
} |
||||
|
||||
/** |
||||
* @param array $names |
||||
* @return string |
||||
*/ |
||||
public function renderInterfaces($names) |
||||
{ |
||||
$interfaces = []; |
||||
sort($names, SORT_STRING); |
||||
foreach($names as $interface) { |
||||
if(isset($this->context->interfaces[$interface])) { |
||||
$interfaces[] = $this->typeLink($this->context->interfaces[$interface]); |
||||
} else { |
||||
$interfaces[] = $interface; // TODO link to php.net |
||||
} |
||||
} |
||||
return implode(', ',$interfaces); |
||||
} |
||||
|
||||
/** |
||||
* @param array $names |
||||
* @return string |
||||
*/ |
||||
public function renderTraits($names) |
||||
{ |
||||
$traits = []; |
||||
sort($names, SORT_STRING); |
||||
foreach($names as $trait) { |
||||
if(isset($this->context->traits[$trait])) { |
||||
$traits[] = $this->typeLink($this->context->traits[$trait]); |
||||
} else { |
||||
$traits[] = $trait; // TODO link to php.net |
||||
} |
||||
} |
||||
return implode(', ',$traits); |
||||
} |
||||
|
||||
/** |
||||
* @param array $names |
||||
* @return string |
||||
*/ |
||||
public function renderClasses($names) |
||||
{ |
||||
$classes = []; |
||||
sort($names, SORT_STRING); |
||||
foreach($names as $class) { |
||||
if(isset($this->context->classes[$class])) { |
||||
$classes[] = $this->typeLink($this->context->classes[$class]); |
||||
} else { |
||||
$classes[] = $class; // TODO link to php.net |
||||
} |
||||
} |
||||
return implode(', ',$classes); |
||||
} |
||||
|
||||
/** |
||||
* @param PropertyDoc $property |
||||
* @return string |
||||
*/ |
||||
public function renderPropertySignature($property) |
||||
{ |
||||
if ($property->getter !== null || $property->setter !== null) { |
||||
$sig = []; |
||||
if ($property->getter !== null) { |
||||
$sig[] = $this->renderMethodSignature($property->getter); |
||||
} |
||||
if ($property->setter !== null) { |
||||
$sig[] = $this->renderMethodSignature($property->setter); |
||||
} |
||||
return implode('<br />', $sig); |
||||
} |
||||
return $this->typeLink($property->types) . ' ' . $property->name . ' = ' . ($property->defaultValue === null ? 'null' : $property->defaultValue); |
||||
} |
||||
|
||||
/** |
||||
* @param MethodDoc $method |
||||
* @return string |
||||
*/ |
||||
public function renderMethodSignature($method) |
||||
{ |
||||
$params = []; |
||||
foreach($method->params as $param) { |
||||
$params[] = (empty($param->typeHint) ? '' : $param->typeHint . ' ') |
||||
. ($param->isPassedByReference ? '<b>&</b>' : '') |
||||
. $param->name |
||||
. ($param->isOptional ? ' = ' . $param->defaultValue : ''); |
||||
} |
||||
|
||||
return ($method->isReturnByReference ? '<b>&</b>' : '') |
||||
. ($method->returnType === null ? 'void' : $this->typeLink($method->returnTypes)) |
||||
. ' ' . $this->subjectLink($method, $method->name) . '( ' |
||||
. implode(', ', $params) |
||||
. ' )'; |
||||
} |
||||
|
||||
protected function generateFileName($typeName) |
||||
{ |
||||
return strtolower(str_replace('\\', '_', $typeName)) . '.html'; |
||||
} |
||||
|
||||
/** |
||||
* Finds the view file corresponding to the specified relative view name. |
||||
* @param string $view a relative view name. The name does NOT start with a slash. |
||||
* @return string the view file path. Note that the file may not exist. |
||||
*/ |
||||
public function findViewFile($view) |
||||
{ |
||||
return Yii::getAlias('@yii/apidoc/templates/html/views/' . $view); |
||||
} |
||||
} |
@ -0,0 +1,36 @@
|
||||
<?php |
||||
|
||||
use yii\apidoc\helpers\Markdown; |
||||
use yii\apidoc\models\ClassDoc; |
||||
/** |
||||
* @var ClassDoc $type |
||||
* @var yii\web\View $this |
||||
*/ |
||||
|
||||
if (empty($type->constants)) { |
||||
return; |
||||
} ?> |
||||
<div class="summary docConst"> |
||||
<h2>Constants</h2> |
||||
|
||||
<p><a href="#" class="toggle">Hide inherited constants</a></p> |
||||
|
||||
<table class="summaryTable"> |
||||
<colgroup> |
||||
<col class="col-const" /> |
||||
<col class="col-description" /> |
||||
<col class="col-defined" /> |
||||
</colgroup> |
||||
<tr> |
||||
<th>Constant</th><th>Value</th><th>Description</th><th>Defined By</th> |
||||
</tr> |
||||
<?php foreach($type->constants as $constant): ?> |
||||
<tr<?= $constant->definedBy != $type->name ? ' class="inherited"' : '' ?> id="<?= $constant->name ?>">
|
||||
<td><?= $constant->name ?></td>
|
||||
<td><?= $constant->value ?></td>
|
||||
<td><?= Markdown::process($constant->shortDescription . "\n" . $constant->description, $type) ?></td>
|
||||
<td><?= $this->context->typeLink($constant->definedBy) ?></td>
|
||||
</tr> |
||||
<?php endforeach; ?> |
||||
</table> |
||||
</div> |
@ -0,0 +1,35 @@
|
||||
<?php |
||||
|
||||
use yii\apidoc\helpers\Markdown; |
||||
use yii\apidoc\models\ClassDoc; |
||||
/** |
||||
* @var ClassDoc $type |
||||
* @var yii\web\View $this |
||||
*/ |
||||
|
||||
$events = $type->getNativeEvents(); |
||||
if (empty($events)) { |
||||
return; |
||||
} ?> |
||||
<h2>Event Details</h2> |
||||
<?php foreach($events as $event): ?> |
||||
<div class="detailHeader" id="<?= $event->name.'-detail' ?>">
|
||||
<?php echo $event->name; ?> |
||||
<span class="detailHeaderTag"> |
||||
event |
||||
<?php if(!empty($event->since)): ?> |
||||
(available since version <?= $event->since ?>)
|
||||
<?php endif; ?> |
||||
</span> |
||||
</div> |
||||
|
||||
<?php /* |
||||
<div class="signature"> |
||||
<?php echo $event->trigger->signature; ?> |
||||
</div>*/ ?> |
||||
|
||||
<p><?= Markdown::process($event->description, $type); ?></p>
|
||||
|
||||
<?= $this->render('seeAlso', ['object' => $event]); ?> |
||||
|
||||
<?php endforeach; ?> |
@ -0,0 +1,41 @@
|
||||
<?php |
||||
|
||||
use yii\apidoc\helpers\Markdown; |
||||
use yii\apidoc\models\ClassDoc; |
||||
/** |
||||
* @var ClassDoc $type |
||||
* @var yii\web\View $this |
||||
*/ |
||||
|
||||
if (empty($type->events)) { |
||||
return; |
||||
} ?> |
||||
<div class="summary docEvent"> |
||||
<h2>Events</h2> |
||||
|
||||
<p><a href="#" class="toggle">Hide inherited events</a></p> |
||||
|
||||
<table class="summaryTable"> |
||||
<colgroup> |
||||
<col class="col-event" /> |
||||
<col class="col-description" /> |
||||
<col class="col-defined" /> |
||||
</colgroup> |
||||
<tr> |
||||
<th>Event</th><th>Type</th><th>Description</th><th>Defined By</th> |
||||
</tr> |
||||
<?php foreach($type->events as $event): ?> |
||||
<tr<?= $event->definedBy != $type->name ? ' class="inherited"' : '' ?> id="<?= $event->name ?>">
|
||||
<td><?= $this->context->subjectLink($event) ?></td>
|
||||
<td><?= $this->context->typeLink($event->types) ?></td>
|
||||
<td> |
||||
<?= Markdown::process($event->shortDescription, $type) ?> |
||||
<?php if(!empty($event->since)): ?> |
||||
(available since version <?php echo $event->since; ?>)
|
||||
<?php endif; ?> |
||||
</td> |
||||
<td><?= $this->context->typeLink($event->definedBy) ?></td>
|
||||
</tr> |
||||
<?php endforeach; ?> |
||||
</table> |
||||
</div> |
@ -0,0 +1,67 @@
|
||||
<?php |
||||
|
||||
use yii\apidoc\helpers\Markdown; |
||||
use yii\apidoc\models\ClassDoc; |
||||
use yii\apidoc\models\TraitDoc; |
||||
/** |
||||
* @var ClassDoc|TraitDoc $type |
||||
* @var yii\web\View $this |
||||
*/ |
||||
|
||||
$methods = $type->getNativeMethods(); |
||||
if (empty($methods)) { |
||||
return; |
||||
} ?> |
||||
<h2>Method Details</h2> |
||||
|
||||
<?php foreach($methods as $method): ?> |
||||
|
||||
<div class="detailHeader" id="<?= $method->name . '()-detail' ?>">
|
||||
<?= $method->name ?>()
|
||||
<span class="detailHeaderTag"> |
||||
method |
||||
<?php if (!empty($method->since)): ?> |
||||
(available since version <?php echo $method->since; ?>)
|
||||
<?php endif; ?> |
||||
</span> |
||||
</div> |
||||
|
||||
<table class="summaryTable"> |
||||
<tr><td colspan="3"> |
||||
<div class="signature2"> |
||||
<?= $this->context->renderMethodSignature($method) ?> |
||||
</div> |
||||
</td></tr> |
||||
<?php if(!empty($method->params) || !empty($method->return) || !empty($method->exceptions)): ?> |
||||
<?php foreach($method->params as $param): ?> |
||||
<tr> |
||||
<td class="paramNameCol"><?= $param->name ?></td>
|
||||
<td class="paramTypeCol"><?= $this->context->typeLink($param->types) ?></td>
|
||||
<td class="paramDescCol"><?= Markdown::process($param->description, $type) ?></td>
|
||||
</tr> |
||||
<?php endforeach; ?> |
||||
<?php if(!empty($method->return)): ?> |
||||
<tr> |
||||
<td class="paramNameCol"><?= 'return'; ?></td>
|
||||
<td class="paramTypeCol"><?= $this->context->typeLink($method->returnTypes); ?></td>
|
||||
<td class="paramDescCol"><?= Markdown::process($method->return, $type); ?></td>
|
||||
</tr> |
||||
<?php endif; ?> |
||||
<?php foreach($method->exceptions as $exception => $description): ?> |
||||
<tr> |
||||
<td class="paramNameCol"><?= 'throws' ?></td>
|
||||
<td class="paramTypeCol"><?= $this->context->typeLink($exception) ?></td>
|
||||
<td class="paramDescCol"><?= Markdown::process($description, $type) ?></td>
|
||||
</tr> |
||||
<?php endforeach; ?> |
||||
<?php endif; ?> |
||||
</table> |
||||
|
||||
<!-- --><?php //$this->renderPartial('sourceCode',array('object'=>$method)); ?>
|
||||
|
||||
<p><?= Markdown::process($method->shortDescription, $type) ?></strong></p>
|
||||
<p><?= Markdown::process($method->description, $type) ?></p>
|
||||
|
||||
<?= $this->render('seeAlso', ['object' => $method]); ?> |
||||
|
||||
<?php endforeach; ?> |
@ -0,0 +1,41 @@
|
||||
<?php |
||||
|
||||
use yii\apidoc\helpers\Markdown; |
||||
use yii\apidoc\models\ClassDoc; |
||||
use yii\apidoc\models\InterfaceDoc; |
||||
use yii\apidoc\models\TraitDoc; |
||||
/** |
||||
* @var ClassDoc|InterfaceDoc|TraitDoc $type |
||||
* @var boolean $protected |
||||
* @var yii\web\View $this |
||||
*/ |
||||
|
||||
if ($protected && count($type->getProtectedMethods()) == 0 || !$protected && count($type->getPublicMethods()) == 0) { |
||||
return; |
||||
} ?> |
||||
|
||||
<div class="summary docMethod"> |
||||
<h2><?= $protected ? 'Protected Methods' : 'Public Methods' ?></h2>
|
||||
|
||||
<p><a href="#" class="toggle">Hide inherited methods</a></p> |
||||
|
||||
<table class="summaryTable"> |
||||
<colgroup> |
||||
<col class="col-method" /> |
||||
<col class="col-description" /> |
||||
<col class="col-defined" /> |
||||
</colgroup> |
||||
<tr> |
||||
<th>Method</th><th>Description</th><th>Defined By</th> |
||||
</tr> |
||||
<?php foreach($type->methods as $method): ?> |
||||
<?php if($protected && $method->visibility == 'protected' || !$protected && $method->visibility != 'protected'): ?> |
||||
<tr<?= $method->definedBy != $type->name ? ' class="inherited"' : '' ?> id="<?= $method->name ?>()">
|
||||
<td><?= $this->context->subjectLink($method, $method->name.'()') ?></td>
|
||||
<td><?= Markdown::process($method->shortDescription, $type) ?></td>
|
||||
<td><?= $this->context->typeLink($method->definedBy, $type) ?></td>
|
||||
</tr> |
||||
<?php endif; ?> |
||||
<?php endforeach; ?> |
||||
</table> |
||||
</div> |
@ -0,0 +1,39 @@
|
||||
<?php |
||||
|
||||
use yii\apidoc\helpers\Markdown; |
||||
use yii\apidoc\models\ClassDoc; |
||||
use yii\apidoc\models\TraitDoc; |
||||
/** |
||||
* @var ClassDoc|TraitDoc $type |
||||
* @var yii\web\View $this |
||||
*/ |
||||
|
||||
$properties = $type->getNativeProperties(); |
||||
if (empty($properties)) { |
||||
return; |
||||
} ?> |
||||
<h2>Property Details</h2> |
||||
|
||||
<?php foreach($properties as $property): ?> |
||||
|
||||
<div class="detailHeader" id="<?= $property->name.'-detail' ?>">
|
||||
<?php echo $property->name; ?> |
||||
<span class="detailHeaderTag"> |
||||
property |
||||
<?php if($property->getIsReadOnly()) echo ' <em>read-only</em> '; ?> |
||||
<?php if($property->getIsWriteOnly()) echo ' <em>write-only</em> '; ?> |
||||
<?php if(!empty($property->since)): ?> |
||||
(available since version <?php echo $property->since; ?>)
|
||||
<?php endif; ?> |
||||
</span> |
||||
</div> |
||||
|
||||
<div class="signature"> |
||||
<?php echo $this->context->renderPropertySignature($property); ?> |
||||
</div> |
||||
|
||||
<p><?= Markdown::process($property->description, $type) ?></p>
|
||||
|
||||
<?= $this->render('seeAlso', ['object' => $property]); ?> |
||||
|
||||
<?php endforeach; ?> |
@ -0,0 +1,42 @@
|
||||
<?php |
||||
|
||||
use yii\apidoc\helpers\Markdown; |
||||
use yii\apidoc\models\ClassDoc; |
||||
use yii\apidoc\models\TraitDoc; |
||||
/** |
||||
* @var ClassDoc|TraitDoc $type |
||||
* @var boolean $protected |
||||
* @var yii\web\View $this |
||||
*/ |
||||
|
||||
if ($protected && count($type->getProtectedProperties()) == 0 || !$protected && count($type->getPublicProperties()) == 0) { |
||||
return; |
||||
} ?> |
||||
|
||||
<div class="summary docProperty"> |
||||
<h2><?= $protected ? 'Protected Properties' : 'Public Properties' ?></h2>
|
||||
|
||||
<p><a href="#" class="toggle">Hide inherited properties</a></p> |
||||
|
||||
<table class="summaryTable"> |
||||
<colgroup> |
||||
<col class="col-property" /> |
||||
<col class="col-type" /> |
||||
<col class="col-description" /> |
||||
<col class="col-defined" /> |
||||
</colgroup> |
||||
<tr> |
||||
<th>Property</th><th>Type</th><th>Description</th><th>Defined By</th> |
||||
</tr> |
||||
<?php foreach($type->properties as $property): ?> |
||||
<?php if($protected && $property->visibility == 'protected' || !$protected && $property->visibility != 'protected'): ?> |
||||
<tr<?= $property->definedBy != $type->name ? ' class="inherited"' : '' ?> id="<?= $property->name ?>">
|
||||
<td><?= $this->context->subjectLink($property) ?></td>
|
||||
<td><?= $this->context->typeLink($property->types) ?></td>
|
||||
<td><?= Markdown::process($property->shortDescription, $type) ?></td>
|
||||
<td><?= $this->context->typeLink($property->definedBy) ?></td>
|
||||
</tr> |
||||
<?php endif; ?> |
||||
<?php endforeach; ?> |
||||
</table> |
||||
</div> |
@ -0,0 +1,31 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* @var yii\apidoc\models\BaseDoc $object |
||||
* @var yii\web\View $this |
||||
*/ |
||||
|
||||
$see = []; |
||||
foreach($object->tags as $tag) { |
||||
/** @var $tag phpDocumentor\Reflection\DocBlock\Tag\SeeTag */ |
||||
if (get_class($tag) == 'phpDocumentor\Reflection\DocBlock\Tag\SeeTag') { |
||||
$ref = $tag->getReference(); |
||||
if (strpos($ref, '://') === false) { |
||||
$see[] = '[[' . $ref . ']]'; |
||||
} else { |
||||
$see[] = $ref; |
||||
} |
||||
} |
||||
} |
||||
if (empty($see)) { |
||||
return; |
||||
} |
||||
?> |
||||
<div class="SeeAlso"> |
||||
<h4>See Also</h4> |
||||
<ul> |
||||
<?php foreach($see as $ref): ?> |
||||
<li><?= \yii\apidoc\helpers\Markdown::process($ref, $this->context->context->getType($object->definedBy)) ?></li>
|
||||
<?php endforeach; ?> |
||||
</ul> |
||||
</div> |
@ -0,0 +1,102 @@
|
||||
<?php |
||||
|
||||
use yii\apidoc\helpers\Markdown; |
||||
use yii\apidoc\models\ClassDoc; |
||||
use yii\apidoc\models\InterfaceDoc; |
||||
use yii\apidoc\models\TraitDoc; |
||||
/** |
||||
* @var ClassDoc|InterfaceDoc|TraitDoc $type |
||||
* @var yii\web\View $this |
||||
* @var \yii\apidoc\templates\html\Renderer $renderer |
||||
*/ |
||||
|
||||
$renderer = $this->context; |
||||
?> |
||||
<h1><?php |
||||
if ($type instanceof InterfaceDoc) { |
||||
echo 'Interface '; |
||||
} elseif ($type instanceof TraitDoc) { |
||||
echo 'Trait '; |
||||
} else { |
||||
if ($type->isFinal) { |
||||
echo 'Final '; |
||||
} |
||||
if ($type->isAbstract) { |
||||
echo 'Abstract '; |
||||
} |
||||
echo 'Class '; |
||||
} |
||||
echo $type->name; |
||||
?></h1> |
||||
<div id="nav"> |
||||
<a href="index.html">All Classes</a> |
||||
<?php if(!($type instanceof InterfaceDoc) && !empty($type->properties)): ?> |
||||
| <a href="#properties">Properties</a> |
||||
<?php endif; ?> |
||||
<?php if(!empty($type->methods)): ?> |
||||
| <a href="#methods">Methods</a> |
||||
<?php endif; ?> |
||||
<?php if($type instanceof ClassDoc && !empty($type->events)): ?> |
||||
| <a href="#events">Events</a> |
||||
<?php endif; ?> |
||||
<?php if($type instanceof ClassDoc && !empty($type->constants)): ?> |
||||
| <a href="#constants">Constants</a> |
||||
<?php endif; ?> |
||||
</div> |
||||
|
||||
<table class="summaryTable docClass"> |
||||
<colgroup> |
||||
<col class="col-name" /> |
||||
<col class="col-value" /> |
||||
</colgroup> |
||||
<?php if ($type instanceof ClassDoc): ?> |
||||
<tr><th>Inheritance</th><td><?= $renderer->renderInheritance($type) ?></td></tr>
|
||||
<?php endif; ?> |
||||
<?php if ($type instanceof ClassDoc && !empty($type->interfaces)): ?> |
||||
<tr><th>Implements</th><td><?= $renderer->renderInterfaces($type->interfaces) ?></td></tr>
|
||||
<?php endif; ?> |
||||
<?php if(!($type instanceof InterfaceDoc) && !empty($type->traits)): ?> |
||||
<tr><th>Uses Traits</th><td><?= $renderer->renderTraits($type->traits) ?></td></tr>
|
||||
<?php endif; ?> |
||||
<?php if($type instanceof ClassDoc && !empty($type->subclasses)): ?> |
||||
<tr><th>Subclasses</th><td><?= $renderer->renderClasses($type->subclasses) ?></td></tr>
|
||||
<?php endif; ?> |
||||
<?php if ($type instanceof InterfaceDoc && !empty($type->implementedBy)): ?> |
||||
<tr><th>Implemented by</th><td><?= $renderer->renderClasses($type->implementedBy) ?></td></tr>
|
||||
<?php endif; ?> |
||||
<?php if ($type instanceof TraitDoc && !empty($type->usedBy)): ?> |
||||
<tr><th>Implemented by</th><td><?= $renderer->renderClasses($type->usedBy) ?></td></tr>
|
||||
<?php endif; ?> |
||||
<?php if(!empty($type->since)): ?> |
||||
<tr><th>Available since version</th><td><?= $type->since ?></td></tr>
|
||||
<?php endif; ?> |
||||
<tr> |
||||
<th>Source Code</th> |
||||
<td><?php // TODO echo $this->renderSourceLink($type->sourcePath) ?></td>
|
||||
</tr> |
||||
</table> |
||||
|
||||
<div id="classDescription"> |
||||
<strong><?= Markdown::process($type->shortDescription, $type) ?></strong>
|
||||
<p><?= Markdown::process($type->description, $type) ?></p>
|
||||
</div> |
||||
|
||||
<a name="properties"></a> |
||||
<?= $this->render('@yii/apidoc/templates/html/views/propertySummary', ['type' => $type,'protected' => false]) ?> |
||||
<?= $this->render('@yii/apidoc/templates/html/views/propertySummary', ['type' => $type,'protected' => true]) ?> |
||||
|
||||
<a name="methods"></a> |
||||
<?= $this->render('@yii/apidoc/templates/html/views/methodSummary', ['type' => $type, 'protected' => false]) ?> |
||||
<?= $this->render('@yii/apidoc/templates/html/views/methodSummary', ['type' => $type, 'protected' => true]) ?> |
||||
|
||||
<a name="events"></a> |
||||
<?= $this->render('@yii/apidoc/templates/html/views/eventSummary', ['type' => $type]) ?> |
||||
|
||||
<a name="constants"></a> |
||||
<?= $this->render('@yii/apidoc/templates/html/views/constSummary', ['type' => $type]) ?> |
||||
|
||||
<?= $this->render('@yii/apidoc/templates/html/views/propertyDetails', ['type' => $type]) ?> |
||||
<?= $this->render('@yii/apidoc/templates/html/views/methodDetails', ['type' => $type]) ?> |
||||
<?php if($type instanceof ClassDoc): ?> |
||||
<?= $this->render('@yii/apidoc/templates/html/views/eventDetails', ['type' => $type]) ?> |
||||
<?php endif; ?> |
@ -0,0 +1,26 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\templates\offline; |
||||
use yii\apidoc\models\Context; |
||||
use yii\console\Controller; |
||||
use Yii; |
||||
use yii\helpers\Console; |
||||
use yii\helpers\FileHelper; |
||||
|
||||
/** |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class Renderer extends \yii\apidoc\templates\html\Renderer |
||||
{ |
||||
public $layout = '@yii/apidoc/templates/offline/views/offline.php'; |
||||
public $indexView = '@yii/apidoc/templates/offline/views/index.php'; |
||||
|
||||
public $pageTitle = 'Yii Framework 2.0 API Documentation'; |
||||
} |
@ -0,0 +1,31 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\apidoc\templates\offline\assets; |
||||
use yii\web\JqueryAsset; |
||||
use yii\web\View; |
||||
|
||||
/** |
||||
* The asset bundle for the offline template. |
||||
* |
||||
* @author Carsten Brandt <mail@cebe.cc> |
||||
* @since 2.0 |
||||
*/ |
||||
class AssetBundle extends \yii\web\AssetBundle |
||||
{ |
||||
public $sourcePath = '@yii/apidoc/templates/offline/assets/css'; |
||||
public $css = [ |
||||
'api.css', |
||||
'style.css', |
||||
]; |
||||
public $depends = [ |
||||
'yii\web\JqueryAsset', |
||||
]; |
||||
public $jsOptions = [ |
||||
'position' => View::POS_HEAD, |
||||
]; |
||||
} |
@ -0,0 +1,111 @@
|
||||
pre { |
||||
color: #000000; |
||||
background-color: #FFF5E6; |
||||
font-family: "courier new", "times new roman", monospace; |
||||
line-height: 1.3em; |
||||
/* Put a nice border around it. */ |
||||
padding: 1px; |
||||
width: 90%; |
||||
/* Don't wrap its contents, and show scrollbars. */ |
||||
/* white-space: nowrap;*/ |
||||
overflow: auto; |
||||
/* Stop after about 24 lines, and just show a scrollbar. */ |
||||
/* max-height: 24em; */ |
||||
margin: 5px; |
||||
padding-left: 20px; |
||||
border: 1px solid #FFE6BF; |
||||
border-left: 6px solid #FFE6BF; |
||||
} |
||||
|
||||
code { |
||||
color: #000000; |
||||
background-color: #FFF5E6; |
||||
padding: 1px; |
||||
} |
||||
|
||||
div.code { |
||||
display: none; |
||||
color: #000000; |
||||
background-color: #FFF5E6; |
||||
font-family: "courier new", "times new roman", monospace; |
||||
line-height: 1.3em; |
||||
/* Put a nice border around it. */ |
||||
padding: 1px; |
||||
width: 90%; |
||||
/* Don't wrap its contents, and show scrollbars. */ |
||||
/* white-space: nowrap;*/ |
||||
overflow: auto; |
||||
/* Stop after about 24 lines, and just show a scrollbar. */ |
||||
/* max-height: 24em; */ |
||||
margin: 5px; |
||||
padding-left: 20px; |
||||
border-left: 6px solid #FFE6BF; |
||||
} |
||||
|
||||
table.summaryTable { |
||||
background: #E6ECFF; |
||||
border-collapse: collapse; |
||||
width: 100%; |
||||
} |
||||
|
||||
table.summaryTable th, table.summaryTable td { |
||||
border: 1px #BFCFFF solid; |
||||
padding: 0.2em; |
||||
} |
||||
|
||||
table.summaryTable th { |
||||
background: #CCD9FF; |
||||
text-align: left; |
||||
} |
||||
|
||||
#nav { |
||||
padding: 3px; |
||||
margin: 0 0 10px 0; |
||||
border-top: 1px #BFCFFF solid; |
||||
} |
||||
|
||||
#classDescription { |
||||
padding: 5px; |
||||
margin: 10px 0 20px 0; |
||||
border-bottom: 1px solid #BFCFFF; |
||||
} |
||||
|
||||
.detailHeader { |
||||
font-weight: bold; |
||||
font-size: 12pt; |
||||
margin: 30px 0 5px 0; |
||||
border-bottom: 1px solid #BFCFFF; |
||||
} |
||||
|
||||
.detailHeaderTag { |
||||
font-weight: normal; |
||||
font-size: 10pt; |
||||
} |
||||
|
||||
.signature, .signature2 { |
||||
padding: 3px; |
||||
color: #000000; |
||||
font-family: "courier new", "times new roman", monospace; |
||||
line-height: 1.3em; |
||||
} |
||||
|
||||
.signature { |
||||
margin: 10px 0 10px 0; |
||||
background: #E6ECFF; |
||||
border: 1px #BFCFFF solid; |
||||
} |
||||
|
||||
.paramNameCol { |
||||
width: 12%; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.paramTypeCol { |
||||
width: 12%; |
||||
} |
||||
|
||||
.sourceCode { |
||||
margin: 5px 0; |
||||
padding:5px; |
||||
background:#FFF5E6; |
||||
} |
@ -0,0 +1,32 @@
|
||||
body |
||||
{ |
||||
} |
||||
|
||||
body, div, span, p, input |
||||
{ |
||||
font-family: Verdana, Arial, sans-serif; |
||||
font-size: 10pt; |
||||
color: #333333; |
||||
} |
||||
|
||||
#apiPage { |
||||
} |
||||
|
||||
#apiHeader { |
||||
padding: 3px; |
||||
color: white; |
||||
background: #6078BF; |
||||
margin-bottom: 5px; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
#apiHeader a { |
||||
color: white; |
||||
} |
||||
|
||||
#apiFooter { |
||||
margin-top: 5px; |
||||
padding: 3px; |
||||
border-top: 1px solid #BFCFFF; |
||||
text-align: center; |
||||
} |
@ -0,0 +1,30 @@
|
||||
<?php |
||||
|
||||
use yii\apidoc\models\ClassDoc; |
||||
use yii\apidoc\models\InterfaceDoc; |
||||
use yii\apidoc\models\TraitDoc; |
||||
/** |
||||
* @var ClassDoc[]|InterfaceDoc[]|TraitDoc[] $types |
||||
* @var yii\web\View $this |
||||
*/ |
||||
|
||||
?><h1>Class Reference</h1> |
||||
|
||||
<table class="summaryTable docIndex"> |
||||
<colgroup> |
||||
<col class="col-package" /> |
||||
<col class="col-class" /> |
||||
<col class="col-description" /> |
||||
</colgroup> |
||||
<tr> |
||||
<th>Class</th><th>Description</th> |
||||
</tr> |
||||
<?php |
||||
ksort($types); |
||||
foreach($types as $i=>$class): ?> |
||||
<tr> |
||||
<td><?php echo $this->context->typeLink($class, $class->name); ?></td>
|
||||
<td><?php echo $class->shortDescription; ?></td>
|
||||
</tr> |
||||
<?php endforeach; ?> |
||||
</table> |
@ -0,0 +1,71 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* @var yii\web\View $this |
||||
*/ |
||||
|
||||
\yii\apidoc\templates\offline\assets\AssetBundle::register($this); |
||||
|
||||
$this->beginPage(); |
||||
?> |
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
||||
<head> |
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
||||
<meta name="language" content="en" /> |
||||
<?php $this->head(); ?> |
||||
<title><?php echo $this->context->pageTitle; ?></title>
|
||||
</head> |
||||
|
||||
<body> |
||||
<?php $this->beginBody(); ?> |
||||
<div id="apiPage"> |
||||
|
||||
<div id="apiHeader"> |
||||
<a href="http://www.yiiframework.com">Yii Framework</a> v<?php echo Yii::getVersion(); ?> Class Reference
|
||||
</div><!-- end of header --> |
||||
|
||||
<div id="content"> |
||||
<?php echo $content; ?> |
||||
</div><!-- end of content --> |
||||
|
||||
<div id="apiFooter"> |
||||
© 2008-2013 by <a href="http://www.yiisoft.com">Yii Software LLC</a><br/> |
||||
All Rights Reserved.<br/> |
||||
</div><!-- end of footer --> |
||||
|
||||
<script type="text/javascript"> |
||||
/*<![CDATA[*/ |
||||
$("a.toggle").on('click', function() { |
||||
var $this = $(this); |
||||
if ($this.hasClass('properties-hidden')) { |
||||
$this.text($this.text().replace(/Show/,'Hide')); |
||||
$this.parents(".summary").find(".inherited").show(); |
||||
$this.removeClass('properties-hidden'); |
||||
} else { |
||||
$this.text($this.text().replace(/Hide/,'Show')); |
||||
$this.parents(".summary").find(".inherited").hide(); |
||||
$this.addClass('properties-hidden'); |
||||
} |
||||
return false; |
||||
}); |
||||
/* |
||||
$(".sourceCode a.show").toggle(function(){ |
||||
$(this).text($(this).text().replace(/show/,'hide')); |
||||
$(this).parents(".sourceCode").find("div.code").show(); |
||||
},function(){ |
||||
$(this).text($(this).text().replace(/hide/,'show')); |
||||
$(this).parents(".sourceCode").find("div.code").hide(); |
||||
}); |
||||
$("a.sourceLink").click(function(){ |
||||
$(this).attr('target','_blank'); |
||||
}); |
||||
*/ |
||||
/*]]>*/ |
||||
</script> |
||||
|
||||
</div><!-- end of page --> |
||||
<?php $this->endBody(); ?> |
||||
</body> |
||||
</html> |
||||
<?php $this->endPage(); ?> |
Loading…
Reference in new issue