123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- <?php
- /**
- * Created by PhpStorm.
- * User: robin
- * Date: 10/22/15
- * Time: 9:59 PM
- */
-
- namespace Luticate\Doc\Business;
-
- use Exception;
-
- class DocBlock {
-
- public $docblock,
- $description = null,
- $all_params = array();
-
- /**
- * Parses a docblock;
- */
- function __construct($docblock) {
- if( !is_string($docblock) ) {
- throw new Exception("DocBlock expects first parameter to be a string");
- }
-
- $this->docblock = $docblock;
- $this->parse_block();
- }
-
- /**
- * An alias to __call();
- * allows a better DSL
- *
- * @param string $param_name
- * @return mixed
- */
- public function __get($param_name) {
- return $this->$param_name();
- }
-
- /**
- * Checks if the param exists
- *
- * @param string $param_name
- * @return mixed
- */
- public function __call($param_name, $values = null) {
- if( $param_name == "description" ) {
- return $this->description;
- }else if( isset($this->all_params[$param_name]) ) {
- $params = $this->all_params[$param_name];
-
- if( count($params) == 1 ) {
- return $params[0];
- }else {
- return $params;
- }
- }
-
- return null;
- }
-
- /**
- * Parse each line in the docblock
- * and store the params in `$this->all_params`
- * and the rest in `$this->description`
- */
- private function parse_block() {
- // split at each line
- foreach(preg_split("/(\r?\n)/", $this->docblock) as $line){
-
- // if starts with an asterisk
- if( preg_match('/^(?=\s+?\*[^\/])(.+)/', $line, $matches) ) {
-
- $info = $matches[1];
-
- // remove wrapping whitespace
- $info = trim($info);
-
- // remove leading asterisk
- $info = preg_replace('/^(\*\s+?)/', '', $info);
-
- // if it doesn't start with an "@" symbol
- // then add to the description
- if( $info[0] !== "@" ) {
- $this->description .= "\n$info";
- continue;
- }else {
- // get the name of the param
- if (preg_match('/@param +\\$([^ ]+) +([^ ]+) +(.*)$/', $info, $matches) == 1) {
- $param_name = $matches[1];
- $param_type = $matches[2];
- $value = $matches[3];
-
-
- // push the param value into place
- $this->all_params[$param_name] = [
- "name" => $param_name,
- "type" => $param_type,
- "description" => $value
- ];
-
- continue;
- }
- }
- }
- }
- }
- }
|