Lexer->addEntryPattern('(?=.*?)','base','plugin_idoit'); } public function postConnect() { $this->Lexer->addExitPattern('','plugin_idoit'); } function getInfo(){ return array( 'author' => 'Oliver Günther', 'email' => 'mail@oliverguenther.de', 'date' => '2014-11-19', 'name' => 'i-doit API client plugin', 'desc' => 'Call i-doit API with JSON requests directly from DokuWiki', 'url' => 'https://github.com/oliverguenther/dokuwiki-idoit-syntax' ); } /** * Filter results with a given set of arrays, each containing * one hierarchy element to access. */ function filterResults($request, $response) { $results = array(); foreach ($request['filter'] as $filter) { // Every filter is an array of items $obj = $response; $path = $filter['path']; $name = $filter['desc']; foreach ($path as $elem) { if (array_key_exists($elem, $obj)) { // descend $obj = $obj[$elem]; } else { // continue with next filter $results[$name] = "Filter '$name' (path " . join('/', $path) . ") does not match response"; continue 2; } } $results[$name] = $obj; } return $results; } /** * Execute the request on the JSON RPC apai * and process the results. */ function callAPI($request) { try { // Init connection to api endpoint $api_conn = new ApiClient(new ApiConnection( $this->getConf('api_endpoint'), $this->getConf('api_key'), $this->getConf('api_user'), $this->getConf('api_pass') )); $apiRequest = new Request($api_conn, $request['method'], $request['params']); $response = $apiRequest->send(); if ($request['filter']) { return $this->filterResults($request, $response); } else { return $response; } } catch (Exception $e) { return "API error: " . $e->getMessage(); } } /** * Parse the JSON request from the syntax environment * and call the API with it. * * Returns a string error for JSON decode errors. */ function decodeAndRunQuery($request) { $json = json_decode(trim($request), 1); switch (json_last_error()) { case JSON_ERROR_NONE: return $this->callAPI($json); case JSON_ERROR_DEPTH: return 'JSON decode error: Maximum stack depth exceeded'; case JSON_ERROR_STATE_MISMATCH: return 'JSON decode error: Underflow or the modes mismatch'; case JSON_ERROR_CTRL_CHAR: return 'JSON decode error: Unexpected control character found'; case JSON_ERROR_SYNTAX: return 'JSON decode error: Syntax error, malformed JSON'; case JSON_ERROR_UTF8: return 'JSON decode error: Malformed UTF-8 characters, possibly incorrectly encoded'; default: return 'JSON decode error: unknown'; } } public function handle($match, $state, $pos, Doku_Handler &$handler){ switch ($state) { case DOKU_LEXER_EXIT : case DOKU_LEXER_ENTER : break; case DOKU_LEXER_UNMATCHED : $result = $this->decodeAndRunQuery($match); return array($state, $result); } return array($state, null); } public function render($mode, &$renderer, $data) { if ($mode == 'xhtml') { list($state, $match) = $data; switch ($state) { case DOKU_LEXER_ENTER : $renderer->doc .= "
";
					break;
 
				case DOKU_LEXER_UNMATCHED :
					if (is_array($match)) {
						foreach ($match as $k => $v) {
							if (!is_array($v)) {
								// Print literal
								$renderer->doc .= str_pad($k, 30) . "$v\n";
							} else {
								// Print complex as print_r
								$renderer->doc .= "--- $k ---\n";
								$renderer->doc .= print_r($v, true);
								$renderer->doc .= "end $k end\n";
							}
						}
					} else {
						$renderer->doc .= print_r($match, true);
					}

					break;

				case DOKU_LEXER_EXIT :
					$renderer->doc .= "
"; break; } return true; } return false; } }