1<?php
2/**
3 * DokuWiki Plugin prosemirror (Action Component)
4 *
5 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6 * @author  Andreas Gohr <gohr@cosmocode.de>
7 */
8
9// must be run within Dokuwiki
10use dokuwiki\plugin\prosemirror\parser\SyntaxTreeBuilder;
11
12if (!defined('DOKU_INC')) {
13    die();
14}
15
16class action_plugin_prosemirror_parser extends DokuWiki_Action_Plugin
17{
18
19    /**
20     * Registers a callback function for a given event
21     *
22     * @param Doku_Event_Handler $controller DokuWiki's event controller object
23     *
24     * @return void
25     */
26    public function register(Doku_Event_Handler $controller)
27    {
28        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_preprocess');
29        $controller->register_hook('DRAFT_SAVE', 'BEFORE', $this, 'handle_draft');
30    }
31
32    /**
33     * Triggered by: COMMON_DRAFT_SAVE
34     *
35     * @param Doku_Event $event
36     * @param            $param
37     */
38    public function handle_draft(Doku_Event $event, $param)
39    {
40        global $INPUT;
41        $unparsedJSON = $INPUT->post->str('prosemirror_json');
42        if (empty($unparsedJSON)) {
43            return;
44        }
45
46
47        /** @var \helper_plugin_prosemirror $helper */
48        $helper = plugin_load('helper', 'prosemirror');
49
50        try {
51            $syntax = $helper->getSyntaxFromProsemirrorData($unparsedJSON);
52        } catch (\Throwable $e) {
53            $event->preventDefault();
54            $event->stopPropagation();
55
56            $errorMsg = $e->getMessage();
57
58            if ($helper->tryToLogErrorToSentry($e, ['json' => $unparsedJSON])) {
59                $errorMsg .= ' -- The error has been logged to Sentry.';
60            }
61
62            $event->data['errors'][] = $errorMsg;
63            return;
64        }
65
66        $event->data['text'] = $syntax;
67    }
68
69    /**
70     * [Custom event handler which performs action]
71     *
72     * Triggered by: ACTION_ACT_PREPROCESS
73     *
74     * @param Doku_Event $event  event object by reference
75     * @param mixed      $param  [the parameters passed as fifth argument to register_hook() when this
76     *                           handler was registered]
77     *
78     * @return void
79     */
80    public function handle_preprocess(Doku_Event $event, $param)
81    {
82        global $TEXT, $INPUT;
83        if ($INPUT->server->str('REQUEST_METHOD') !== 'POST'
84            || !in_array($event->data, ['save', 'preview'])
85            || !$INPUT->post->has('prosemirror_json')
86            || !get_doku_pref('plugin_prosemirror_useWYSIWYG', false)
87        ) {
88            return;
89        }
90
91        $unparsedJSON = $INPUT->post->str('prosemirror_json');
92
93        /** @var \helper_plugin_prosemirror $helper */
94        $helper = plugin_load('helper', 'prosemirror');
95        try {
96            $syntax = $helper->getSyntaxFromProsemirrorData($unparsedJSON);
97        } catch (\Throwable $e) {
98            $event->preventDefault();
99            $event->stopPropagation();
100
101            $errorMsg = $e->getMessage();
102
103            if ($helper->tryToLogErrorToSentry($e, ['json' => $unparsedJSON])) {
104                $errorMsg .= ' -- The error has been logged to Sentry.';
105            }
106
107            msg($errorMsg, -1);
108            return;
109        }
110        if ($syntax !== null) {
111            $TEXT = $syntax;
112        }
113    }
114
115}
116
117// vim:ts=4:sw=4:et:
118