*/ if (!defined('DOKU_INC')) { define('DOKU_INC', realpath(dirname(__FILE__) . '/../../') . DIRECTORY_SEPARATOR); } if (!defined('DOKU_PLUGIN')) { define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/'); } require_once(DOKU_PLUGIN . 'syntax.php'); require_once("ZoteroEntry.php"); require_once("FeedZoteroRepository.php"); require_once("TextZoteroRepository.php"); require_once("IniZoteroConfig.php"); require_once("WebZoteroFeedReader.php"); class syntax_plugin_zotero extends DokuWiki_Syntax_Plugin { /** * @var ZoteroRepository */ private $repo = null; /** * @var ZoteroConfig */ private $config = null; function getInfo() { return array( 'author' => 'Stefan Macke', 'email' => 'me@stefan-macke.de', 'date' => '2013-03-03', 'name' => 'Zotero Plugin', 'desc' => 'Links quotes to Zotero sources', 'url' => 'http://blog.macke.it', ); } function getType() { return 'substition'; } function getSort() { return 50; } function connectTo($mode) { $this->Lexer->addSpecialPattern('\\\cite.*?\}', $mode, 'plugin_zotero'); } function handle($match, $state, $pos, Doku_Handler $handler) { $citeKey = ""; $pageRef = ""; $matches = array(); if (preg_match("/\\\cite(\[([a-zA-Z0-9 \.,\-:]*)\])?\{([a-zA-Z0-9\-:]*?)\}/", $match, $matches)) { $pageRef = $matches[2]; $citeKey = $matches[3]; } else { return $this->outputError("invalid citation: " . $match); } $output = ""; try { $this->config = new IniConfig(); $cachePage = $this->config->getCachePage(); $this->repo = new TextZoteroRepository($cachePage, $this->config); $output = $this->createSourceOutput($citeKey, $pageRef); return $this->output($output); } catch (Exception $e) { return $this->outputError($e->getMessage()); } } private function output($text) { return '' . $text. ''; } private function outputError($message) { return $this->output('ERROR: ' . $message . ""); } private function createSourceOutput($citeKey, $pageRef) { $parentheses = explode(",", $this->config->getConfig("WikiOutput", "parentheses")); if (count($parentheses) != 2) { throw new ZoteroConfigException("configuration not set correctly: WikiOutput.parentheses"); } $entry = $this->getZoteroEntry($citeKey); $output = $parentheses[0] . $this->getZoteroLink($entry); $output = $this->addPageRefToOutput($output, $pageRef); $output .= $parentheses[1]; return $output; } private function addPageRefToOutput($output, $pageRef) { if ($pageRef != "") { if (preg_match("/^[0-9\-f\.]+$/", $pageRef)) { if (isset($this->config['WikiOutput']['pagePrefix'])) { $pageRef = $this->config['WikiOutput']['pagePrefix'] . $pageRef; } } $output .= ", " . $pageRef; } return $output; } private function getZoteroEntry($citeKey) { try { return $this->repo->getEntryByCiteKey($citeKey); } catch (ZoteroEntryNotFoundException $e) { if ($this->config->getConfig('ZoteroAccess', 'autoupdate') == 1) { $cachePage = $this->config->getCachePage(); $feedReader = new WebZoteroFeedReader($this->config); $webRepo = new FeedZoteroRepository($feedReader, $this->config); $entries = $webRepo->getAllEntries(); $this->repo->updateAndSaveEntries($entries); return $this->repo->getEntryByCiteKey($citeKey); } else { throw $e; } } } private function getZoteroLink(ZoteroEntry $entry) { return '' . htmlentities($entry->getCiteKey()) . ""; } function render($mode, Doku_Renderer $renderer, $data) { if($mode == 'xhtml') { $renderer->doc .= $data; return true; } return false; } } ?>