Version 1
[yaffs-website] / vendor / phpdocumentor / reflection-docblock / src / phpDocumentor / Reflection / DocBlock / Description.php
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Description.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Description.php
new file mode 100644 (file)
index 0000000..d41142e
--- /dev/null
@@ -0,0 +1,223 @@
+<?php
+/**
+ * phpDocumentor
+ *
+ * PHP Version 5.3
+ *
+ * @author    Mike van Riel <mike.vanriel@naenius.com>
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license   http://www.opensource.org/licenses/mit-license.php MIT
+ * @link      http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\DocBlock;
+
+/**
+ * Parses a Description of a DocBlock or tag.
+ *
+ * @author  Mike van Riel <mike.vanriel@naenius.com>
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link    http://phpdoc.org
+ */
+class Description implements \Reflector
+{
+    /** @var string */
+    protected $contents = '';
+
+    /** @var array The contents, as an array of strings and Tag objects. */
+    protected $parsedContents = null;
+
+    /** @var DocBlock The DocBlock which this description belongs to. */
+    protected $docblock = null;
+
+    /**
+     * Populates the fields of a description.
+     *
+     * @param string   $content  The description's conetnts.
+     * @param DocBlock $docblock The DocBlock which this description belongs to.
+     */
+    public function __construct($content, DocBlock $docblock = null)
+    {
+        $this->setContent($content)->setDocBlock($docblock);
+    }
+
+    /**
+     * Gets the text of this description.
+     *
+     * @return string
+     */
+    public function getContents()
+    {
+        return $this->contents;
+    }
+
+    /**
+     * Sets the text of this description.
+     *
+     * @param string $content The new text of this description.
+     *
+     * @return $this
+     */
+    public function setContent($content)
+    {
+        $this->contents = trim($content);
+
+        $this->parsedContents = null;
+        return $this;
+    }
+
+    /**
+     * Returns the parsed text of this description.
+     *
+     * @return array An array of strings and tag objects, in the order they
+     *     occur within the description.
+     */
+    public function getParsedContents()
+    {
+        if (null === $this->parsedContents) {
+            $this->parsedContents = preg_split(
+                '/\{
+                    # "{@}" is not a valid inline tag. This ensures that
+                    # we do not treat it as one, but treat it literally.
+                    (?!@\})
+                    # We want to capture the whole tag line, but without the
+                    # inline tag delimiters.
+                    (\@
+                        # Match everything up to the next delimiter.
+                        [^{}]*
+                        # Nested inline tag content should not be captured, or
+                        # it will appear in the result separately.
+                        (?:
+                            # Match nested inline tags.
+                            (?:
+                                # Because we did not catch the tag delimiters
+                                # earlier, we must be explicit with them here.
+                                # Notice that this also matches "{}", as a way
+                                # to later introduce it as an escape sequence.
+                                \{(?1)?\}
+                                |
+                                # Make sure we match hanging "{".
+                                \{
+                            )
+                            # Match content after the nested inline tag.
+                            [^{}]*
+                        )* # If there are more inline tags, match them as well.
+                           # We use "*" since there may not be any nested inline
+                           # tags.
+                    )
+                \}/Sux',
+                $this->contents,
+                null,
+                PREG_SPLIT_DELIM_CAPTURE
+            );
+
+            $count = count($this->parsedContents);
+            for ($i=1; $i<$count; $i += 2) {
+                $this->parsedContents[$i] = Tag::createInstance(
+                    $this->parsedContents[$i],
+                    $this->docblock
+                );
+            }
+
+            //In order to allow "literal" inline tags, the otherwise invalid
+            //sequence "{@}" is changed to "@", and "{}" is changed to "}".
+            //See unit tests for examples.
+            for ($i=0; $i<$count; $i += 2) {
+                $this->parsedContents[$i] = str_replace(
+                    array('{@}', '{}'),
+                    array('@', '}'),
+                    $this->parsedContents[$i]
+                );
+            }
+        }
+        return $this->parsedContents;
+    }
+
+    /**
+     * Return a formatted variant of the Long Description using MarkDown.
+     *
+     * @todo this should become a more intelligent piece of code where the
+     *     configuration contains a setting what format long descriptions are.
+     *
+     * @codeCoverageIgnore Will be removed soon, in favor of adapters at
+     *     PhpDocumentor itself that will process text in various formats.
+     *
+     * @return string
+     */
+    public function getFormattedContents()
+    {
+        $result = $this->contents;
+
+        // if the long description contains a plain HTML <code> element, surround
+        // it with a pre element. Please note that we explicitly used str_replace
+        // and not preg_replace to gain performance
+        if (strpos($result, '<code>') !== false) {
+            $result = str_replace(
+                array('<code>', "<code>\r\n", "<code>\n", "<code>\r", '</code>'),
+                array('<pre><code>', '<code>', '<code>', '<code>', '</code></pre>'),
+                $result
+            );
+        }
+
+        if (class_exists('Parsedown')) {
+            $markdown = \Parsedown::instance();
+            $result = $markdown->parse($result);
+        } elseif (class_exists('dflydev\markdown\MarkdownExtraParser')) {
+            $markdown = new \dflydev\markdown\MarkdownExtraParser();
+            $result = $markdown->transformMarkdown($result);
+        }
+
+        return trim($result);
+    }
+
+    /**
+     * Gets the docblock this tag belongs to.
+     *
+     * @return DocBlock The docblock this description belongs to.
+     */
+    public function getDocBlock()
+    {
+        return $this->docblock;
+    }
+
+    /**
+     * Sets the docblock this tag belongs to.
+     *
+     * @param DocBlock $docblock The new docblock this description belongs to.
+     *     Setting NULL removes any association.
+     *
+     * @return $this
+     */
+    public function setDocBlock(DocBlock $docblock = null)
+    {
+        $this->docblock = $docblock;
+
+        return $this;
+    }
+
+    /**
+     * Builds a string representation of this object.
+     *
+     * @todo determine the exact format as used by PHP Reflection
+     *     and implement it.
+     *
+     * @return void
+     * @codeCoverageIgnore Not yet implemented
+     */
+    public static function export()
+    {
+        throw new \Exception('Not yet implemented');
+    }
+
+    /**
+     * Returns the long description as a string.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getContents();
+    }
+}