xref: /plugin/bpmnio/syntax/bpmnio.php (revision fc2e1131dcb3f4c5ea64a990c067962d4b3342c1)
1<?php
2
3/**
4 * @license    See LICENSE file
5 * @author     Jaap de Haan <jaap.dehaan@color-of-code.de>
6 */
7
8// must be run within DokuWiki
9if (!defined('DOKU_INC')) {
10    die();
11}
12
13// See help: https://www.dokuwiki.org/devel:syntax_plugins
14
15class syntax_plugin_bpmnio_bpmnio extends DokuWiki_Syntax_Plugin
16{
17
18    public function getPType()
19    {
20        return 'block';
21    }
22
23    public function getType()
24    {
25        return 'protected';
26    }
27
28    public function getSort()
29    {
30        return 0;
31    }
32
33    public function connectTo($mode)
34    {
35        $this->Lexer->addEntryPattern('<bpmnio.*?>(?=.*?</bpmnio>)', $mode, 'plugin_bpmnio_bpmnio');
36    }
37
38    public function postConnect()
39    {
40        $this->Lexer->addExitPattern('</bpmnio>', 'plugin_bpmnio_bpmnio');
41    }
42
43    public function handle($match, $state, $pos, Doku_Handler $handler)
44    {
45        switch ($state) {
46            case DOKU_LEXER_ENTER:
47                return array($state, $match, $pos);
48            case DOKU_LEXER_UNMATCHED:
49                $data = base64_encode($match);
50                return array($state, $data, $pos);
51            case DOKU_LEXER_EXIT:
52                return array($state, $match, $pos);
53        }
54        return array();
55    }
56
57    public function render($mode, Doku_Renderer $renderer, $data)
58    {
59        // $data is returned by handle()
60        if ($mode == 'xhtml' || $mode == 'odt') {
61            list($state, $match, $pos) = $data;
62            // $renderer->doc .= '<textarea class="bpmn_js_data">' . $match . '</textarea>';
63            switch ($state) {
64                case DOKU_LEXER_ENTER:
65                    preg_match('/<bpmnio type="(\w+)">/', $match, $type);
66                    $type = $type[1] ?? 'bpmn';
67                    $bpmnid = uniqid('__' . $type . '_js_');
68                    $sectionEditData = ['target' => 'plugin_bpmnio_bpmnio'];
69                    if (!defined('SEC_EDIT_PATTERN')) {
70                        // backwards-compatibility for Frusterick Manners (2017-02-19)
71                        $sectionEditData = 'plugin_bpmnio_bpmnio';
72                    }
73                    $class = $renderer->startSectionEdit($data[$pos], $sectionEditData);
74
75                    $renderer->doc .= '<div class="' . $class . '">';
76                    $renderer->doc .= '<textarea class="bpmn_js_data" id="' . $bpmnid . '" style="visibility:hidden;">';
77                    break;
78
79                case DOKU_LEXER_UNMATCHED:
80                    $renderer->doc .= trim($match);
81                    break;
82                case DOKU_LEXER_EXIT:
83                    $renderer->doc .= '</textarea>';
84                    $renderer->doc .= '</div>';
85                    $renderer->finishSectionEdit($pos);
86                    break;
87            }
88            return true;
89        }
90        return false;
91    }
92}
93