You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							226 lines
						
					
					
						
							5.7 KiB
						
					
					
				
			
		
		
	
	
							226 lines
						
					
					
						
							5.7 KiB
						
					
					
				| <?php | |
| /** | |
|  * @link http://www.yiiframework.com/ | |
|  * @copyright Copyright (c) 2008 Yii Software LLC | |
|  * @license http://www.yiiframework.com/license/ | |
|  */ | |
|  | |
| namespace yii\apidoc\components; | |
|  | |
|  | |
| use yii\apidoc\models\ConstDoc; | |
| use yii\apidoc\models\EventDoc; | |
| use yii\apidoc\models\MethodDoc; | |
| use yii\apidoc\models\PropertyDoc; | |
| use yii\base\ViewContextInterface; | |
| use yii\console\Controller; | |
| use yii\helpers\Console; | |
| use yii\helpers\FileHelper; | |
| use yii\helpers\Html; | |
| use yii\apidoc\models\ClassDoc; | |
| use yii\apidoc\models\Context; | |
| use Yii; | |
| use yii\apidoc\models\InterfaceDoc; | |
| use yii\apidoc\models\TraitDoc; | |
|  | |
| class OfflineRenderer extends BaseRenderer implements ViewContextInterface | |
| { | |
| 	public $targetDir; | |
|  | |
| 	public $layout = '@yii/apidoc/views/layouts/offline.php'; | |
| 	public $itemView = '@yii/apidoc/views/class.php'; | |
| 	public $indexView = '@yii/apidoc/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 a type (class, interface or trait) | |
| 	 * @param ClassDoc|InterfaceDoc|TraitDoc $types | |
| 	 * @param string $title | |
| 	 * @return string | |
| 	 */ | |
| 	public function typeLink($types, $title = null) | |
| 	{ | |
| 		if (!is_array($types)) { | |
| 			$types = [$types]; | |
| 		} | |
| 		$links = []; | |
| 		foreach($types as $type) { | |
| 			if (!is_object($type) && ($t = $this->context->getType($type)) !== null) { | |
| 				$type = $t; | |
| 			} | |
| 			if (!is_object($type)) { | |
| 				$links[] = $type; | |
| 			} else { | |
| 				$links[] = Html::a( | |
| 					$title !== null ? $title : $type->name, | |
| 					null, | |
| 					['href' => $this->generateFileName($type->name)] | |
| 				); | |
| 			} | |
| 		} | |
| 		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) { | |
| 			$title = $subject->name; | |
| 		} | |
| 		if (($type = $this->context->getType($subject->definedBy)) === null) { | |
| 			return $subject->name; | |
| 		} else { | |
| 			return Html::a($title, null, ['href' => $this->generateFileName($type->name) . '#' . $subject->name . '-detail']); | |
| 		} | |
| 	} | |
|  | |
| 	/** | |
| 	 * @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); | |
| 	} | |
|  | |
|  | |
| 	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/apidoc/views/' . $view); | |
| 	} | |
| } |