. /** * TinyMCE text editor integration. * * @package editor * @subpackage tinymce * @copyright 2009 Petr Skoda (http://skodak.org) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); class tinymce_texteditor extends texteditor { /** @var string active version - this is the directory name where to find tinymce code */ public $version = '3.6.0'; /** * Is the current browser supported by this editor? * @return bool */ public function supported_by_browser() { if (check_browser_version('MSIE', 6)) { return true; } if (check_browser_version('Gecko', 20030516)) { return true; } if (check_browser_version('Safari', 412)) { return true; } if (check_browser_version('Chrome', 6)) { return true; } if (check_browser_version('Opera', 9)) { return true; } if (check_browser_version('Safari iOS', 534)) { return true; } return false; } /** * 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; } /** * Sets up head code if necessary. */ public function head_setup() { } /** * Use this editor for give element. * * @param string $elementid * @param array $options * @param null $fpoptions */ public function use_editor($elementid, array $options=null, $fpoptions=null) { global $PAGE; if (debugging('', DEBUG_DEVELOPER)) { $PAGE->requires->js('/lib/editor/tinymce/tiny_mce/'.$this->version.'/tiny_mce_src.js'); } else { $PAGE->requires->js('/lib/editor/tinymce/tiny_mce/'.$this->version.'/tiny_mce.js'); } $PAGE->requires->js_init_call('M.editor_tinymce.init_editor', array($elementid, $this->get_init_params($elementid, $options)), true); if ($fpoptions) { $PAGE->requires->js_init_call('M.editor_tinymce.init_filepicker', array($elementid, $fpoptions), true); } } protected function get_init_params($elementid, array $options=null) { global $CFG, $PAGE, $OUTPUT; require_once($CFG->dirroot . '/lib/editor/tinymce/classes/plugin.php'); //TODO: we need to implement user preferences that affect the editor setup too $directionality = get_string('thisdirection', 'langconfig'); $strtime = get_string('strftimetime'); $strdate = get_string('strftimedaydate'); $lang = current_language(); $contentcss = $PAGE->theme->editor_css_url()->out(false); $context = empty($options['context']) ? context_system::instance() : $options['context']; $config = get_config('editor_tinymce'); $fontselectlist = empty($config->fontselectlist) ? '' : $config->fontselectlist; $fontbutton = ($fontselectlist === '') ? '' : 'fontselect,'; $params = array( 'moodle_config' => $config, 'mode' => "exact", 'elements' => $elementid, 'relative_urls' => false, 'document_base_url' => $CFG->httpswwwroot, 'moodle_plugin_base' => "$CFG->httpswwwroot/lib/editor/tinymce/plugins/", 'content_css' => $contentcss, 'language' => $lang, 'directionality' => $directionality, 'plugin_insertdate_dateFormat ' => $strdate, 'plugin_insertdate_timeFormat ' => $strtime, 'theme' => "advanced", 'skin' => "o2k7", 'skin_variant' => "silver", 'apply_source_formatting' => true, 'remove_script_host' => false, 'entity_encoding' => "raw", 'plugins' => 'safari,table,style,layer,advhr,advlink,emotions,inlinepopups,' . 'searchreplace,paste,directionality,fullscreen,nonbreaking,contextmenu,' . 'insertdatetime,save,iespell,preview,print,noneditable,visualchars,' . 'xhtmlxtras,template,pagebreak', 'theme_advanced_font_sizes' => "1,2,3,4,5,6,7", 'theme_advanced_layout_manager' => "SimpleLayout", 'theme_advanced_toolbar_align' => "left", 'theme_advanced_buttons1' => $fontbutton . 'fontsizeselect,formatselect,|,' . 'undo,redo,|,search,replace,|,fullscreen', 'theme_advanced_buttons2' => 'bold,italic,underline,strikethrough,sub,sup,|,' . 'justifyleft,justifycenter,justifyright,|,' . 'cleanup,removeformat,pastetext,pasteword,|,forecolor,backcolor,|,ltr,rtl', 'theme_advanced_buttons3' => 'bullist,numlist,outdent,indent,|,' . 'link,unlink,|,image,nonbreaking,charmap,table,|,code', 'theme_advanced_fonts' => $fontselectlist, 'theme_advanced_resize_horizontal' => true, 'theme_advanced_resizing' => true, 'theme_advanced_resizing_min_height' => 30, 'min_height' => 30, 'theme_advanced_toolbar_location' => "top", 'theme_advanced_statusbar_location' => "bottom", ); if (!empty($options['legacy']) or !empty($options['noclean']) or !empty($options['trusted'])) { // now deal somehow with non-standard tags, people scream when we do not make moodle code xtml strict, // but they scream even more when we strip all tags that are not strict :-( $params['valid_elements'] = 'script[src|type],*[*]'; // for some reason the *[*] does not inlcude javascript src attribute MDL-25836 $params['invalid_elements'] = ''; } // Add unique moodle elements - unfortunately we have to decide if these are SPANs or DIVs. $params['extended_valid_elements'] = 'nolink,tex,algebra,lang[lang]'; $params['custom_elements'] = 'nolink,~tex,~algebra,lang'; if (empty($options['legacy'])) { if (isset($options['maxfiles']) and $options['maxfiles'] != 0) { $params['file_browser_callback'] = "M.editor_tinymce.filepicker"; } } //Add onblur event for client side text validation if (!empty($options['required'])) { $params['init_instance_callback'] = 'M.editor_tinymce.onblur_event'; } // Allow plugins to adjust parameters. editor_tinymce_plugin::all_update_init_params($params, $context, $options); // Remove temporary parameters. unset($params['moodle_config']); return $params; } /** * Gets a named plugin object. Will cause fatal error if plugin doesn't * exist. This is intended for use by plugin files themselves. * * @param string $plugin Name of plugin e.g. 'moodleemoticon' * @return editor_tinymce_plugin Plugin object */ public function get_plugin($plugin) { global $CFG; require_once($CFG->dirroot . '/lib/editor/tinymce/classes/plugin.php'); return editor_tinymce_plugin::get($plugin); } /** * Equivalent to tinyMCE.baseURL value available from JavaScript, * always use instead of /../ when referencing tinymce core code from moodle plugins! * * @return moodle_url url pointing to the root of TinyMCE javascript code. */ public function get_tinymce_base_url() { global $CFG; return new moodle_url("$CFG->httpswwwroot/lib/editor/tinymce/tiny_mce/$this->version/"); } }