. /** * YUI text editor integration. * * @package editor_atto * @copyright 2013 Damyon Wiese * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); /** * This is the texteditor implementation. * @copyright 2013 Damyon Wiese * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class atto_texteditor extends texteditor { /** * Is the current browser supported by this editor? * * Of course! * @return bool */ public function supported_by_browser() { return true; } /** * Returns array of supported text formats. * @return array */ public function get_supported_formats() { // FORMAT_MOODLE is not supported here, sorry. return array(FORMAT_HTML => FORMAT_HTML); } /** * Returns text format preferred by this editor. * @return int */ public function get_preferred_format() { return FORMAT_HTML; } /** * Does this editor support picking from repositories? * @return bool */ public function supports_repositories() { return true; } /** * Use this editor for given element. * * Available Atto-specific options: * atto:toolbar - set to a string to override the system config editor_atto/toolbar * * Available general options: * context - set to the current context object * enable_filemanagement - set false to get rid of the managefiles plugin * autosave - true/false to control autosave * * Options are also passed through to the plugins. * * @param string $elementid * @param array $options * @param null $fpoptions */ public function use_editor($elementid, array $options=null, $fpoptions=null) { global $PAGE; if (array_key_exists('atto:toolbar', $options)) { $configstr = $options['atto:toolbar']; } else { $configstr = get_config('editor_atto', 'toolbar'); } $grouplines = explode("\n", $configstr); $groups = array(); foreach ($grouplines as $groupline) { $line = explode('=', $groupline); if (count($line) > 1) { $group = trim(array_shift($line)); $plugins = array_map('trim', explode(',', array_shift($line))); $groups[$group] = $plugins; } } $modules = array('moodle-editor_atto-editor'); $options['context'] = empty($options['context']) ? context_system::instance() : $options['context']; $jsplugins = array(); foreach ($groups as $group => $plugins) { $groupplugins = array(); foreach ($plugins as $plugin) { // Do not die on missing plugin. if (!core_component::get_component_directory('atto_' . $plugin)) { continue; } // Remove manage files if requested. if ($plugin == 'managefiles' && isset($options['enable_filemanagement']) && !$options['enable_filemanagement']) { continue; } $jsplugin = array(); $jsplugin['name'] = $plugin; $jsplugin['params'] = array(); $modules[] = 'moodle-atto_' . $plugin . '-button'; component_callback('atto_' . $plugin, 'strings_for_js'); $extra = component_callback('atto_' . $plugin, 'params_for_js', array($elementid, $options, $fpoptions)); if ($extra) { $jsplugin = array_merge($jsplugin, $extra); } // We always need the plugin name. $PAGE->requires->string_for_js('pluginname', 'atto_' . $plugin); $groupplugins[] = $jsplugin; } $jsplugins[] = array('group'=>$group, 'plugins'=>$groupplugins); } $PAGE->requires->strings_for_js(array( 'editor_command_keycode', 'editor_control_keycode', 'plugin_title_shortcut', 'textrecovered', 'autosavefailed', 'autosavesucceeded', 'errortextrecovery' ), 'editor_atto'); $PAGE->requires->strings_for_js(array( 'warning', 'info' ), 'moodle'); $PAGE->requires->yui_module($modules, 'Y.M.editor_atto.Editor.init', array($this->get_init_params($elementid, $options, $fpoptions, $jsplugins))); } /** * Create a params array to init the editor. * * @param string $elementid * @param array $options * @param array $fpoptions */ protected function get_init_params($elementid, array $options = null, array $fpoptions = null, $plugins = null) { global $PAGE; $directionality = get_string('thisdirection', 'langconfig'); $strtime = get_string('strftimetime'); $strdate = get_string('strftimedaydate'); $lang = current_language(); $autosave = true; $autosavefrequency = get_config('editor_atto', 'autosavefrequency'); if (isset($options['autosave'])) { $autosave = $options['autosave']; } $contentcss = $PAGE->theme->editor_css_url()->out(false); // Autosave disabled for guests and not logged in users. if (isguestuser() OR !isloggedin()) { $autosave = false; } // Note <> is a safe separator, because it will not appear in the output of s(). $pagehash = sha1($PAGE->url . '<>' . s($this->get_text())); $params = array( 'elementid' => $elementid, 'content_css' => $contentcss, 'contextid' => $options['context']->id, 'autosaveEnabled' => $autosave, 'autosaveFrequency' => $autosavefrequency, 'language' => $lang, 'directionality' => $directionality, 'filepickeroptions' => array(), 'plugins' => $plugins, 'pageHash' => $pagehash, ); if ($fpoptions) { $params['filepickeroptions'] = $fpoptions; } return $params; } }