1<?php 2 3use dokuwiki\plugin\doi\Resolver\AbstractResolver; 4use \dokuwiki\plugin\doi\Resolver\DoiResolver; 5 6 7/** 8 * DokuWiki Plugin doi (Syntax Component) 9 * 10 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 11 * @author Andreas Gohr <gohr@cosmocode.de> 12 */ 13class syntax_plugin_doi_doi extends \dokuwiki\Extension\SyntaxPlugin 14{ 15 /** @inheritDoc */ 16 public function getType() 17 { 18 return 'substition'; 19 } 20 21 /** @inheritDoc */ 22 public function getPType() 23 { 24 return 'normal'; 25 } 26 27 /** @inheritDoc */ 28 public function getSort() 29 { 30 return 155; 31 } 32 33 /** @inheritDoc */ 34 public function connectTo($mode) 35 { 36 $this->Lexer->addSpecialPattern('\[\[doi>[^\]]+\]\]', $mode, 'plugin_doi_doi'); 37 } 38 39 /** @inheritDoc */ 40 public function handle($match, $state, $pos, Doku_Handler $handler) 41 { 42 $doi = substr($match, 6, -2); 43 44 return ['id' => $doi]; 45 } 46 47 /** @inheritDoc */ 48 public function render($mode, Doku_Renderer $renderer, $data) 49 { 50 $resolver = $this->getResolver(); 51 $data['id'] = $resolver->cleanID($data['id']); 52 53 try { 54 $publication = $resolver->getData($data['id']); 55 $url = $publication['url']; 56 $title = $publication['title']; 57 } catch (Exception $e) { 58 msg(hsc($e->getMessage()), -1); 59 $publication = null; 60 $url = $resolver->getFallbackURL($data['id']); 61 $title = $data['id']; 62 } 63 64 // FIXME use nicer rendering for non-xhtml modes 65 if ($mode !== 'xhtml' || !$publication) { 66 $renderer->externallink($url, $title); 67 return true; 68 } 69 70 /** @var Doku_Renderer_xhtml $renderer */ 71 $this->formatPub($publication, $renderer); 72 73 return true; 74 } 75 76 /** 77 * @return AbstractResolver 78 */ 79 protected function getResolver() 80 { 81 return new DoiResolver(); 82 } 83 84 /** 85 * Render the given data 86 * 87 * @param array $data 88 * @param Doku_Renderer_xhtml $renderer 89 * @return void 90 */ 91 protected function formatPub($data, $renderer) 92 { 93 $renderer->doc .= '<div class="plugin_doi ' . hsc($data['type']) . '">'; 94 $renderer->externallink($data['url'], $data['title']); 95 96 if ($data['published']) { 97 $renderer->doc .= ' <span>(' . hsc($data['published']) . ')</span>'; 98 } 99 100 $renderer->doc .= '<div class="meta">'; 101 if ($data['authors']) { 102 $authors = array_map(function ($author) { 103 return '<strong>' . hsc($author) . '</strong>'; 104 }, $data['authors']); 105 $renderer->doc .= '<span class="authors">' . join(', ', $authors) . '</span>'; 106 } 107 if ($data['journal']) { 108 $journal = $data['journal']; 109 $journal .= ' ' . join('/', array_filter([$data['volume'] ?? null, $data['issue'] ?? null])); 110 $journal = '<span>' . hsc($journal) . '</span>'; 111 if (isset($data['page'])) { 112 $journal .= ' <i>p' . hsc($data['page']) . '</i>'; 113 } 114 $renderer->doc .= ' <span class="journal">' . $journal . '</span>'; 115 } 116 $renderer->doc .= '</div>'; 117 118 $renderer->doc .= '<div class="meta">'; 119 if ($data['publisher']) { 120 $renderer->doc .= '<span class="publisher">' . hsc($data['publisher']) . '</span>'; 121 } 122 $renderer->doc .= ' <code class="id">'.$data['idtype'].':' . hsc($data['id']) . '</code>'; 123 $renderer->doc .= '</div>'; 124 125 $renderer->doc .= '</div>'; 126 } 127} 128 129