diff --git a/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php b/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php index a1ebc99..7ad72f2 100644 --- a/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php +++ b/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php @@ -26,8 +26,11 @@ class AuthorTag extends Tag /** @var string The name of the author */ protected $name = ''; - /** @var string The email of the author */ - protected $email = ''; + /** @var array Array of URIs belonging to the author, including email */ + protected $uris = array(); + + /** @var string The role of the author */ + protected $role = ''; /** * Parses a tag and populates the member variables. @@ -37,12 +40,36 @@ class AuthorTag extends Tag */ public function __construct($type, $content) { - parent::__construct($type, $content); - if (preg_match('/^([^\<]*)(\<([^\>]*)\>)?$/', $content, $matches)) { + $this->tag = $type; + $this->content = $content; + if (preg_match( + '/^ + # Name + ([^\<]*) + (?: + # URIs + \<([^>]*)\>\s* + # Role + (?: + \(([^\)]*)\) + )? + # Description + (.*) + )? + $/sux', + $content, + $matches + ) + ) { $this->name = trim($matches[1]); - if (isset($matches[3])) { - $this->email = trim($matches[3]); + if (isset($matches[2])) { + $matches[2] = trim($matches[2]); + if ('' !== $matches[2]) { + $this->uris = preg_split('/\s+/u', $matches[2]); + } } + $this->role = isset($matches[3]) ? trim($matches[3]) : ''; + $this->description = isset($matches[4]) ? trim($matches[4]) : ''; } } @@ -57,12 +84,22 @@ class AuthorTag extends Tag } /** - * Gets the author's email. + * Gets the author's URIs. * - * @return string The author's email. + * @return array Array of URIs belonging to the author, including email. */ - public function getAuthorEmail() + public function getAuthorURIs() { - return $this->email; + return $this->uris; + } + + /** + * Gets the author's role. + * + * @return string The role of the author. + */ + public function getAuthorRole() + { + return $this->role; } } diff --git a/tests/phpDocumentor/Reflection/DocBlock/Tag/AuthorTagTest.php b/tests/phpDocumentor/Reflection/DocBlock/Tag/AuthorTagTest.php new file mode 100644 index 0000000..46c2f4b --- /dev/null +++ b/tests/phpDocumentor/Reflection/DocBlock/Tag/AuthorTagTest.php @@ -0,0 +1,138 @@ + + * @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\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\AuthorTag. + * + * @author Vasil Rangelov + * @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 + */ +class AuthorTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that the \phpDocumentor\Reflection\DocBlock\Tag\AuthorTag can + * understand the @author DocBlock. + * + * @param string $type + * @param string $content + * @param string $extractedType + * @param string $extractedVarName + * @param string $extractedDescription + * + * @dataProvider provideDataForConstructor + * + * @return void + */ + public function testConstructorParsesInputsIntoCorrectFields( + $type, + $content, + $extractedName, + $extractedURIs, + $extractedRole, + $extractedDescription + ) { + $tag = new AuthorTag($type, $content); + + $this->assertEquals($extractedName, $tag->getAuthorName()); + $this->assertEquals($extractedURIs, $tag->getAuthorURIs()); + $this->assertEquals($extractedRole, $tag->getAuthorRole()); + $this->assertEquals($extractedDescription, $tag->getDescription()); + } + + /** + * Data provider for testConstructorParsesInputsIntoCorrectFields() + * + * @return array + */ + public function provideDataForConstructor() + { + return array( + array('author', 'Mike van Riel', 'Mike van Riel', array(), '', ''), + array( + 'author', + 'Mike van Riel ', + 'Mike van Riel', + array('mike.vanriel@naenius.com'), + '', + '' + ), + array( + 'author', + 'Mike van Riel ', + 'Mike van Riel', + array('mike.vanriel@naenius.com'), + '', + '' + ), + array( + 'author', + 'Mike van Riel < mike.vanriel@naenius.com>', + 'Mike van Riel', + array('mike.vanriel@naenius.com'), + '', + '' + ), + array( + 'author', + 'Mike van Riel < mike.vanriel@naenius.com >', + 'Mike van Riel', + array('mike.vanriel@naenius.com'), + '', + '' + ), + array( + 'author', + 'Mike van Riel ', + 'Mike van Riel', + array('mike.vanriel@naenius.com', '@mvriel'), + '', + '' + ), + array( + 'author', + 'Mike van Riel (lead)', + 'Mike van Riel', + array('mike.vanriel@naenius.com'), + 'lead', + '' + ), + array( + 'author', + 'Mike van Riel (lead) The one', + 'Mike van Riel', + array('mike.vanriel@naenius.com'), + 'lead', + 'The one' + ), + array( + 'author', + 'Mike van Riel The one', + 'Mike van Riel', + array('mike.vanriel@naenius.com'), + '', + 'The one' + ), + array( + 'author', + 'Mike van Riel <> The one', + 'Mike van Riel', + array(), + '', + 'The one' + ) + ); + } +}