Вход Регистрация
Файл: gapps/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php
Строк: 270
<?php
/**
 * This file is part of phpDocumentor.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright 2010-2015 Mike van Riel<mike@phpdoc.org>
 * @license   http://www.opensource.org/licenses/mit-license.php MIT
 * @link      http://phpdoc.org
 */

namespace phpDocumentorReflectionDocBlock;

use 
phpDocumentorReflectionDocBlock;
use 
WebmozartAssertAssert;

/**
 * Converts a DocBlock back from an object to a complete DocComment including Asterisks.
 */
class Serializer
{
    
/** @var string The string to indent the comment with. */
    
protected $indentString = ' ';

    
/** @var int The number of times the indent string is repeated. */
    
protected $indent = 0;

    
/** @var bool Whether to indent the first line with the given indent amount and string. */
    
protected $isFirstLineIndented = true;

    
/** @var int|null The max length of a line. */
    
protected $lineLength = null;

    
/**
     * Create a Serializer instance.
     *
     * @param int $indent The number of times the indent string is repeated.
     * @param string   $indentString    The string to indent the comment with.
     * @param bool     $indentFirstLine Whether to indent the first line.
     * @param int|null $lineLength The max length of a line or NULL to disable line wrapping.
     */
    
public function __construct($indent = 0, $indentString = ' ', $indentFirstLine = true, $lineLength = null)
    {
        
Assert::integer($indent);
        
Assert::string($indentString);
        
Assert::boolean($indentFirstLine);
        
Assert::nullOrInteger($lineLength);

        
$this->indent = $indent;
        
$this->indentString = $indentString;
        
$this->isFirstLineIndented = $indentFirstLine;
        
$this->lineLength = $lineLength;
    }

    
/**
     * Generate a DocBlock comment.
     *
     * @param DocBlock $docblock The DocBlock to serialize.
     *
     * @return string The serialized doc block.
     */
    
public function getDocComment(DocBlock $docblock)
    {
        
$indent = str_repeat($this->indentString, $this->indent);
        
$firstIndent = $this->isFirstLineIndented ? $indent : '';
        
// 3 === strlen(' * ')
        
$wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null;

        
$text = $this->removeTrailingSpaces(
            
$indent,
            
$this->addAsterisksForEachLine(
                
$indent,
                
$this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength)
            )
        );

        
$comment = "{$firstIndent}/**n{$indent} * {$text}n{$indent} *n";
        
$comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment);
        
$comment .= $indent . ' */';

        return 
$comment;
    }

    
/**
     * @param $indent
     * @param $text
     * @return mixed
     */
    
private function removeTrailingSpaces($indent, $text)
    {
        return 
str_replace("n{$indent} * n", "n{$indent} *n", $text);
    }

    
/**
     * @param $indent
     * @param $text
     * @return mixed
     */
    
private function addAsterisksForEachLine($indent, $text)
    {
        return 
str_replace("n", "n{$indent} * ", $text);
    }

    
/**
     * @param DocBlock $docblock
     * @param $wrapLength
     * @return string
     */
    
private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, $wrapLength)
    {
        
$text = $docblock->getSummary() . ((string)$docblock->getDescription() ? "nn" . $docblock->getDescription()
                : 
'');
        if (
$wrapLength !== null) {
            
$text = wordwrap($text, $wrapLength);
            return 
$text;
        }
        return 
$text;
    }

    
/**
     * @param DocBlock $docblock
     * @param $wrapLength
     * @param $indent
     * @param $comment
     * @return string
     */
    
private function addTagBlock(DocBlock $docblock, $wrapLength, $indent, $comment)
    {
        foreach (
$docblock->getTags() as $tag) {
            
$formatter = new DocBlockTagsFormatterPassthroughFormatter();
            
$tagText   = $formatter->format($tag);
            if (
$wrapLength !== null) {
                
$tagText = wordwrap($tagText, $wrapLength);
            }
            
$tagText = str_replace("n", "n{$indent} * ", $tagText);

            
$comment .= "{$indent} * {$tagText}n";
        }

        return 
$comment;
    }
}
Онлайн: 2
Реклама