Browse Source

early draft of api doc generator

issue #62
tags/2.0.0-beta
Carsten Brandt 11 years ago
parent
commit
63e726234c
  1. 2
      extensions/yii/phpdoc/.gitignore
  2. 7
      extensions/yii/phpdoc/CHANGELOG.md
  3. 32
      extensions/yii/phpdoc/LICENSE.md
  4. 28
      extensions/yii/phpdoc/README.md
  5. 105
      extensions/yii/phpdoc/assets/css/api.css
  6. 32
      extensions/yii/phpdoc/assets/css/style.css
  7. 89
      extensions/yii/phpdoc/commands/PhpdocController.php
  8. 38
      extensions/yii/phpdoc/components/BaseRenderer.php
  9. 182
      extensions/yii/phpdoc/components/OfflineRenderer.php
  10. 29
      extensions/yii/phpdoc/composer.json
  11. 40
      extensions/yii/phpdoc/models/BaseDoc.php
  12. 75
      extensions/yii/phpdoc/models/ClassDoc.php
  13. 93
      extensions/yii/phpdoc/models/Context.php
  14. 10
      extensions/yii/phpdoc/models/EventDoc.php
  15. 48
      extensions/yii/phpdoc/models/File.php
  16. 10
      extensions/yii/phpdoc/models/FunctionDoc.php
  17. 45
      extensions/yii/phpdoc/models/InterfaceDoc.php
  18. 13
      extensions/yii/phpdoc/models/MethodDoc.php
  19. 18
      extensions/yii/phpdoc/models/ParamDoc.php
  20. 23
      extensions/yii/phpdoc/models/PropertyDoc.php
  21. 49
      extensions/yii/phpdoc/models/TraitDoc.php
  22. 49
      extensions/yii/phpdoc/views/class.php
  23. 60
      extensions/yii/phpdoc/views/classSummary.php
  24. 30
      extensions/yii/phpdoc/views/index.php
  25. 64
      extensions/yii/phpdoc/views/layouts/offline.php

2
extensions/yii/phpdoc/.gitignore vendored

@ -0,0 +1,2 @@
/vendor
composer.lock

7
extensions/yii/phpdoc/CHANGELOG.md

@ -0,0 +1,7 @@
Yii Framework 2 phpdoc extension Change Log
===========================================
2.0.0 beta under development
----------------------------
- Initial release.

32
extensions/yii/phpdoc/LICENSE.md

@ -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.

28
extensions/yii/phpdoc/README.md

@ -0,0 +1,28 @@
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-phpdoc "*"
```
or add
```json
"yiisoft/yii2-phpdoc": "*"
```
to the require section of your composer.json.
Usage
-----
TDB

105
extensions/yii/phpdoc/assets/css/api.css

@ -0,0 +1,105 @@
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;
}
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;
}

32
extensions/yii/phpdoc/assets/css/style.css

@ -0,0 +1,32 @@
body
{
}
body, div, span, p, input
{
font-family: Verdana, sans-serif, Arial;
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;
}

89
extensions/yii/phpdoc/commands/PhpdocController.php

@ -0,0 +1,89 @@
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\phpdoc\commands;
use phpDocumentor\Reflection\FileReflector;
use yii\console\Controller;
use yii\helpers\Console;
use yii\helpers\FileHelper;
use yii\phpdoc\components\OfflineRenderer;
use yii\phpdoc\models\Context;
use Yii;
/**
*
* @author Carsten Brandt <mail@cebe.cc>
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class PhpdocController extends Controller
{
public function actionIndex($targetDir)
{
echo "hi\n";
$targetDir = Yii::getAlias($targetDir);
if (is_dir($targetDir) && !$this->confirm('TargetDirectory already exists. Overwrite?')) {
return 2;
}
// TODO determine files to analyze
$this->stdout('Searching files to process... ');
$files = $this->findFiles(YII_PATH);
// $files = array_slice($files, 0, 42); // TODO remove this line
$this->stdout('done.' . PHP_EOL, Console::FG_GREEN);
$fileCount = count($files);
Console::startProgress(0, $fileCount, 'Processing files... ', false);
$context = new Context();
$done = 0;
foreach($files as $file) {
$context->addFile($file);
Console::updateProgress(++$done, $fileCount);
}
Console::endProgress(true);
$this->stdout('done.' . PHP_EOL, Console::FG_GREEN);
$this->stdout('Updating cross references and backlinks... ');
$context->updateReferences();
$this->stdout('done.' . PHP_EOL, Console::FG_GREEN);
// TODO LATER analyze for dead links and similar stuff
// TODO render models
$renderer = new OfflineRenderer();
$renderer->targetDir = $targetDir;
$renderer->render($context, $this);
}
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' => array_merge($except, [
'/views/',
'/requirements/',
'/gii/generators/',
]),
];
return FileHelper::findFiles($path, $options);
}
}

38
extensions/yii/phpdoc/components/BaseRenderer.php

@ -0,0 +1,38 @@
<?php
/**
*
*
* @author Carsten Brandt <mail@cebe.cc>
*/
namespace yii\phpdoc\components;
use Yii;
use yii\base\Component;
use yii\console\Controller;
use yii\phpdoc\models\Context;
use yii\web\View;
abstract class BaseRenderer extends Component
{
private $_view;
public function getView()
{
if ($this->_view === null) {
$this->_view = new View();
}
return $this->_view;
}
/**
* @param Context $context
* @param Controller $controller
* @return mixed
*/
public abstract function render($context, $controller);
}

182
extensions/yii/phpdoc/components/OfflineRenderer.php

@ -0,0 +1,182 @@
<?php
/**
*
*
* @author Carsten Brandt <mail@cebe.cc>
*/
namespace yii\phpdoc\components;
use yii\base\ViewContextInterface;
use yii\console\Controller;
use yii\helpers\Console;
use yii\helpers\FileHelper;
use yii\helpers\Html;
use yii\phpdoc\models\ClassDoc;
use yii\phpdoc\models\Context;
use Yii;
use yii\phpdoc\models\InterfaceDoc;
use yii\phpdoc\models\TraitDoc;
class OfflineRenderer extends BaseRenderer implements ViewContextInterface
{
public $targetDir;
public $layout = '@yii/phpdoc/views/layouts/offline.php';
public $itemView = '@yii/phpdoc/views/class.php';
public $indexView = '@yii/phpdoc/views/index.php';
public $pageTitle = 'Yii Framework 2.0 API Documentation';
/**
* @var Context
*/
protected $context;
/**
* @param Context $context
* @param Controller $controller
*/
public function render($context, $controller)
{
$this->context = $context;
$dir = Yii::getAlias($this->targetDir);
if (!is_dir($dir)) {
mkdir($dir);
}
$items = array_merge($context->classes, $context->interfaces, $context->traits);
$itemCount = count($items) + 1;
Console::startProgress(0, $itemCount, 'Rendering files: ', false);
$done = 0;
foreach($items as $item) {
$fileContent = $this->renderWithLayout($this->itemView, [
'item' => $item,
'docContext' => $context,
]);
file_put_contents($dir . '/' . $this->generateFileName($item->name), $fileContent);
Console::updateProgress(++$done, $itemCount);
}
$indexFileContent = $this->renderWithLayout($this->indexView, [
'docContext' => $context,
'items' => $items,
]);
file_put_contents($dir . '/index.html', $indexFileContent);
Console::updateProgress(++$done, $itemCount);
Console::endProgress(true);
$controller->stdout('done.' . PHP_EOL, Console::FG_GREEN);
$controller->stdout('Copying asset files... ');
FileHelper::copyDirectory(__DIR__ . '/../assets/css', $dir . '/css');
$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 an item
* @param ClassDoc|InterfaceDoc|TraitDoc $item
* @param string $title
* @return string
*/
public function link($item, $title = null)
{
if ($title === null) {
$title = $item->name;
}
return Html::a($title, null, ['href' => $this->generateFileName($item->name)]);
}
/**
* @param ClassDoc $class
* @return string
*/
public function renderInheritance($class)
{
$parents[] = $this->link($class);
while ($class->parentClass !== null) {
if(isset($this->context->classes[$class->parentClass])) {
$class = $this->context->classes[$class->parentClass];
$parents[] = $this->link($class);
} else {
$parents[] = $class->parentClass; // TODO link to php.net
break;
}
}
return implode(" &raquo;\n",$parents);
}
/**
* @param ClassDoc $class
* @return string
*/
public function renderImplements($class)
{
$interfaces = [];
foreach($class->interfaces as $interface) {
if(isset($this->context->interfaces[$interface])) {
$interfaces[] = $this->link($this->context->interfaces[$interface]);
} else {
$interfaces[] = $interface; // TODO link to php.net
}
}
return implode(', ',$interfaces);
}
/**
* @param ClassDoc|TraitDoc $class
* @return string
*/
public function renderTraitUses($class)
{
$traits = [];
foreach($class->traits as $trait) {
if(isset($this->context->traits[$trait])) {
$traits[] = $this->link($this->context->traits[$trait]);
} else {
$traits[] = $trait; // TODO link to php.net
}
}
return implode(', ',$traits);
}
public function renderSubclasses($class)
{
$subclasses = [];
foreach($class->subclasses as $subclass) {
if(isset($this->context->classes[$subclass])) {
$subclasses[] = $this->link($this->context->classes[$subclass]);
} else {
$subclasses[] = $subclass; // TODO link to php.net
}
}
return implode(', ',$subclasses);
}
public function generateFileName($itemName)
{
return strtolower(str_replace('\\', '_', $itemName)) . '.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/phpdoc/views/' . $view);
}
}

29
extensions/yii/phpdoc/composer.json

@ -0,0 +1,29 @@
{
"name": "yiisoft/yii2-phpdoc",
"description": "PHP Documentation generator for the Yii framework 2.0",
"keywords": ["yii", "phpdoc", "api", "documentation"],
"type": "yii2-extension",
"license": "BSD-3-Clause",
"support": {
"issues": "https://github.com/yiisoft/yii2/issues?labels=ext%3Aredis",
"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\\redis\\": "" }
},
"target-dir": "yii/redis"
}

40
extensions/yii/phpdoc/models/BaseDoc.php

@ -0,0 +1,40 @@
<?php
namespace yii\phpdoc\models;
use yii\base\Object;
class BaseDoc extends Object
{
public $name;
public $since;
public $shortDescription;
public $description;
public $sourceFile;
public $startLine;
public $endLine;
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));
}
}

75
extensions/yii/phpdoc/models/ClassDoc.php

@ -0,0 +1,75 @@
<?php
namespace yii\phpdoc\models;
/**
* Class ClassDoc
*/
class ClassDoc extends BaseDoc
{
public $parentClass;
public $isAbstract;
public $isFinal;
public $interfaces = [];
public $traits = [];
public $properties = [];
public $methods = [];
public $events = [];
public $constants = [];
// public $protectedPropertyCount=0;
// public $publicPropertyCount=0;
// public $protectedMethodCount=0;
// public $publicMethodCount=0;
//
// public $nativePropertyCount=0;
// public $nativeMethodCount=0;
// public $nativeEventCount=0;
public $sinceVersion;
public $subclasses = [];
/**
* @param \phpDocumentor\Reflection\ClassReflector $reflector
* @param Context $context
* @param array $config
*/
public function __construct($reflector, $context = null, $config = [])
{
// base properties
$this->name = ltrim($reflector->getName(), '\\');
$this->startLine = $reflector->getNode()->getAttribute('startLine');
$this->endLine = $reflector->getNode()->getAttribute('endLine');
$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, '\\');
}
// TODO methods
// TODO properties
// TODO docblock
if ($context !== null) {
$context->addClass($this);
}
parent::__construct($config);
}
}

93
extensions/yii/phpdoc/models/Context.php

@ -0,0 +1,93 @@
<?php
/**
*
*
* @author Carsten Brandt <mail@cebe.cc>
*/
namespace yii\phpdoc\models;
use yii\base\Component;
use yii\base\Exception;
class Context extends Component
{
public $basePath;
public $files = [];
/**
* @var ClassDoc[]
*/
public $classes = [];
/**
* @var InterfaceDoc[]
*/
public $interfaces = [];
/**
* @var TraitDoc[]
*/
public $traits = [];
public function addFile($fileName)
{
$file = new File($fileName, $this);
$this->files[$fileName] = $file;
}
public function addClass($class)
{
if (isset($this->classes[$class->name])) {
throw new Exception('Duplicate class definition: ' . $class->name . ' in file ' . $class->fileName);
}
$this->classes[$class->name] = $class;
}
public function addInterface($interface)
{
if (isset($this->interfaces[$interface->name])) {
throw new Exception('Duplicate interface definition: ' . $interface->name . ' in file ' . $interface->fileName);
}
$this->interfaces[$interface->name] = $interface;
}
public function addTrait($trait)
{
if (isset($this->traits[$trait->name])) {
throw new Exception('Duplicate trait definition: ' . $trait->name . ' in file ' . $trait->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);
}
// TODO update interface and trait usages
}
/**
* 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);
}
}
}

10
extensions/yii/phpdoc/models/EventDoc.php

@ -0,0 +1,10 @@
<?php
namespace yii\phpdoc\models;
class EventDoc extends BaseDoc
{
public $isInherited;
public $definedBy;
public $trigger;
}

48
extensions/yii/phpdoc/models/File.php

@ -0,0 +1,48 @@
<?php
namespace yii\phpdoc\models;
use phpDocumentor\Reflection\FileReflector;
use yii\base\Object;
class File extends Object
{
public $name;
public $namespaces = [];
/**
* @var ClassDoc[]
*/
public $classes = [];
/**
* @var InterfaceDoc[]
*/
public $interfaces = [];
/**
* @var TraitDoc[]
*/
public $traits = [];
private $_reflection;
public function __construct($fileName, $context, $config = [])
{
$this->name = $fileName;
$this->_reflection = new FileReflector($fileName, true);
$this->_reflection->process();
foreach($this->_reflection->getClasses() as $class) {
$class = new ClassDoc($class, $context);
$class->sourceFile = $fileName;
$this->classes[] = $class;
}
foreach($this->_reflection->getInterfaces() as $interface) {
$this->interfaces[] = new InterfaceDoc($interface, $context);
}
foreach($this->_reflection->getTraits() as $trait) {
$this->traits[] = new TraitDoc($trait, $context);
}
parent::__construct($config);
}
}

10
extensions/yii/phpdoc/models/FunctionDoc.php

@ -0,0 +1,10 @@
<?php
namespace yii\phpdoc\models;
class FunctionDoc extends BaseDoc
{
public $signature;
public $input=array();
public $output;
}

45
extensions/yii/phpdoc/models/InterfaceDoc.php

@ -0,0 +1,45 @@
<?php
/**
*
*
* @author Carsten Brandt <mail@cebe.cc>
*/
namespace yii\phpdoc\models;
class InterfaceDoc extends BaseDoc
{
public $parentInterfaces = [];
public $implementedBy = [];
public $methods = [];
/**
* @param \phpDocumentor\Reflection\InterfaceReflector $reflector
* @param Context $context
* @param array $config
*/
public function __construct($reflector, $context = null, $config = [])
{
// base properties
$this->name = ltrim($reflector->getName(), '\\');
$this->startLine = $reflector->getNode()->getAttribute('startLine');
$this->endLine = $reflector->getNode()->getAttribute('endLine');
foreach($reflector->getParentInterfaces() as $interface) {
$this->parentInterfaces[] = ltrim($interface, '\\');
}
// TODO methods
// TODO docblock
if ($context !== null) {
$context->addInterface($this);
}
parent::__construct($config);
}
}

13
extensions/yii/phpdoc/models/MethodDoc.php

@ -0,0 +1,13 @@
<?php
namespace yii\phpdoc\models;
class MethodDoc extends FunctionDoc
{
public $isAbstract;
public $isFinal;
public $isProtected;
public $isStatic;
public $isInherited;
public $definedBy;
}

18
extensions/yii/phpdoc/models/ParamDoc.php

@ -0,0 +1,18 @@
<?php
/**
*
*
* @author Carsten Brandt <mail@cebe.cc>
*/
namespace yii\phpdoc\models;
class ParamDoc
{
public $name;
public $description;
public $type;
public $isOptional;
public $defaultValue;
public $isPassedByReference;
}

23
extensions/yii/phpdoc/models/PropertyDoc.php

@ -0,0 +1,23 @@
<?php
/**
*
*
* @author Carsten Brandt <mail@cebe.cc>
*/
namespace yii\phpdoc\models;
class PropertyDoc extends BaseDoc
{
public $isProtected;
public $isStatic;
public $readOnly;
public $isInherited;
public $definedBy;
public $type;
public $signature;
public $getter;
public $setter;
}

49
extensions/yii/phpdoc/models/TraitDoc.php

@ -0,0 +1,49 @@
<?php
/**
*
*
* @author Carsten Brandt <mail@cebe.cc>
*/
namespace yii\phpdoc\models;
class TraitDoc extends BaseDoc
{
// classes using the trait
public $usedByClasses = [];
public $traits = [];
public $properties = [];
public $methods = [];
/**
* @param \phpDocumentor\Reflection\TraitReflector $reflector
* @param Context $context
* @param array $config
*/
public function __construct($reflector, $context = null, $config = [])
{
// base properties
$this->name = ltrim($reflector->getName(), '\\');
$this->startLine = $reflector->getNode()->getAttribute('startLine');
$this->endLine = $reflector->getNode()->getAttribute('endLine');
foreach($reflector->getTraits() as $trait) {
$this->traits[] = ltrim($trait, '\\');
}
// TODO methods
// TODO properties
// TODO docblock
if ($context !== null) {
$context->addTrait($this);
}
parent::__construct($config);
}
}

49
extensions/yii/phpdoc/views/class.php

@ -0,0 +1,49 @@
<?php
use yii\phpdoc\models\ClassDoc;
use yii\phpdoc\models\InterfaceDoc;
use yii\phpdoc\models\TraitDoc;
/**
* @var ClassDoc|InterfaceDoc|TraitDoc $item
* @var yii\web\View $this
*/
?>
<h1><?php
if ($item instanceof InterfaceDoc) {
echo 'Interface ';
} elseif ($item instanceof TraitDoc) {
echo 'Trait ';
} else {
echo 'Class ';
}
echo $item->name;
?></h1>
<div id="nav">
<a href="index.html">All Classes</a>
<?php if(!($item instanceof InterfaceDoc) && !empty($item->properties)): ?>
| <a href="#properties">Properties</a>
<?php endif; ?>
<?php if(!empty($item->methods)): ?>
| <a href="#methods">Methods</a>
<?php endif; ?>
<?php if($item instanceof ClassDoc && !empty($item->events)): ?>
| <a href="#events">Events</a>
<?php endif; ?>
</div>
<?= $this->render('classSummary', ['item' => $item]); ?>
<a name="properties"></a>
<?php //$this->renderPartial('propertySummary',array('class'=>$item,'protected'=>false)); ?>
<?php //$this->renderPartial('propertySummary',array('class'=>$item,'protected'=>true)); ?>
<a name="methods"></a>
<?php //$this->renderPartial('methodSummary',array('class'=>$item,'protected'=>false)); ?>
<?php //$this->renderPartial('methodSummary',array('class'=>$item,'protected'=>true)); ?>
<a name="events"></a>
<?php //$this->renderPartial('eventSummary',array('class'=>$item)); ?>
<?php //$this->renderPartial('propertyDetails',array('class'=>$item)); ?>
<?php //$this->renderPartial('methodDetails',array('class'=>$item)); ?>

60
extensions/yii/phpdoc/views/classSummary.php

@ -0,0 +1,60 @@
<?php
use yii\phpdoc\models\ClassDoc;
use yii\phpdoc\models\InterfaceDoc;
use yii\phpdoc\models\TraitDoc;
/**
* @var ClassDoc|InterfaceDoc|TraitDoc $item
* @var yii\web\View $this
*/
?><table class="summaryTable docClass">
<colgroup>
<col class="col-name" />
<col class="col-value" />
</colgroup>
<?php if ($item instanceof ClassDoc): ?>
<tr>
<th>Inheritance</th>
<td><?php echo $this->context->renderInheritance($item); ?></td>
</tr>
<?php endif; ?>
<?php if(!empty($item->interfaces)): ?>
<tr>
<th>Implements</th>
<td><?php echo $this->context->renderImplements($item); ?></td>
</tr>
<?php endif; ?>
<?php if(!($item instanceof InterfaceDoc) && !empty($item->traits)): ?>
<tr>
<th>Uses Traits</th>
<td><?php echo $this->context->renderTraitUses($item); ?></td>
</tr>
<?php endif; ?>
<?php if($item instanceof ClassDoc && !empty($item->subclasses)): ?>
<tr>
<th>Subclasses</th>
<td><?php echo $this->context->renderSubclasses($item); ?></td>
</tr>
<?php endif; ?>
<?php if(!empty($item->since)): ?>
<tr>
<th>Since</th>
<td><?php echo $item->since; ?></td>
</tr>
<?php endif; ?>
<?php if(!empty($item->version)): ?>
<tr>
<th>Version</th>
<td><?php echo $item->version; ?></td>
</tr>
<?php endif; ?>
<tr>
<th>Source Code</th>
<!-- <td>--><?php //echo $this->renderSourceLink($item->sourcePath); ?><!--</td>-->
</tr>
</table>
<div id="classDescription">
<?php echo $item->description; ?>
</div>

30
extensions/yii/phpdoc/views/index.php

@ -0,0 +1,30 @@
<?php
use yii\phpdoc\models\ClassDoc;
use yii\phpdoc\models\InterfaceDoc;
use yii\phpdoc\models\TraitDoc;
/**
* @var ClassDoc[]|InterfaceDoc[]|TraitDoc[] $items
* @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($items);
foreach($items as $i=>$class): ?>
<tr>
<td><?php echo $this->context->link($class, $class->name); ?></td>
<td><?php echo $class->shortDescription; ?></td>
</tr>
<?php endforeach; ?>
</table>

64
extensions/yii/phpdoc/views/layouts/offline.php

@ -0,0 +1,64 @@
<?php
/**
* @var yii\web\View $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" />
<link rel="stylesheet" type="text/css" href="css/style.css" />
<link rel="stylesheet" type="text/css" href="css/api.css" />
<script type="text/javascript" src="js/jquery.js"></script>
<?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">
&copy; 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").toggle(function(){
$(this).text($(this).text().replace(/Hide/,'Show'));
$(this).parents(".summary").find(".inherited").hide();
},function(){
$(this).text($(this).text().replace(/Show/,'Hide'));
$(this).parents(".summary").find(".inherited").show();
});
$(".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…
Cancel
Save