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 10*242f4056SJaap de Haan// The HTML structure generated by this syntax plugin is: 11*242f4056SJaap de Haan// 12*242f4056SJaap de Haan// <div class="plugin-bpmnio" id="__(bpmn|dmn)_js_<hash>"> 13*242f4056SJaap de Haan// <div class="bpmn_js_data"> 14*242f4056SJaap de Haan// ... base64 encoded xml 15*242f4056SJaap de Haan// </div> 16*242f4056SJaap de Haan// <div class="bpmn_js_canvas {$class}"> 17*242f4056SJaap de Haan// <div class="bpmn_js_container">... rendered herein</div> 18*242f4056SJaap de Haan// </div> 19*242f4056SJaap de Haan// </div> 20*242f4056SJaap de Haan 21*242f4056SJaap de Haan 22fc2e1131SJaap de Haanclass syntax_plugin_bpmnio_bpmnio extends DokuWiki_Syntax_Plugin 23fc2e1131SJaap de Haan{ 24fc2e1131SJaap de Haan public function getPType() 25fc2e1131SJaap de Haan { 26fc2e1131SJaap de Haan return 'block'; 27fc2e1131SJaap de Haan } 28fc2e1131SJaap de Haan 29fc2e1131SJaap de Haan public function getType() 30fc2e1131SJaap de Haan { 31fc2e1131SJaap de Haan return 'protected'; 32fc2e1131SJaap de Haan } 33fc2e1131SJaap de Haan 34fc2e1131SJaap de Haan public function getSort() 35fc2e1131SJaap de Haan { 36fc2e1131SJaap de Haan return 0; 37fc2e1131SJaap de Haan } 38fc2e1131SJaap de Haan 39fc2e1131SJaap de Haan public function connectTo($mode) 40fc2e1131SJaap de Haan { 41fc2e1131SJaap de Haan $this->Lexer->addEntryPattern('<bpmnio.*?>(?=.*?</bpmnio>)', $mode, 'plugin_bpmnio_bpmnio'); 42fc2e1131SJaap de Haan } 43fc2e1131SJaap de Haan 44fc2e1131SJaap de Haan public function postConnect() 45fc2e1131SJaap de Haan { 46fc2e1131SJaap de Haan $this->Lexer->addExitPattern('</bpmnio>', 'plugin_bpmnio_bpmnio'); 47fc2e1131SJaap de Haan } 48fc2e1131SJaap de Haan 49fc2e1131SJaap de Haan public function handle($match, $state, $pos, Doku_Handler $handler) 50fc2e1131SJaap de Haan { 51c4f02a6eSJaap de Haan $posStart = $pos; 52c4f02a6eSJaap de Haan $posEnd = $pos + strlen($match); 53c4f02a6eSJaap de Haan 54e9e1a493SJaap de Haan if ($state == DOKU_LEXER_UNMATCHED) { 55*242f4056SJaap de Haan $match = base64_encode($match); 56fc2e1131SJaap de Haan } 57c4f02a6eSJaap de Haan return array($match, $state, $posStart, $posEnd); 58fc2e1131SJaap de Haan } 59fc2e1131SJaap de Haan 60fc2e1131SJaap de Haan public function render($mode, Doku_Renderer $renderer, $data) 61fc2e1131SJaap de Haan { 62c4f02a6eSJaap de Haan list($match, $state, $posStart, $posEnd) = $data; 6334515d89SJaap de Haan 6434515d89SJaap de Haan if (is_a($renderer, 'renderer_plugin_dw2pdf')) { 6534515d89SJaap de Haan if ($state == DOKU_LEXER_EXIT) { 6634515d89SJaap de Haan $renderer->doc .= <<<HTML 6734515d89SJaap de Haan <div class="plugin-bpmnio"> 6834515d89SJaap de Haan <a href="https://github.com/Color-Of-Code/dokuwiki-plugin-bpmnio/issues/4">DW2PDF support missing: Help wanted</a> 6934515d89SJaap de Haan </div> 7034515d89SJaap de Haan HTML; 7134515d89SJaap de Haan } 7234515d89SJaap de Haan return true; 7334515d89SJaap de Haan } 7434515d89SJaap de Haan 7534515d89SJaap de Haan if ($mode == 'xhtml' || $mode == 'odt') { 76fc2e1131SJaap de Haan switch ($state) { 77fc2e1131SJaap de Haan case DOKU_LEXER_ENTER: 78fc2e1131SJaap de Haan preg_match('/<bpmnio type="(\w+)">/', $match, $type); 79fc2e1131SJaap de Haan $type = $type[1] ?? 'bpmn'; 80*242f4056SJaap de Haan $bpmnid = uniqid("__{$type}_js_"); 818428abe8SJaap de Haan $renderer->doc .= <<<HTML 828428abe8SJaap de Haan <div class="plugin-bpmnio" id="{$bpmnid}"> 838428abe8SJaap de Haan HTML; 84fc2e1131SJaap de Haan break; 85fc2e1131SJaap de Haan 86fc2e1131SJaap de Haan case DOKU_LEXER_UNMATCHED: 878428abe8SJaap de Haan $renderer->doc .= <<<HTML 88c4f02a6eSJaap de Haan <div class="bpmn_js_data"> 89c4f02a6eSJaap de Haan {$match} 908428abe8SJaap de Haan </div> 918428abe8SJaap de Haan HTML; 92c4f02a6eSJaap de Haan 93c4f02a6eSJaap de Haan $class = $this->_startSectionEdit($renderer, $posStart); 94c4f02a6eSJaap de Haan $renderer->doc .= <<<HTML 95c4f02a6eSJaap de Haan <div class="bpmn_js_canvas {$class}"> 96*242f4056SJaap de Haan <div class="bpmn_js_container"></div> 97c4f02a6eSJaap de Haan </div> 98c4f02a6eSJaap de Haan HTML; 99c4f02a6eSJaap de Haan $this->_finishSectionEdit($renderer, $posEnd); 100c4f02a6eSJaap de Haan break; 101c4f02a6eSJaap de Haan 102c4f02a6eSJaap de Haan case DOKU_LEXER_EXIT: 103c4f02a6eSJaap de Haan $renderer->doc .= '</div>'; 104fc2e1131SJaap de Haan break; 105fc2e1131SJaap de Haan } 106fc2e1131SJaap de Haan return true; 107fc2e1131SJaap de Haan } 108fc2e1131SJaap de Haan return false; 109fc2e1131SJaap de Haan } 110c4f02a6eSJaap de Haan 111c4f02a6eSJaap de Haan private function _startSectionEdit(Doku_Renderer $renderer, $pos) 112c4f02a6eSJaap de Haan { 113c4f02a6eSJaap de Haan $sectionEditData = ['target' => 'plugin_bpmnio']; 114c4f02a6eSJaap de Haan if (!defined('SEC_EDIT_PATTERN')) { 115c4f02a6eSJaap de Haan // backwards-compatibility for Frusterick Manners (2017-02-19) 116c4f02a6eSJaap de Haan $sectionEditData = 'plugin_bpmnio'; 117c4f02a6eSJaap de Haan } 118c4f02a6eSJaap de Haan return $renderer->startSectionEdit($pos, $sectionEditData); 119c4f02a6eSJaap de Haan } 120c4f02a6eSJaap de Haan 121c4f02a6eSJaap de Haan private function _finishSectionEdit(Doku_Renderer $renderer, $pos) 122c4f02a6eSJaap de Haan { 123c4f02a6eSJaap de Haan $renderer->finishSectionEdit($pos); 124c4f02a6eSJaap de Haan } 125fc2e1131SJaap de Haan} 126