xref: /plugin/bpmnio/syntax/bpmnio.php (revision ae85f1fa037e44eb658e87cc080ee4ef08ce1465)
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