1fc2e1131SJaap de Haan<?php 2fc2e1131SJaap de Haan 3a494ddccSgithub-actions[bot]use dokuwiki\Extension\SyntaxPlugin; 4*4c812427SJaap 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{ 22*4c812427SJaap de Haan protected string $type = ''; // 'bpmn' or 'dmn' 23*4c812427SJaap de Haan protected string $src = ''; // media file 24f0ae282cSJaap de Haan 25fc2e1131SJaap de Haan public function getPType() 26fc2e1131SJaap de Haan { 27fc2e1131SJaap de Haan return 'block'; 28fc2e1131SJaap de Haan } 29fc2e1131SJaap de Haan 30fc2e1131SJaap de Haan public function getType() 31fc2e1131SJaap de Haan { 32fc2e1131SJaap de Haan return 'protected'; 33fc2e1131SJaap de Haan } 34fc2e1131SJaap de Haan 35fc2e1131SJaap de Haan public function getSort() 36fc2e1131SJaap de Haan { 37fc2e1131SJaap de Haan return 0; 38fc2e1131SJaap de Haan } 39fc2e1131SJaap de Haan 40fc2e1131SJaap de Haan public function connectTo($mode) 41fc2e1131SJaap de Haan { 42fc2e1131SJaap de Haan $this->Lexer->addEntryPattern('<bpmnio.*?>(?=.*?</bpmnio>)', $mode, 'plugin_bpmnio_bpmnio'); 43fc2e1131SJaap de Haan } 44fc2e1131SJaap de Haan 45fc2e1131SJaap de Haan public function postConnect() 46fc2e1131SJaap de Haan { 47fc2e1131SJaap de Haan $this->Lexer->addExitPattern('</bpmnio>', 'plugin_bpmnio_bpmnio'); 48fc2e1131SJaap de Haan } 49fc2e1131SJaap de Haan 50fc2e1131SJaap de Haan public function handle($match, $state, $pos, Doku_Handler $handler) 51fc2e1131SJaap de Haan { 52f0ae282cSJaap de Haan switch ($state) { 53f0ae282cSJaap de Haan case DOKU_LEXER_ENTER: 54*4c812427SJaap de Haan $matched = []; 55*4c812427SJaap de Haan preg_match('/<bpmnio\s+([^>]+)>/', $match, $matched); 56*4c812427SJaap de Haan 57*4c812427SJaap de Haan $attrs = []; 58*4c812427SJaap de Haan if (!empty($matched[1])) { 59*4c812427SJaap de Haan $attrs = $this->buildAttributes($matched[1]); 60*4c812427SJaap de Haan } 61*4c812427SJaap de Haan 62*4c812427SJaap de Haan $this->type = $attrs['type'] ?? 'bpmn'; 63*4c812427SJaap de Haan $this->src = $attrs['src'] ?? ''; 64*4c812427SJaap de Haan 65*4c812427SJaap 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); 70*4c812427SJaap de Haan 71*4c812427SJaap de Haan $inline = empty($this->src); 72*4c812427SJaap de Haan if (!$inline) { 73*4c812427SJaap de Haan $match = $this->getMedia($this->src); 74*4c812427SJaap de Haan } 75*4c812427SJaap 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 = ''; 79*4c812427SJaap de Haan $this->src = ''; 80*4c812427SJaap de Haan return [$state, '', '', '', '', '', false]; 81fc2e1131SJaap de Haan } 82a494ddccSgithub-actions[bot] return []; 83fc2e1131SJaap de Haan } 84fc2e1131SJaap de Haan 85*4c812427SJaap de Haan private function buildAttributes($string) 86*4c812427SJaap de Haan { 87*4c812427SJaap de Haan $attrs = []; 88*4c812427SJaap de Haan preg_match_all('/(\w+)=["\'](.*?)["\']/', $string, $matches, PREG_SET_ORDER); 89*4c812427SJaap de Haan foreach ($matches as $match) { 90*4c812427SJaap de Haan $attrs[$match[1]] = $match[2]; 91*4c812427SJaap de Haan } 92*4c812427SJaap de Haan return $attrs; 93*4c812427SJaap de Haan } 94*4c812427SJaap de Haan 95*4c812427SJaap de Haan private function getMedia($src) 96*4c812427SJaap de Haan { 97*4c812427SJaap de Haan global $ID; 98*4c812427SJaap de Haan 99*4c812427SJaap de Haan $id = (new MediaResolver($ID))->resolveId($src); 100*4c812427SJaap de Haan if (auth_quickaclcheck($id) < AUTH_READ) { 101*4c812427SJaap de Haan return "Error: Access denied for file $src"; 102*4c812427SJaap de Haan } 103*4c812427SJaap de Haan 104*4c812427SJaap de Haan $file = mediaFN($id); 105*4c812427SJaap de Haan if (!file_exists($file) || !is_readable($file)) { 106*4c812427SJaap de Haan return "Error: Cannot load file $src"; 107*4c812427SJaap de Haan } 108*4c812427SJaap de Haan 109*4c812427SJaap de Haan return file_get_contents($file); 110*4c812427SJaap de Haan } 111*4c812427SJaap de Haan 112fc2e1131SJaap de Haan public function render($mode, Doku_Renderer $renderer, $data) 113fc2e1131SJaap de Haan { 114*4c812427SJaap 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; 144*4c812427SJaap 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); 148*4c812427SJaap de Haan } else { 149*4c812427SJaap de Haan $class = ''; 150*4c812427SJaap 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; 156*4c812427SJaap de Haan if ($inline) { 157962d7b81SJaap de Haan $renderer->finishSectionEdit($posEnd); 158*4c812427SJaap 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