public function getAnnotations($docComment)
 {
     $result = new AnnotationCollection();
     if (preg_match_all('/@(.*?)\\n/is', $docComment, $matches)) {
         array_shift($matches);
         foreach ($matches[0] as $match) {
             $parts = explode(' ', $match);
             $x = new Annotation();
             $x->setName($parts[0]);
             if (count($parts) > 1) {
                 for ($i = 1; $i != count($parts); $i++) {
                     $x->addValue($parts[$i]);
                 }
             }
             $result->add($x);
         }
     }
     return $result;
 }
Пример #2
0
 /**
  * @param AnnotationCollection $annotations
  * @param string               $shortName
  *
  * @return AnnotationCollection
  */
 private static function findAnnotations(AnnotationCollection $annotations = null, $shortName = '')
 {
     // init
     $result = new AnnotationCollection();
     // action
     /** @var Annotation $annotation */
     foreach ($annotations as $annotation) {
         if ($annotation->getShortName() == $shortName) {
             $result->add($annotation);
         }
     }
     // return
     return $result;
 }
Пример #3
0
 /**
  * @param string $docblock
  *
  * @return AnnotationCollection
  */
 private static function parseDocblock($docblock = '')
 {
     //echo $docblock.PHP_EOL;
     // init
     $result = new AnnotationCollection();
     $debug = false;
     // config
     $ramlNamespace = '\\raml\\annotations';
     // action
     $annotationIsOpen = false;
     $annotationNameIsOpen = false;
     $annotationParameterIsOpen = false;
     $currentAnnotationName = '';
     $parameterKeyIsOpen = false;
     $parameterValueIsOpen = false;
     $parameterValueStringIsOpen = false;
     $currentParameterKey = '';
     $currentParameterValue = '';
     $parameter = new AnnotationParameterCollection();
     for ($i = 0; $i < strlen($docblock); $i++) {
         $currentChar = $docblock[$i];
         $previousChar = $i - 1 >= 0 ? $docblock[$i - 1] : '';
         $nextChar = $i + 1 < strlen($docblock) ? $docblock[$i + 1] : '';
         if (!$annotationIsOpen && $currentChar == '@') {
             // check, if @ is followed by raml namespace
             if ($i + strlen($ramlNamespace) < strlen($docblock) && substr($docblock, $i + 1, strlen($ramlNamespace)) == $ramlNamespace) {
                 echo $debug ? 'start reading annotation' . PHP_EOL : '';
                 $annotationIsOpen = true;
                 echo $debug ? '  start reading annotation name' . PHP_EOL : '';
                 $annotationNameIsOpen = true;
                 continue;
             }
         } else {
             if ($annotationNameIsOpen) {
                 if ($currentChar == '(') {
                     echo $debug ? '  stop reading annotation name: ' . $currentAnnotationName . PHP_EOL : '';
                     $annotationNameIsOpen = false;
                     echo $debug ? '  start reading annotation parameter' . PHP_EOL : '';
                     $annotationParameterIsOpen = true;
                     echo $debug ? '    start reading annotation parameter key' . PHP_EOL : '';
                     $parameterKeyIsOpen = true;
                     continue;
                 } else {
                     $currentAnnotationName .= $currentChar;
                 }
             }
             if ($annotationParameterIsOpen) {
                 if ($parameterKeyIsOpen) {
                     if ($currentChar == '=') {
                         $currentParameterKey = trim($currentParameterKey);
                         // TODO if parameter section is open, wait until !\s comes to first start key, then value
                         echo $debug ? '    stop reading annotation parameter key: ' . $currentParameterKey . PHP_EOL : '';
                         $parameterKeyIsOpen = false;
                         echo $debug ? '    start reading annotation parameter value' . PHP_EOL : '';
                         $parameterValueIsOpen = true;
                         continue;
                     } else {
                         $currentParameterKey .= $currentChar;
                     }
                 }
                 if ($parameterValueIsOpen) {
                     if ($currentChar == '"') {
                         // masked quotation mark
                         if ($nextChar == '"') {
                             $currentParameterValue .= '"';
                             $i += 1;
                             // step 2 positions forward
                             continue;
                         }
                         $parameterValueStringIsOpen = !$parameterValueStringIsOpen;
                         if (!$parameterValueStringIsOpen) {
                             echo $debug ? '    stop reading annotation parameter value (string): ' . $currentParameterValue . PHP_EOL : '';
                             // parameter is finished
                             $parameterValueStringIsOpen = false;
                             $parameterValueIsOpen = false;
                             $parameter->add(new AnnotationParameter($currentParameterKey, $currentParameterValue), $currentParameterKey);
                             // clear
                             $currentParameterKey = '';
                             $currentParameterValue = '';
                             continue;
                         } else {
                             echo $debug ? '    start reading annotation parameter value (string)' . PHP_EOL : '';
                             $parameterValueStringIsOpen = true;
                             continue;
                         }
                     }
                     if (!$parameterValueStringIsOpen) {
                         if ($currentChar == ' ' || $currentChar == ')') {
                             echo $debug ? '    stop reading annotation parameter value: ' . $currentParameterValue . PHP_EOL : '';
                             $parameterValueIsOpen = false;
                             $parameter->add(new AnnotationParameter($currentParameterKey, $currentParameterValue), $currentParameterKey);
                             // clear
                             $currentParameterKey = '';
                             $currentParameterValue = '';
                             if ($currentChar == ')') {
                                 // complete attribute seems to be finished
                                 echo $debug ? '    stop reading annotation parameter' . PHP_EOL : '';
                                 $annotationParameterIsOpen = false;
                                 echo $debug ? 'stop reading annotation: ' . $currentAnnotationName . PHP_EOL : '';
                                 $annotationIsOpen = false;
                                 $result->add(new Annotation($currentAnnotationName, $parameter));
                                 $currentAnnotationName = '';
                                 $parameter = new AnnotationParameterCollection();
                             }
                         }
                     }
                     $currentParameterValue .= $currentChar;
                 } else {
                     if (!$parameterKeyIsOpen && $currentChar != ' ') {
                         echo $debug ? '    start reading annotation parameter key' . PHP_EOL : '';
                         $parameterKeyIsOpen = true;
                     }
                     if ($currentChar == ')') {
                         echo $debug ? '    stop reading annotation parameter' . PHP_EOL : '';
                         $annotationParameterIsOpen = false;
                         echo $debug ? 'stop reading annotation: ' . $currentAnnotationName . PHP_EOL : '';
                         $annotationIsOpen = false;
                         // complete attribute seems to be finished
                         $result->add(new Annotation($currentAnnotationName, $parameter));
                         $currentAnnotationName = '';
                         $parameter = new AnnotationParameterCollection();
                     }
                 }
             }
         }
     }
     // return
     return $result;
 }