123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- <?php
- /**
- * @link http://www.yiiframework.com/
- * @copyright Copyright (c) 2008 Yii Software LLC
- * @license http://www.yiiframework.com/license/
- */
- namespace yii\apidoc\renderers;
- use Yii;
- use yii\apidoc\helpers\ApiMarkdown;
- use yii\apidoc\helpers\ApiMarkdownLaTeX;
- use yii\apidoc\models\BaseDoc;
- 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\apidoc\models\TypeDoc;
- use yii\base\Component;
- use yii\console\Controller;
- /**
- * Base class for all documentation renderers
- *
- * @author Carsten Brandt <mail@cebe.cc>
- * @since 2.0
- */
- abstract class BaseRenderer extends Component
- {
- /**
- * @deprecated since 2.0.1 use [[$guidePrefix]] instead which allows configuring this options
- */
- const GUIDE_PREFIX = 'guide-';
- public $guidePrefix = 'guide-';
- public $apiUrl;
- /**
- * @var string string to use as the title of the generated page.
- */
- public $pageTitle;
- /**
- * @var Context the [[Context]] currently being rendered.
- */
- public $apiContext;
- /**
- * @var Controller the apidoc controller instance. Can be used to control output.
- */
- public $controller;
- public $guideUrl;
- public function init()
- {
- ApiMarkdown::$renderer = $this;
- ApiMarkdownLaTeX::$renderer = $this;
- }
- /**
- * creates a link to a type (class, interface or trait)
- * @param ClassDoc|InterfaceDoc|TraitDoc|ClassDoc[]|InterfaceDoc[]|TraitDoc[]|string|string[] $types
- * @param string $title a title to be used for the link TODO check whether [[yii\...|Class]] is supported
- * @param BaseDoc $context
- * @param array $options additional HTML attributes for the link.
- * @return string
- */
- public function createTypeLink($types, $context = null, $title = null, $options = [])
- {
- if (!is_array($types)) {
- $types = [$types];
- }
- if (count($types) > 1) {
- $title = null;
- }
- $links = [];
- foreach ($types as $type) {
- $postfix = '';
- if (is_string($type)) {
- if (!empty($type) && substr_compare($type, '[]', -2, 2) === 0) {
- $postfix = '[]';
- $type = substr($type, 0, -2);
- }
- if ($type === '$this' && $context instanceof TypeDoc) {
- $title = '$this';
- $type = $context;
- } elseif (($t = $this->apiContext->getType(ltrim($type, '\\'))) !== null) {
- $type = $t;
- } elseif (!empty($type) && $type[0] !== '\\' && ($t = $this->apiContext->getType($this->resolveNamespace($context) . '\\' . ltrim($type, '\\'))) !== null) {
- $type = $t;
- } else {
- ltrim($type, '\\');
- }
- }
- if (is_string($type)) {
- $linkText = ltrim($type, '\\');
- if ($title !== null) {
- $linkText = $title;
- $title = null;
- }
- $phpTypes = [
- 'callable',
- 'array',
- 'string',
- 'boolean',
- 'bool',
- 'integer',
- 'int',
- 'float',
- 'object',
- 'resource',
- 'null',
- 'false',
- 'true',
- ];
- $phpTypeAliases = [
- 'true' => 'boolean',
- 'false' => 'boolean',
- 'bool' => 'boolean',
- 'int' => 'integer',
- ];
- $phpTypeDisplayAliases = [
- 'bool' => 'boolean',
- 'int' => 'integer',
- ];
- // check if it is PHP internal class
- if (((class_exists($type, false) || interface_exists($type, false) || trait_exists($type, false)) &&
- ($reflection = new \ReflectionClass($type)) && $reflection->isInternal())) {
- $links[] = $this->generateLink($linkText, 'http://www.php.net/class.' . strtolower(ltrim($type, '\\')), $options) . $postfix;
- } elseif (in_array($type, $phpTypes)) {
- if (isset($phpTypeDisplayAliases[$type])) {
- $linkText = $phpTypeDisplayAliases[$type];
- }
- if (isset($phpTypeAliases[$type])) {
- $type = $phpTypeAliases[$type];
- }
- $links[] = $this->generateLink($linkText, 'http://www.php.net/language.types.' . strtolower(ltrim($type, '\\')), $options) . $postfix;
- } else {
- $links[] = $type . $postfix;
- }
- } elseif ($type instanceof BaseDoc) {
- $linkText = $type->name;
- if ($title !== null) {
- $linkText = $title;
- $title = null;
- }
- $links[] = $this->generateLink($linkText, $this->generateApiUrl($type->name), $options) . $postfix;
- }
- }
- return implode('|', $links);
- }
- /**
- * creates a link to a subject
- * @param PropertyDoc|MethodDoc|ConstDoc|EventDoc $subject
- * @param string $title
- * @param array $options additional HTML attributes for the link.
- * @return string
- */
- public function createSubjectLink($subject, $title = null, $options = [])
- {
- if ($title === null) {
- if ($subject instanceof MethodDoc) {
- $title = $subject->name . '()';
- } else {
- $title = $subject->name;
- }
- }
- if (($type = $this->apiContext->getType($subject->definedBy)) === null) {
- return $subject->name;
- } else {
- $link = $this->generateApiUrl($type->name);
- if ($subject instanceof MethodDoc) {
- $link .= '#' . $subject->name . '()';
- } else {
- $link .= '#' . $subject->name;
- }
- $link .= '-detail';
- return $this->generateLink($title, $link, $options);
- }
- }
- /**
- * @param BaseDoc|string $context
- * @return string
- */
- 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->apiContext->getType($context);
- if ($type !== null) {
- return $type->namespace;
- }
- }
- return '';
- }
- /**
- * generate link markup
- * @param $text
- * @param $href
- * @param array $options additional HTML attributes for the link.
- * @return mixed
- */
- abstract protected function generateLink($text, $href, $options = []);
- /**
- * Generate an url to a type in apidocs
- * @param $typeName
- * @return mixed
- */
- abstract public function generateApiUrl($typeName);
- /**
- * Generate an url to a guide page
- * @param string $file
- * @return string
- */
- public function generateGuideUrl($file)
- {
- //skip parsing external url
- if ( (strpos($file, 'https://') !== false) || (strpos($file, 'http://') !== false) ) {
- return $file;
- }
- $hash = '';
- if (($pos = strpos($file, '#')) !== false) {
- $hash = substr($file, $pos);
- $file = substr($file, 0, $pos);
- }
- return rtrim($this->guideUrl, '/') . '/' . $this->guidePrefix . basename($file, '.md') . '.html' . $hash;
- }
- }
|