xref: /plugin/bpmnio/syntax/bpmnio.php (revision c4f02a6e87d8a7e5a5592838ccca7b7221b9de2e)
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// must be run within DokuWiki
9fc2e1131SJaap de Haanif (!defined('DOKU_INC')) {
10fc2e1131SJaap de Haan    die();
11fc2e1131SJaap de Haan}
12fc2e1131SJaap de Haan
13fc2e1131SJaap de Haan// See help: https://www.dokuwiki.org/devel:syntax_plugins
14fc2e1131SJaap de Haan
15fc2e1131SJaap de Haanclass syntax_plugin_bpmnio_bpmnio extends DokuWiki_Syntax_Plugin
16fc2e1131SJaap de Haan{
17fc2e1131SJaap de Haan    public function getPType()
18fc2e1131SJaap de Haan    {
19fc2e1131SJaap de Haan        return 'block';
20fc2e1131SJaap de Haan    }
21fc2e1131SJaap de Haan
22fc2e1131SJaap de Haan    public function getType()
23fc2e1131SJaap de Haan    {
24fc2e1131SJaap de Haan        return 'protected';
25fc2e1131SJaap de Haan    }
26fc2e1131SJaap de Haan
27fc2e1131SJaap de Haan    public function getSort()
28fc2e1131SJaap de Haan    {
29fc2e1131SJaap de Haan        return 0;
30fc2e1131SJaap de Haan    }
31fc2e1131SJaap de Haan
32fc2e1131SJaap de Haan    public function connectTo($mode)
33fc2e1131SJaap de Haan    {
34fc2e1131SJaap de Haan        $this->Lexer->addEntryPattern('<bpmnio.*?>(?=.*?</bpmnio>)', $mode, 'plugin_bpmnio_bpmnio');
35fc2e1131SJaap de Haan    }
36fc2e1131SJaap de Haan
37fc2e1131SJaap de Haan    public function postConnect()
38fc2e1131SJaap de Haan    {
39fc2e1131SJaap de Haan        $this->Lexer->addExitPattern('</bpmnio>', 'plugin_bpmnio_bpmnio');
40fc2e1131SJaap de Haan    }
41fc2e1131SJaap de Haan
42fc2e1131SJaap de Haan    public function handle($match, $state, $pos, Doku_Handler $handler)
43fc2e1131SJaap de Haan    {
44*c4f02a6eSJaap de Haan        $posStart = $pos;
45*c4f02a6eSJaap de Haan        $posEnd = $pos + strlen($match);
46*c4f02a6eSJaap de Haan
47e9e1a493SJaap de Haan        if ($state == DOKU_LEXER_UNMATCHED) {
48*c4f02a6eSJaap de Haan            $match = base64_encode(trim($match));
49fc2e1131SJaap de Haan        }
50*c4f02a6eSJaap de Haan        return array($match, $state, $posStart, $posEnd);
51fc2e1131SJaap de Haan    }
52fc2e1131SJaap de Haan
53fc2e1131SJaap de Haan    public function render($mode, Doku_Renderer $renderer, $data)
54fc2e1131SJaap de Haan    {
55*c4f02a6eSJaap de Haan        list($match, $state, $posStart, $posEnd) = $data;
5634515d89SJaap de Haan
5734515d89SJaap de Haan        if (is_a($renderer, 'renderer_plugin_dw2pdf')) {
5834515d89SJaap de Haan            if ($state == DOKU_LEXER_EXIT) {
5934515d89SJaap de Haan                $renderer->doc .= <<<HTML
6034515d89SJaap de Haan                    <div class="plugin-bpmnio">
6134515d89SJaap de Haan                        <a href="https://github.com/Color-Of-Code/dokuwiki-plugin-bpmnio/issues/4">DW2PDF support missing: Help wanted</a>
6234515d89SJaap de Haan                    </div>
6334515d89SJaap de Haan                    HTML;
6434515d89SJaap de Haan            }
6534515d89SJaap de Haan            return true;
6634515d89SJaap de Haan        }
6734515d89SJaap de Haan
6834515d89SJaap de Haan        if ($mode == 'xhtml' || $mode == 'odt') {
69fc2e1131SJaap de Haan            switch ($state) {
70fc2e1131SJaap de Haan                case DOKU_LEXER_ENTER:
71fc2e1131SJaap de Haan                    preg_match('/<bpmnio type="(\w+)">/', $match, $type);
72fc2e1131SJaap de Haan                    $type = $type[1] ?? 'bpmn';
73fc2e1131SJaap de Haan                    $bpmnid = uniqid('__' . $type . '_js_');
748428abe8SJaap de Haan                    $renderer->doc .= <<<HTML
758428abe8SJaap de Haan                        <div class="plugin-bpmnio" id="{$bpmnid}">
768428abe8SJaap de Haan                        HTML;
77fc2e1131SJaap de Haan                    break;
78fc2e1131SJaap de Haan
79fc2e1131SJaap de Haan                case DOKU_LEXER_UNMATCHED:
808428abe8SJaap de Haan                    $renderer->doc .= <<<HTML
81*c4f02a6eSJaap de Haan                        <div class="bpmn_js_data">
82*c4f02a6eSJaap de Haan                            {$match}
838428abe8SJaap de Haan                        </div>
848428abe8SJaap de Haan                        HTML;
85*c4f02a6eSJaap de Haan
86*c4f02a6eSJaap de Haan                    $class = $this->_startSectionEdit($renderer, $posStart);
87*c4f02a6eSJaap de Haan                    $renderer->doc .= <<<HTML
88*c4f02a6eSJaap de Haan                        <div class="bpmn_js_canvas {$class}">
89*c4f02a6eSJaap de Haan                            <div class="bpmn_js_container {$class}"></div>
90*c4f02a6eSJaap de Haan                        </div>
91*c4f02a6eSJaap de Haan                        HTML;
92*c4f02a6eSJaap de Haan                    $this->_finishSectionEdit($renderer, $posEnd);
93*c4f02a6eSJaap de Haan                    break;
94*c4f02a6eSJaap de Haan
95*c4f02a6eSJaap de Haan                case DOKU_LEXER_EXIT:
96*c4f02a6eSJaap de Haan                    $renderer->doc .= '</div>';
97fc2e1131SJaap de Haan                    break;
98fc2e1131SJaap de Haan            }
99fc2e1131SJaap de Haan            return true;
100fc2e1131SJaap de Haan        }
101fc2e1131SJaap de Haan        return false;
102fc2e1131SJaap de Haan    }
103*c4f02a6eSJaap de Haan
104*c4f02a6eSJaap de Haan    private function _startSectionEdit(Doku_Renderer $renderer, $pos)
105*c4f02a6eSJaap de Haan    {
106*c4f02a6eSJaap de Haan        $sectionEditData = ['target' => 'plugin_bpmnio'];
107*c4f02a6eSJaap de Haan        if (!defined('SEC_EDIT_PATTERN')) {
108*c4f02a6eSJaap de Haan            // backwards-compatibility for Frusterick Manners (2017-02-19)
109*c4f02a6eSJaap de Haan            $sectionEditData = 'plugin_bpmnio';
110*c4f02a6eSJaap de Haan        }
111*c4f02a6eSJaap de Haan        return $renderer->startSectionEdit($pos, $sectionEditData);
112*c4f02a6eSJaap de Haan    }
113*c4f02a6eSJaap de Haan
114*c4f02a6eSJaap de Haan    private function _finishSectionEdit(Doku_Renderer $renderer, $pos)
115*c4f02a6eSJaap de Haan    {
116*c4f02a6eSJaap de Haan        $renderer->finishSectionEdit($pos);
117*c4f02a6eSJaap de Haan    }
118fc2e1131SJaap de Haan}
119