diff --git a/Lib/Formatter/Html.php b/Lib/Formatter/Html.php index 47d8013..2dda42d 100644 --- a/Lib/Formatter/Html.php +++ b/Lib/Formatter/Html.php @@ -130,10 +130,15 @@ class Html extends Formatter { 'status' => 'info', ); } - $data = Logger::data(); - $context['time'] = $data['time']; + $info = Logger::data(); + $context['time'] = $info['time']; $panel = static::template($context, 'panel'); + + if(isset($data['extra'])) { + $panel .= $data['extra']; + } + echo static::template(array( 'title' => $context['title'], 'content' => $panel, diff --git a/Lib/Help.php b/Lib/Help.php new file mode 100644 index 0000000..6b89508 --- /dev/null +++ b/Lib/Help.php @@ -0,0 +1,79 @@ +getDocComment(); + $params = $rm->getParameters(); + + preg_match_all('/@param\s+(?P[^\s]*?)\s*\$(?P[^\s]+?)\s+(?P[\w\s]*)/', $doc, $parametersDoc, PREG_SET_ORDER); + preg_match('/@return\s+(?P[^\s]*?)\s+(?P[\w\s]*)/', $doc, $returnDoc); + + $doc = array_filter(array_map(function($l) { + $l = trim($l, " \t\n\r\0\x0B"); + if(strpos($l, '/**') === 0 || strpos($l, '*/') === 0) { + $l = ''; + } + $l = trim($l, "* "); + if(strpos($l, '@') === 0) { + $l = ''; + } + return $l; + }, explode("\n", $doc))); + $doc = nl2br(implode("\n", $doc)); + + $paramsHtml = ''; + foreach($params as $p) { + foreach($parametersDoc as $d) { + if(isset($d['name']) && $p->name == $d['name']) { + $paramsHtml .= Html::template(array( + 'name' => $p->name, + 'optional' => $p->isDefaultValueAvailable() ? '(optional)' : '', + 'type' => isset($d['type']) ? $d['type'] : '', + 'doc' => isset($d['doc']) ? $d['doc'] : '', + ), 'param_help'); + } + } + } + + return Html::template(array( + 'func' => $func, + 'help' => $doc, + 'parameters' => $paramsHtml, + 'return' => Html::template(array( + 'type' => isset($returnDoc['type']) ? $returnDoc['type'] : '', + 'doc' => isset($returnDoc['doc']) ? $returnDoc['doc'] : '', + ), 'return_help'), + ), 'func_help'); + } + + + public static function content(WebService $ws) { + $rc = new \ReflectionClass($ws); + + $methods = array_filter(array_map(function(\ReflectionMethod $m) { + if($m->getName() == 'Run') { + // this is a method from WebService directly and is of not interests for the help + return ''; + } + return $m->getName(); + }, $rc->getMethods(\ReflectionMethod::IS_PUBLIC))); + + $html = ''; + foreach($methods as $m) { + $html .= static::func($ws, $m); + } + + return $html; + } + + public static function exception(WebException $e, WebService $ws, $func) { + return static::func($ws, $func); + } +} \ No newline at end of file diff --git a/Lib/WebService.php b/Lib/WebService.php index 9c97164..0dcf1af 100644 --- a/Lib/WebService.php +++ b/Lib/WebService.php @@ -31,6 +31,9 @@ abstract class WebService $data["error"]["code"] = $e->getCode(); $data["error"]["reason"] = $e->getMessage(); $data["error"]["name"] = $e->getName(); + + $data['extra'] = Help::exception($e, $this, $this->func); + $this->status = 400; Logger::info($e->getName(), 'error'); diff --git a/help.php b/help.php new file mode 100644 index 0000000..42b413f --- /dev/null +++ b/help.php @@ -0,0 +1,13 @@ + 'Help', + 'content' => Help::content(new NetBiblio()), +)); diff --git a/templates/func_help.html b/templates/func_help.html new file mode 100644 index 0000000..e6e1925 --- /dev/null +++ b/templates/func_help.html @@ -0,0 +1,14 @@ +

{{ func }}

+ +

Parameters

+
+ {{ parameters }} +
+ +

Return

+{{ return }} + +

Description

+{{ help }} + + diff --git a/templates/layout.html b/templates/layout.html index f680de0..c9ea2c0 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -22,7 +22,7 @@