123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- <?php
- declare(strict_types=1);
- /**
- * 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.
- *
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock;
- use phpDocumentor\Reflection\DocBlock;
- use phpDocumentor\Reflection\DocBlock\Tags\Formatter;
- use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter;
- use function sprintf;
- use function str_repeat;
- use function str_replace;
- use function strlen;
- use function wordwrap;
- /**
- * 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;
- /** @var Formatter A custom tag formatter. */
- protected $tagFormatter;
- /** @var string */
- private $lineEnding;
- /**
- * 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.
- * @param Formatter $tagFormatter A custom tag formatter, defaults to PassthroughFormatter.
- * @param string $lineEnding Line ending used in the output, by default \n is used.
- */
- public function __construct(
- int $indent = 0,
- string $indentString = ' ',
- bool $indentFirstLine = true,
- ?int $lineLength = null,
- ?Formatter $tagFormatter = null,
- string $lineEnding = "\n"
- ) {
- $this->indent = $indent;
- $this->indentString = $indentString;
- $this->isFirstLineIndented = $indentFirstLine;
- $this->lineLength = $lineLength;
- $this->tagFormatter = $tagFormatter ?: new PassthroughFormatter();
- $this->lineEnding = $lineEnding;
- }
- /**
- * Generate a DocBlock comment.
- *
- * @param DocBlock $docblock The DocBlock to serialize.
- *
- * @return string The serialized doc block.
- */
- public function getDocComment(DocBlock $docblock): string
- {
- $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";
- if ($text) {
- $comment .= $indent . ' * ' . $text . "\n";
- $comment .= $indent . " *\n";
- }
- $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment);
- return str_replace("\n", $this->lineEnding, $comment . $indent . ' */');
- }
- private function removeTrailingSpaces(string $indent, string $text): string
- {
- return str_replace(
- sprintf("\n%s * \n", $indent),
- sprintf("\n%s *\n", $indent),
- $text
- );
- }
- private function addAsterisksForEachLine(string $indent, string $text): string
- {
- return str_replace(
- "\n",
- sprintf("\n%s * ", $indent),
- $text
- );
- }
- private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, ?int $wrapLength): string
- {
- $text = $docblock->getSummary() . ((string) $docblock->getDescription() ? "\n\n" . $docblock->getDescription()
- : '');
- if ($wrapLength !== null) {
- $text = wordwrap($text, $wrapLength);
- return $text;
- }
- return $text;
- }
- private function addTagBlock(DocBlock $docblock, ?int $wrapLength, string $indent, string $comment): string
- {
- foreach ($docblock->getTags() as $tag) {
- $tagText = $this->tagFormatter->format($tag);
- if ($wrapLength !== null) {
- $tagText = wordwrap($tagText, $wrapLength);
- }
- $tagText = str_replace(
- "\n",
- sprintf("\n%s * ", $indent),
- $tagText
- );
- $comment .= sprintf("%s * %s\n", $indent, $tagText);
- }
- return $comment;
- }
- }
|