register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'moaieditor_main'); } // Main function public function moaieditor_main (Doku_Event &$event, $param) { global $ACT, $INFO, $conf, $lang; // Exit if not in edit mode if (!in_array($ACT, ['edit'])) { return; } // Load the JS files in 'templates/' and 'user_templates/' $info = $this->getInfo(); $version = str_replace('-', '', $info['date']); $plugin_path = DOKU_PLUGIN.'moaieditor'; $plugin_url = DOKU_BASE.'lib/plugins/moaieditor'; $t = $this->scanTemplateDir ($plugin_url, $plugin_path, "templates"); $u = $this->scanTemplateDir ($plugin_url, $plugin_path, "user_templates"); $templates = array_merge($t, $u); foreach ($templates as $template) $event->data['script'][] = array( 'type' => 'text/javascript', 'charset' => 'utf-8', 'src' => $plugin_url.'/'.$template['folder'].'/'.$template['name'].".js?v=$version", 'defer' => 'defer', ); // Pass some data to Javascript $jsinfo = array( // Configuration options 'base_url' => $plugin_url, 'templates' => $templates, 'hide_editor_by_default' => $this->getConf('hide_editor_by_default'), 'editor_width_side_by_side' => $this->getConf('editor_width_side_by_side'), 'editor_width_top_bottom' => $this->getConf('editor_width_top_bottom'), 'editor_width_single_pane' => $this->getConf('editor_width_single_pane'), // Docinfo 'docinfo' => $this->getDocinfo(), // Editor intro message 'intromsg' => $this->getEditorIntroMessage(), ); $event->data['script'][] = array( 'type' => 'text/javascript', '_data' => 'JSINFO.plugin_moaieditor = ' . json_encode($jsinfo), ); // Simulate template messages (for testing template compatibility) if( isset($_GET['fakemsg']) || MOAIED_FAKE_MESSAGES) $this->simulate_template_messages(); } // Scan template dir public function scanTemplateDir ($plugin_url, $plugin_path, $folder) { $files = []; foreach (scandir("$plugin_path/$folder") as $filename) if (str_ends_with($filename, '.js')) if (!str_ends_with($filename, 'default.js')) { $name = pathinfo($filename, PATHINFO_FILENAME); $css = Null; if (file_exists("$plugin_path/$folder/$name.css")) $css = "$plugin_url/$folder/$name.css"; $files[] = ['name'=>$name, 'folder'=>$folder, 'css'=>$css]; } return $files; } // Get the intro message shown by DokuWiki in editor mode (whether we show it or not will depend on user settings) public function getEditorIntroMessage () { # The editor intro message is rendered here: inc/Ui/Editor.php -> show() # In editor mode, it can be of two types: 'editrev' or 'edit' # /inc/lang/en/edit.txt "**You've loaded an old revision of the document!** If you save it, you will create a new version with this data." # /inc/lang/en/editrev.txt "Edit the page and hit ''Save''. See [[wiki:syntax]] for Wiki syntax. Please edit the page only if you can **improve** it. If you want to test some things, learn to make your first steps on the [[playground:playground|playground]]." global $REV; global $INFO; $wr = $INFO['writable'] && !$INFO['locked']; if (!$wr) return null; $type = ($REV) ? 'editrev' : 'edit'; // intro locale text (edit, rditrev, or read) $html = p_locale_xhtml($type); return ['type'=>$type, 'html'=>$html]; } // Get document info (mostly copied from 'tpl_pageinfo' but we want to format the data differently) public function getDocinfo () { global $conf, $lang, $INFO, $ID; // Document info will not exist when creating a new page if (!$INFO['exists']) return null; // Document path on disk $fn = $INFO['filepath']; if (!$conf['fullpath']) { if ($INFO['rev']) $fn = str_replace($conf['olddir'] . '/', '', $fn); else $fn = str_replace($conf['datadir'] . '/', '', $fn); } $fn = utf8_decodeFN($fn); // Last modification time $dateLocal = dformat($INFO['lastmod']); $dateIso = date(DATE_ISO8601, $INFO['lastmod']); // Edited by if ($INFO['editor']) $by = $lang['by'].' '.editorinfo($INFO['editor']).''; else $by = '('.$lang['external_edit'].')'; // Return it return [ 'labelPath' => 'Document path on disk', 'labelMod' => $lang['lastmod'], 'path' => "data/pages/$fn", 'time' => "", 'by' => $by ]; } // Create fake messages to test template compatibilty public function simulate_template_messages () { global $MSG; $MSG[] = ['msg'=>'Error message (-1)', 'lvl'=>'error', 'allow'=>0, 'line'=>'', 'file'=>'']; $MSG[] = ['msg'=>'Info message (0)', 'lvl'=>'info', 'allow'=>0, 'line'=>'', 'file'=>'']; $MSG[] = ['msg'=>'Success message (1)', 'lvl'=>'success', 'allow'=>0, 'line'=>'', 'file'=>'']; $MSG[] = ['msg'=>'Notify message (2)', 'lvl'=>'notify', 'allow'=>0, 'line'=>'', 'file'=>'']; } } // End class