1fc2e1131SJaap de Haan<?php 2fc2e1131SJaap de Haan 3fc2e1131SJaap de Haan/** 4fc2e1131SJaap de Haan * @license See LICENSE file 5fc2e1131SJaap de Haan * @author Jaap de Haan <jaap.dehaan@color-of-code.de> 6fc2e1131SJaap de Haan */ 7fc2e1131SJaap de Haan 8fc2e1131SJaap de Haan// See help: https://www.dokuwiki.org/devel:syntax_plugins 9fc2e1131SJaap de Haan 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> 20242f4056SJaap de Haan 21242f4056SJaap de Haan 22fc2e1131SJaap de Haanclass syntax_plugin_bpmnio_bpmnio extends DokuWiki_Syntax_Plugin 23fc2e1131SJaap de Haan{ 24*ae85f1faSJaap de Haan public string $type = ''; // 'bpmn' or 'dmn' 25f0ae282cSJaap de Haan 26fc2e1131SJaap de Haan public function getPType() 27fc2e1131SJaap de Haan { 28fc2e1131SJaap de Haan return 'block'; 29fc2e1131SJaap de Haan } 30fc2e1131SJaap de Haan 31fc2e1131SJaap de Haan public function getType() 32fc2e1131SJaap de Haan { 33fc2e1131SJaap de Haan return 'protected'; 34fc2e1131SJaap de Haan } 35fc2e1131SJaap de Haan 36fc2e1131SJaap de Haan public function getSort() 37fc2e1131SJaap de Haan { 38fc2e1131SJaap de Haan return 0; 39fc2e1131SJaap de Haan } 40fc2e1131SJaap de Haan 41fc2e1131SJaap de Haan public function connectTo($mode) 42fc2e1131SJaap de Haan { 43fc2e1131SJaap de Haan $this->Lexer->addEntryPattern('<bpmnio.*?>(?=.*?</bpmnio>)', $mode, 'plugin_bpmnio_bpmnio'); 44fc2e1131SJaap de Haan } 45fc2e1131SJaap de Haan 46fc2e1131SJaap de Haan public function postConnect() 47fc2e1131SJaap de Haan { 48fc2e1131SJaap de Haan $this->Lexer->addExitPattern('</bpmnio>', 'plugin_bpmnio_bpmnio'); 49fc2e1131SJaap de Haan } 50fc2e1131SJaap de Haan 51fc2e1131SJaap de Haan public function handle($match, $state, $pos, Doku_Handler $handler) 52fc2e1131SJaap de Haan { 53f0ae282cSJaap de Haan switch ($state) { 54f0ae282cSJaap de Haan case DOKU_LEXER_ENTER : 55f0ae282cSJaap de Haan $matched = ''; 56f0ae282cSJaap de Haan preg_match('/<bpmnio type="(\w+)">/', $match, $matched); 57*ae85f1faSJaap de Haan $this->type = $matched[1] ?? 'bpmn'; 58*ae85f1faSJaap de Haan return array($state, $this->type, '', $pos, ''); 59f0ae282cSJaap de Haan 60f0ae282cSJaap de Haan case DOKU_LEXER_UNMATCHED: 61c4f02a6eSJaap de Haan $posStart = $pos; 62c4f02a6eSJaap de Haan $posEnd = $pos + strlen($match); 63242f4056SJaap de Haan $match = base64_encode($match); 64*ae85f1faSJaap de Haan return array($state, $this->type, $match, $posStart, $posEnd); 65f0ae282cSJaap de Haan 66f0ae282cSJaap de Haan case DOKU_LEXER_EXIT: 67*ae85f1faSJaap de Haan $this->type = ''; 68f0ae282cSJaap de Haan return array($state, '', '', '', ''); 69fc2e1131SJaap de Haan } 70f0ae282cSJaap de Haan return array(); 71fc2e1131SJaap de Haan } 72fc2e1131SJaap de Haan 73fc2e1131SJaap de Haan public function render($mode, Doku_Renderer $renderer, $data) 74fc2e1131SJaap de Haan { 75f0ae282cSJaap de Haan list($state, $type, $match, $posStart, $posEnd) = $data; 7634515d89SJaap de Haan 7734515d89SJaap de Haan if (is_a($renderer, 'renderer_plugin_dw2pdf')) { 7834515d89SJaap de Haan if ($state == DOKU_LEXER_EXIT) { 7934515d89SJaap de Haan $renderer->doc .= <<<HTML 8034515d89SJaap de Haan <div class="plugin-bpmnio"> 8134515d89SJaap de Haan <a href="https://github.com/Color-Of-Code/dokuwiki-plugin-bpmnio/issues/4">DW2PDF support missing: Help wanted</a> 8234515d89SJaap de Haan </div> 8334515d89SJaap de Haan HTML; 8434515d89SJaap de Haan } 8534515d89SJaap de Haan return true; 8634515d89SJaap de Haan } 8734515d89SJaap de Haan 8834515d89SJaap de Haan if ($mode == 'xhtml' || $mode == 'odt') { 89fc2e1131SJaap de Haan switch ($state) { 90fc2e1131SJaap de Haan case DOKU_LEXER_ENTER: 91*ae85f1faSJaap de Haan $bpmnid = "__{$type}_js_{$posStart}"; 928428abe8SJaap de Haan $renderer->doc .= <<<HTML 938428abe8SJaap de Haan <div class="plugin-bpmnio" id="{$bpmnid}"> 948428abe8SJaap de Haan HTML; 95fc2e1131SJaap de Haan break; 96fc2e1131SJaap de Haan 97fc2e1131SJaap de Haan case DOKU_LEXER_UNMATCHED: 988428abe8SJaap de Haan $renderer->doc .= <<<HTML 99f0ae282cSJaap de Haan <div class="{$type}_js_data"> 100c4f02a6eSJaap de Haan {$match} 1018428abe8SJaap de Haan </div> 1028428abe8SJaap de Haan HTML; 103c4f02a6eSJaap de Haan 104f0ae282cSJaap de Haan $class = $this->_startSectionEdit($renderer, $posStart, $type); 105c4f02a6eSJaap de Haan $renderer->doc .= <<<HTML 106f0ae282cSJaap de Haan <div class="{$type}_js_canvas {$class}"> 107f0ae282cSJaap de Haan <div class="{$type}_js_container"></div> 108c4f02a6eSJaap de Haan </div> 109c4f02a6eSJaap de Haan HTML; 110c4f02a6eSJaap de Haan $this->_finishSectionEdit($renderer, $posEnd); 111c4f02a6eSJaap de Haan break; 112c4f02a6eSJaap de Haan 113c4f02a6eSJaap de Haan case DOKU_LEXER_EXIT: 114f0ae282cSJaap de Haan $renderer->doc .= <<<HTML 115f0ae282cSJaap de Haan </div> 116f0ae282cSJaap de Haan HTML; 117fc2e1131SJaap de Haan break; 118fc2e1131SJaap de Haan } 119fc2e1131SJaap de Haan return true; 120fc2e1131SJaap de Haan } 121fc2e1131SJaap de Haan return false; 122fc2e1131SJaap de Haan } 123c4f02a6eSJaap de Haan 124f0ae282cSJaap de Haan private function _startSectionEdit(Doku_Renderer $renderer, $pos, $type) 125c4f02a6eSJaap de Haan { 126f0ae282cSJaap de Haan $target = "plugin_bpmnio_{$type}"; 127f0ae282cSJaap de Haan $sectionEditData = ['target' => $target]; 128c4f02a6eSJaap de Haan if (!defined('SEC_EDIT_PATTERN')) { 129c4f02a6eSJaap de Haan // backwards-compatibility for Frusterick Manners (2017-02-19) 130f0ae282cSJaap de Haan $sectionEditData = $target; 131c4f02a6eSJaap de Haan } 132c4f02a6eSJaap de Haan return $renderer->startSectionEdit($pos, $sectionEditData); 133c4f02a6eSJaap de Haan } 134c4f02a6eSJaap de Haan 135c4f02a6eSJaap de Haan private function _finishSectionEdit(Doku_Renderer $renderer, $pos) 136c4f02a6eSJaap de Haan { 137c4f02a6eSJaap de Haan $renderer->finishSectionEdit($pos); 138c4f02a6eSJaap de Haan } 139fc2e1131SJaap de Haan} 140