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