1<?php 2 3/** 4 * DokuWiki Plugin randomtable multi (Syntax Component) 5 * 6 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 7 * @author Oscar Merida <oscar@oscarm.org> 8 */ 9class syntax_plugin_randomtables_multi extends \dokuwiki\Extension\SyntaxPlugin 10{ 11 /** @inheritDoc */ 12 public function getType(): string 13 { 14 return 'protected'; 15 } 16 17 /** @inheritDoc */ 18 public function getPType(): string 19 { 20 return 'block'; 21 } 22 23 /** @inheritDoc */ 24 public function getSort(): int 25 { 26 return 201; 27 } 28 29 /** @inheritDoc */ 30 public function connectTo($mode): void 31 { 32 $this->Lexer->addEntryPattern('\<ROLL_MULTI\s+', $mode, 'plugin_randomtables_multi'); 33 } 34 35 /** @inheritDoc */ 36 public function postConnect(): void 37 { 38 $this->Lexer->addExitPattern('>', 'plugin_randomtables_multi'); 39 } 40 41 /** @inheritDoc */ 42 public function handle($match, $state, $pos, Doku_Handler $handler): array 43 { 44 switch ($state) { 45 case DOKU_LEXER_UNMATCHED: 46 return [$state, $match]; 47 case DOKU_LEXER_EXIT: 48 return [$state, '']; 49 case DOKU_LEXER_ENTER: 50 default: 51 return [$state, $match]; 52 } 53 } 54 55 /** @inheritDoc */ 56 public function render($mode, Doku_Renderer $renderer, $data): bool 57 { 58 if ($mode !== 'xhtml') { 59 return false; 60 } 61 [$state, $match] = $data; 62 63 switch ($state) { 64 case DOKU_LEXER_ENTER: 65 $renderer->doc .= '<div class="randomtable-well randomtable-well-column">' . PHP_EOL; 66 break; 67 case DOKU_LEXER_UNMATCHED: 68 $id = md5(__CLASS__ . serialize($data)); 69 70 $tables = preg_split('/[\r\n]+/', $match); 71 $tables = array_filter($tables); 72 $renderer->doc .= '<div class="btnGroup">'; 73 foreach ($tables as $table) { 74 if (str_contains($table, ':')) { 75 [$ident, $label] = explode(':', $table,2); 76 } else { 77 $ident = $label = $table; 78 } 79 80 $ident = $renderer->_xmlEntities(trim($ident)); 81 $label = $renderer->_xmlEntities(trim($label)); 82 83 $id = $renderer->_xmlEntities($id); 84 $renderer->doc .= '<button class="randomtable" data-src="' 85 . $ident . '" data-target="results-' 86 . $id . '">Roll ' . $label 87 . '</button>'; 88 } 89 $renderer->doc .= '</div><div id="results-' . $id . '" class="results"></div>'; 90 break; 91 case DOKU_LEXER_EXIT: 92 $renderer->doc .= '</div>' . PHP_EOL; 93 break; 94 } 95 return true; 96 } 97} 98