1fc2e1131SJaap de Haan<?php 2fc2e1131SJaap de Haan 3a494ddccSgithub-actions[bot]use dokuwiki\Extension\SyntaxPlugin; 44c812427SJaap de Haanuse dokuwiki\File\MediaResolver; 5a494ddccSgithub-actions[bot] 6fc2e1131SJaap de Haan/** 7fc2e1131SJaap de Haan * @license See LICENSE file 8fc2e1131SJaap de Haan */ 9fc2e1131SJaap de Haan// See help: https://www.dokuwiki.org/devel:syntax_plugins 10242f4056SJaap de Haan// The HTML structure generated by this syntax plugin is: 11242f4056SJaap de Haan// 12242f4056SJaap de Haan// <div class="plugin-bpmnio" id="__(bpmn|dmn)_js_<hash>"> 13242f4056SJaap de Haan// <div class="bpmn_js_data"> 14242f4056SJaap de Haan// ... base64 encoded xml 15242f4056SJaap de Haan// </div> 16242f4056SJaap de Haan// <div class="bpmn_js_canvas {$class}"> 17242f4056SJaap de Haan// <div class="bpmn_js_container">... rendered herein</div> 18242f4056SJaap de Haan// </div> 19242f4056SJaap de Haan// </div> 20a494ddccSgithub-actions[bot]class syntax_plugin_bpmnio_bpmnio extends SyntaxPlugin 21fc2e1131SJaap de Haan{ 224c812427SJaap de Haan protected string $type = ''; // 'bpmn' or 'dmn' 234c812427SJaap de Haan protected string $src = ''; // media file 24f0ae282cSJaap de Haan 25*9ff8d41cSJaap de Haan public function getPType(): string 26fc2e1131SJaap de Haan { 27fc2e1131SJaap de Haan return 'block'; 28fc2e1131SJaap de Haan } 29fc2e1131SJaap de Haan 30*9ff8d41cSJaap de Haan public function getType(): string 31fc2e1131SJaap de Haan { 32fc2e1131SJaap de Haan return 'protected'; 33fc2e1131SJaap de Haan } 34fc2e1131SJaap de Haan 35*9ff8d41cSJaap de Haan public function getSort(): int 36fc2e1131SJaap de Haan { 37fc2e1131SJaap de Haan return 0; 38fc2e1131SJaap de Haan } 39fc2e1131SJaap de Haan 40*9ff8d41cSJaap de Haan public function connectTo($mode): void 41fc2e1131SJaap de Haan { 42fc2e1131SJaap de Haan $this->Lexer->addEntryPattern('<bpmnio.*?>(?=.*?</bpmnio>)', $mode, 'plugin_bpmnio_bpmnio'); 43fc2e1131SJaap de Haan } 44fc2e1131SJaap de Haan 45*9ff8d41cSJaap de Haan public function postConnect(): void 46fc2e1131SJaap de Haan { 47fc2e1131SJaap de Haan $this->Lexer->addExitPattern('</bpmnio>', 'plugin_bpmnio_bpmnio'); 48fc2e1131SJaap de Haan } 49fc2e1131SJaap de Haan 50*9ff8d41cSJaap de Haan public function handle($match, $state, $pos, Doku_Handler $handler): array 51fc2e1131SJaap de Haan { 52f0ae282cSJaap de Haan switch ($state) { 53f0ae282cSJaap de Haan case DOKU_LEXER_ENTER: 544c812427SJaap de Haan $matched = []; 554c812427SJaap de Haan preg_match('/<bpmnio\s+([^>]+)>/', $match, $matched); 564c812427SJaap de Haan 574c812427SJaap de Haan $attrs = []; 584c812427SJaap de Haan if (!empty($matched[1])) { 594c812427SJaap de Haan $attrs = $this->buildAttributes($matched[1]); 604c812427SJaap de Haan } 614c812427SJaap de Haan 624c812427SJaap de Haan $this->type = $attrs['type'] ?? 'bpmn'; 634c812427SJaap de Haan $this->src = $attrs['src'] ?? ''; 644c812427SJaap de Haan 654c812427SJaap de Haan return [$state, $this->type, '', $pos, '', false]; 66f0ae282cSJaap de Haan 67f0ae282cSJaap de Haan case DOKU_LEXER_UNMATCHED: 68c4f02a6eSJaap de Haan $posStart = $pos; 69c4f02a6eSJaap de Haan $posEnd = $pos + strlen($match); 704c812427SJaap de Haan 714c812427SJaap de Haan $inline = empty($this->src); 724c812427SJaap de Haan if (!$inline) { 734c812427SJaap de Haan $match = $this->getMedia($this->src); 744c812427SJaap de Haan } 754c812427SJaap de Haan return [$state, $this->type, base64_encode($match), $posStart, $posEnd, $inline]; 76f0ae282cSJaap de Haan 77f0ae282cSJaap de Haan case DOKU_LEXER_EXIT: 78ae85f1faSJaap de Haan $this->type = ''; 794c812427SJaap de Haan $this->src = ''; 804c812427SJaap de Haan return [$state, '', '', '', '', '', false]; 81fc2e1131SJaap de Haan } 82a494ddccSgithub-actions[bot] return []; 83fc2e1131SJaap de Haan } 84fc2e1131SJaap de Haan 854c812427SJaap de Haan private function buildAttributes($string) 864c812427SJaap de Haan { 874c812427SJaap de Haan $attrs = []; 884c812427SJaap de Haan preg_match_all('/(\w+)=["\'](.*?)["\']/', $string, $matches, PREG_SET_ORDER); 894c812427SJaap de Haan foreach ($matches as $match) { 904c812427SJaap de Haan $attrs[$match[1]] = $match[2]; 914c812427SJaap de Haan } 924c812427SJaap de Haan return $attrs; 934c812427SJaap de Haan } 944c812427SJaap de Haan 954c812427SJaap de Haan private function getMedia($src) 964c812427SJaap de Haan { 974c812427SJaap de Haan global $ID; 984c812427SJaap de Haan 994c812427SJaap de Haan $id = (new MediaResolver($ID))->resolveId($src); 1004c812427SJaap de Haan if (auth_quickaclcheck($id) < AUTH_READ) { 1014c812427SJaap de Haan return "Error: Access denied for file $src"; 1024c812427SJaap de Haan } 1034c812427SJaap de Haan 1044c812427SJaap de Haan $file = mediaFN($id); 1054c812427SJaap de Haan if (!file_exists($file) || !is_readable($file)) { 1064c812427SJaap de Haan return "Error: Cannot load file $src"; 1074c812427SJaap de Haan } 1084c812427SJaap de Haan 1094c812427SJaap de Haan return file_get_contents($file); 1104c812427SJaap de Haan } 1114c812427SJaap de Haan 112*9ff8d41cSJaap de Haan public function render($mode, Doku_Renderer $renderer, $data): bool 113fc2e1131SJaap de Haan { 1144c812427SJaap de Haan [$state, $type, $match, $posStart, $posEnd, $inline] = $data; 11534515d89SJaap de Haan 11634515d89SJaap de Haan if (is_a($renderer, 'renderer_plugin_dw2pdf')) { 11734515d89SJaap de Haan if ($state == DOKU_LEXER_EXIT) { 11834515d89SJaap de Haan $renderer->doc .= <<<HTML 11934515d89SJaap de Haan <div class="plugin-bpmnio"> 120962d7b81SJaap de Haan <a href="https://github.com/Color-Of-Code/dokuwiki-plugin-bpmnio/issues/4"> 121962d7b81SJaap de Haan DW2PDF support missing: Help wanted 122962d7b81SJaap de Haan </a> 12334515d89SJaap de Haan </div> 12434515d89SJaap de Haan HTML; 12534515d89SJaap de Haan } 12634515d89SJaap de Haan return true; 12734515d89SJaap de Haan } 12834515d89SJaap de Haan 12934515d89SJaap de Haan if ($mode == 'xhtml' || $mode == 'odt') { 130fc2e1131SJaap de Haan switch ($state) { 131fc2e1131SJaap de Haan case DOKU_LEXER_ENTER: 132ae85f1faSJaap de Haan $bpmnid = "__{$type}_js_{$posStart}"; 1338428abe8SJaap de Haan $renderer->doc .= <<<HTML 1348428abe8SJaap de Haan <div class="plugin-bpmnio" id="{$bpmnid}"> 1358428abe8SJaap de Haan HTML; 136fc2e1131SJaap de Haan break; 137fc2e1131SJaap de Haan 138fc2e1131SJaap de Haan case DOKU_LEXER_UNMATCHED: 1398428abe8SJaap de Haan $renderer->doc .= <<<HTML 140f0ae282cSJaap de Haan <div class="{$type}_js_data"> 141c4f02a6eSJaap de Haan {$match} 1428428abe8SJaap de Haan </div> 1438428abe8SJaap de Haan HTML; 1444c812427SJaap de Haan if ($inline) { 145962d7b81SJaap de Haan $target = "plugin_bpmnio_{$type}"; 146962d7b81SJaap de Haan $sectionEditData = ['target' => $target]; 147962d7b81SJaap de Haan $class = $renderer->startSectionEdit($posStart, $sectionEditData); 1484c812427SJaap de Haan } else { 1494c812427SJaap de Haan $class = ''; 1504c812427SJaap de Haan } 151c4f02a6eSJaap de Haan $renderer->doc .= <<<HTML 152f0ae282cSJaap de Haan <div class="{$type}_js_canvas {$class}"> 153f0ae282cSJaap de Haan <div class="{$type}_js_container"></div> 154c4f02a6eSJaap de Haan </div> 155c4f02a6eSJaap de Haan HTML; 1564c812427SJaap de Haan if ($inline) { 157962d7b81SJaap de Haan $renderer->finishSectionEdit($posEnd); 1584c812427SJaap de Haan } 159c4f02a6eSJaap de Haan break; 160c4f02a6eSJaap de Haan 161c4f02a6eSJaap de Haan case DOKU_LEXER_EXIT: 162f0ae282cSJaap de Haan $renderer->doc .= <<<HTML 163f0ae282cSJaap de Haan </div> 164f0ae282cSJaap de Haan HTML; 165fc2e1131SJaap de Haan break; 166fc2e1131SJaap de Haan } 167fc2e1131SJaap de Haan return true; 168fc2e1131SJaap de Haan } 169fc2e1131SJaap de Haan return false; 170fc2e1131SJaap de Haan } 171fc2e1131SJaap de Haan} 172