xref: /plugin/diagrams/action/prosemirror.php (revision 8d8f8b264bf651cfe4995a4a8e09bf6ea6291c37)
1<?php
2
3use dokuwiki\plugin\prosemirror\schema\Node;
4
5/**
6 * DokuWiki Plugin diagrams (Action Component)
7 *
8 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
9 * @author  Anna Dabrowska <dabrowska@cosmocode.de>
10 */
11class action_plugin_diagrams_prosemirror extends \dokuwiki\Extension\ActionPlugin
12{
13
14    /** @inheritDoc */
15    public function register(Doku_Event_Handler $controller)
16    {
17        $controller->register_hook('PROSEMIRROR_RENDER_PLUGIN', 'BEFORE', $this, 'handleRender');
18        $controller->register_hook('PROSEMIRROR_PARSE_UNKNOWN', 'BEFORE', $this, 'handleNode');
19    }
20
21    /**
22     * Event handler for PROSEMIRROR_RENDER_PLUGIN
23     * Renders DokuWiki's instructions into JSON as required by schema
24     *
25     * @param Doku_Event $event Event object
26     * @return void
27     */
28    public function handleRender(Doku_Event $event) {
29        /*
30          $eventData = [
31            'name' => $name,
32            'data' => $data,
33            'state' => $state,
34            'match' => $match,
35            'renderer' => $this,
36        ];*/
37
38        $eventData = $event->data;
39        $imageData = $eventData['data'];
40
41        //check for our data
42        if ($eventData['name'] !== 'diagrams_mediafile') return;
43
44        $event->preventDefault();
45
46        $node = new Node('diagrams');
47        $node->attr('id', $imageData['src']);
48        $node->attr('src', $imageData['url']);
49        $node->attr('title', $imageData['title']);
50        $node->attr('width', $imageData['width']);
51        $node->attr('height', $imageData['height']);
52        $node->attr('align', $imageData['align']);
53
54        $event->data['renderer']->addToNodestack($node);
55    }
56
57    /**
58     * Event handler for PROSEMIRROR_PARSE_UNKNOWN
59     * Translate the JSON from Prosemirror back to DokuWiki's syntax
60     *
61     * @param Doku_Event $event
62     * @return void
63     */
64    public function handleNode(Doku_Event $event)
65    {
66        /*
67          $eventData = [
68            'node' => $node,
69            'parent' => $parent,
70            'previous' => $previous,
71            'newNode' => null,
72        ];*/
73
74        // check for our node type
75        if ($event->data['node']['type'] !== 'diagrams') return;
76
77        $event->preventDefault();
78
79        $node = new \dokuwiki\plugin\diagrams\parser\DiagramsNode($event->data['node'], $event->data['parent']);
80        $event->data['newNode'] = $node;
81    }
82}
83