1<?php 2 3/** 4 * @license See LICENSE file 5 * @author Jaap de Haan <jaap.dehaan@color-of-code.de> 6 */ 7 8// must be run within DokuWiki 9if (!defined('DOKU_INC')) { 10 die(); 11} 12 13// See help: https://www.dokuwiki.org/devel:syntax_plugins 14 15class syntax_plugin_bpmnio_bpmnio extends DokuWiki_Syntax_Plugin 16{ 17 18 public function getPType() 19 { 20 return 'block'; 21 } 22 23 public function getType() 24 { 25 return 'protected'; 26 } 27 28 public function getSort() 29 { 30 return 0; 31 } 32 33 public function connectTo($mode) 34 { 35 $this->Lexer->addEntryPattern('<bpmnio.*?>(?=.*?</bpmnio>)', $mode, 'plugin_bpmnio_bpmnio'); 36 } 37 38 public function postConnect() 39 { 40 $this->Lexer->addExitPattern('</bpmnio>', 'plugin_bpmnio_bpmnio'); 41 } 42 43 public function handle($match, $state, $pos, Doku_Handler $handler) 44 { 45 switch ($state) { 46 case DOKU_LEXER_ENTER: 47 return array($state, $match, $pos); 48 case DOKU_LEXER_UNMATCHED: 49 $data = base64_encode($match); 50 return array($state, $data, $pos); 51 case DOKU_LEXER_EXIT: 52 return array($state, $match, $pos); 53 } 54 return array(); 55 } 56 57 public function render($mode, Doku_Renderer $renderer, $data) 58 { 59 // $data is returned by handle() 60 if ($mode == 'xhtml' || $mode == 'odt') { 61 list($state, $match, $pos) = $data; 62 // $renderer->doc .= '<textarea class="bpmn_js_data">' . $match . '</textarea>'; 63 switch ($state) { 64 case DOKU_LEXER_ENTER: 65 preg_match('/<bpmnio type="(\w+)">/', $match, $type); 66 $type = $type[1] ?? 'bpmn'; 67 $bpmnid = uniqid('__' . $type . '_js_'); 68 $sectionEditData = ['target' => 'plugin_bpmnio_bpmnio']; 69 if (!defined('SEC_EDIT_PATTERN')) { 70 // backwards-compatibility for Frusterick Manners (2017-02-19) 71 $sectionEditData = 'plugin_bpmnio_bpmnio'; 72 } 73 $class = $renderer->startSectionEdit($data[$pos], $sectionEditData); 74 75 $renderer->doc .= '<div class="' . $class . '">'; 76 $renderer->doc .= '<textarea class="bpmn_js_data" id="' . $bpmnid . '" style="visibility:hidden;">'; 77 break; 78 79 case DOKU_LEXER_UNMATCHED: 80 $renderer->doc .= trim($match); 81 break; 82 case DOKU_LEXER_EXIT: 83 $renderer->doc .= '</textarea>'; 84 $renderer->doc .= '</div>'; 85 $renderer->finishSectionEdit($pos); 86 break; 87 } 88 return true; 89 } 90 return false; 91 } 92} 93