294 Zeilen
		
	
	
	
		
			7,3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			294 Zeilen
		
	
	
	
		
			7,3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Zend Framework
 | |
|  *
 | |
|  * LICENSE
 | |
|  *
 | |
|  * This source file is subject to the new BSD license that is bundled
 | |
|  * with this package in the file LICENSE.txt.
 | |
|  * It is also available through the world-wide-web at this URL:
 | |
|  * http://framework.zend.com/license/new-bsd
 | |
|  * If you did not receive a copy of the license and are unable to
 | |
|  * obtain it through the world-wide-web, please send an email
 | |
|  * to license@zend.com so we can send you a copy immediately.
 | |
|  *
 | |
|  * @category   Zend
 | |
|  * @package    Zend_Reflection
 | |
|  * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 | |
|  * @license    http://framework.zend.com/license/new-bsd     New BSD License
 | |
|  * @version    $Id$
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * @see Zend_Reflection_Docblock_Tag
 | |
|  */
 | |
| require_once 'Zend/Reflection/Docblock/Tag.php';
 | |
| 
 | |
| /**
 | |
|  * @category   Zend
 | |
|  * @package    Zend_Reflection
 | |
|  * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 | |
|  * @license    http://framework.zend.com/license/new-bsd     New BSD License
 | |
|  */
 | |
| class Zend_Reflection_Docblock implements Reflector
 | |
| {
 | |
|     /**
 | |
|      * @var Reflector
 | |
|      */
 | |
|     protected $_reflector = null;
 | |
| 
 | |
|     /**#@+
 | |
|      * @var int
 | |
|      */
 | |
|     protected $_startLine = null;
 | |
|     protected $_endLine   = null;
 | |
|     /**#@-*/
 | |
| 
 | |
|     /**
 | |
|      * @var string
 | |
|      */
 | |
|     protected $_docComment = null;
 | |
| 
 | |
|     /**
 | |
|      * @var string
 | |
|      */
 | |
|     protected $_cleanDocComment = null;
 | |
| 
 | |
|     /**
 | |
|      * @var string
 | |
|      */
 | |
|     protected $_longDescription = null;
 | |
| 
 | |
|     /**
 | |
|      * @var string
 | |
|      */
 | |
|     protected $_shortDescription = null;
 | |
| 
 | |
|     /**
 | |
|      * @var array
 | |
|      */
 | |
|     protected $_tags = array();
 | |
| 
 | |
|     /**
 | |
|      * Export reflection
 | |
|      *
 | |
|      * Reqired by the Reflector interface.
 | |
|      *
 | |
|      * @todo   What should this do?
 | |
|      * @return void
 | |
|      */
 | |
|     public static function export()
 | |
|     {
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Serialize to string
 | |
|      *
 | |
|      * Required by the Reflector interface
 | |
|      *
 | |
|      * @todo   What should this return?
 | |
|      * @return string
 | |
|      */
 | |
|     public function __toString()
 | |
|     {
 | |
|         $str = "Docblock [ /* Docblock */ ] {".PHP_EOL.PHP_EOL;
 | |
|         $str .= "  - Tags [".count($this->_tags)."] {".PHP_EOL;
 | |
| 
 | |
|         foreach($this->_tags AS $tag) {
 | |
|             $str .= "    ".$tag;
 | |
|         }
 | |
| 
 | |
|         $str .= "  }".PHP_EOL;
 | |
|         $str .= "}".PHP_EOL;
 | |
| 
 | |
|         return $str;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Constructor
 | |
|      *
 | |
|      * @param Reflector|string $commentOrReflector
 | |
|      */
 | |
|     public function __construct($commentOrReflector)
 | |
|     {
 | |
|         if ($commentOrReflector instanceof Reflector) {
 | |
|             $this->_reflector = $commentOrReflector;
 | |
|             if (!method_exists($commentOrReflector, 'getDocComment')) {
 | |
|                 require_once 'Zend/Reflection/Exception.php';
 | |
|                 throw new Zend_Reflection_Exception('Reflector must contain method "getDocComment"');
 | |
|             }
 | |
|             $docComment = $commentOrReflector->getDocComment();
 | |
| 
 | |
|             $lineCount = substr_count($docComment, "\n");
 | |
| 
 | |
|             $this->_startLine = $this->_reflector->getStartLine() - $lineCount - 1;
 | |
|             $this->_endLine   = $this->_reflector->getStartLine() - 1;
 | |
| 
 | |
|         } elseif (is_string($commentOrReflector)) {
 | |
|             $docComment = $commentOrReflector;
 | |
|         } else {
 | |
|             require_once 'Zend/Reflection/Exception.php';
 | |
|             throw new Zend_Reflection_Exception(get_class($this) . ' must have a (string) DocComment or a Reflector in the constructor');
 | |
|         }
 | |
| 
 | |
|         if ($docComment == '') {
 | |
|             require_once 'Zend/Reflection/Exception.php';
 | |
|             throw new Zend_Reflection_Exception('DocComment cannot be empty');
 | |
|         }
 | |
| 
 | |
|         $this->_docComment = $docComment;
 | |
|         $this->_parse();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Retrieve contents of docblock
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function getContents()
 | |
|     {
 | |
|         return $this->_cleanDocComment;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get start line (position) of docblock
 | |
|      *
 | |
|      * @return int
 | |
|      */
 | |
|     public function getStartLine()
 | |
|     {
 | |
|         return $this->_startLine;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get last line (position) of docblock
 | |
|      *
 | |
|      * @return int
 | |
|      */
 | |
|     public function getEndLine()
 | |
|     {
 | |
|         return $this->_endLine;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get docblock short description
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function getShortDescription()
 | |
|     {
 | |
|         return $this->_shortDescription;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get docblock long description
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function getLongDescription()
 | |
|     {
 | |
|         return $this->_longDescription;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Does the docblock contain the given annotation tag?
 | |
|      *
 | |
|      * @param  string $name
 | |
|      * @return bool
 | |
|      */
 | |
|     public function hasTag($name)
 | |
|     {
 | |
|         foreach ($this->_tags as $tag) {
 | |
|             if ($tag->getName() == $name) {
 | |
|                 return true;
 | |
|             }
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Retrieve the given docblock tag
 | |
|      *
 | |
|      * @param  string $name
 | |
|      * @return Zend_Reflection_Docblock_Tag|false
 | |
|      */
 | |
|     public function getTag($name)
 | |
|     {
 | |
|         foreach ($this->_tags as $tag) {
 | |
|             if ($tag->getName() == $name) {
 | |
|                 return $tag;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get all docblock annotation tags
 | |
|      *
 | |
|      * @param string $filter
 | |
|      * @return array Array of Zend_Reflection_Docblock_Tag
 | |
|      */
 | |
|     public function getTags($filter = null)
 | |
|     {
 | |
|         if ($filter === null || !is_string($filter)) {
 | |
|             return $this->_tags;
 | |
|         }
 | |
| 
 | |
|         $returnTags = array();
 | |
|         foreach ($this->_tags as $tag) {
 | |
|             if ($tag->getName() == $filter) {
 | |
|                 $returnTags[] = $tag;
 | |
|             }
 | |
|         }
 | |
|         return $returnTags;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Parse the docblock
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     protected function _parse()
 | |
|     {
 | |
|         $docComment = $this->_docComment;
 | |
| 
 | |
|         // First remove doc block line starters
 | |
|         $docComment = preg_replace('#[ \t]*(?:\/\*\*|\*\/|\*)?[ ]{0,1}(.*)?#', '$1', $docComment);
 | |
|         $docComment = ltrim($docComment, "\r\n"); // @todo should be changed to remove first and last empty line
 | |
| 
 | |
|         $this->_cleanDocComment = $docComment;
 | |
| 
 | |
|         // Next parse out the tags and descriptions
 | |
|         $parsedDocComment = $docComment;
 | |
|         $lineNumber = $firstBlandLineEncountered = 0;
 | |
|         while (($newlinePos = strpos($parsedDocComment, "\n")) !== false) {
 | |
|             $lineNumber++;
 | |
|             $line = substr($parsedDocComment, 0, $newlinePos);
 | |
| 
 | |
|             $matches = array();
 | |
| 
 | |
|             if ((strpos($line, '@') === 0) && (preg_match('#^(@\w+.*?)(\n)(?:@|\r?\n|$)#s', $parsedDocComment, $matches))) {
 | |
|                 $this->_tags[] = Zend_Reflection_Docblock_Tag::factory($matches[1]);
 | |
|                 $parsedDocComment = str_replace($matches[1] . $matches[2], '', $parsedDocComment);
 | |
|             } else {
 | |
|                 if ($lineNumber < 3 && !$firstBlandLineEncountered) {
 | |
|                     $this->_shortDescription .= $line . "\n";
 | |
|                 } else {
 | |
|                     $this->_longDescription .= $line . "\n";
 | |
|                 }
 | |
| 
 | |
|                 if ($line == '') {
 | |
|                     $firstBlandLineEncountered = true;
 | |
|                 }
 | |
| 
 | |
|                 $parsedDocComment = substr($parsedDocComment, $newlinePos + 1);
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
|         $this->_shortDescription = rtrim($this->_shortDescription);
 | |
|         $this->_longDescription  = rtrim($this->_longDescription);
 | |
|     }
 | |
| }
 |