1<?php 2 3/** 4 * @license See LICENSE file 5 */ 6 7// See help: 8// * https://www.dokuwiki.org/devel:section_editor 9// * https://www.dokuwiki.org/devel:releases:refactor2021 10use dokuwiki\Extension\ActionPlugin; 11use dokuwiki\Extension\EventHandler; 12use dokuwiki\Extension\Event; 13use dokuwiki\Form\Form; 14use dokuwiki\Utf8; 15 16class action_plugin_bpmnio_editor extends ActionPlugin 17{ 18 public function register(EventHandler $controller) 19 { 20 $controller->register_hook('HTML_SECEDIT_BUTTON', 'BEFORE', $this, 'sectionEditButton'); 21 $controller->register_hook('EDIT_FORM_ADDTEXTAREA', 'BEFORE', $this, 'handleForm'); 22 $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handlePost'); 23 $controller->register_hook('FORM_EDIT_OUTPUT', 'BEFORE', $this, 'handleFormEditOutput'); 24 } 25 26 public function handleFormEditOutput(Event $event) 27 { 28 /** @var Doku_Form $form */ 29 $form = &$event->data; 30 31 $previewButtonPosition = $form->findPositionByAttribute('id', 'edbtn__preview'); 32 if ($previewButtonPosition !== false) { 33 $form->removeElement($previewButtonPosition); 34 } 35 } 36 37 public function sectionEditButton(Event $event) 38 { 39 if ($this->shallIgnore($event)) return; 40 41 $event->data['name'] = $this->getLang('edit_diagram'); 42 } 43 44 public function handleForm(Event $event) 45 { 46 if ($this->shallIgnore($event)) return; 47 48 global $TEXT; 49 global $RANGE; 50 global $INPUT; 51 52 if (!$RANGE) { 53 // section editing failed, use default editor instead 54 $event->data['target'] = 'section'; 55 return; 56 } 57 58 $event->stopPropagation(); 59 $event->preventDefault(); 60 61 /** @var Doku_Form $form */ 62 $form = &$event->data['form']; 63 $data = base64_encode($TEXT); 64 65 $type = 'bpmn'; 66 if ($event->data['target'] === 'plugin_bpmnio_dmn') 67 $type = 'dmn'; 68 69 $form->setHiddenField('plugin_bpmnio_data', $data); 70 $form->addHTML(<<<HTML 71 <div class="plugin-bpmnio" id="plugin_bpmnio__{$type}_editor"> 72 <div class="{$type}_js_data">{$data}</div> 73 <div class="{$type}_js_canvas"> 74 <div class="{$type}_js_container"></div> 75 </div> 76 </div> 77 </div> 78 HTML); 79 80 // used during previews 81 $form->setHiddenField('target', "plugin_bpmnio_{$type}"); 82 $form->setHiddenField('range', $RANGE); 83 } 84 85 public function handlePost(Event $event) 86 { 87 global $TEXT; 88 global $INPUT; 89 90 if (!$INPUT->post->has('plugin_bpmnio_data')) return; 91 92 $TEXT = base64_decode($INPUT->post->str('plugin_bpmnio_data')); 93 } 94 95 private function shallIgnore(Event $event) 96 { 97 if ($event->data['target'] === 'plugin_bpmnio_bpmn') 98 return false; 99 if ($event->data['target'] === 'plugin_bpmnio_dmn') 100 return false; 101 return true; 102 } 103} 104