mirror of
https://github.com/moodle/moodle.git
synced 2025-02-24 12:03:12 +01:00
371 lines
13 KiB
PHP
371 lines
13 KiB
PHP
<?php // $Id$
|
|
|
|
/**
|
|
* This file contains the htmlarea subclass for moodle editorObject.
|
|
*
|
|
* @author Janne Mikkonen
|
|
* @version $Id$
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
|
|
* @package editorObject
|
|
*/
|
|
class htmlarea extends editorObject {
|
|
|
|
/**
|
|
* Configuration array to hold configuration data.
|
|
* @var array $htmlareaconf
|
|
*/
|
|
var $htmlareaconf = array();
|
|
|
|
/**
|
|
* Configuration keys array to store possible configuration keys.
|
|
* @var array $htmlareaconfkeys
|
|
*/
|
|
var $htmlareaconfkeys = array("width","height","statusBar","undoSteps","undoTimeout",
|
|
"sizeIncludesToolbar","fullPage","pageStyle","killWordOnPaste",
|
|
"toolbar","fontname","fontsize","formatblock","customSelects");
|
|
|
|
/**
|
|
* An array to store valid value types that can
|
|
* be passed to specific configuration key.
|
|
* @var array $htmlareaconfkeytypes
|
|
*/
|
|
var $htmlareaconfkeytypes = array('width' => 'string', 'height' => 'string', 'statusBar' => 'bool',
|
|
'undoSteps' => 'int', 'undoTimeout' => 'int',
|
|
'sizeIncludeToolbar' => 'bool', 'fullPage' => 'bool',
|
|
'pageStyle' => 'string', 'killWordOnPaste' => 'bool',
|
|
'toolbar' => 'array', 'fontname' => 'assoc', 'fontsize' => 'assoc',
|
|
'formatblock' => 'assoc', 'customSelects' => 'array');
|
|
|
|
/**
|
|
* Array of default configuration set via editor settings.
|
|
* @var array $defaults
|
|
*/
|
|
var $defaults = array();
|
|
|
|
/**
|
|
* PHP4 style class constructor.
|
|
*
|
|
* @param int $courseid Courseid.
|
|
*/
|
|
function htmlarea($courseid) {
|
|
parent::editorObject();
|
|
$this->courseid = clean_param($courseid, PARAM_INT);
|
|
|
|
$pagestyle = 'body {';
|
|
$pagestyle .= !empty($this->cfg->editorbackgroundcolor) ?
|
|
' background-color: '. $this->cfg->editorbackgroundcolor .'; ' : '';
|
|
$pagestyle .= !empty($this->cfg->editorfontfamily) ?
|
|
' font-family: '. $this->cfg->editorfontfamily .';' : '';
|
|
$pagestyle .= !empty($this->cfg->editorfontsize) ?
|
|
' font-size: '. $this->cfg->editorfontsize .';' : '';
|
|
$pagestyle .= '}';
|
|
|
|
$this->defaults['pageStyle'] = $pagestyle;
|
|
$this->defaults['killWordOnPaste'] = !empty($this->cfg->editorkillword) ? true : false;
|
|
|
|
$fontlist = isset($this->cfg->editorfontlist) ? explode(';', $this->cfg->editorfontlist) : array();
|
|
$fonts = array();
|
|
foreach ( $fontlist as $fontline ) {
|
|
if ( !empty($fontline) ) {
|
|
list($fontkey, $fontvalue) = split(":", $fontline);
|
|
$fonts[$fontkey] = $fontvalue;
|
|
}
|
|
}
|
|
$this->defaults['fontname'] = $fonts;
|
|
$this->defaults['hideSomeButtons'] = !empty($this->cfg->editorhidebuttons) ?
|
|
' '. $this->cfg->editorhidebuttons .' ' : '';
|
|
|
|
}
|
|
|
|
/**
|
|
* PHP5 style class constructor.
|
|
* @param int $courseid Course id.
|
|
*/
|
|
function __construct($courseid) {
|
|
$this->htmlarea($courseid);
|
|
}
|
|
|
|
/**
|
|
* Check if passed configuration key is valid.
|
|
* @param string $key
|
|
* @return bool Return true if key is valid and false if it's not.
|
|
*/
|
|
function __is_valid_key($key) {
|
|
if ( in_array($key, $this->htmlareaconfkeys) ) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check if passed value's type is valid.
|
|
* @param string $key Configuration key name.
|
|
* @param mixed $value Configuration value.
|
|
* @return bool Returns true if value is valid type and false if it's not.
|
|
*/
|
|
function __is_valid_value_type($key, $value) {
|
|
|
|
if ( !empty($this->htmlareaconfkeytypes[$key]) ) {
|
|
$keytype = $this->htmlareaconfkeytypes[$key];
|
|
|
|
switch ( $keytype ) {
|
|
case 'bool':
|
|
if ( is_bool($value) ) {
|
|
return true;
|
|
}
|
|
break;
|
|
case 'string':
|
|
if ( is_string($value) ) {
|
|
return true;
|
|
}
|
|
break;
|
|
case 'int':
|
|
if ( is_int($value) ) {
|
|
return true;
|
|
}
|
|
break;
|
|
case 'array':
|
|
if ( is_array($value) ) {
|
|
return true;
|
|
}
|
|
break;
|
|
case 'assoc':
|
|
if ( is_array($value) ) {
|
|
// Check first key.
|
|
$key = key($value);
|
|
if ( preg_match("/[a-z]+/i", $key) ) {
|
|
return true;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Sets configuration key and value pairs.
|
|
* Passed parameters can be key and value pair or
|
|
* an associative array of keys and values.
|
|
* @todo code example
|
|
*/
|
|
function setconfig() {
|
|
|
|
$numargs = func_num_args();
|
|
|
|
switch ( $numargs ) {
|
|
case 1: // Must be an array.
|
|
$args = func_get_arg(0);
|
|
if ( !is_array($args) ) {
|
|
$this->error("Passed argument is not an array!!!");
|
|
}
|
|
foreach ( $args as $key => $value ) {
|
|
if ( !preg_match("/[a-z]+/i", $key) && !$this->__is_valid_key($key) ) {
|
|
$this->error("Invalid configuration key!!!");
|
|
}
|
|
if ( $this->__is_valid_value_type($key, $value) ) {
|
|
$this->htmlareaconf[$key] = $value;
|
|
} else {
|
|
$this->error("Invalid key, value pair!!!");
|
|
}
|
|
}
|
|
break;
|
|
case 2: // Must be key, value pair.
|
|
$key = func_get_arg(0);
|
|
$value = func_get_arg(1);
|
|
if ( empty($key) or !isset($value) ) {
|
|
$this->error("Empty key or value passed!!!");
|
|
}
|
|
if ( !preg_match("/[a-z]+/i", $key) ) {
|
|
$this->error("Configuration key must be a string!!");
|
|
}
|
|
|
|
if ( !$this->__is_valid_key($key) ) {
|
|
$this->error("Invalid configuration key!!!");
|
|
}
|
|
|
|
if ( $this->__is_valid_value_type($key, $value) ) {
|
|
$this->htmlareaconf[$key] = $value;
|
|
} else {
|
|
$this->error("Invalid key, value pair!!!");
|
|
}
|
|
break;
|
|
default:
|
|
if ( $numargs > 2 ) {
|
|
$this->error("Too many arguments!!!");
|
|
}
|
|
if ( $numargs < 1 ) {
|
|
$this->error("No arguments passed!!!");
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* For internal usage. Print out configuration arrays.
|
|
* @param string $conftype Type of configuration.
|
|
* @return void
|
|
*/
|
|
function __printconfig($conftype='') {
|
|
|
|
$conf = NULL;
|
|
$assocs = array('fontname','fontsize','formatblocks');
|
|
|
|
switch( $conftype ) {
|
|
case 'merge': // New config overrides defaults if found.
|
|
$conf = array_merge($this->defaults,$this->htmlareaconf);
|
|
break;
|
|
case 'append': // Append mode leave default value if found.
|
|
$conf = $this->defaults;
|
|
$keys = array_keys($this->defaults);
|
|
foreach ( $this->htmlareaconf as $key => $value ) {
|
|
if ( in_array($key, $keys) ) {
|
|
continue;
|
|
} else {
|
|
$conf[$key] = $value;
|
|
}
|
|
}
|
|
break;
|
|
case 'default': // Use only default config.
|
|
$conf = $this->defaults;
|
|
break;
|
|
default: // Print what's in htmlareaconf.
|
|
$conf = $this->htmlareaconf;
|
|
}
|
|
|
|
echo "\n";
|
|
echo '<script type="text/javascript" defer="defer">'."\n";
|
|
echo '//<![CDATA['."\n";
|
|
echo ' var config = new HTMLArea.Config();'."\n";
|
|
|
|
foreach ( $conf as $key => $value ) {
|
|
|
|
if ( empty($value) ) {
|
|
continue;
|
|
}
|
|
|
|
echo ' config.'. $key .' = ';
|
|
if ( is_bool($value) ) {
|
|
echo $value ? "true;\n" : "false;\n";
|
|
} else if ( in_array($key, $assocs) ) {
|
|
|
|
echo '{'."\n";
|
|
$cnt = 1;
|
|
foreach ( $value as $key => $value ) {
|
|
if ( $cnt > 1 ) {
|
|
echo ",\n";
|
|
}
|
|
echo "\t\"$key\" : \"$value\"";
|
|
$cnt++;
|
|
}
|
|
echo ' };'."\n";
|
|
|
|
} else if ( $key == 'toolbar' ) {
|
|
// toolbar is array of arrays.
|
|
echo '['."\n";
|
|
$max = count($conf['toolbar']);
|
|
$cnt = 1;
|
|
foreach ( $conf['toolbar'] as $row ) {
|
|
echo "\t" . '[ ';
|
|
$count = count($row);
|
|
for ( $i = 0; $i < $count; $i++ ) {
|
|
if ( $i > 0 ) {
|
|
echo ',';
|
|
}
|
|
if ( $i != 0 && ($i % 4) == 0 ) {
|
|
echo "\n\t";
|
|
}
|
|
echo '"'. $row[$i] .'"';
|
|
}
|
|
if ( $cnt < $max ) {
|
|
echo " ],\n";
|
|
} else {
|
|
echo " ]\n";
|
|
}
|
|
$cnt++;
|
|
}
|
|
echo "\t" . '];'. "\n";
|
|
|
|
} else {
|
|
echo '"'. $value .'"'. "\n";
|
|
}
|
|
}
|
|
|
|
if ( !empty($this->cfg->editorspelling) && !empty($this->cfg->aspellpath) ) {
|
|
echo "\n";
|
|
$this->print_speller_code(true);
|
|
echo "\n";
|
|
}
|
|
|
|
echo ' HTMLArea.replaceAll(config);'."\n";
|
|
echo '//]]>'."\n";
|
|
echo '</script>'."\n";
|
|
|
|
}
|
|
|
|
/**
|
|
* Print out code that start up the editor.
|
|
* @param string $conftype Configuration type to print.
|
|
*/
|
|
function starteditor($configtype='') {
|
|
$this->__printconfig($configtype);
|
|
}
|
|
|
|
/**
|
|
* For backward compatibility only.
|
|
* @param string $name
|
|
* @param string $editorhidesomebuttons
|
|
*/
|
|
function use_html_editor ( $name='', $editorhidebuttons='' ) {
|
|
|
|
if ( !empty($editorhidesomebuttons) ) {
|
|
$this->defaults['hideSomeButtons'] = $editorhidesomebuttons;
|
|
}
|
|
|
|
if (empty($name)) {
|
|
$this->starteditor('default');
|
|
} else {
|
|
$this->starteditor('default');
|
|
}
|
|
|
|
if ( !empty($this->cfg->editorsrc) ) {
|
|
unset($this->cfg->editorsrc);
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Prints out needed code for spellchecking.
|
|
* @param bool $usehtmleditor
|
|
* @todo Deprecated? see lib/weblib.php::print_speller_code()
|
|
* @see lib/weblib.php::print_speller_code()
|
|
*/
|
|
function print_speller_code ($usehtmleditor=false) {
|
|
echo "\n".'<script type="text/javascript">'."\n";
|
|
echo '//<![CDATA['."\n";
|
|
if (!$usehtmleditor) {
|
|
echo 'function openSpellChecker() {'."\n";
|
|
echo "\tvar speller = new spellChecker();\n";
|
|
echo "\tspeller.popUpUrl = \"" . $this->cfg->httpswwwroot ."/lib/speller/spellchecker.html\";\n";
|
|
echo "\tspeller.spellCheckScript = \"". $this->cfg->httpswwwroot ."/lib/speller/server-scripts/spellchecker.php\";\n";
|
|
echo "\tspeller.spellCheckAll();\n";
|
|
echo '}'."\n";
|
|
} else {
|
|
echo "\n\tfunction spellClickHandler(editor, buttonId) {\n";
|
|
echo "\t\teditor._textArea.value = editor.getHTML();\n";
|
|
echo "\t\tvar speller = new spellChecker( editor._textArea );\n";
|
|
echo "\t\tspeller.popUpUrl = \"" . $this->cfg->httpswwwroot ."/lib/speller/spellchecker.html\";\n";
|
|
echo "\t\tspeller.spellCheckScript = \"". $this->cfg->httpswwwroot ."/lib/speller/server-scripts/spellchecker.php\";\n";
|
|
echo "\t\tspeller._moogle_edit=1;\n";
|
|
echo "\t\tspeller._editor=editor;\n";
|
|
echo "\t\tspeller.openChecker();\n\t";
|
|
echo '}'."\n";
|
|
}
|
|
echo '//]]>'."\n";
|
|
echo '</script>'."\n";
|
|
|
|
}
|
|
|
|
}
|
|
?>
|