xref: /plugin/bpmnio/syntax/bpmnio.php (revision 4c812427e529b08e1e3703d430e40929f20c2885)
1fc2e1131SJaap de Haan<?php
2fc2e1131SJaap de Haan
3a494ddccSgithub-actions[bot]use dokuwiki\Extension\SyntaxPlugin;
4*4c812427SJaap de Haanuse dokuwiki\File\MediaResolver;
5a494ddccSgithub-actions[bot]
6fc2e1131SJaap de Haan/**
7fc2e1131SJaap de Haan * @license    See LICENSE file
8fc2e1131SJaap de Haan */
9fc2e1131SJaap de Haan// See help: https://www.dokuwiki.org/devel:syntax_plugins
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>
20a494ddccSgithub-actions[bot]class syntax_plugin_bpmnio_bpmnio extends SyntaxPlugin
21fc2e1131SJaap de Haan{
22*4c812427SJaap de Haan    protected string $type = ''; // 'bpmn' or 'dmn'
23*4c812427SJaap de Haan    protected string $src = ''; // media file
24f0ae282cSJaap de Haan
25fc2e1131SJaap de Haan    public function getPType()
26fc2e1131SJaap de Haan    {
27fc2e1131SJaap de Haan        return 'block';
28fc2e1131SJaap de Haan    }
29fc2e1131SJaap de Haan
30fc2e1131SJaap de Haan    public function getType()
31fc2e1131SJaap de Haan    {
32fc2e1131SJaap de Haan        return 'protected';
33fc2e1131SJaap de Haan    }
34fc2e1131SJaap de Haan
35fc2e1131SJaap de Haan    public function getSort()
36fc2e1131SJaap de Haan    {
37fc2e1131SJaap de Haan        return 0;
38fc2e1131SJaap de Haan    }
39fc2e1131SJaap de Haan
40fc2e1131SJaap de Haan    public function connectTo($mode)
41fc2e1131SJaap de Haan    {
42fc2e1131SJaap de Haan        $this->Lexer->addEntryPattern('<bpmnio.*?>(?=.*?</bpmnio>)', $mode, 'plugin_bpmnio_bpmnio');
43fc2e1131SJaap de Haan    }
44fc2e1131SJaap de Haan
45fc2e1131SJaap de Haan    public function postConnect()
46fc2e1131SJaap de Haan    {
47fc2e1131SJaap de Haan        $this->Lexer->addExitPattern('</bpmnio>', 'plugin_bpmnio_bpmnio');
48fc2e1131SJaap de Haan    }
49fc2e1131SJaap de Haan
50fc2e1131SJaap de Haan    public function handle($match, $state, $pos, Doku_Handler $handler)
51fc2e1131SJaap de Haan    {
52f0ae282cSJaap de Haan        switch ($state) {
53f0ae282cSJaap de Haan            case DOKU_LEXER_ENTER:
54*4c812427SJaap de Haan                $matched = [];
55*4c812427SJaap de Haan                preg_match('/<bpmnio\s+([^>]+)>/', $match, $matched);
56*4c812427SJaap de Haan
57*4c812427SJaap de Haan                $attrs = [];
58*4c812427SJaap de Haan                if (!empty($matched[1])) {
59*4c812427SJaap de Haan                    $attrs = $this->buildAttributes($matched[1]);
60*4c812427SJaap de Haan                }
61*4c812427SJaap de Haan
62*4c812427SJaap de Haan                $this->type = $attrs['type'] ?? 'bpmn';
63*4c812427SJaap de Haan                $this->src = $attrs['src'] ?? '';
64*4c812427SJaap de Haan
65*4c812427SJaap de Haan                return [$state, $this->type, '', $pos, '', false];
66f0ae282cSJaap de Haan
67f0ae282cSJaap de Haan            case DOKU_LEXER_UNMATCHED:
68c4f02a6eSJaap de Haan                $posStart = $pos;
69c4f02a6eSJaap de Haan                $posEnd = $pos + strlen($match);
70*4c812427SJaap de Haan
71*4c812427SJaap de Haan                $inline = empty($this->src);
72*4c812427SJaap de Haan                if (!$inline) {
73*4c812427SJaap de Haan                    $match = $this->getMedia($this->src);
74*4c812427SJaap de Haan                }
75*4c812427SJaap de Haan                return [$state, $this->type, base64_encode($match), $posStart, $posEnd, $inline];
76f0ae282cSJaap de Haan
77f0ae282cSJaap de Haan            case DOKU_LEXER_EXIT:
78ae85f1faSJaap de Haan                $this->type = '';
79*4c812427SJaap de Haan                $this->src = '';
80*4c812427SJaap de Haan                return [$state, '', '', '', '', '', false];
81fc2e1131SJaap de Haan        }
82a494ddccSgithub-actions[bot]        return [];
83fc2e1131SJaap de Haan    }
84fc2e1131SJaap de Haan
85*4c812427SJaap de Haan    private function buildAttributes($string)
86*4c812427SJaap de Haan    {
87*4c812427SJaap de Haan        $attrs = [];
88*4c812427SJaap de Haan        preg_match_all('/(\w+)=["\'](.*?)["\']/', $string, $matches, PREG_SET_ORDER);
89*4c812427SJaap de Haan        foreach ($matches as $match) {
90*4c812427SJaap de Haan            $attrs[$match[1]] = $match[2];
91*4c812427SJaap de Haan        }
92*4c812427SJaap de Haan        return $attrs;
93*4c812427SJaap de Haan    }
94*4c812427SJaap de Haan
95*4c812427SJaap de Haan    private function getMedia($src)
96*4c812427SJaap de Haan    {
97*4c812427SJaap de Haan        global $ID;
98*4c812427SJaap de Haan
99*4c812427SJaap de Haan        $id = (new MediaResolver($ID))->resolveId($src);
100*4c812427SJaap de Haan        if (auth_quickaclcheck($id) < AUTH_READ) {
101*4c812427SJaap de Haan            return "Error: Access denied for file $src";
102*4c812427SJaap de Haan        }
103*4c812427SJaap de Haan
104*4c812427SJaap de Haan        $file = mediaFN($id);
105*4c812427SJaap de Haan        if (!file_exists($file) || !is_readable($file)) {
106*4c812427SJaap de Haan            return "Error: Cannot load file $src";
107*4c812427SJaap de Haan        }
108*4c812427SJaap de Haan
109*4c812427SJaap de Haan        return file_get_contents($file);
110*4c812427SJaap de Haan    }
111*4c812427SJaap de Haan
112fc2e1131SJaap de Haan    public function render($mode, Doku_Renderer $renderer, $data)
113fc2e1131SJaap de Haan    {
114*4c812427SJaap de Haan        [$state, $type, $match, $posStart, $posEnd, $inline] = $data;
11534515d89SJaap de Haan
11634515d89SJaap de Haan        if (is_a($renderer, 'renderer_plugin_dw2pdf')) {
11734515d89SJaap de Haan            if ($state == DOKU_LEXER_EXIT) {
11834515d89SJaap de Haan                $renderer->doc .= <<<HTML
11934515d89SJaap de Haan                    <div class="plugin-bpmnio">
120962d7b81SJaap de Haan                        <a href="https://github.com/Color-Of-Code/dokuwiki-plugin-bpmnio/issues/4">
121962d7b81SJaap de Haan                            DW2PDF support missing: Help wanted
122962d7b81SJaap de Haan                        </a>
12334515d89SJaap de Haan                    </div>
12434515d89SJaap de Haan                    HTML;
12534515d89SJaap de Haan            }
12634515d89SJaap de Haan            return true;
12734515d89SJaap de Haan        }
12834515d89SJaap de Haan
12934515d89SJaap de Haan        if ($mode == 'xhtml' || $mode == 'odt') {
130fc2e1131SJaap de Haan            switch ($state) {
131fc2e1131SJaap de Haan                case DOKU_LEXER_ENTER:
132ae85f1faSJaap de Haan                    $bpmnid = "__{$type}_js_{$posStart}";
1338428abe8SJaap de Haan                    $renderer->doc .= <<<HTML
1348428abe8SJaap de Haan                        <div class="plugin-bpmnio" id="{$bpmnid}">
1358428abe8SJaap de Haan                        HTML;
136fc2e1131SJaap de Haan                    break;
137fc2e1131SJaap de Haan
138fc2e1131SJaap de Haan                case DOKU_LEXER_UNMATCHED:
1398428abe8SJaap de Haan                    $renderer->doc .= <<<HTML
140f0ae282cSJaap de Haan                        <div class="{$type}_js_data">
141c4f02a6eSJaap de Haan                            {$match}
1428428abe8SJaap de Haan                        </div>
1438428abe8SJaap de Haan                        HTML;
144*4c812427SJaap de Haan                    if ($inline) {
145962d7b81SJaap de Haan                        $target = "plugin_bpmnio_{$type}";
146962d7b81SJaap de Haan                        $sectionEditData = ['target' => $target];
147962d7b81SJaap de Haan                        $class = $renderer->startSectionEdit($posStart, $sectionEditData);
148*4c812427SJaap de Haan                    } else {
149*4c812427SJaap de Haan                        $class = '';
150*4c812427SJaap de Haan                    }
151c4f02a6eSJaap de Haan                    $renderer->doc .= <<<HTML
152f0ae282cSJaap de Haan                        <div class="{$type}_js_canvas {$class}">
153f0ae282cSJaap de Haan                            <div class="{$type}_js_container"></div>
154c4f02a6eSJaap de Haan                        </div>
155c4f02a6eSJaap de Haan                        HTML;
156*4c812427SJaap de Haan                    if ($inline) {
157962d7b81SJaap de Haan                        $renderer->finishSectionEdit($posEnd);
158*4c812427SJaap de Haan                    }
159c4f02a6eSJaap de Haan                    break;
160c4f02a6eSJaap de Haan
161c4f02a6eSJaap de Haan                case DOKU_LEXER_EXIT:
162f0ae282cSJaap de Haan                    $renderer->doc .= <<<HTML
163f0ae282cSJaap de Haan                        </div>
164f0ae282cSJaap de Haan                        HTML;
165fc2e1131SJaap de Haan                    break;
166fc2e1131SJaap de Haan            }
167fc2e1131SJaap de Haan            return true;
168fc2e1131SJaap de Haan        }
169fc2e1131SJaap de Haan        return false;
170fc2e1131SJaap de Haan    }
171fc2e1131SJaap de Haan}
172