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