You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
4.3 KiB
141 lines
4.3 KiB
4 years ago
|
<?php
|
||
|
|
||
|
|
||
|
namespace App\Libs;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @title Doc
|
||
|
* @description Doc
|
||
|
* @package App\Libs
|
||
|
* @author zcstatham
|
||
|
* @time 2021/1/28
|
||
|
*/
|
||
|
Class Doc{
|
||
|
|
||
|
private $params = array ();
|
||
|
/**
|
||
|
* 解析注释
|
||
|
* @param string $doc
|
||
|
* @return array
|
||
|
*/
|
||
|
public function parse($doc = '') {
|
||
|
if ($doc == '' || !$doc) {
|
||
|
return $this->params;
|
||
|
}
|
||
|
// Get the comment
|
||
|
if (preg_match('#^/\*\*(.*)\*/#s', $doc, $comment) === false)
|
||
|
return $this->params;
|
||
|
$comment = trim($comment[1]);
|
||
|
// Get all the lines and strip the * from the first character
|
||
|
if (preg_match_all('#^\s*\*(.*)#m', $comment, $lines) === false)
|
||
|
return $this->params;
|
||
|
$this->parseLines($lines[1]);
|
||
|
return $this->params;
|
||
|
}
|
||
|
|
||
|
private function parseLines($lines) {
|
||
|
$desc = [];
|
||
|
foreach ($lines as $line) {
|
||
|
$parsedLine = $this->parseLine($line); // Parse the line
|
||
|
if ($parsedLine === false && !isset ($this->params['description'])) {
|
||
|
if (isset ($desc)) {
|
||
|
// Store the first line in the short description
|
||
|
$this->params['description'] = implode(PHP_EOL, $desc);
|
||
|
}
|
||
|
$desc = array();
|
||
|
} elseif ($parsedLine !== false) {
|
||
|
$desc[] = $parsedLine; // Store the line in the long description
|
||
|
}
|
||
|
}
|
||
|
$desc = implode(' ', $desc);
|
||
|
if (!empty ($desc))
|
||
|
$this->params['long_description'] = $desc;
|
||
|
}
|
||
|
|
||
|
private function parseLine($line) {
|
||
|
// trim the whitespace from the line
|
||
|
$line = trim($line);
|
||
|
if (empty ($line))
|
||
|
return false; // Empty line
|
||
|
if (strpos($line, '@') === 0) {
|
||
|
if (strpos($line, ' ') > 0) {
|
||
|
// Get the parameter name
|
||
|
$param = substr($line, 1, strpos($line, ' ') - 1);
|
||
|
$value = substr($line, strlen($param) + 2); // Get the value
|
||
|
} else {
|
||
|
$param = substr($line, 1);
|
||
|
$value = '';
|
||
|
}
|
||
|
if($value == 'Request $request')
|
||
|
return false;
|
||
|
// Parse the line and return false if the parameter is valid
|
||
|
if ($this->setParam($param, $value))
|
||
|
return false;
|
||
|
}
|
||
|
return $line;
|
||
|
}
|
||
|
|
||
|
private function setParam($param, $value) {
|
||
|
if ($param == 'param' || $param == 'header')
|
||
|
$value = $this->formatParam($value);
|
||
|
if ($param == 'class')
|
||
|
list ($param, $value) = $this->formatClass($value);
|
||
|
if ($param == 'return' || $param == 'param' || $param == 'header') {
|
||
|
$this->params[$param][] = $value;
|
||
|
} else if (empty ($this->params[$param])) {
|
||
|
$this->params[$param] = $value;
|
||
|
} else {
|
||
|
$this->params[$param] = $this->params[$param] . $value;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
private function formatClass($value) {
|
||
|
$r = preg_split("[\(|\)]", $value);
|
||
|
if (is_array($r)) {
|
||
|
$param = $r[0];
|
||
|
parse_str($r[1], $value);
|
||
|
foreach ($value as $key => $val) {
|
||
|
$val = explode(',', $val);
|
||
|
if (count($val) > 1)
|
||
|
$value[$key] = $val;
|
||
|
}
|
||
|
} else {
|
||
|
$param = 'Unknown';
|
||
|
}
|
||
|
return array($param, $value);
|
||
|
}
|
||
|
|
||
|
private function formatParam($string) {
|
||
|
$string = $string . " ";
|
||
|
if (preg_match_all('/(\w+):(.*?)[\s\n]/s', $string, $match)) {
|
||
|
$param = [];
|
||
|
foreach ($match[1] as $key => $value) {
|
||
|
$param[$match[1][$key]] = $this->getParamType($match[2][$key]);
|
||
|
}
|
||
|
return $param;
|
||
|
} else if (preg_match('/(\w+) (\$.*?)[\s\n]/s', $string, $match)) {
|
||
|
return $match[2];
|
||
|
} else {
|
||
|
return trim($string);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private function getParamType($type)
|
||
|
{
|
||
|
$typeMaps = [
|
||
|
'string' => '字符串',
|
||
|
'int' => '整型',
|
||
|
'float' => '浮点型',
|
||
|
'boolean' => '布尔型',
|
||
|
'date' => '日期',
|
||
|
'array' => '数组',
|
||
|
'fixed' => '固定值',
|
||
|
'enum' => '枚举类型',
|
||
|
'object' => '对象',
|
||
|
];
|
||
|
return array_key_exists($type, $typeMaps) ? $typeMaps[$type] : $type;
|
||
|
}
|
||
|
}
|