223 lines
8.5 KiB
PHP
223 lines
8.5 KiB
PHP
<?php
|
|
// This file is part of Moodle - http://moodle.org/
|
|
//
|
|
// Moodle is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Moodle is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
/**
|
|
* 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/");
|
|
}
|
|
}
|