Added feature #16073: htmlArea RTE: Add paste as plain text feature
[Packages/TYPO3.CMS.git] / typo3 / sysext / rtehtmlarea / class.tx_rtehtmlarea_base.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 2004-2010 Kasper Skårhøj (kasper@typo3.com)
6 * (c) 2004-2010 Philipp Borgmann <philipp.borgmann@gmx.de>
7 * (c) 2004-2010 Stanislas Rolland <typo3(arobas)sjbr.ca>
8 * All rights reserved
9 *
10 * This script is part of the TYPO3 project. The TYPO3 project is
11 * free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * The GNU General Public License can be found at
17 * http://www.gnu.org/copyleft/gpl.html.
18 * A copy is found in the textfile GPL.txt and important notices to the license
19 * from the author is found in LICENSE.txt distributed with these scripts.
20 *
21 *
22 * This script is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU General Public License for more details.
26 *
27 * This copyright notice MUST APPEAR in all copies of the script!
28 ***************************************************************/
29 /**
30 * A RTE using the htmlArea editor
31 *
32 * @author Philipp Borgmann <philipp.borgmann@gmx.de>
33 * @author Stanislas Rolland <typo3(arobas)sjbr.ca>
34 *
35 * $Id$ *
36 */
37
38 class tx_rtehtmlarea_base extends t3lib_rteapi {
39 // Configuration of supported browsers
40 var $conf_supported_browser = array (
41 'msie' => array (
42 1 => array (
43 'version' => 6.0,
44 'system' => 'winNT'
45 ),
46 2 => array (
47 'version' => 6.0,
48 'system' => 'win98'
49 ),
50 3 => array (
51 'version' => 6.0,
52 'system' => 'win95'
53 )
54 ),
55 'gecko' => array (
56 1 => array (
57 'version' => 1.8
58 )
59 ),
60 'webkit' => array (
61 1 => array (
62 'version' => 523,
63 'system' => 'mac'
64 ),
65 2 => array (
66 'version' => 523,
67 'system' => 'winNT'
68 ),
69 3 => array (
70 'version' => 523,
71 'system' => 'linux'
72 ),
73 4 => array (
74 'version' => 523,
75 'system' => 'win98'
76 ),
77 5 => array (
78 'version' => 523,
79 'system' => 'win95'
80 )
81 ),
82 'opera' => array (
83 1 => array (
84 'version' => 9.62
85 )
86 )
87 );
88
89 // Always hide these toolbar buttons (TYPO3 button name)
90 var $conf_toolbar_hide = array (
91 'showhelp', // Has no content yet
92 );
93
94 // The order of the toolbar: the name is the TYPO3-button name
95 var $defaultToolbarOrder;
96
97 // Conversion array: TYPO3 button names to htmlArea button names
98 var $convertToolbarForHtmlAreaArray = array (
99 'showhelp' => 'ShowHelp',
100 'space' => 'space',
101 'bar' => 'separator',
102 'linebreak' => 'linebreak',
103 );
104
105 var $pluginButton = array();
106 var $pluginLabel = array();
107 // Alternative style for RTE <div> tag.
108 public $RTEdivStyle;
109 // Relative path to this extension. It ends with "/"
110 public $extHttpPath;
111 public $backPath = '';
112 // TYPO3 site url
113 public $siteURL;
114 // TYPO3 host url
115 public $hostURL;
116 // Typo3 version
117 public $typoVersion;
118 // Identifies the RTE as being the one from the "rtehtmlarea" extension if any external code needs to know
119 var $ID = 'rtehtmlarea';
120 // If set, the content goes into a regular TEXT area field - for developing testing of transformations.
121 var $debugMode = FALSE;
122 // For the editor
123 var $client;
124
125 /**
126 * Reference to parent object, which is an instance of the TCEforms
127 *
128 * @var t3lib_TCEforms
129 */
130 var $TCEform;
131 var $elementId;
132 var $elementParts;
133 var $tscPID;
134 var $typeVal;
135 var $thePid;
136 var $RTEsetup;
137 var $thisConfig;
138 var $confValues;
139 public $language;
140 public $contentTypo3Language;
141 public $contentISOLanguage;
142 public $contentCharset;
143 public $OutputCharset;
144 var $editorCSS;
145 var $specConf;
146 var $toolbar = array(); // Save the buttons for the toolbar
147 var $toolbarOrderArray = array();
148 protected $pluginEnabledArray = array(); // Array of plugin id's enabled in the current RTE editing area
149 protected $pluginEnabledCumulativeArray = array(); // Cumulative array of plugin id's enabled so far in any of the RTE editing areas of the form
150 protected $cumulativeScripts = array();
151 public $registeredPlugins = array(); // Array of registered plugins indexed by their plugin Id's
152 protected $fullScreen = false;
153
154 /**
155 * Returns true if the RTE is available. Here you check if the browser requirements are met.
156 * If there are reasons why the RTE cannot be displayed you simply enter them as text in ->errorLog
157 *
158 * @return boolean TRUE if this RTE object offers an RTE in the current browser environment
159 */
160
161 function isAvailable() {
162 global $TYPO3_CONF_VARS;
163
164 $this->client = $this->clientInfo();
165 $this->errorLog = array();
166 if (!$this->debugMode) { // If debug-mode, let any browser through
167 $rteIsAvailable = 0;
168 $rteConfBrowser = $this->conf_supported_browser;
169 if (is_array($rteConfBrowser)) {
170 foreach ($rteConfBrowser as $browser => $browserConf) {
171 if ($browser == $this->client['browser']) {
172 // Config for Browser found, check it:
173 if (is_array($browserConf)) {
174 foreach ($browserConf as $browserConfNr => $browserConfSub) {
175 if ($browserConfSub['version'] <= $this->client['version'] || empty($browserConfSub['version'])) {
176 // Version is correct
177 if ($browserConfSub['system'] == $this->client['system'] || empty($browserConfSub['system'])) {
178 // System is correctly
179 $rteIsAvailable = 1;
180 }// End of System
181 }// End of Version
182 }// End of foreach-BrowserSubpart
183 } else {
184 // no config for this browser found, so all versions or system with this browsers are allow
185 $rteIsAvailable = 1;
186 }
187 } // End of Browser Check
188 } // foreach: Browser Check
189 } else {
190 // no Browser config for this RTE-Editor, so all Clients are allow
191 }
192 if (!$rteIsAvailable) {
193 $this->errorLog[] = 'rte: Browser not supported. Only msie Version 5 or higher and Mozilla based client 1. and higher.';
194 }
195 if (t3lib_div::int_from_ver(TYPO3_version) < 4000000) {
196 $rteIsAvailable = 0;
197 $this->errorLog[] = 'rte: This version of htmlArea RTE cannot run under this version of TYPO3.';
198 }
199 }
200 if ($rteIsAvailable) return true;
201 }
202
203 /**
204 * Draws the RTE as an iframe
205 *
206 * @param object Reference to parent object, which is an instance of the TCEforms.
207 * @param string The table name
208 * @param string The field name
209 * @param array The current row from which field is being rendered
210 * @param array Array of standard content for rendering form fields from TCEforms. See TCEforms for details on this. Includes for instance the value and the form field name, java script actions and more.
211 * @param array "special" configuration - what is found at position 4 in the types configuration of a field from record, parsed into an array.
212 * @param array Configuration for RTEs; A mix between TSconfig and otherwise. Contains configuration for display, which buttons are enabled, additional transformation information etc.
213 * @param string Record "type" field value.
214 * @param string Relative path for images/links in RTE; this is used when the RTE edits content from static files where the path of such media has to be transformed forth and back!
215 * @param integer PID value of record (true parent page id)
216 * @return string HTML code for RTE!
217 */
218
219 function drawRTE($parentObject, $table, $field, $row, $PA, $specConf, $thisConfig, $RTEtypeVal, $RTErelPath, $thePidValue) {
220 global $BE_USER, $LANG, $TYPO3_DB, $TYPO3_CONF_VARS;
221
222 $this->TCEform = $parentObject;
223 $inline = $this->TCEform->inline;
224 $LANG->includeLLFile('EXT:' . $this->ID . '/locallang.xml');
225 $this->client = $this->clientInfo();
226 $this->typoVersion = t3lib_div::int_from_ver(TYPO3_version);
227 $this->userUid = 'BE_' . $BE_USER->user['uid'];
228
229 // Draw form element:
230 if ($this->debugMode) { // Draws regular text area (debug mode)
231 $item = parent::drawRTE($this->TCEform, $table, $field, $row, $PA, $specConf, $thisConfig, $RTEtypeVal, $RTErelPath, $thePidValue);
232 } else { // Draw real RTE
233
234 /* =======================================
235 * INIT THE EDITOR-SETTINGS
236 * =======================================
237 */
238 // Set backPath
239 $this->backPath = $this->TCEform->backPath;
240 // Get the path to this extension:
241 $this->extHttpPath = $this->backPath . t3lib_extMgm::extRelPath($this->ID);
242 // Get the site URL
243 $this->siteURL = t3lib_div::getIndpEnv('TYPO3_SITE_URL');
244 // Get the host URL
245 $this->hostURL = $this->siteURL . TYPO3_mainDir;
246 // Element ID + pid
247 $this->elementId = $PA['itemFormElName']; // Form element name
248 $this->elementParts = explode('][',preg_replace('/\]$/','',preg_replace('/^(TSFE_EDIT\[data\]\[|data\[)/','',$this->elementId)));
249 // Find the page PIDs:
250 list($this->tscPID,$this->thePid) = t3lib_BEfunc::getTSCpid(trim($this->elementParts[0]),trim($this->elementParts[1]),$thePidValue);
251
252 // Record "types" field value:
253 $this->typeVal = $RTEtypeVal; // TCA "types" value for record
254
255 // Find "thisConfig" for record/editor:
256 unset($this->RTEsetup);
257 $this->RTEsetup = $BE_USER->getTSConfig('RTE',t3lib_BEfunc::getPagesTSconfig($this->tscPID));
258 $this->thisConfig = $thisConfig;
259
260 // Special configuration and default extras:
261 $this->specConf = $specConf;
262
263 if ($this->thisConfig['forceHTTPS']) {
264 $this->extHttpPath = preg_replace('/^(http|https)/', 'https', $this->extHttpPath);
265 $this->siteURL = preg_replace('/^(http|https)/', 'https', $this->siteURL);
266 $this->hostURL = preg_replace('/^(http|https)/', 'https', $this->hostURL);
267 }
268
269 /* =======================================
270 * LANGUAGES & CHARACTER SETS
271 * =======================================
272 */
273
274 // Languages: interface and content
275 $this->language = $LANG->lang;
276 if ($this->language=='default' || !$this->language) {
277 $this->language='en';
278 }
279 $this->contentTypo3Language = $this->language;
280 $this->contentISOLanguage = 'en';
281 $this->contentLanguageUid = ($row['sys_language_uid'] > 0) ? $row['sys_language_uid'] : 0;
282 if (t3lib_extMgm::isLoaded('static_info_tables')) {
283 if ($this->contentLanguageUid) {
284 $tableA = 'sys_language';
285 $tableB = 'static_languages';
286 $languagesUidsList = $this->contentLanguageUid;
287 $selectFields = $tableA . '.uid,' . $tableB . '.lg_iso_2,' . $tableB . '.lg_country_iso_2,' . $tableB . '.lg_typo3';
288 $tableAB = $tableA . ' LEFT JOIN ' . $tableB . ' ON ' . $tableA . '.static_lang_isocode=' . $tableB . '.uid';
289 $whereClause = $tableA . '.uid IN (' . $languagesUidsList . ') ';
290 $whereClause .= t3lib_BEfunc::BEenableFields($tableA);
291 $whereClause .= t3lib_BEfunc::deleteClause($tableA);
292 $res = $TYPO3_DB->exec_SELECTquery($selectFields, $tableAB, $whereClause);
293 while($languageRow = $TYPO3_DB->sql_fetch_assoc($res)) {
294 $this->contentISOLanguage = strtolower(trim($languageRow['lg_iso_2']).(trim($languageRow['lg_country_iso_2'])?'_'.trim($languageRow['lg_country_iso_2']):''));
295 $this->contentTypo3Language = strtolower(trim($languageRow['lg_typo3']));
296 }
297 } else {
298 $this->contentISOLanguage = trim($this->thisConfig['defaultContentLanguage']) ? trim($this->thisConfig['defaultContentLanguage']) : 'en';
299 $selectFields = 'lg_iso_2, lg_typo3';
300 $tableAB = 'static_languages';
301 $whereClause = 'lg_iso_2 = ' . $TYPO3_DB->fullQuoteStr(strtoupper($this->contentISOLanguage), $tableAB);
302 $res = $TYPO3_DB->exec_SELECTquery($selectFields, $tableAB, $whereClause);
303 while($languageRow = $TYPO3_DB->sql_fetch_assoc($res)) {
304 $this->contentTypo3Language = strtolower(trim($languageRow['lg_typo3']));
305 }
306 }
307 }
308
309 // Character sets: interface and content
310 $this->charset = $LANG->charSet;
311 $this->OutputCharset = $this->charset;
312
313 $this->contentCharset = $LANG->csConvObj->charSetArray[$this->contentTypo3Language];
314 $this->contentCharset = $this->contentCharset ? $this->contentCharset : 'iso-8859-1';
315 $this->origContentCharSet = $this->contentCharset;
316 $this->contentCharset = (trim($TYPO3_CONF_VARS['BE']['forceCharset']) ? trim($TYPO3_CONF_VARS['BE']['forceCharset']) : $this->contentCharset);
317
318 /* =======================================
319 * TOOLBAR CONFIGURATION
320 * =======================================
321 */
322 $this->initializeToolbarConfiguration();
323
324 /* =======================================
325 * SET STYLES
326 * =======================================
327 */
328
329 $RTEWidth = isset($BE_USER->userTS['options.']['RTESmallWidth']) ? $BE_USER->userTS['options.']['RTESmallWidth'] : '530';
330 $RTEHeight = isset($BE_USER->userTS['options.']['RTESmallHeight']) ? $BE_USER->userTS['options.']['RTESmallHeight'] : '380';
331 $RTEWidth = $RTEWidth + ($this->TCEform->docLarge ? (isset($BE_USER->userTS['options.']['RTELargeWidthIncrement']) ? $BE_USER->userTS['options.']['RTELargeWidthIncrement'] : '150') : 0);
332 $RTEWidth -= ($inline->getStructureDepth() > 0 ? ($inline->getStructureDepth()+1)*$inline->getLevelMargin() : 0);
333 if (isset($this->thisConfig['RTEWidthOverride'])) {
334 if (strstr($this->thisConfig['RTEWidthOverride'], '%')) {
335 if ($this->client['browser'] != 'msie') {
336 $RTEWidth = (intval($this->thisConfig['RTEWidthOverride']) > 0) ? $this->thisConfig['RTEWidthOverride'] : '100%';
337 }
338 } else {
339 $RTEWidth = (intval($this->thisConfig['RTEWidthOverride']) > 0) ? intval($this->thisConfig['RTEWidthOverride']) : $RTEWidth;
340 }
341 }
342 $RTEWidth = strstr($RTEWidth, '%') ? $RTEWidth : $RTEWidth . 'px';
343 $RTEHeight = $RTEHeight + ($this->TCEform->docLarge ? (isset($BE_USER->userTS['options.']['RTELargeHeightIncrement']) ? $BE_USER->userTS['options.']['RTELargeHeightIncrement'] : 0) : 0);
344 $RTEHeightOverride = intval($this->thisConfig['RTEHeightOverride']);
345 $RTEHeight = ($RTEHeightOverride > 0) ? $RTEHeightOverride : $RTEHeight;
346 $editorWrapWidth = '99%';
347 $editorWrapHeight = '100%';
348 $this->RTEdivStyle = 'position:relative; left:0px; top:0px; height:' . $RTEHeight . 'px; width:'.$RTEWidth.'; border: 1px solid black; padding: 2px 2px 2px 2px;';
349
350 /* =======================================
351 * LOAD CSS AND JAVASCRIPT
352 * =======================================
353 */
354 // Preloading the pageStyle and including RTE skin stylesheets
355 $this->addPageStyle();
356 $this->addSkin();
357 // Loading JavaScript files and code
358 if ($this->TCEform->RTEcounter == 1) {
359 $this->TCEform->additionalJS_pre['rtehtmlarea-loadJScode'] = $this->loadJScode($this->TCEform->RTEcounter);
360 }
361 $this->TCEform->additionalCode_pre['rtehtmlarea-loadJSfiles'] = $this->loadJSfiles($this->TCEform->RTEcounter);
362 $pageRenderer = $GLOBALS['SOBE']->doc->getPageRenderer();
363 $pageRenderer->enableExtJSQuickTips();
364 if (!$GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->ID]['enableCompressedScripts']) {
365 $pageRenderer->enableExtJsDebug();
366 }
367 $pageRenderer->addJsFile('../t3lib/js/extjs/notifications.js');
368 /* =======================================
369 * DRAW THE EDITOR
370 * =======================================
371 */
372
373 // Transform value:
374 $value = $this->transformContent('rte',$PA['itemFormElValue'],$table,$field,$row,$specConf,$thisConfig,$RTErelPath,$thePidValue);
375
376 // Further content transformation by registered plugins
377 foreach ($this->registeredPlugins as $pluginId => $plugin) {
378 if ($this->isPluginEnabled($pluginId) && method_exists($plugin, "transformContent")) {
379 $value = $plugin->transformContent($value);
380 }
381 }
382 // Register RTE windows
383 $this->TCEform->RTEwindows[] = $PA['itemFormElName'];
384 $textAreaId = preg_replace('/[^a-zA-Z0-9_:.-]/', '_', $PA['itemFormElName']);
385 $textAreaId = htmlspecialchars(preg_replace('/^[^a-zA-Z]/', 'x', $textAreaId));
386
387 // Check if wizard_rte called this for fullscreen edtition; if so, change the size of the RTE to fullscreen using JS
388 if (basename(PATH_thisScript) == 'wizard_rte.php') {
389 $this->fullScreen = true;
390 $editorWrapWidth = '100%';
391 $editorWrapHeight = '100%';
392 $this->RTEdivStyle = 'position:relative; left:0px; top:0px; height:100%; width:100%; border: 1px solid black; padding: 2px 0px 2px 2px;';
393 }
394
395 // Register RTE in JS:
396 $this->TCEform->additionalJS_post[] = $this->registerRTEinJS($this->TCEform->RTEcounter, $table, $row['uid'], $field, $textAreaId);
397
398 // Set the save option for the RTE:
399 $this->TCEform->additionalJS_submit[] = $this->setSaveRTE($this->TCEform->RTEcounter, $this->TCEform->formName, $textAreaId, $PA['itemFormElName']);
400 $this->TCEform->additionalJS_delete[] = $this->setDeleteRTE($this->TCEform->RTEcounter, $this->TCEform->formName, $textAreaId);
401
402 // Draw the textarea
403 $visibility = 'hidden';
404 $item = $this->triggerField($PA['itemFormElName']).'
405 <div id="pleasewait' . $textAreaId . '" class="pleasewait" style="display: block;" >' . $LANG->getLL('Please wait') . '</div>
406 <div id="editorWrap' . $textAreaId . '" class="editorWrap" style="visibility: hidden; width:' . $editorWrapWidth . '; height:' . $editorWrapHeight . ';">
407 <textarea id="RTEarea' . $textAreaId . '" name="'.htmlspecialchars($PA['itemFormElName']).'" rows="0" cols="0" style="'.t3lib_div::deHSCentities(htmlspecialchars($this->RTEdivStyle)).'">'.t3lib_div::formatForTextarea($value).'</textarea>
408 </div>' . ($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableDebugMode'] ? '<div id="HTMLAreaLog"></div>' : '') . '
409 ';
410 }
411
412 // Return form item:
413 return $item;
414 }
415
416 /**
417 * Add link to content style sheet to document header
418 *
419 * @return void
420 */
421 protected function addPageStyle() {
422 // Get stylesheet file name from Page TSConfig if any
423 $filename = trim($this->thisConfig['contentCSS']) ? trim($this->thisConfig['contentCSS']) : 'EXT:' . $this->ID . '/res/contentcss/default.css';
424 $this->addStyleSheet(
425 'rtehtmlarea-page-style',
426 $this->getFullFileName($filename),
427 'htmlArea RTE Content CSS',
428 'alternate stylesheet'
429 );
430 }
431
432 /**
433 * Add links to skin style sheet(s) to document header
434 *
435 * @return void
436 */
437 protected function addSkin() {
438 // Get skin file name from Page TSConfig if any
439 $skinFilename = trim($this->thisConfig['skin']) ? trim($this->thisConfig['skin']) : 'EXT:' . $this->ID . '/htmlarea/skins/default/htmlarea.css';
440 $this->editorCSS = $this->getFullFileName($skinFilename);
441 $skinDir = dirname($this->editorCSS);
442 // Editing area style sheet
443 $this->editedContentCSS = $skinDir . '/htmlarea-edited-content.css';
444 $this->addStyleSheet(
445 'rtehtmlarea-editing-area-skin',
446 $this->editedContentCSS
447 );
448 // Main skin
449 $this->addStyleSheet(
450 'rtehtmlarea-skin',
451 $this->editorCSS
452 );
453 // Additional icons from registered plugins
454 foreach ($this->pluginEnabledCumulativeArray[$this->TCEform->RTEcounter] as $pluginId) {
455 if (is_object($this->registeredPlugins[$pluginId])) {
456 $pathToSkin = $this->registeredPlugins[$pluginId]->getPathToSkin();
457 if ($pathToSkin) {
458 $key = $this->registeredPlugins[$pluginId]->getExtensionKey();
459 $this->addStyleSheet(
460 'rtehtmlarea-plugin-' . $pluginId . '-skin',
461 ($this->is_FE() ? t3lib_extMgm::siteRelPath($key) : $this->backPath . t3lib_extMgm::extRelPath($key)) . $pathToSkin
462 );
463 }
464 }
465 }
466 }
467
468 /**
469 * Add style sheet file to document header
470 *
471 * @param string $key: some key identifying the style sheet
472 * @param string $href: uri to the style sheet file
473 * @param string $title: value for the title attribute of the link element
474 * @return string $relation: value for the rel attribute of the link element
475 * @return void
476 */
477 protected function addStyleSheet($key, $href, $title='', $relation='stylesheet') {
478 // If it was not known that an RTE-enabled would be created when the page was first created, the css would not be added to head
479 if (is_object($this->TCEform->inline) && $this->TCEform->inline->isAjaxCall) {
480 $this->TCEform->additionalCode_pre[$key] = '<link rel="' . $relation . '" type="text/css" href="' . $href . '" title="' . $title. '" />';
481 } else {
482 $pageRenderer = $GLOBALS['SOBE']->doc->getPageRenderer();
483 $pageRenderer->addCssFile($href, $relation, 'screen', $title);
484 }
485 }
486
487 /**
488 * Initialize toolbar configuration and enable registered plugins
489 *
490 * @return void
491 */
492 protected function initializeToolbarConfiguration() {
493
494 // Enable registred plugins
495 $this->enableRegisteredPlugins();
496
497 // Configure toolbar
498 $this->setToolbar();
499
500 // Check if some plugins need to be disabled
501 $this->setPlugins();
502
503 // Merge the list of enabled plugins with the lists from the previous RTE editing areas on the same form
504 $this->pluginEnabledCumulativeArray[$this->TCEform->RTEcounter] = $this->pluginEnabledArray;
505 if ($this->TCEform->RTEcounter > 1 && isset($this->pluginEnabledCumulativeArray[$this->TCEform->RTEcounter-1]) && is_array($this->pluginEnabledCumulativeArray[$this->TCEform->RTEcounter-1])) {
506 $this->pluginEnabledCumulativeArray[$this->TCEform->RTEcounter] = array_unique(array_values(array_merge($this->pluginEnabledArray,$this->pluginEnabledCumulativeArray[$this->TCEform->RTEcounter-1])));
507 }
508 }
509
510 /**
511 * Add registered plugins to the array of enabled plugins
512 *
513 */
514 function enableRegisteredPlugins() {
515 global $TYPO3_CONF_VARS;
516 // Traverse registered plugins
517 if (is_array($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['plugins'])) {
518 foreach($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['plugins'] as $pluginId => $pluginObjectConfiguration) {
519 $plugin = false;
520 if (is_array($pluginObjectConfiguration) && count($pluginObjectConfiguration)) {
521 $plugin = t3lib_div::getUserObj($pluginObjectConfiguration['objectReference']);
522 }
523 if (is_object($plugin)) {
524 if ($plugin->main($this)) {
525 $this->registeredPlugins[$pluginId] = $plugin;
526 // Override buttons from previously registered plugins
527 $pluginButtons = t3lib_div::trimExplode(',', $plugin->getPluginButtons(), 1);
528 foreach ($this->pluginButton as $previousPluginId => $buttonList) {
529 $this->pluginButton[$previousPluginId] = implode(',',array_diff(t3lib_div::trimExplode(',', $this->pluginButton[$previousPluginId], 1), $pluginButtons));
530 }
531 $this->pluginButton[$pluginId] = $plugin->getPluginButtons();
532 $pluginLabels = t3lib_div::trimExplode(',', $plugin->getPluginLabels(), 1);
533 foreach ($this->pluginLabel as $previousPluginId => $labelList) {
534 $this->pluginLabel[$previousPluginId] = implode(',',array_diff(t3lib_div::trimExplode(',', $this->pluginLabel[$previousPluginId], 1), $pluginLabels));
535 }
536 $this->pluginLabel[$pluginId] = $plugin->getPluginLabels();
537 $this->pluginEnabledArray[] = $pluginId;
538 }
539 }
540 }
541 }
542 // Process overrides
543 $hidePlugins = array();
544 foreach ($this->registeredPlugins as $pluginId => $plugin) {
545 if ($plugin->addsButtons() && !$this->pluginButton[$pluginId]) {
546 $hidePlugins[] = $pluginId;
547 }
548 }
549 $this->pluginEnabledArray = array_unique(array_diff($this->pluginEnabledArray, $hidePlugins));
550 }
551
552 /**
553 * Set the toolbar config (only in this PHP-Object, not in JS):
554 *
555 */
556
557 function setToolbar() {
558 global $BE_USER;
559
560 if ($this->client['browser'] == 'msie' || $this->client['browser'] == 'opera') {
561 $this->thisConfig['keepButtonGroupTogether'] = 0;
562 }
563
564 $this->defaultToolbarOrder = 'bar, blockstylelabel, blockstyle, space, textstylelabel, textstyle, linebreak,
565 bar, formattext, bold, strong, italic, emphasis, big, small, insertedtext, deletedtext, citation, code, definition, keyboard, monospaced, quotation, sample, variable, bidioverride, strikethrough, subscript, superscript, underline, span,
566 bar, fontstyle, space, fontsize, bar, formatblock, insertparagraphbefore, insertparagraphafter, blockquote, line,
567 bar, left, center, right, justifyfull,
568 bar, orderedlist, unorderedlist, definitionlist, definitionitem, outdent, indent, bar, lefttoright, righttoleft, language, showlanguagemarks,
569 bar, textcolor, bgcolor, textindicator,
570 bar, emoticon, insertcharacter, link, unlink, image, table,' . (($this->thisConfig['hideTableOperationsInToolbar'] && is_array($this->thisConfig['buttons.']) && is_array($this->thisConfig['buttons.']['toggleborders.']) && $this->thisConfig['buttons.']['toggleborders.']['keepInToolbar']) ? ' toggleborders,': '') . ' user, acronym, bar, findreplace, spellcheck,
571 bar, chMode, inserttag, removeformat, bar, copy, cut, paste, pasteastext, bar, undo, redo, bar, showhelp, about, linebreak,
572 ' . ($this->thisConfig['hideTableOperationsInToolbar'] ? '': 'bar, toggleborders,') . ' bar, tableproperties, tablerestyle, bar, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, bar,
573 columnproperties, columninsertbefore, columninsertafter, columndelete, columnsplit, bar,
574 cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge';
575
576 // Additional buttons from registered plugins
577 foreach($this->registeredPlugins as $pluginId => $plugin) {
578 if ($this->isPluginEnabled($pluginId)) {
579 $this->defaultToolbarOrder = $plugin->addButtonsToToolbar();
580 }
581 }
582 $toolbarOrder = $this->thisConfig['toolbarOrder'] ? $this->thisConfig['toolbarOrder'] : $this->defaultToolbarOrder;
583
584 // Getting rid of undefined buttons
585 $this->toolbarOrderArray = array_intersect(t3lib_div::trimExplode(',', $toolbarOrder, 1), t3lib_div::trimExplode(',', $this->defaultToolbarOrder, 1));
586 $toolbarOrder = array_unique(array_values($this->toolbarOrderArray));
587
588 // Fetching specConf for field from backend
589 $pList = is_array($this->specConf['richtext']['parameters']) ? implode(',',$this->specConf['richtext']['parameters']) : '';
590 if ($pList != '*') { // If not all
591 $show = is_array($this->specConf['richtext']['parameters']) ? $this->specConf['richtext']['parameters'] : array();
592 if ($this->thisConfig['showButtons']) {
593 if (!t3lib_div::inList($this->thisConfig['showButtons'],'*')) {
594 $show = array_unique(array_merge($show,t3lib_div::trimExplode(',',$this->thisConfig['showButtons'],1)));
595 } else {
596 $show = array_unique(array_merge($show, $toolbarOrder));
597 }
598 }
599 if (is_array($this->thisConfig['showButtons.'])) {
600 foreach ($this->thisConfig['showButtons.'] as $buttonId => $value) {
601 if ($value) $show[] = $buttonId;
602 }
603 $show = array_unique($show);
604 }
605 } else {
606 $show = $toolbarOrder;
607 }
608
609 // Resticting to RTEkeyList for backend user
610 if(is_object($BE_USER)) {
611 $RTEkeyList = isset($BE_USER->userTS['options.']['RTEkeyList']) ? $BE_USER->userTS['options.']['RTEkeyList'] : '*';
612 if ($RTEkeyList != '*') { // If not all
613 $show = array_intersect($show, t3lib_div::trimExplode(',',$RTEkeyList,1));
614 }
615 }
616
617 // Hiding buttons of disabled plugins
618 $hideButtons = array('space', 'bar', 'linebreak');
619 foreach ($this->pluginButton as $pluginId => $buttonList) {
620 if (!$this->isPluginEnabled($pluginId)) {
621 $buttonArray = t3lib_div::trimExplode(',',$buttonList,1);
622 foreach ($buttonArray as $button) {
623 $hideButtons[] = $button;
624 }
625 }
626 }
627
628 // Hiding labels of disabled plugins
629 foreach ($this->pluginLabel as $pluginId => $label) {
630 if (!$this->isPluginEnabled($pluginId)) {
631 $hideButtons[] = $label;
632 }
633 }
634
635 // Hiding buttons
636 $show = array_diff($show, $this->conf_toolbar_hide, t3lib_div::trimExplode(',',$this->thisConfig['hideButtons'],1));
637
638 // Apply toolbar constraints from registered plugins
639 foreach ($this->registeredPlugins as $pluginId => $plugin) {
640 if ($this->isPluginEnabled($pluginId) && method_exists($plugin, "applyToolbarConstraints")) {
641 $show = $plugin->applyToolbarConstraints($show);
642 }
643 }
644 // Getting rid of the buttons for which we have no position
645 $show = array_intersect($show, $toolbarOrder);
646 $this->toolbar = $show;
647 }
648
649 /**
650 * Disable some plugins
651 *
652 */
653 function setPlugins() {
654
655 // Disabling a plugin that adds buttons if none of its buttons is in the toolbar
656 $hidePlugins = array();
657 foreach ($this->pluginButton as $pluginId => $buttonList) {
658 if ($this->registeredPlugins[$pluginId]->addsButtons()) {
659 $showPlugin = false;
660 $buttonArray = t3lib_div::trimExplode(',', $buttonList, 1);
661 foreach ($buttonArray as $button) {
662 if (in_array($button, $this->toolbar)) {
663 $showPlugin = true;
664 }
665 }
666 if (!$showPlugin) {
667 $hidePlugins[] = $pluginId;
668 }
669 }
670 }
671 $this->pluginEnabledArray = array_diff($this->pluginEnabledArray, $hidePlugins);
672
673 // Hiding labels of disabled plugins
674 $hideLabels = array();
675 foreach ($this->pluginLabel as $pluginId => $label) {
676 if (!$this->isPluginEnabled($pluginId)) {
677 $hideLabels[] = $label;
678 }
679 }
680 $this->toolbar = array_diff($this->toolbar, $hideLabels);
681
682 // Adding plugins declared as prerequisites by enabled plugins
683 $requiredPlugins = array();
684 foreach ($this->registeredPlugins as $pluginId => $plugin) {
685 if ($this->isPluginEnabled($pluginId)) {
686 $requiredPlugins = array_merge($requiredPlugins, t3lib_div::trimExplode(',', $plugin->getRequiredPlugins(), 1));
687 }
688 }
689 $requiredPlugins = array_unique($requiredPlugins);
690 foreach ($requiredPlugins as $pluginId) {
691 if (is_object($this->registeredPlugins[$pluginId]) && !$this->isPluginEnabled($pluginId)) {
692 $this->pluginEnabledArray[] = $pluginId;
693 }
694 }
695 $this->pluginEnabledArray = array_unique($this->pluginEnabledArray);
696
697 // Completing the toolbar conversion array for htmlArea
698 foreach ($this->registeredPlugins as $pluginId => $plugin) {
699 if ($this->isPluginEnabled($pluginId)) {
700 $this->convertToolbarForHtmlAreaArray = array_unique(array_merge($this->convertToolbarForHtmlAreaArray, $plugin->getConvertToolbarForHtmlAreaArray()));
701 }
702 }
703 }
704
705 /**
706 * Convert the TYPO3 names of buttons into the names for htmlArea RTE
707 *
708 * @param string buttonname (typo3-name)
709 * @return string buttonname (htmlarea-name)
710 */
711
712 function convertToolbarForHTMLArea($button) {
713 return $this->convertToolbarForHtmlAreaArray[$button];
714 }
715 /**
716 * Return the HTML code for loading the Javascript files
717 *
718 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
719 *
720 * @return string the html code for loading the Javascript Files
721 */
722 function loadJSfiles($RTEcounter) {
723 // Re-initialize the scripts array so that only the cumulative set of plugins of the last RTE on the page is used
724 $this->cumulativeScripts[$RTEcounter] = array();
725 $this->writeTemporaryFile('EXT:' . $this->ID . '/htmlarea/htmlarea.js', 'htmlarea', 'js', '', TRUE);
726 if ($this->client['browser'] == 'msie') {
727 $this->writeTemporaryFile('EXT:' . $this->ID . '/htmlarea/htmlarea-ie.js', 'htmlarea-ie', 'js', '', TRUE);
728 } else {
729 $this->writeTemporaryFile('EXT:' . $this->ID . '/htmlarea/htmlarea-gecko.js', 'htmlarea-gecko', 'js', '', TRUE);
730 }
731 foreach ($this->pluginEnabledCumulativeArray[$RTEcounter] as $pluginId) {
732 $extensionKey = is_object($this->registeredPlugins[$pluginId]) ? $this->registeredPlugins[$pluginId]->getExtensionKey() : $this->ID;
733 $this->writeTemporaryFile('EXT:' . $extensionKey . '/htmlarea/plugins/' . $pluginId . '/' . strtolower(preg_replace('/([a-z])([A-Z])([a-z])/', "$1".'-'."$2"."$3", $pluginId)) . '.js', $pluginId, 'js', '', TRUE);
734 }
735 $this->buildJSMainLangFile($RTEcounter);
736 // Avoid re-initialization on AJax call when RTEarea object was already initialized
737 $loadJavascriptCode = '
738 <script type="text/javascript" src="' . $this->doConcatenate($RTEcounter) . '"></script>
739 <script type="text/javascript">
740 /*<![CDATA[*/
741 if (typeof(RTEarea) == "undefined") {
742 RTEarea = new Object();
743 RTEarea[0] = new Object();
744 RTEarea[0].version = "' . $GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->ID]['version'] . '";
745 RTEarea[0].editorUrl = "' . $this->extHttpPath . 'htmlarea/";
746 RTEarea[0].editorCSS = "' . t3lib_div::createVersionNumberedFilename($this->editorCSS) . '";
747 RTEarea[0].editorSkin = "' . dirname($this->editorCSS) . '/";
748 RTEarea[0].editedContentCSS = "' . t3lib_div::createVersionNumberedFilename($this->editedContentCSS) . '";
749 RTEarea[0].hostUrl = "' . $this->hostURL . '";
750 RTEarea[0].enableDebugMode = ' . ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->ID]['enableDebugMode'] ? 'true' : 'false') . ';
751 RTEarea.init = function() {
752 if (typeof(HTMLArea) == "undefined" || !Ext.isReady) {
753 window.setTimeout("RTEarea.init();", 40);
754 } else {
755 Ext.QuickTips.init();
756 HTMLArea.init();
757 }
758 };
759 RTEarea.initEditor = function(editorNumber) {
760 if (typeof(HTMLArea) == "undefined") {
761 RTEarea.initEditor.defer(40, null, [editorNumber]);
762 } else {
763 HTMLArea.initEditor(editorNumber);
764 }
765 };
766 }
767 /*]]>*/
768 </script>';
769 return $loadJavascriptCode;
770 }
771
772 /**
773 * Return the Javascript code for initializing the RTE
774 *
775 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
776 *
777 * @return string the Javascript code for initializing the RTE
778 */
779 function loadJScode($RTEcounter) {
780 return (!$this->is_FE() ? '' : '
781 ' . '/*<![CDATA[*/') . '
782 RTEarea.init();' . (!$this->is_FE() ? '' : '
783 /*]]>*/
784 ');
785 }
786
787 /**
788 * Return the Javascript code for configuring the RTE
789 *
790 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
791 * @param string $table: The table that includes this RTE (optional, necessary for IRRE).
792 * @param string $uid: The uid of that table that includes this RTE (optional, necessary for IRRE).
793 * @param string $field: The field of that record that includes this RTE (optional).
794 *
795 * @return string the Javascript code for configuring the RTE
796 */
797 function registerRTEinJS($RTEcounter, $table='', $uid='', $field='', $textAreaId = '') {
798
799 $configureRTEInJavascriptString = (!$this->is_FE() ? '' : '
800 ' . '/*<![CDATA[*/') . '
801 if (typeof(configureEditorInstance) == "undefined") {
802 configureEditorInstance = new Object();
803 }
804 configureEditorInstance["' . $textAreaId . '"] = function() {
805 if (typeof(RTEarea) == "undefined" || typeof(HTMLArea) == "undefined") {
806 window.setTimeout("configureEditorInstance[\'' . $textAreaId . '\']();", 40);
807 } else {
808 editornumber = "' . $textAreaId . '";
809 RTEarea[editornumber] = new Object();
810 RTEarea[editornumber].RTEtsConfigParams = "&RTEtsConfigParams=' . rawurlencode($this->RTEtsConfigParams()) . '";
811 RTEarea[editornumber].number = editornumber;
812 RTEarea[editornumber].deleted = false;
813 RTEarea[editornumber].textAreaId = "' . $textAreaId . '";
814 RTEarea[editornumber].id = "RTEarea" + editornumber;
815 RTEarea[editornumber].RTEWidthOverride = "' . trim($this->thisConfig['RTEWidthOverride']) . '";
816 RTEarea[editornumber].RTEHeightOverride = "' . trim($this->thisConfig['RTEHeightOverride']) . '";
817 RTEarea[editornumber].fullScreen = ' . ($this->fullScreen ? 'true' : 'false') . ';
818 RTEarea[editornumber].showStatusBar = ' . (trim($this->thisConfig['showStatusBar'])?'true':'false') . ';
819 RTEarea[editornumber].enableWordClean = ' . (trim($this->thisConfig['enableWordClean'])?'true':'false') . ';
820 RTEarea[editornumber].htmlRemoveComments = ' . (trim($this->thisConfig['removeComments'])?'true':'false') . ';
821 RTEarea[editornumber].disableEnterParagraphs = ' . (trim($this->thisConfig['disableEnterParagraphs'])?'true':'false') . ';
822 RTEarea[editornumber].disableObjectResizing = ' . (trim($this->thisConfig['disableObjectResizing'])?'true':'false') . ';
823 RTEarea[editornumber].removeTrailingBR = ' . (trim($this->thisConfig['removeTrailingBR'])?'true':'false') . ';
824 RTEarea[editornumber].useCSS = ' . (trim($this->thisConfig['useCSS'])?'true':'false') . ';
825 RTEarea[editornumber].keepButtonGroupTogether = ' . (trim($this->thisConfig['keepButtonGroupTogether'])?'true':'false') . ';
826 RTEarea[editornumber].disablePCexamples = ' . (trim($this->thisConfig['disablePCexamples'])?'true':'false') . ';
827 RTEarea[editornumber].showTagFreeClasses = ' . (trim($this->thisConfig['showTagFreeClasses'])?'true':'false') . ';
828 RTEarea[editornumber].useHTTPS = ' . ((trim(stristr($this->siteURL, 'https')) || $this->thisConfig['forceHTTPS'])?'true':'false') . ';
829 RTEarea[editornumber].tceformsNested = ' . (is_object($this->TCEform) && method_exists($this->TCEform, 'getDynNestedStack') ? $this->TCEform->getDynNestedStack(true) : '[]') . ';
830 RTEarea[editornumber].dialogueWindows = new Object();
831 RTEarea[editornumber].dialogueWindows.defaultPositionFromTop = ' . (isset($this->thisConfig['dialogueWindows.']['defaultPositionFromTop'])? intval($this->thisConfig['dialogueWindows.']['defaultPositionFromTop']) : '100') . ';
832 RTEarea[editornumber].dialogueWindows.defaultPositionFromLeft = ' . (isset($this->thisConfig['dialogueWindows.']['defaultPositionFromLeft'])? intval($this->thisConfig['dialogueWindows.']['defaultPositionFromLeft']) : '100') . ';
833 RTEarea[editornumber].dialogueWindows.doNotResize = ' . (trim($this->thisConfig['dialogueWindows.']['doNotResize'])?'true':'false') . ';
834 RTEarea[editornumber].dialogueWindows.doNotCenter = ' . (trim($this->thisConfig['dialogueWindows.']['doNotCenter'])?'true':'false') . ';';
835
836 // The following properties apply only to the backend
837 if (!$this->is_FE()) {
838 $configureRTEInJavascriptString .= '
839 RTEarea[editornumber].sys_language_content = "' . $this->contentLanguageUid . '";
840 RTEarea[editornumber].typo3ContentLanguage = "' . $this->contentTypo3Language . '";
841 RTEarea[editornumber].typo3ContentCharset = "' . $this->contentCharset . '";
842 RTEarea[editornumber].userUid = "' . $this->userUid . '";';
843 }
844
845 // Setting the plugin flags
846 $configureRTEInJavascriptString .= '
847 RTEarea[editornumber].plugin = new Object();
848 RTEarea[editornumber].pathToPluginDirectory = new Object();';
849 foreach ($this->pluginEnabledArray as $pluginId) {
850 $configureRTEInJavascriptString .= '
851 RTEarea[editornumber].plugin.'.$pluginId.' = true;';
852 if (is_object($this->registeredPlugins[$pluginId])) {
853 $pathToPluginDirectory = $this->registeredPlugins[$pluginId]->getPathToPluginDirectory();
854 if ($pathToPluginDirectory) {
855 $configureRTEInJavascriptString .= '
856 RTEarea[editornumber].pathToPluginDirectory.'.$pluginId.' = "' . $pathToPluginDirectory . '";';
857 }
858 }
859 }
860
861 // Setting the buttons configuration
862 $configureRTEInJavascriptString .= '
863 RTEarea[editornumber].buttons = new Object();';
864 if (is_array($this->thisConfig['buttons.'])) {
865 foreach ($this->thisConfig['buttons.'] as $buttonIndex => $conf) {
866 $button = substr($buttonIndex, 0, -1);
867 if (in_array($button,$this->toolbar)) {
868 $configureRTEInJavascriptString .= '
869 RTEarea[editornumber].buttons.'.$button.' = ' . $this->buildNestedJSArray($conf) . ';';
870 }
871 }
872 }
873
874 // Setting the list of tags to be removed if specified in the RTE config
875 if (trim($this->thisConfig['removeTags'])) {
876 $configureRTEInJavascriptString .= '
877 RTEarea[editornumber].htmlRemoveTags = /^(' . implode('|', t3lib_div::trimExplode(',', $this->thisConfig['removeTags'], 1)) . ')$/i;';
878 }
879
880 // Setting the list of tags to be removed with their contents if specified in the RTE config
881 if (trim($this->thisConfig['removeTagsAndContents'])) {
882 $configureRTEInJavascriptString .= '
883 RTEarea[editornumber].htmlRemoveTagsAndContents = /^(' . implode('|', t3lib_div::trimExplode(',', $this->thisConfig['removeTagsAndContents'], 1)) . ')$/i;';
884 }
885 // Process default style configuration
886 $configureRTEInJavascriptString .= '
887 RTEarea[editornumber].defaultPageStyle = "' . $this->writeTemporaryFile('', 'defaultPageStyle', 'css', $this->buildStyleSheet()) . '";';
888 // Setting the pageStyle
889 $filename = trim($this->thisConfig['contentCSS']) ? trim($this->thisConfig['contentCSS']) : 'EXT:' . $this->ID . '/res/contentcss/default.css';
890 $configureRTEInJavascriptString .= '
891 RTEarea[editornumber].pageStyle = "' . t3lib_div::createVersionNumberedFilename($this->getFullFileName($filename)) .'";';
892 // Process classes configuration
893 $classesConfigurationRequired = false;
894 foreach ($this->registeredPlugins as $pluginId => $plugin) {
895 if ($this->isPluginEnabled($pluginId)) {
896 $classesConfigurationRequired = $classesConfigurationRequired || $plugin->requiresClassesConfiguration();
897 }
898 }
899 if ($classesConfigurationRequired) {
900 $configureRTEInJavascriptString .= $this->buildJSClassesConfig($RTEcounter);
901 }
902 // Add Javascript configuration for registered plugins
903 foreach ($this->registeredPlugins as $pluginId => $plugin) {
904 if ($this->isPluginEnabled($pluginId)) {
905 $configureRTEInJavascriptString .= $plugin->buildJavascriptConfiguration('editornumber');
906 }
907 }
908 // Avoid premature reference to HTMLArea when being initially loaded by IRRE Ajax call
909 $configureRTEInJavascriptString .= '
910 RTEarea[editornumber].toolbar = ' . $this->getJSToolbarArray() . ';
911 RTEarea[editornumber].convertButtonId = ' . json_encode(array_flip($this->convertToolbarForHtmlAreaArray)) . ';
912 RTEarea.initEditor(editornumber);
913 }
914 };
915 configureEditorInstance["' . $textAreaId . '"]();'. (!$this->is_FE() ? '' : '
916 /*]]>*/');
917 return $configureRTEInJavascriptString;
918 }
919
920 /**
921 * Return true, if the plugin can be loaded
922 *
923 * @param string $pluginId: The identification string of the plugin
924 *
925 * @return boolean true if the plugin can be loaded
926 */
927
928 function isPluginEnabled($pluginId) {
929 return in_array($pluginId, $this->pluginEnabledArray);
930 }
931
932 /**
933 * Build the default content style sheet
934 *
935 * @return string Style sheet
936 */
937 function buildStyleSheet() {
938
939 if (!trim($this->thisConfig['ignoreMainStyleOverride'])) {
940 $mainStyle_font = $this->thisConfig['mainStyle_font'] ? $this->thisConfig['mainStyle_font']: 'Verdana,sans-serif';
941
942 $mainElements = array();
943 $mainElements['P'] = $this->thisConfig['mainStyleOverride_add.']['P'];
944 $elList = explode(',','H1,H2,H3,H4,H5,H6,PRE');
945 foreach ($elList as $elListName) {
946 if ($this->thisConfig['mainStyleOverride_add.'][$elListName]) {
947 $mainElements[$elListName] = $this->thisConfig['mainStyleOverride_add.'][$elListName];
948 }
949 }
950
951 $addElementCode = '';
952 foreach ($mainElements as $elListName => $elValue) {
953 $addElementCode .= strToLower($elListName) . ' {' . $elValue . '}' . LF;
954 }
955
956 $stylesheet = $this->thisConfig['mainStyleOverride'] ? $this->thisConfig['mainStyleOverride'] : LF .
957 'body.htmlarea-content-body { font-family: ' . $mainStyle_font .
958 '; font-size: '.($this->thisConfig['mainStyle_size'] ? $this->thisConfig['mainStyle_size'] : '12px') .
959 '; color: '.($this->thisConfig['mainStyle_color']?$this->thisConfig['mainStyle_color'] : 'black') .
960 '; background-color: '.($this->thisConfig['mainStyle_bgcolor'] ? $this->thisConfig['mainStyle_bgcolor'] : 'white') .
961 ';'.$this->thisConfig['mainStyleOverride_add.']['BODY'].'}' . LF .
962 'td { ' . $this->thisConfig['mainStyleOverride_add.']['TD'].'}' . LF .
963 'div { ' . $this->thisConfig['mainStyleOverride_add.']['DIV'].'}' . LF .
964 'pre { ' . $this->thisConfig['mainStyleOverride_add.']['PRE'].'}' . LF .
965 'ol { ' . $this->thisConfig['mainStyleOverride_add.']['OL'].'}' . LF .
966 'ul { ' . $this->thisConfig['mainStyleOverride_add.']['UL'].'}' . LF .
967 'blockquote { ' . $this->thisConfig['mainStyleOverride_add.']['BLOCKQUOTE'].'}' . LF .
968 $addElementCode;
969
970 if (is_array($this->thisConfig['inlineStyle.'])) {
971 $stylesheet .= LF . implode(LF, $this->thisConfig['inlineStyle.']) . LF;
972 }
973 } else {
974 $stylesheet = '/* mainStyleOverride and inlineStyle properties ignored. */';
975 }
976 return $stylesheet;
977 }
978
979 /**
980 * Return Javascript configuration of classes
981 *
982 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
983 *
984 * @return string Javascript configuration of classes
985 */
986 function buildJSClassesConfig($RTEcounter) {
987 // Build JS array of lists of classes
988 $classesTagList = 'classesCharacter, classesParagraph, classesImage, classesTable, classesLinks, classesTD';
989 $classesTagConvert = array( 'classesCharacter' => 'span', 'classesParagraph' => 'div', 'classesImage' => 'img', 'classesTable' => 'table', 'classesLinks' => 'a', 'classesTD' => 'td');
990 $classesTagArray = t3lib_div::trimExplode(',' , $classesTagList);
991 $configureRTEInJavascriptString = '
992 RTEarea[editornumber].classesTag = new Object();';
993 foreach ($classesTagArray as $classesTagName) {
994 $HTMLAreaJSClasses = ($this->thisConfig[$classesTagName])?('"' . $this->cleanList($this->thisConfig[$classesTagName]) . '";'):'null;';
995 $configureRTEInJavascriptString .= '
996 RTEarea[editornumber].classesTag.'. $classesTagConvert[$classesTagName] .' = '. $HTMLAreaJSClasses;
997 }
998 // Include JS arrays of configured classes
999 $configureRTEInJavascriptString .= '
1000 RTEarea[editornumber].classesUrl = "' . $this->writeTemporaryFile('', 'classes_'.$LANG->lang, 'js', $this->buildJSClassesArray()) . '";';
1001 return $configureRTEInJavascriptString;
1002 }
1003
1004 /**
1005 * Return JS arrays of classes configuration
1006 *
1007 * @return string JS classes arrays
1008 */
1009 function buildJSClassesArray() {
1010 if ($this->is_FE()) {
1011 $RTEProperties = $this->RTEsetup;
1012 } else {
1013 $RTEProperties = $this->RTEsetup['properties'];
1014 }
1015 $classesArray = array('labels' => array(), 'values' => array(), 'noShow' => array(), 'alternating' => array(), 'counting' => array(), 'XOR' => array());
1016 $JSClassesArray = '';
1017 // Scanning the list of classes if specified in the RTE config
1018 if (is_array($RTEProperties['classes.'])) {
1019 foreach ($RTEProperties['classes.'] as $className => $conf) {
1020 $className = rtrim($className, '.');
1021 $classesArray['labels'][$className] = $this->getPageConfigLabel($conf['name'], FALSE);
1022 $classesArray['values'][$className] = str_replace('\\\'', '\'', $conf['value']);
1023 if (isset($conf['noShow'])) {
1024 $classesArray['noShow'][$className] = $conf['noShow'];
1025 }
1026 if (is_array($conf['alternating.'])) {
1027 $classesArray['alternating'][$className] = $conf['alternating.'];
1028 }
1029 if (is_array($conf['counting.'])) {
1030 $classesArray['counting'][$className] = $conf['counting.'];
1031 }
1032 }
1033 }
1034 // Scanning the list of sets of mutually exclusives classes if specified in the RTE config
1035 if (is_array($RTEProperties['mutuallyExclusiveClasses.'])) {
1036 foreach ($RTEProperties['mutuallyExclusiveClasses.'] as $listName => $conf) {
1037 $classSet = t3lib_div::trimExplode(',', $conf, 1);
1038 $classList = implode(',', $classSet);
1039 foreach ($classSet as $className) {
1040 $classesArray['XOR'][$className] = '/^(' . implode('|', t3lib_div::trimExplode(',', t3lib_div::rmFromList($className, $classList), 1)) . ')$/';
1041 }
1042 }
1043 }
1044 foreach ($classesArray as $key => $subArray) {
1045 $JSClassesArray .= 'HTMLArea.classes' . ucfirst($key) . ' = ' . $this->buildNestedJSArray($subArray) . ';' . LF;
1046 }
1047 return $JSClassesArray;
1048 }
1049
1050 /**
1051 * Translate Page TS Config array in JS nested array definition
1052 * Replace 0 values with false
1053 * Unquote regular expression values
1054 * Replace empty arrays with empty objects
1055 *
1056 * @param array $conf: Page TSConfig configuration array
1057 *
1058 * @return string nested JS array definition
1059 */
1060 function buildNestedJSArray($conf) {
1061 $convertedConf = t3lib_div::removeDotsFromTS($conf);
1062 if ($this->is_FE()) {
1063 $GLOBALS['TSFE']->csConvObj->convArray($convertedConf, ($GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'] ? $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'] : 'iso-8859-1'), 'utf-8');
1064 } else {
1065 $GLOBALS['LANG']->csConvObj->convArray($convertedConf, $GLOBALS['LANG']->charSet, 'utf-8');
1066 }
1067 return str_replace(array(':"0"', ':"\/^(', ')$\/i"', ':"\/^(', ')$\/"', '[]'), array(':false', ':/^(', ')$/i', ':/^(', ')$/', '{}'), json_encode($convertedConf));
1068 }
1069
1070 /**
1071 * Return a Javascript localization array for htmlArea RTE
1072 *
1073 * @return string Javascript localization array
1074 */
1075 function buildJSMainLangArray() {
1076 $JSLanguageArray = 'HTMLArea.I18N = new Object();' . LF;
1077 $labelsArray = array('tooltips' => array(), 'msg' => array(), 'dialogs' => array());
1078 foreach ($labelsArray as $labels => $subArray) {
1079 $LOCAL_LANG = t3lib_div::readLLfile('EXT:' . $this->ID . '/htmlarea/locallang_' . $labels . '.xml', $this->language, 'utf-8');
1080 if (!empty($LOCAL_LANG[$this->language])) {
1081 $LOCAL_LANG[$this->language] = t3lib_div::array_merge_recursive_overrule($LOCAL_LANG['default'], $LOCAL_LANG[$this->language]);
1082 } else {
1083 $LOCAL_LANG[$this->language] = $LOCAL_LANG['default'];
1084 }
1085 $labelsArray[$labels] = $LOCAL_LANG[$this->language];
1086 }
1087 $JSLanguageArray .= 'HTMLArea.I18N = ' . json_encode($labelsArray) . ';' . LF;
1088 return $JSLanguageArray;
1089 }
1090
1091 /**
1092 * Writes contents in a file in typo3temp/rtehtmlarea directory and returns the file name
1093 *
1094 * @param string $sourceFileName: The name of the file from which the contents should be extracted
1095 * @param string $label: A label to insert at the beginning of the name of the file
1096 * @param string $fileExtension: The file extension of the file, defaulting to 'js'
1097 * @param string $contents: The contents to write into the file if no $sourceFileName is provided
1098 *
1099 * @return string The name of the file writtten to typo3temp/rtehtmlarea
1100 */
1101 public function writeTemporaryFile($sourceFileName='', $label, $fileExtension='js', $contents='', $concatenate = FALSE) {
1102 global $TYPO3_CONF_VARS;
1103
1104 if ($sourceFileName) {
1105 $output = '';
1106 $source = t3lib_div::getFileAbsFileName($sourceFileName);
1107 $output = file_get_contents($source);
1108 } else {
1109 $output = $contents;
1110 }
1111 $compress = $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts'] && ($fileExtension == 'js') && ($output != '');
1112 $relativeFilename = 'typo3temp/' . $this->ID . '/' . str_replace('-','_',$label) . '_' . t3lib_div::shortMD5(($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['version'] . ($sourceFileName ? $sourceFileName : $output)), 20) . ($compress ? '_compressed' : '') . '.' . $fileExtension;
1113 $destination = PATH_site . $relativeFilename;
1114 if(!file_exists($destination)) {
1115 $compressedJavaScript = '';
1116 if ($compress && $fileExtension == 'js') {
1117 $compressedJavaScript = t3lib_div::minifyJavaScript($output);
1118 }
1119 $failure = t3lib_div::writeFileToTypo3tempDir($destination, $compressedJavaScript ? $compressedJavaScript : $output);
1120 if ($failure) {
1121 die($failure);
1122 }
1123 }
1124 if ($concatenate && $fileExtension == 'js') {
1125 $this->cumulativeScripts[$this->TCEform->RTEcounter][] = $destination;
1126 }
1127 if ($this->is_FE()) {
1128 $filename = ($GLOBALS['TSFE']->absRefPrefix ? $GLOBALS['TSFE']->absRefPrefix : '') . t3lib_div::createVersionNumberedFilename($relativeFilename);
1129 } else {
1130 $filename = t3lib_div::createVersionNumberedFilename(($this->isFrontendEditActive() ? '' : ($this->backPath . '../')) . $relativeFilename);
1131 }
1132 return t3lib_div::resolveBackPath($filename);
1133 }
1134 /**
1135 * Concatenates all accumulated scripts in a file in typo3temp/rtehtmlarea directory and returns the file name
1136 *
1137 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
1138 *
1139 * @return string The name of the file writtten to typo3temp/rtehtmlarea
1140 */
1141 protected function doConcatenate($RTEcounter) {
1142 $fileExtension = 'js';
1143 $compress = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->ID]['enableCompressedScripts'];
1144 $token = implode('|', $this->cumulativeScripts[$RTEcounter]);
1145 $relativeFilename = 'typo3temp/' . $this->ID . '/' . 'htmlarea_cumulative' . '_' . t3lib_div::shortMD5(($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['version'] . $token ), 20) . ($compress ? '_compressed' : '') . '.' . $fileExtension;
1146 $destination = PATH_site . $relativeFilename;
1147 if (!file_exists($destination)) {
1148 foreach ($this->cumulativeScripts[$RTEcounter] as $fileName) {
1149 $contents = file_get_contents($fileName);
1150 if (!file_exists($destination)) {
1151 $failure = t3lib_div::writeFileToTypo3tempDir($destination, $contents);
1152 if ($failure) {
1153 die($failure);
1154 }
1155 } else {
1156 $success = file_put_contents($destination, $contents, FILE_APPEND);
1157 if (!$success) {
1158 die('Could not append script' + $fileName);
1159 }
1160 }
1161 }
1162 }
1163 if ($this->is_FE()) {
1164 $filename = ($GLOBALS['TSFE']->absRefPrefix ? $GLOBALS['TSFE']->absRefPrefix : '') . t3lib_div::createVersionNumberedFilename($relativeFilename);
1165 } else {
1166 if ($compress) {
1167 $compressor = t3lib_div::makeInstance('t3lib_Compressor');
1168 $filename = $compressor->compressJsFile(($this->isFrontendEditActive() ? '' : $this->backPath) . '../' . $relativeFilename);
1169 if ($this->isFrontendEditActive()) {
1170 $filename = preg_replace('/^..\//', '', $filename);
1171 }
1172 } else {
1173 $filename = t3lib_div::createVersionNumberedFilename(($this->isFrontendEditActive() ? '' : ($this->backPath . '../')) . $relativeFilename);
1174 }
1175 }
1176 return t3lib_div::resolveBackPath($filename);
1177 }
1178
1179 /**
1180 * Return a file name containing the main JS language array for HTMLArea
1181 *
1182 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
1183 *
1184 * @return string filename
1185 */
1186 function buildJSMainLangFile($RTEcounter) {
1187 $contents = $this->buildJSMainLangArray() . LF;
1188 foreach ($this->pluginEnabledCumulativeArray[$RTEcounter] as $pluginId) {
1189 $contents .= $this->buildJSLangArray($pluginId) . LF;
1190 }
1191 return $this->writeTemporaryFile('', $this->language.'_'.$this->OutputCharset, 'js', $contents, TRUE);
1192 }
1193
1194 /**
1195 * Return a Javascript localization array for the plugin
1196 *
1197 * @param string $plugin: identification string of the plugin
1198 *
1199 * @return string Javascript localization array
1200 */
1201
1202 function buildJSLangArray($plugin) {
1203 $LOCAL_LANG = FALSE;
1204 $extensionKey = is_object($this->registeredPlugins[$plugin]) ? $this->registeredPlugins[$plugin]->getExtensionKey() : $this->ID;
1205 $LOCAL_LANG = t3lib_div::readLLfile('EXT:' . $extensionKey . '/htmlarea/plugins/' . $plugin . '/locallang.xml', $this->language, 'utf-8', 1);
1206 $linebreak = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->ID]['enableCompressedScripts'] ? '' : LF;
1207 $JSLanguageArray = 'HTMLArea.I18N["' . $plugin . '"] = new Object();' . $linebreak;
1208 if (is_array($LOCAL_LANG)) {
1209 if (!empty($LOCAL_LANG[$this->language])) {
1210 $LOCAL_LANG[$this->language] = t3lib_div::array_merge_recursive_overrule($LOCAL_LANG['default'],$LOCAL_LANG[$this->language]);
1211 } else {
1212 $LOCAL_LANG[$this->language] = $LOCAL_LANG['default'];
1213 }
1214 $JSLanguageArray .= 'HTMLArea.I18N["' . $plugin . '"] = ' . json_encode($LOCAL_LANG[$this->language]) . ';'. LF;
1215 }
1216 return $JSLanguageArray;
1217 }
1218
1219 /**
1220 * Return the JS code of the toolbar configuration for the HTMLArea editor
1221 *
1222 * @return string the JS code as nested JS arrays
1223 */
1224 protected function getJSToolbarArray() {
1225 // The toolbar array
1226 $toolbar = array();
1227 // The current row; a "linebreak" ends the current row
1228 $row = array();
1229 // The current group; each group is between "bar"s; a "linebreak" ends the current group
1230 $group = array();
1231 // Process each toolbar item in the toolbar order list
1232 foreach ($this->toolbarOrderArray as $item) {
1233 switch ($item) {
1234 case 'linebreak':
1235 // Add row to toolbar if not empty
1236 if (!empty($group)) {
1237 $row[] = $group;
1238 $group = array();
1239 }
1240 if (!empty($row)) {
1241 $toolbar[] = $row;
1242 $row = array();
1243 }
1244 break;
1245 case 'bar':
1246 // Add group to row if not empty
1247 if (!empty($group)) {
1248 $row[] = $group;
1249 $group = array();
1250 }
1251 break;
1252 case 'space':
1253 if (end($group) != $this->convertToolbarForHTMLArea($item)) {
1254 $group[] = $this->convertToolbarForHTMLArea($item);
1255 }
1256 break;
1257 default:
1258 if (in_array($item, $this->toolbar)) {
1259 // Add the item to the group
1260 $convertedItem = $this->convertToolbarForHTMLArea($item);
1261 if ($convertedItem) {
1262 $group[] = $convertedItem;
1263 }
1264 }
1265 break;
1266 }
1267 }
1268 // Add the last group and last line, if not empty
1269 if (!empty($group)) {
1270 $row[] = $group;
1271 }
1272 if (!empty($row)) {
1273 $toolbar[] = $row;
1274 }
1275 return json_encode($toolbar);
1276 }
1277
1278 public function getLLContent($string) {
1279 global $LANG;
1280
1281 $BE_lang = $LANG->lang;
1282 $BE_charSet = $LANG->charSet;
1283 $LANG->lang = $this->contentTypo3Language;
1284 $LANG->charSet = $this->contentCharset;
1285 $LLString = $LANG->JScharCode($LANG->sL($string));
1286 $LANG->lang = $BE_lang;
1287 $LANG->charSet = $BE_charSet;
1288 return $LLString;
1289 }
1290
1291 public function getPageConfigLabel($string,$JScharCode=1) {
1292 global $LANG, $TSFE, $TYPO3_CONF_VARS;
1293
1294 if ($this->is_FE()) {
1295 if (strcmp(substr($string,0,4),'LLL:') && $TYPO3_CONF_VARS['BE']['forceCharset']) {
1296 // A pure string coming from Page TSConfig must be in forceCharset, otherwise we just don't know..
1297 $label = $TSFE->csConvObj->conv($TSFE->sL(trim($string)), $TYPO3_CONF_VARS['BE']['forceCharset'], $this->OutputCharset);
1298 } else {
1299 $label = $TSFE->csConvObj->conv($TSFE->sL(trim($string)), $this->charset, $this->OutputCharset);
1300 }
1301 $label = str_replace('"', '\"', str_replace('\\\'', '\'', $label));
1302 $label = $JScharCode ? $this->feJScharCode($label) : $label;
1303 } else {
1304 if (strcmp(substr($string,0,4),'LLL:')) {
1305 $label = $string;
1306 } else {
1307 $label = $LANG->sL(trim($string));
1308 }
1309 $label = str_replace('"', '\"', str_replace('\\\'', '\'', $label));
1310 $label = $JScharCode ? $LANG->JScharCode($label): $label;
1311 }
1312 return $label;
1313 }
1314
1315 function feJScharCode($str) {
1316 global $TSFE;
1317 // Convert string to UTF-8:
1318 if ($this->OutputCharset != 'utf-8') $str = $TSFE->csConvObj->utf8_encode($str,$this->OutputCharset);
1319 // Convert the UTF-8 string into a array of char numbers:
1320 $nArr = $TSFE->csConvObj->utf8_to_numberarray($str);
1321 return 'String.fromCharCode('.implode(',',$nArr).')';
1322 }
1323
1324 public function getFullFileName($filename) {
1325 if (substr($filename,0,4)=='EXT:') { // extension
1326 list($extKey,$local) = explode('/',substr($filename,4),2);
1327 $newFilename = '';
1328 if (strcmp($extKey,'') && t3lib_extMgm::isLoaded($extKey) && strcmp($local,'')) {
1329 $newFilename = (($this->is_FE() || $this->isFrontendEditActive()) ? t3lib_extMgm::siteRelPath($extKey) : $this->backPath . t3lib_extMgm::extRelPath($extKey)) . $local;
1330 }
1331 } elseif (substr($filename,0,1) != '/') {
1332 $newFilename = (($this->is_FE() || $this->isFrontendEditActive()) ? '' : ($this->backPath . '../')) . $filename;
1333 } else {
1334 $newFilename = (($this->is_FE() || $this->isFrontendEditActive()) ? '' : ($this->backPath . '../')) . substr($filename, 1);
1335 }
1336 return t3lib_div::resolveBackPath($newFilename);
1337 }
1338
1339 /**
1340 * Return the Javascript code for copying the HTML code from the editor into the hidden input field.
1341 * This is for submit function of the form.
1342 *
1343 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
1344 * @param string $formName: the name of the form
1345 * @param string $textareaId: the id of the textarea
1346 * @param string $textareaName: the name of the textarea
1347 *
1348 * @return string Javascript code
1349 */
1350 function setSaveRTE($RTEcounter, $formName, $textareaId, $textareaName) {
1351 return 'if (RTEarea["' . $textareaId . '"]) { document.' . $formName . '["' . $textareaName . '"].value = RTEarea["' . $textareaId . '"].editor.getHTML(); } else { OK = 0; };';
1352 }
1353
1354 /**
1355 * Return the Javascript code for copying the HTML code from the editor into the hidden input field.
1356 * This is for submit function of the form.
1357 *
1358 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
1359 * @param string $formName: the name of the form
1360 * @param string $textareaId: the id of the textarea
1361 *
1362 * @return string Javascript code
1363 */
1364 function setDeleteRTE($RTEcounter, $formName, $textareaId) {
1365 return 'if (RTEarea["' . $textareaId . '"]) { RTEarea["' . $textareaId . '"].deleted = true;}';
1366 }
1367
1368 /**
1369 * Return true if we are in the FE, but not in the FE editing feature of BE.
1370 *
1371 * @return boolean
1372 */
1373
1374 function is_FE() {
1375 return is_object($GLOBALS['TSFE']) && !$this->isFrontendEditActive() && TYPO3_MODE=='FE';
1376 }
1377
1378 /**
1379 * Checks whether frontend editing is active.
1380 *
1381 * @return boolean
1382 */
1383 public function isFrontendEditActive() {
1384 return is_object($GLOBALS['TSFE']) && $GLOBALS['TSFE']->beUserLogin && ($GLOBALS['BE_USER']->frontendEdit instanceof t3lib_frontendedit);
1385 }
1386 /**
1387 * Client Browser Information
1388 *
1389 * @param string $userAgent: The useragent string, t3lib_div::getIndpEnv('HTTP_USER_AGENT')
1390 * @return array Contains keys "useragent", "browser", "version", "system"
1391 * where "browser" is limited to the engines
1392 * and where "version" is a floating number
1393 */
1394 function clientInfo ($userAgent='') {
1395 if (!$userAgent) {
1396 $userAgent = t3lib_div::getIndpEnv('HTTP_USER_AGENT');
1397 }
1398 $browserInfo = t3lib_utility_Client::getBrowserInfo($userAgent);
1399 // Known engines: order is not irrelevant!
1400 $knownEngines = array('opera', 'msie', 'gecko', 'webkit');
1401 if (is_array($browserInfo['all'])) {
1402 foreach ($knownEngines as $engine) {
1403 if ($browserInfo['all'][$engine]) {
1404 $browserInfo['browser'] = $engine;
1405 $browserInfo['version'] = t3lib_utility_Client::getVersion($browserInfo['all'][$engine]);
1406 break;
1407 }
1408 }
1409 }
1410 if ($browserInfo['system'] == 'mac') {
1411 if (strstr($userAgent,'iPad')) {
1412 $browserInfo['system'] = 'iPad';
1413 } elseif (strstr($userAgent,'iPhone')) {
1414 $browserInfo['system'] = 'iPhone';
1415 } elseif (strstr($userAgent,'iPod')) {
1416 $browserInfo['system'] = 'iPod';
1417 }
1418 }
1419 return $browserInfo;
1420 }
1421 /***************************
1422 *
1423 * OTHER FUNCTIONS: (from Classic RTE)
1424 *
1425 ***************************/
1426 /**
1427 * @return [type] ...
1428 * @desc
1429 */
1430
1431 function RTEtsConfigParams() {
1432 if($this->is_FE()) {
1433 return '';
1434 } else {
1435 $p = t3lib_BEfunc::getSpecConfParametersFromArray($this->specConf['rte_transform']['parameters']);
1436 return $this->elementParts[0].':'.$this->elementParts[1].':'.$this->elementParts[2].':'.$this->thePid.':'.$this->typeVal.':'.$this->tscPID.':'.$p['imgpath'];
1437 }
1438 }
1439
1440 public function cleanList($str) {
1441 if (strstr($str,'*')) {
1442 $str = '*';
1443 } else {
1444 $str = implode(',',array_unique(t3lib_div::trimExplode(',',$str,1)));
1445 }
1446 return $str;
1447 }
1448
1449 function filterStyleEl($elValue,$matchList) {
1450 $matchParts = t3lib_div::trimExplode(',',$matchList,1);
1451 $styleParts = explode(';',$elValue);
1452 $nStyle=array();
1453 foreach ($styleParts as $k => $p) {
1454 $pp = t3lib_div::trimExplode(':',$p);
1455 if ($pp[0]&&$pp[1]) {
1456 foreach ($matchParts as $el) {
1457 $star=substr($el,-1)=='*';
1458 if (!strcmp($pp[0],$el) || ($star && t3lib_div::isFirstPartOfStr($pp[0],substr($el,0,-1)) )) {
1459 $nStyle[]=$pp[0].':'.$pp[1];
1460 } else unset($styleParts[$k]);
1461 }
1462 } else {
1463 unset($styleParts[$k]);
1464 }
1465 }
1466 return implode('; ',$nStyle);
1467 }
1468
1469 // Hook on lorem_ipsum extension to insert text into the RTE in wysiwyg mode
1470 function loremIpsumInsert($params) {
1471 return "
1472 if (typeof(lorem_ipsum) == 'function' && " . $params['element'] . ".tagName.toLowerCase() == 'textarea' ) lorem_ipsum(" . $params['element'] . ", lipsum_temp_strings[lipsum_temp_pointer]);
1473 ";
1474 }
1475 }
1476 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/rtehtmlarea/class.tx_rtehtmlarea_base.php']) {
1477 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/rtehtmlarea/class.tx_rtehtmlarea_base.php']);
1478 }
1479 ?>