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