xref: /plugin/bpmnio/syntax/bpmnio.php (revision a494ddcc62e5b9ad640d30acec0360d3b24cbd8a)
1fc2e1131SJaap de Haan<?php
2fc2e1131SJaap de Haan
3*a494ddccSgithub-actions[bot]use dokuwiki\Extension\SyntaxPlugin;
4*a494ddccSgithub-actions[bot]
5fc2e1131SJaap de Haan/**
6fc2e1131SJaap de Haan * @license    See LICENSE file
7fc2e1131SJaap de Haan */
8fc2e1131SJaap de Haan// See help: https://www.dokuwiki.org/devel:syntax_plugins
9242f4056SJaap de Haan// The HTML structure generated by this syntax plugin is:
10242f4056SJaap de Haan//
11242f4056SJaap de Haan// <div class="plugin-bpmnio" id="__(bpmn|dmn)_js_<hash>">
12242f4056SJaap de Haan//   <div class="bpmn_js_data">
13242f4056SJaap de Haan//      ... base64 encoded xml
14242f4056SJaap de Haan//   </div>
15242f4056SJaap de Haan//   <div class="bpmn_js_canvas {$class}">
16242f4056SJaap de Haan//     <div class="bpmn_js_container">... rendered herein</div>
17242f4056SJaap de Haan//   </div>
18242f4056SJaap de Haan// </div>
19*a494ddccSgithub-actions[bot]class syntax_plugin_bpmnio_bpmnio extends SyntaxPlugin
20fc2e1131SJaap de Haan{
21ae85f1faSJaap de Haan    public string $type = ''; // 'bpmn' or 'dmn'
22f0ae282cSJaap de Haan
23fc2e1131SJaap de Haan    public function getPType()
24fc2e1131SJaap de Haan    {
25fc2e1131SJaap de Haan        return 'block';
26fc2e1131SJaap de Haan    }
27fc2e1131SJaap de Haan
28fc2e1131SJaap de Haan    public function getType()
29fc2e1131SJaap de Haan    {
30fc2e1131SJaap de Haan        return 'protected';
31fc2e1131SJaap de Haan    }
32fc2e1131SJaap de Haan
33fc2e1131SJaap de Haan    public function getSort()
34fc2e1131SJaap de Haan    {
35fc2e1131SJaap de Haan        return 0;
36fc2e1131SJaap de Haan    }
37fc2e1131SJaap de Haan
38fc2e1131SJaap de Haan    public function connectTo($mode)
39fc2e1131SJaap de Haan    {
40fc2e1131SJaap de Haan        $this->Lexer->addEntryPattern('<bpmnio.*?>(?=.*?</bpmnio>)', $mode, 'plugin_bpmnio_bpmnio');
41fc2e1131SJaap de Haan    }
42fc2e1131SJaap de Haan
43fc2e1131SJaap de Haan    public function postConnect()
44fc2e1131SJaap de Haan    {
45fc2e1131SJaap de Haan        $this->Lexer->addExitPattern('</bpmnio>', 'plugin_bpmnio_bpmnio');
46fc2e1131SJaap de Haan    }
47fc2e1131SJaap de Haan
48fc2e1131SJaap de Haan    public function handle($match, $state, $pos, Doku_Handler $handler)
49fc2e1131SJaap de Haan    {
50f0ae282cSJaap de Haan        switch ($state) {
51f0ae282cSJaap de Haan            case DOKU_LEXER_ENTER:
52f0ae282cSJaap de Haan                $matched = '';
53f0ae282cSJaap de Haan                preg_match('/<bpmnio type="(\w+)">/', $match, $matched);
54ae85f1faSJaap de Haan                $this->type = $matched[1] ?? 'bpmn';
55*a494ddccSgithub-actions[bot]                return [$state, $this->type, '', $pos, ''];
56f0ae282cSJaap de Haan
57f0ae282cSJaap de Haan            case DOKU_LEXER_UNMATCHED:
58c4f02a6eSJaap de Haan                $posStart = $pos;
59c4f02a6eSJaap de Haan                $posEnd = $pos + strlen($match);
60242f4056SJaap de Haan                $match = base64_encode($match);
61*a494ddccSgithub-actions[bot]                return [$state, $this->type, $match, $posStart, $posEnd];
62f0ae282cSJaap de Haan
63f0ae282cSJaap de Haan            case DOKU_LEXER_EXIT:
64ae85f1faSJaap de Haan                $this->type = '';
65*a494ddccSgithub-actions[bot]                return [$state, '', '', '', ''];
66fc2e1131SJaap de Haan        }
67*a494ddccSgithub-actions[bot]        return [];
68fc2e1131SJaap de Haan    }
69fc2e1131SJaap de Haan
70fc2e1131SJaap de Haan    public function render($mode, Doku_Renderer $renderer, $data)
71fc2e1131SJaap de Haan    {
72*a494ddccSgithub-actions[bot]        [$state, $type, $match, $posStart, $posEnd] = $data;
7334515d89SJaap de Haan
7434515d89SJaap de Haan        if (is_a($renderer, 'renderer_plugin_dw2pdf')) {
7534515d89SJaap de Haan            if ($state == DOKU_LEXER_EXIT) {
7634515d89SJaap de Haan                $renderer->doc .= <<<HTML
7734515d89SJaap de Haan                    <div class="plugin-bpmnio">
78962d7b81SJaap de Haan                        <a href="https://github.com/Color-Of-Code/dokuwiki-plugin-bpmnio/issues/4">
79962d7b81SJaap de Haan                            DW2PDF support missing: Help wanted
80962d7b81SJaap de Haan                        </a>
8134515d89SJaap de Haan                    </div>
8234515d89SJaap de Haan                    HTML;
8334515d89SJaap de Haan            }
8434515d89SJaap de Haan            return true;
8534515d89SJaap de Haan        }
8634515d89SJaap de Haan
8734515d89SJaap de Haan        if ($mode == 'xhtml' || $mode == 'odt') {
88fc2e1131SJaap de Haan            switch ($state) {
89fc2e1131SJaap de Haan                case DOKU_LEXER_ENTER:
90ae85f1faSJaap de Haan                    $bpmnid = "__{$type}_js_{$posStart}";
918428abe8SJaap de Haan                    $renderer->doc .= <<<HTML
928428abe8SJaap de Haan                        <div class="plugin-bpmnio" id="{$bpmnid}">
938428abe8SJaap de Haan                        HTML;
94fc2e1131SJaap de Haan                    break;
95fc2e1131SJaap de Haan
96fc2e1131SJaap de Haan                case DOKU_LEXER_UNMATCHED:
978428abe8SJaap de Haan                    $renderer->doc .= <<<HTML
98f0ae282cSJaap de Haan                        <div class="{$type}_js_data">
99c4f02a6eSJaap de Haan                            {$match}
1008428abe8SJaap de Haan                        </div>
1018428abe8SJaap de Haan                        HTML;
102c4f02a6eSJaap de Haan
103962d7b81SJaap de Haan                    $target = "plugin_bpmnio_{$type}";
104962d7b81SJaap de Haan                    $sectionEditData = ['target' => $target];
105962d7b81SJaap de Haan                    $class = $renderer->startSectionEdit($posStart, $sectionEditData);
106c4f02a6eSJaap de Haan                    $renderer->doc .= <<<HTML
107f0ae282cSJaap de Haan                        <div class="{$type}_js_canvas {$class}">
108f0ae282cSJaap de Haan                            <div class="{$type}_js_container"></div>
109c4f02a6eSJaap de Haan                        </div>
110c4f02a6eSJaap de Haan                        HTML;
111962d7b81SJaap de Haan                    $renderer->finishSectionEdit($posEnd);
112c4f02a6eSJaap de Haan                    break;
113c4f02a6eSJaap de Haan
114c4f02a6eSJaap de Haan                case DOKU_LEXER_EXIT:
115f0ae282cSJaap de Haan                    $renderer->doc .= <<<HTML
116f0ae282cSJaap de Haan                        </div>
117f0ae282cSJaap de Haan                        HTML;
118fc2e1131SJaap de Haan                    break;
119fc2e1131SJaap de Haan            }
120fc2e1131SJaap de Haan            return true;
121fc2e1131SJaap de Haan        }
122fc2e1131SJaap de Haan        return false;
123fc2e1131SJaap de Haan    }
124fc2e1131SJaap de Haan}
125