25 changed files with 1171 additions and 0 deletions
			
			
		| @ -0,0 +1,7 @@ | ||||
| Yii Framework 2 phpdoc 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,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 | ||||
| @ -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; | ||||
| } | ||||
| @ -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; | ||||
| } | ||||
| @ -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); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| @ -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); | ||||
| 
 | ||||
| }  | ||||
| @ -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(" »\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); | ||||
| 	} | ||||
| } | ||||
| @ -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" | ||||
| } | ||||
| @ -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)); | ||||
| 	} | ||||
| } | ||||
| @ -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); | ||||
| 	} | ||||
| } | ||||
| @ -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); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,10 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace yii\phpdoc\models; | ||||
| 
 | ||||
| class EventDoc extends BaseDoc | ||||
| { | ||||
| 	public $isInherited; | ||||
| 	public $definedBy; | ||||
| 	public $trigger; | ||||
| } | ||||
| @ -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); | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,10 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace yii\phpdoc\models; | ||||
| 
 | ||||
| class FunctionDoc extends BaseDoc | ||||
| { | ||||
| 	public $signature; | ||||
| 	public $input=array(); | ||||
| 	public $output; | ||||
| } | ||||
| @ -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); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| @ -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; | ||||
| } | ||||
| @ -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; | ||||
| } | ||||
| @ -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; | ||||
| } | ||||
| @ -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); | ||||
| 	} | ||||
| } | ||||
| @ -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)); ?>
 | ||||
| @ -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> | ||||
| @ -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> | ||||
| @ -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"> | ||||
| © 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…
					
					
				
		Reference in new issue