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; }
/** * @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; }
/** * @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; }