Fixed issue #15601: Change all core PHP files to UTF8 encoding
[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 /* =======================================
368 * DRAW THE EDITOR
369 * =======================================
370 */
371
372 // Transform value:
373 $value = $this->transformContent('rte',$PA['itemFormElValue'],$table,$field,$row,$specConf,$thisConfig,$RTErelPath,$thePidValue);
374
375 // Further content transformation by registered plugins
376 foreach ($this->registeredPlugins as $pluginId => $plugin) {
377 if ($this->isPluginEnabled($pluginId) && method_exists($plugin, "transformContent")) {
378 $value = $plugin->transformContent($value);
379 }
380 }
381 // Register RTE windows
382 $this->TCEform->RTEwindows[] = $PA['itemFormElName'];
383 $textAreaId = htmlspecialchars($PA['itemFormElName']);
384
385 // Check if wizard_rte called this for fullscreen edtition; if so, change the size of the RTE to fullscreen using JS
386 if (basename(PATH_thisScript) == 'wizard_rte.php') {
387 $this->fullScreen = true;
388 $editorWrapWidth = '100%';
389 $editorWrapHeight = '100%';
390 $this->RTEdivStyle = 'position:relative; left:0px; top:0px; height:100%; width:100%; border: 1px solid black; padding: 2px 0px 2px 2px;';
391 }
392
393 // Register RTE in JS:
394 $this->TCEform->additionalJS_post[] = $this->registerRTEinJS($this->TCEform->RTEcounter, $table, $row['uid'], $field, $textAreaId);
395
396 // Set the save option for the RTE:
397 $this->TCEform->additionalJS_submit[] = $this->setSaveRTE($this->TCEform->RTEcounter, $this->TCEform->formName, $textAreaId);
398 $this->TCEform->additionalJS_delete[] = $this->setDeleteRTE($this->TCEform->RTEcounter, $this->TCEform->formName, $textAreaId);
399
400 // Draw the textarea
401 $visibility = 'hidden';
402 $item = $this->triggerField($PA['itemFormElName']).'
403 <div id="pleasewait' . $textAreaId . '" class="pleasewait" style="display: block;" >' . $LANG->getLL('Please wait') . '</div>
404 <div id="editorWrap' . $textAreaId . '" class="editorWrap" style="visibility: hidden; width:' . $editorWrapWidth . '; height:' . $editorWrapHeight . ';">
405 <textarea id="RTEarea' . $textAreaId . '" name="'.htmlspecialchars($PA['itemFormElName']).'" style="'.t3lib_div::deHSCentities(htmlspecialchars($this->RTEdivStyle)).'">'.t3lib_div::formatForTextarea($value).'</textarea>
406 </div>' . ($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableDebugMode'] ? '<div id="HTMLAreaLog"></div>' : '') . '
407 ';
408 }
409
410 // Return form item:
411 return $item;
412 }
413
414 /**
415 * Add link to content style sheet to document header
416 *
417 * @return void
418 */
419 protected function addPageStyle() {
420 // Get stylesheet file name from Page TSConfig if any
421 $filename = trim($this->thisConfig['contentCSS']) ? trim($this->thisConfig['contentCSS']) : 'EXT:' . $this->ID . '/res/contentcss/default.css';
422 $this->addStyleSheet(
423 'rtehtmlarea-page-style',
424 $this->getFullFileName($filename),
425 'htmlArea RTE Content CSS',
426 'alternate stylesheet'
427 );
428 }
429
430 /**
431 * Add links to skin style sheet(s) to document header
432 *
433 * @return void
434 */
435 protected function addSkin() {
436 // Get skin file name from Page TSConfig if any
437 $skinFilename = trim($this->thisConfig['skin']) ? trim($this->thisConfig['skin']) : 'EXT:' . $this->ID . '/htmlarea/skins/default/htmlarea.css';
438 $this->editorCSS = $this->getFullFileName($skinFilename);
439 $skinDir = dirname($this->editorCSS);
440 // Editing area style sheet
441 $this->editedContentCSS = $skinDir . '/htmlarea-edited-content.css';
442 $this->addStyleSheet(
443 'rtehtmlarea-editing-area-skin',
444 $this->editedContentCSS
445 );
446 // Main skin
447 $this->addStyleSheet(
448 'rtehtmlarea-skin',
449 $this->editorCSS
450 );
451 // Additional icons from registered plugins
452 foreach ($this->pluginEnabledCumulativeArray[$this->TCEform->RTEcounter] as $pluginId) {
453 if (is_object($this->registeredPlugins[$pluginId])) {
454 $pathToSkin = $this->registeredPlugins[$pluginId]->getPathToSkin();
455 if ($pathToSkin) {
456 $key = $this->registeredPlugins[$pluginId]->getExtensionKey();
457 $this->addStyleSheet(
458 'rtehtmlarea-plugin-' . $pluginId . '-skin',
459 ($this->is_FE() ? t3lib_extMgm::siteRelPath($key) : $this->backPath . t3lib_extMgm::extRelPath($key)) . $pathToSkin
460 );
461 }
462 }
463 }
464 }
465
466 /**
467 * Add style sheet file to document header
468 *
469 * @param string $key: some key identifying the style sheet
470 * @param string $href: uri to the style sheet file
471 * @param string $title: value for the title attribute of the link element
472 * @return string $relation: value for the rel attribute of the link element
473 * @return void
474 */
475 protected function addStyleSheet($key, $href, $title='', $relation='stylesheet') {
476 // 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
477 if (is_object($this->TCEform->inline) && $this->TCEform->inline->isAjaxCall) {
478 $this->TCEform->additionalCode_pre[$key] = '<link rel="' . $relation . '" type="text/css" href="' . $href . '" title="' . $title. '" />';
479 } else {
480 $pageRenderer = $GLOBALS['SOBE']->doc->getPageRenderer();
481 $pageRenderer->addCssFile($href, $relation, 'screen', $title);
482 }
483 }
484
485 /**
486 * Initialize toolbar configuration and enable registered plugins
487 *
488 * @return void
489 */
490 protected function initializeToolbarConfiguration() {
491
492 // Enable registred plugins
493 $this->enableRegisteredPlugins();
494
495 // Configure toolbar
496 $this->setToolbar();
497
498 // Check if some plugins need to be disabled
499 $this->setPlugins();
500
501 // Merge the list of enabled plugins with the lists from the previous RTE editing areas on the same form
502 $this->pluginEnabledCumulativeArray[$this->TCEform->RTEcounter] = $this->pluginEnabledArray;
503 if ($this->TCEform->RTEcounter > 1 && isset($this->pluginEnabledCumulativeArray[$this->TCEform->RTEcounter-1]) && is_array($this->pluginEnabledCumulativeArray[$this->TCEform->RTEcounter-1])) {
504 $this->pluginEnabledCumulativeArray[$this->TCEform->RTEcounter] = array_unique(array_values(array_merge($this->pluginEnabledArray,$this->pluginEnabledCumulativeArray[$this->TCEform->RTEcounter-1])));
505 }
506 }
507
508 /**
509 * Add registered plugins to the array of enabled plugins
510 *
511 */
512 function enableRegisteredPlugins() {
513 global $TYPO3_CONF_VARS;
514 // Traverse registered plugins
515 if (is_array($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['plugins'])) {
516 foreach($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['plugins'] as $pluginId => $pluginObjectConfiguration) {
517 $plugin = false;
518 if (is_array($pluginObjectConfiguration) && count($pluginObjectConfiguration)) {
519 $plugin = t3lib_div::getUserObj($pluginObjectConfiguration['objectReference']);
520 }
521 if (is_object($plugin)) {
522 if ($plugin->main($this)) {
523 $this->registeredPlugins[$pluginId] = $plugin;
524 // Override buttons from previously registered plugins
525 $pluginButtons = t3lib_div::trimExplode(',', $plugin->getPluginButtons(), 1);
526 foreach ($this->pluginButton as $previousPluginId => $buttonList) {
527 $this->pluginButton[$previousPluginId] = implode(',',array_diff(t3lib_div::trimExplode(',', $this->pluginButton[$previousPluginId], 1), $pluginButtons));
528 }
529 $this->pluginButton[$pluginId] = $plugin->getPluginButtons();
530 $pluginLabels = t3lib_div::trimExplode(',', $plugin->getPluginLabels(), 1);
531 foreach ($this->pluginLabel as $previousPluginId => $labelList) {
532 $this->pluginLabel[$previousPluginId] = implode(',',array_diff(t3lib_div::trimExplode(',', $this->pluginLabel[$previousPluginId], 1), $pluginLabels));
533 }
534 $this->pluginLabel[$pluginId] = $plugin->getPluginLabels();
535 $this->pluginEnabledArray[] = $pluginId;
536 }
537 }
538 }
539 }
540 // Process overrides
541 $hidePlugins = array();
542 foreach ($this->registeredPlugins as $pluginId => $plugin) {
543 if ($plugin->addsButtons() && !$this->pluginButton[$pluginId]) {
544 $hidePlugins[] = $pluginId;
545 }
546 }
547 $this->pluginEnabledArray = array_unique(array_diff($this->pluginEnabledArray, $hidePlugins));
548 }
549
550 /**
551 * Set the toolbar config (only in this PHP-Object, not in JS):
552 *
553 */
554
555 function setToolbar() {
556 global $BE_USER;
557
558 if ($this->client['browser'] == 'msie' || $this->client['browser'] == 'opera') {
559 $this->thisConfig['keepButtonGroupTogether'] = 0;
560 }
561
562 $this->defaultToolbarOrder = 'bar, blockstylelabel, blockstyle, space, textstylelabel, textstyle, linebreak,
563 bar, formattext, bold, strong, italic, emphasis, big, small, insertedtext, deletedtext, citation, code, definition, keyboard, monospaced, quotation, sample, variable, bidioverride, strikethrough, subscript, superscript, underline, span,
564 bar, fontstyle, space, fontsize, bar, formatblock, insertparagraphbefore, insertparagraphafter, blockquote, line,
565 bar, left, center, right, justifyfull,
566 bar, orderedlist, unorderedlist, definitionlist, definitionitem, outdent, indent, bar, lefttoright, righttoleft, language, showlanguagemarks,
567 bar, textcolor, bgcolor, textindicator,
568 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,
569 bar, chMode, inserttag, removeformat, bar, copy, cut, paste, bar, undo, redo, bar, showhelp, about, linebreak,
570 ' . ($this->thisConfig['hideTableOperationsInToolbar'] ? '': 'bar, toggleborders,') . ' bar, tableproperties, tablerestyle, bar, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, bar,
571 columnproperties, columninsertbefore, columninsertafter, columndelete, columnsplit, bar,
572 cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge';
573
574 // Additional buttons from registered plugins
575 foreach($this->registeredPlugins as $pluginId => $plugin) {
576 if ($this->isPluginEnabled($pluginId)) {
577 $this->defaultToolbarOrder = $plugin->addButtonsToToolbar();
578 }
579 }
580 $toolbarOrder = $this->thisConfig['toolbarOrder'] ? $this->thisConfig['toolbarOrder'] : $this->defaultToolbarOrder;
581
582 // Getting rid of undefined buttons
583 $this->toolbarOrderArray = array_intersect(t3lib_div::trimExplode(',', $toolbarOrder, 1), t3lib_div::trimExplode(',', $this->defaultToolbarOrder, 1));
584 $toolbarOrder = array_unique(array_values($this->toolbarOrderArray));
585
586 // Fetching specConf for field from backend
587 $pList = is_array($this->specConf['richtext']['parameters']) ? implode(',',$this->specConf['richtext']['parameters']) : '';
588 if ($pList != '*') { // If not all
589 $show = is_array($this->specConf['richtext']['parameters']) ? $this->specConf['richtext']['parameters'] : array();
590 if ($this->thisConfig['showButtons']) {
591 if (!t3lib_div::inList($this->thisConfig['showButtons'],'*')) {
592 $show = array_unique(array_merge($show,t3lib_div::trimExplode(',',$this->thisConfig['showButtons'],1)));
593 } else {
594 $show = array_unique(array_merge($show, $toolbarOrder));
595 }
596 }
597 if (is_array($this->thisConfig['showButtons.'])) {
598 foreach ($this->thisConfig['showButtons.'] as $buttonId => $value) {
599 if ($value) $show[] = $buttonId;
600 }
601 $show = array_unique($show);
602 }
603 } else {
604 $show = $toolbarOrder;
605 }
606
607 // Resticting to RTEkeyList for backend user
608 if(is_object($BE_USER)) {
609 $RTEkeyList = isset($BE_USER->userTS['options.']['RTEkeyList']) ? $BE_USER->userTS['options.']['RTEkeyList'] : '*';
610 if ($RTEkeyList != '*') { // If not all
611 $show = array_intersect($show, t3lib_div::trimExplode(',',$RTEkeyList,1));
612 }
613 }
614
615 // Hiding buttons of disabled plugins
616 $hideButtons = array('space', 'bar', 'linebreak');
617 foreach ($this->pluginButton as $pluginId => $buttonList) {
618 if (!$this->isPluginEnabled($pluginId)) {
619 $buttonArray = t3lib_div::trimExplode(',',$buttonList,1);
620 foreach ($buttonArray as $button) {
621 $hideButtons[] = $button;
622 }
623 }
624 }
625
626 // Hiding labels of disabled plugins
627 foreach ($this->pluginLabel as $pluginId => $label) {
628 if (!$this->isPluginEnabled($pluginId)) {
629 $hideButtons[] = $label;
630 }
631 }
632
633 // Hiding buttons
634 $show = array_diff($show, $this->conf_toolbar_hide, t3lib_div::trimExplode(',',$this->thisConfig['hideButtons'],1));
635
636 // Apply toolbar constraints from registered plugins
637 foreach ($this->registeredPlugins as $pluginId => $plugin) {
638 if ($this->isPluginEnabled($pluginId) && method_exists($plugin, "applyToolbarConstraints")) {
639 $show = $plugin->applyToolbarConstraints($show);
640 }
641 }
642 // Getting rid of the buttons for which we have no position
643 $show = array_intersect($show, $toolbarOrder);
644 $this->toolbar = $show;
645 }
646
647 /**
648 * Disable some plugins
649 *
650 */
651 function setPlugins() {
652
653 // Disabling a plugin that adds buttons if none of its buttons is in the toolbar
654 $hidePlugins = array();
655 foreach ($this->pluginButton as $pluginId => $buttonList) {
656 if ($this->registeredPlugins[$pluginId]->addsButtons()) {
657 $showPlugin = false;
658 $buttonArray = t3lib_div::trimExplode(',', $buttonList, 1);
659 foreach ($buttonArray as $button) {
660 if (in_array($button, $this->toolbar)) {
661 $showPlugin = true;
662 }
663 }
664 if (!$showPlugin) {
665 $hidePlugins[] = $pluginId;
666 }
667 }
668 }
669 $this->pluginEnabledArray = array_diff($this->pluginEnabledArray, $hidePlugins);
670
671 // Hiding labels of disabled plugins
672 $hideLabels = array();
673 foreach ($this->pluginLabel as $pluginId => $label) {
674 if (!$this->isPluginEnabled($pluginId)) {
675 $hideLabels[] = $label;
676 }
677 }
678 $this->toolbar = array_diff($this->toolbar, $hideLabels);
679
680 // Adding plugins declared as prerequisites by enabled plugins
681 $requiredPlugins = array();
682 foreach ($this->registeredPlugins as $pluginId => $plugin) {
683 if ($this->isPluginEnabled($pluginId)) {
684 $requiredPlugins = array_merge($requiredPlugins, t3lib_div::trimExplode(',', $plugin->getRequiredPlugins(), 1));
685 }
686 }
687 $requiredPlugins = array_unique($requiredPlugins);
688 foreach ($requiredPlugins as $pluginId) {
689 if (is_object($this->registeredPlugins[$pluginId]) && !$this->isPluginEnabled($pluginId)) {
690 $this->pluginEnabledArray[] = $pluginId;
691 }
692 }
693 $this->pluginEnabledArray = array_unique($this->pluginEnabledArray);
694
695 // Completing the toolbar conversion array for htmlArea
696 foreach ($this->registeredPlugins as $pluginId => $plugin) {
697 if ($this->isPluginEnabled($pluginId)) {
698 $this->convertToolbarForHtmlAreaArray = array_unique(array_merge($this->convertToolbarForHtmlAreaArray, $plugin->getConvertToolbarForHtmlAreaArray()));
699 }
700 }
701 }
702
703 /**
704 * Convert the TYPO3 names of buttons into the names for htmlArea RTE
705 *
706 * @param string buttonname (typo3-name)
707 * @return string buttonname (htmlarea-name)
708 */
709
710 function convertToolbarForHTMLArea($button) {
711 return $this->convertToolbarForHtmlAreaArray[$button];
712 }
713 /**
714 * Return the HTML code for loading the Javascript files
715 *
716 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
717 *
718 * @return string the html code for loading the Javascript Files
719 */
720 function loadJSfiles($RTEcounter) {
721 // Re-initialize the scripts array so that only the cumulative set of plugins of the last RTE on the page is used
722 $this->cumulativeScripts[$RTEcounter] = array();
723 $this->writeTemporaryFile('EXT:' . $this->ID . '/htmlarea/htmlarea.js', 'htmlarea', 'js', '', TRUE);
724 if ($this->client['browser'] == 'msie') {
725 $this->writeTemporaryFile('EXT:' . $this->ID . '/htmlarea/htmlarea-ie.js', 'htmlarea-ie', 'js', '', TRUE);
726 } else {
727 $this->writeTemporaryFile('EXT:' . $this->ID . '/htmlarea/htmlarea-gecko.js', 'htmlarea-gecko', 'js', '', TRUE);
728 }
729 foreach ($this->pluginEnabledCumulativeArray[$RTEcounter] as $pluginId) {
730 $extensionKey = is_object($this->registeredPlugins[$pluginId]) ? $this->registeredPlugins[$pluginId]->getExtensionKey() : $this->ID;
731 $this->writeTemporaryFile('EXT:' . $extensionKey . '/htmlarea/plugins/' . $pluginId . '/' . strtolower(preg_replace('/([a-z])([A-Z])([a-z])/', "$1".'-'."$2"."$3", $pluginId)) . '.js', $pluginId, 'js', '', TRUE);
732 }
733 $this->buildJSMainLangFile($RTEcounter);
734 // Avoid re-initialization on AJax call when RTEarea object was already initialized
735 $loadJavascriptCode = '
736 <script type="text/javascript" src="' . $this->doConcatenate($RTEcounter) . '"></script>
737 <script type="text/javascript">
738 /*<![CDATA[*/
739 if (typeof(RTEarea) == "undefined") {
740 RTEarea = new Object();
741 RTEarea[0] = new Object();
742 RTEarea[0].version = "' . $GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->ID]['version'] . '";
743 RTEarea[0].editorUrl = "' . $this->extHttpPath . 'htmlarea/";
744 RTEarea[0].editorCSS = "' . t3lib_div::createVersionNumberedFilename($this->editorCSS) . '";
745 RTEarea[0].editorSkin = "' . dirname($this->editorCSS) . '/";
746 RTEarea[0].editedContentCSS = "' . t3lib_div::createVersionNumberedFilename($this->editedContentCSS) . '";
747 RTEarea[0].hostUrl = "' . $this->hostURL . '";
748 RTEarea[0].enableDebugMode = ' . ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->ID]['enableDebugMode'] ? 'true' : 'false') . ';
749 RTEarea.init = function() {
750 if (typeof(HTMLArea) == "undefined" || !Ext.isReady) {
751 window.setTimeout("RTEarea.init();", 40);
752 } else {
753 Ext.QuickTips.init();
754 HTMLArea.init();
755 }
756 };
757 RTEarea.initEditor = function(editorNumber) {
758 if (typeof(HTMLArea) == "undefined") {
759 RTEarea.initEditor.defer(40, null, [editorNumber]);
760 } else {
761 HTMLArea.initEditor(editorNumber);
762 }
763 };
764 }
765 /*]]>*/
766 </script>';
767 return $loadJavascriptCode;
768 }
769
770 /**
771 * Return the Javascript code for initializing the RTE
772 *
773 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
774 *
775 * @return string the Javascript code for initializing the RTE
776 */
777 function loadJScode($RTEcounter) {
778 return (!$this->is_FE() ? '' : '
779 ' . '/*<![CDATA[*/') . '
780 RTEarea.init();' . (!$this->is_FE() ? '' : '
781 /*]]>*/
782 ');
783 }
784
785 /**
786 * Return the Javascript code for configuring the RTE
787 *
788 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
789 * @param string $table: The table that includes this RTE (optional, necessary for IRRE).
790 * @param string $uid: The uid of that table that includes this RTE (optional, necessary for IRRE).
791 * @param string $field: The field of that record that includes this RTE (optional).
792 *
793 * @return string the Javascript code for configuring the RTE
794 */
795 function registerRTEinJS($RTEcounter, $table='', $uid='', $field='', $textAreaId = '') {
796
797 $configureRTEInJavascriptString = (!$this->is_FE() ? '' : '
798 ' . '/*<![CDATA[*/') . '
799 if (typeof(configureEditorInstance) == "undefined") {
800 configureEditorInstance = new Object();
801 }
802 configureEditorInstance["' . $textAreaId . '"] = function() {
803 if (typeof(RTEarea) == "undefined" || typeof(HTMLArea) == "undefined") {
804 window.setTimeout("configureEditorInstance[\'' . $textAreaId . '\']();", 40);
805 } else {
806 editornumber = "' . $textAreaId . '";
807 RTEarea[editornumber] = new Object();
808 RTEarea[editornumber].RTEtsConfigParams = "&RTEtsConfigParams=' . rawurlencode($this->RTEtsConfigParams()) . '";
809 RTEarea[editornumber].number = editornumber;
810 RTEarea[editornumber].deleted = false;
811 RTEarea[editornumber].textAreaId = "' . $textAreaId . '";
812 RTEarea[editornumber].id = "RTEarea" + editornumber;
813 RTEarea[editornumber].RTEWidthOverride = "' . trim($this->thisConfig['RTEWidthOverride']) . '";
814 RTEarea[editornumber].RTEHeightOverride = "' . trim($this->thisConfig['RTEHeightOverride']) . '";
815 RTEarea[editornumber].fullScreen = ' . ($this->fullScreen ? 'true' : 'false') . ';
816 RTEarea[editornumber].showStatusBar = ' . (trim($this->thisConfig['showStatusBar'])?'true':'false') . ';
817 RTEarea[editornumber].enableWordClean = ' . (trim($this->thisConfig['enableWordClean'])?'true':'false') . ';
818 RTEarea[editornumber].htmlRemoveComments = ' . (trim($this->thisConfig['removeComments'])?'true':'false') . ';
819 RTEarea[editornumber].disableEnterParagraphs = ' . (trim($this->thisConfig['disableEnterParagraphs'])?'true':'false') . ';
820 RTEarea[editornumber].disableObjectResizing = ' . (trim($this->thisConfig['disableObjectResizing'])?'true':'false') . ';
821 RTEarea[editornumber].removeTrailingBR = ' . (trim($this->thisConfig['removeTrailingBR'])?'true':'false') . ';
822 RTEarea[editornumber].useCSS = ' . (trim($this->thisConfig['useCSS'])?'true':'false') . ';
823 RTEarea[editornumber].keepButtonGroupTogether = ' . (trim($this->thisConfig['keepButtonGroupTogether'])?'true':'false') . ';
824 RTEarea[editornumber].disablePCexamples = ' . (trim($this->thisConfig['disablePCexamples'])?'true':'false') . ';
825 RTEarea[editornumber].showTagFreeClasses = ' . (trim($this->thisConfig['showTagFreeClasses'])?'true':'false') . ';
826 RTEarea[editornumber].useHTTPS = ' . ((trim(stristr($this->siteURL, 'https')) || $this->thisConfig['forceHTTPS'])?'true':'false') . ';
827 RTEarea[editornumber].tceformsNested = ' . (is_object($this->TCEform) && method_exists($this->TCEform, 'getDynNestedStack') ? $this->TCEform->getDynNestedStack(true) : '[]') . ';
828 RTEarea[editornumber].dialogueWindows = new Object();
829 RTEarea[editornumber].dialogueWindows.defaultPositionFromTop = ' . (isset($this->thisConfig['dialogueWindows.']['defaultPositionFromTop'])? intval($this->thisConfig['dialogueWindows.']['defaultPositionFromTop']) : '100') . ';
830 RTEarea[editornumber].dialogueWindows.defaultPositionFromLeft = ' . (isset($this->thisConfig['dialogueWindows.']['defaultPositionFromLeft'])? intval($this->thisConfig['dialogueWindows.']['defaultPositionFromLeft']) : '100') . ';
831 RTEarea[editornumber].dialogueWindows.doNotResize = ' . (trim($this->thisConfig['dialogueWindows.']['doNotResize'])?'true':'false') . ';
832 RTEarea[editornumber].dialogueWindows.doNotCenter = ' . (trim($this->thisConfig['dialogueWindows.']['doNotCenter'])?'true':'false') . ';';
833
834 // The following properties apply only to the backend
835 if (!$this->is_FE()) {
836 $configureRTEInJavascriptString .= '
837 RTEarea[editornumber].sys_language_content = "' . $this->contentLanguageUid . '";
838 RTEarea[editornumber].typo3ContentLanguage = "' . $this->contentTypo3Language . '";
839 RTEarea[editornumber].typo3ContentCharset = "' . $this->contentCharset . '";
840 RTEarea[editornumber].userUid = "' . $this->userUid . '";';
841 }
842
843 // Setting the plugin flags
844 $configureRTEInJavascriptString .= '
845 RTEarea[editornumber].plugin = new Object();
846 RTEarea[editornumber].pathToPluginDirectory = new Object();';
847 foreach ($this->pluginEnabledArray as $pluginId) {
848 $configureRTEInJavascriptString .= '
849 RTEarea[editornumber].plugin.'.$pluginId.' = true;';
850 if (is_object($this->registeredPlugins[$pluginId])) {
851 $pathToPluginDirectory = $this->registeredPlugins[$pluginId]->getPathToPluginDirectory();
852 if ($pathToPluginDirectory) {
853 $configureRTEInJavascriptString .= '
854 RTEarea[editornumber].pathToPluginDirectory.'.$pluginId.' = "' . $pathToPluginDirectory . '";';
855 }
856 }
857 }
858
859 // Setting the buttons configuration
860 $configureRTEInJavascriptString .= '
861 RTEarea[editornumber].buttons = new Object();';
862 if (is_array($this->thisConfig['buttons.'])) {
863 foreach ($this->thisConfig['buttons.'] as $buttonIndex => $conf) {
864 $button = substr($buttonIndex, 0, -1);
865 if (in_array($button,$this->toolbar)) {
866 $configureRTEInJavascriptString .= '
867 RTEarea[editornumber].buttons.'.$button.' = ' . $this->buildNestedJSArray($conf) . ';';
868 }
869 }
870 }
871
872 // Setting the list of tags to be removed if specified in the RTE config
873 if (trim($this->thisConfig['removeTags'])) {
874 $configureRTEInJavascriptString .= '
875 RTEarea[editornumber].htmlRemoveTags = /^(' . implode('|', t3lib_div::trimExplode(',', $this->thisConfig['removeTags'], 1)) . ')$/i;';
876 }
877
878 // Setting the list of tags to be removed with their contents if specified in the RTE config
879 if (trim($this->thisConfig['removeTagsAndContents'])) {
880 $configureRTEInJavascriptString .= '
881 RTEarea[editornumber].htmlRemoveTagsAndContents = /^(' . implode('|', t3lib_div::trimExplode(',', $this->thisConfig['removeTagsAndContents'], 1)) . ')$/i;';
882 }
883 // Process default style configuration
884 $configureRTEInJavascriptString .= '
885 RTEarea[editornumber].defaultPageStyle = "' . $this->writeTemporaryFile('', 'defaultPageStyle', 'css', $this->buildStyleSheet()) . '";';
886 // Setting the pageStyle
887 $filename = trim($this->thisConfig['contentCSS']) ? trim($this->thisConfig['contentCSS']) : 'EXT:' . $this->ID . '/res/contentcss/default.css';
888 $configureRTEInJavascriptString .= '
889 RTEarea[editornumber].pageStyle = "' . t3lib_div::createVersionNumberedFilename($this->getFullFileName($filename)) .'";';
890 // Process classes configuration
891 $classesConfigurationRequired = false;
892 foreach ($this->registeredPlugins as $pluginId => $plugin) {
893 if ($this->isPluginEnabled($pluginId)) {
894 $classesConfigurationRequired = $classesConfigurationRequired || $plugin->requiresClassesConfiguration();
895 }
896 }
897 if ($classesConfigurationRequired) {
898 $configureRTEInJavascriptString .= $this->buildJSClassesConfig($RTEcounter);
899 }
900 // Add Javascript configuration for registered plugins
901 foreach ($this->registeredPlugins as $pluginId => $plugin) {
902 if ($this->isPluginEnabled($pluginId)) {
903 $configureRTEInJavascriptString .= $plugin->buildJavascriptConfiguration('editornumber');
904 }
905 }
906 // Avoid premature reference to HTMLArea when being initially loaded by IRRE Ajax call
907 $configureRTEInJavascriptString .= '
908 RTEarea[editornumber].toolbar = ' . $this->getJSToolbarArray() . ';
909 RTEarea[editornumber].convertButtonId = ' . json_encode(array_flip($this->convertToolbarForHtmlAreaArray)) . ';
910 RTEarea.initEditor(editornumber);
911 }
912 };
913 configureEditorInstance["' . $textAreaId . '"]();'. (!$this->is_FE() ? '' : '
914 /*]]>*/');
915 return $configureRTEInJavascriptString;
916 }
917
918 /**
919 * Return true, if the plugin can be loaded
920 *
921 * @param string $pluginId: The identification string of the plugin
922 *
923 * @return boolean true if the plugin can be loaded
924 */
925
926 function isPluginEnabled($pluginId) {
927 return in_array($pluginId, $this->pluginEnabledArray);
928 }
929
930 /**
931 * Build the default content style sheet
932 *
933 * @return string Style sheet
934 */
935 function buildStyleSheet() {
936
937 if (!trim($this->thisConfig['ignoreMainStyleOverride'])) {
938 $mainStyle_font = $this->thisConfig['mainStyle_font'] ? $this->thisConfig['mainStyle_font']: 'Verdana,sans-serif';
939
940 $mainElements = array();
941 $mainElements['P'] = $this->thisConfig['mainStyleOverride_add.']['P'];
942 $elList = explode(',','H1,H2,H3,H4,H5,H6,PRE');
943 foreach ($elList as $elListName) {
944 if ($this->thisConfig['mainStyleOverride_add.'][$elListName]) {
945 $mainElements[$elListName] = $this->thisConfig['mainStyleOverride_add.'][$elListName];
946 }
947 }
948
949 $addElementCode = '';
950 foreach ($mainElements as $elListName => $elValue) {
951 $addElementCode .= strToLower($elListName) . ' {' . $elValue . '}' . LF;
952 }
953
954 $stylesheet = $this->thisConfig['mainStyleOverride'] ? $this->thisConfig['mainStyleOverride'] : LF .
955 'body.htmlarea-content-body { font-family: ' . $mainStyle_font .
956 '; font-size: '.($this->thisConfig['mainStyle_size'] ? $this->thisConfig['mainStyle_size'] : '12px') .
957 '; color: '.($this->thisConfig['mainStyle_color']?$this->thisConfig['mainStyle_color'] : 'black') .
958 '; background-color: '.($this->thisConfig['mainStyle_bgcolor'] ? $this->thisConfig['mainStyle_bgcolor'] : 'white') .
959 ';'.$this->thisConfig['mainStyleOverride_add.']['BODY'].'}' . LF .
960 'td { ' . $this->thisConfig['mainStyleOverride_add.']['TD'].'}' . LF .
961 'div { ' . $this->thisConfig['mainStyleOverride_add.']['DIV'].'}' . LF .
962 'pre { ' . $this->thisConfig['mainStyleOverride_add.']['PRE'].'}' . LF .
963 'ol { ' . $this->thisConfig['mainStyleOverride_add.']['OL'].'}' . LF .
964 'ul { ' . $this->thisConfig['mainStyleOverride_add.']['UL'].'}' . LF .
965 'blockquote { ' . $this->thisConfig['mainStyleOverride_add.']['BLOCKQUOTE'].'}' . LF .
966 $addElementCode;
967
968 if (is_array($this->thisConfig['inlineStyle.'])) {
969 $stylesheet .= LF . implode(LF, $this->thisConfig['inlineStyle.']) . LF;
970 }
971 } else {
972 $stylesheet = '/* mainStyleOverride and inlineStyle properties ignored. */';
973 }
974 return $stylesheet;
975 }
976
977 /**
978 * Return Javascript configuration of classes
979 *
980 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
981 *
982 * @return string Javascript configuration of classes
983 */
984 function buildJSClassesConfig($RTEcounter) {
985 // Build JS array of lists of classes
986 $classesTagList = 'classesCharacter, classesParagraph, classesImage, classesTable, classesLinks, classesTD';
987 $classesTagConvert = array( 'classesCharacter' => 'span', 'classesParagraph' => 'div', 'classesImage' => 'img', 'classesTable' => 'table', 'classesLinks' => 'a', 'classesTD' => 'td');
988 $classesTagArray = t3lib_div::trimExplode(',' , $classesTagList);
989 $configureRTEInJavascriptString = '
990 RTEarea[editornumber].classesTag = new Object();';
991 foreach ($classesTagArray as $classesTagName) {
992 $HTMLAreaJSClasses = ($this->thisConfig[$classesTagName])?('"' . $this->cleanList($this->thisConfig[$classesTagName]) . '";'):'null;';
993 $configureRTEInJavascriptString .= '
994 RTEarea[editornumber].classesTag.'. $classesTagConvert[$classesTagName] .' = '. $HTMLAreaJSClasses;
995 }
996 // Include JS arrays of configured classes
997 $configureRTEInJavascriptString .= '
998 RTEarea[editornumber].classesUrl = "' . $this->writeTemporaryFile('', 'classes_'.$LANG->lang, 'js', $this->buildJSClassesArray()) . '";';
999 return $configureRTEInJavascriptString;
1000 }
1001
1002 /**
1003 * Return JS arrays of classes configuration
1004 *
1005 * @return string JS classes arrays
1006 */
1007 function buildJSClassesArray() {
1008 if ($this->is_FE()) {
1009 $RTEProperties = $this->RTEsetup;
1010 } else {
1011 $RTEProperties = $this->RTEsetup['properties'];
1012 }
1013 $classesArray = array('labels' => array(), 'values' => array(), 'noShow' => array(), 'alternating' => array(), 'counting' => array(), 'XOR' => array());
1014 $JSClassesArray = '';
1015 // Scanning the list of classes if specified in the RTE config
1016 if (is_array($RTEProperties['classes.'])) {
1017 foreach ($RTEProperties['classes.'] as $className => $conf) {
1018 $className = rtrim($className, '.');
1019 $classesArray['labels'][$className] = $this->getPageConfigLabel($conf['name'], FALSE);
1020 $classesArray['values'][$className] = str_replace('\\\'', '\'', $conf['value']);
1021 if (isset($conf['noShow'])) {
1022 $classesArray['noShow'][$className] = $conf['noShow'];
1023 }
1024 if (is_array($conf['alternating.'])) {
1025 $classesArray['alternating'][$className] = $conf['alternating.'];
1026 }
1027 if (is_array($conf['counting.'])) {
1028 $classesArray['counting'][$className] = $conf['counting.'];
1029 }
1030 }
1031 }
1032 // Scanning the list of sets of mutually exclusives classes if specified in the RTE config
1033 if (is_array($RTEProperties['mutuallyExclusiveClasses.'])) {
1034 foreach ($RTEProperties['mutuallyExclusiveClasses.'] as $listName => $conf) {
1035 $classSet = t3lib_div::trimExplode(',', $conf, 1);
1036 $classList = implode(',', $classSet);
1037 foreach ($classSet as $className) {
1038 $classesArray['XOR'][$className] = '/^(' . implode('|', t3lib_div::trimExplode(',', t3lib_div::rmFromList($className, $classList), 1)) . ')$/';
1039 }
1040 }
1041 }
1042 foreach ($classesArray as $key => $subArray) {
1043 $JSClassesArray .= 'HTMLArea.classes' . ucfirst($key) . ' = ' . $this->buildNestedJSArray($subArray) . ';' . LF;
1044 }
1045 return $JSClassesArray;
1046 }
1047
1048 /**
1049 * Translate Page TS Config array in JS nested array definition
1050 * Replace 0 values with false
1051 * Unquote regular expression values
1052 * Replace empty arrays with empty objects
1053 *
1054 * @param array $conf: Page TSConfig configuration array
1055 *
1056 * @return string nested JS array definition
1057 */
1058 function buildNestedJSArray($conf) {
1059 $convertedConf = t3lib_div::removeDotsFromTS($conf);
1060 if ($this->is_FE()) {
1061 $GLOBALS['TSFE']->csConvObj->convArray($convertedConf, ($GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'] ? $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'] : 'iso-8859-1'), 'utf-8');
1062 } else {
1063 $GLOBALS['LANG']->csConvObj->convArray($convertedConf, $GLOBALS['LANG']->charSet, 'utf-8');
1064 }
1065 return str_replace(array(':"0"', ':"\/^(', ')$\/i"', ':"\/^(', ')$\/"', '[]'), array(':false', ':/^(', ')$/i', ':/^(', ')$/', '{}'), json_encode($convertedConf));
1066 }
1067
1068 /**
1069 * Return a Javascript localization array for htmlArea RTE
1070 *
1071 * @return string Javascript localization array
1072 */
1073 function buildJSMainLangArray() {
1074 $JSLanguageArray = 'HTMLArea.I18N = new Object();' . LF;
1075 $labelsArray = array('tooltips' => array(), 'msg' => array(), 'dialogs' => array());
1076 foreach ($labelsArray as $labels => $subArray) {
1077 $LOCAL_LANG = t3lib_div::readLLfile('EXT:' . $this->ID . '/htmlarea/locallang_' . $labels . '.xml', $this->language, 'utf-8');
1078 if (!empty($LOCAL_LANG[$this->language])) {
1079 $LOCAL_LANG[$this->language] = t3lib_div::array_merge_recursive_overrule($LOCAL_LANG['default'], $LOCAL_LANG[$this->language]);
1080 } else {
1081 $LOCAL_LANG[$this->language] = $LOCAL_LANG['default'];
1082 }
1083 $labelsArray[$labels] = $LOCAL_LANG[$this->language];
1084 }
1085 $JSLanguageArray .= 'HTMLArea.I18N = ' . json_encode($labelsArray) . ';' . LF;
1086 return $JSLanguageArray;
1087 }
1088
1089 /**
1090 * Writes contents in a file in typo3temp/rtehtmlarea directory and returns the file name
1091 *
1092 * @param string $sourceFileName: The name of the file from which the contents should be extracted
1093 * @param string $label: A label to insert at the beginning of the name of the file
1094 * @param string $fileExtension: The file extension of the file, defaulting to 'js'
1095 * @param string $contents: The contents to write into the file if no $sourceFileName is provided
1096 *
1097 * @return string The name of the file writtten to typo3temp/rtehtmlarea
1098 */
1099 public function writeTemporaryFile($sourceFileName='', $label, $fileExtension='js', $contents='', $concatenate = FALSE) {
1100 global $TYPO3_CONF_VARS;
1101
1102 if ($sourceFileName) {
1103 $output = '';
1104 $source = t3lib_div::getFileAbsFileName($sourceFileName);
1105 $output = file_get_contents($source);
1106 } else {
1107 $output = $contents;
1108 }
1109 $compress = $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts'] && ($fileExtension == 'js') && ($output != '');
1110 $relativeFilename = 'typo3temp/' . $this->ID . '/' . str_replace('-','_',$label) . '_' . t3lib_div::shortMD5(($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['version'] . ($sourceFileName ? $sourceFileName : $output)), 20) . ($compress ? '_compressed' : '') . '.' . $fileExtension;
1111 $destination = PATH_site . $relativeFilename;
1112 if(!file_exists($destination)) {
1113 $compressedJavaScript = '';
1114 if ($compress && $fileExtension == 'js') {
1115 $compressedJavaScript = t3lib_div::minifyJavaScript($output);
1116 }
1117 $failure = t3lib_div::writeFileToTypo3tempDir($destination, $compressedJavaScript ? $compressedJavaScript : $output);
1118 if ($failure) {
1119 die($failure);
1120 }
1121 }
1122 if ($concatenate && $fileExtension == 'js') {
1123 $this->cumulativeScripts[$this->TCEform->RTEcounter][] = $destination;
1124 }
1125 if ($this->is_FE()) {
1126 $filename = ($GLOBALS['TSFE']->absRefPrefix ? $GLOBALS['TSFE']->absRefPrefix : '') . t3lib_div::createVersionNumberedFilename($relativeFilename);
1127 } else {
1128 $filename = t3lib_div::createVersionNumberedFilename(($this->isFrontendEditActive() ? '' : ($this->backPath . '../')) . $relativeFilename);
1129 }
1130 return t3lib_div::resolveBackPath($filename);
1131 }
1132 /**
1133 * Concatenates all accumulated scripts in a file in typo3temp/rtehtmlarea directory and returns the file name
1134 *
1135 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
1136 *
1137 * @return string The name of the file writtten to typo3temp/rtehtmlarea
1138 */
1139 protected function doConcatenate($RTEcounter) {
1140 $fileExtension = 'js';
1141 $compress = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->ID]['enableCompressedScripts'];
1142 $token = implode('|', $this->cumulativeScripts[$RTEcounter]);
1143 $relativeFilename = 'typo3temp/' . $this->ID . '/' . 'htmlarea_cumulative' . '_' . t3lib_div::shortMD5(($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['version'] . $token ), 20) . ($compress ? '_compressed' : '') . '.' . $fileExtension;
1144 $destination = PATH_site . $relativeFilename;
1145 if (!file_exists($destination)) {
1146 foreach ($this->cumulativeScripts[$RTEcounter] as $fileName) {
1147 $contents = file_get_contents($fileName);
1148 if (!file_exists($destination)) {
1149 $failure = t3lib_div::writeFileToTypo3tempDir($destination, $contents);
1150 if ($failure) {
1151 die($failure);
1152 }
1153 } else {
1154 $success = file_put_contents($destination, $contents, FILE_APPEND);
1155 if (!$success) {
1156 die('Could not append script' + $fileName);
1157 }
1158 }
1159 }
1160 }
1161 if ($this->is_FE()) {
1162 $filename = ($GLOBALS['TSFE']->absRefPrefix ? $GLOBALS['TSFE']->absRefPrefix : '') . t3lib_div::createVersionNumberedFilename($relativeFilename);
1163 } else {
1164 if ($compress) {
1165 $compressor = t3lib_div::makeInstance('t3lib_Compressor');
1166 $filename = $compressor->compressJsFile(($this->isFrontendEditActive() ? '' : $this->backPath) . '../' . $relativeFilename);
1167 if ($this->isFrontendEditActive()) {
1168 $filename = preg_replace('/^..\//', '', $filename);
1169 }
1170 } else {
1171 $filename = t3lib_div::createVersionNumberedFilename(($this->isFrontendEditActive() ? '' : ($this->backPath . '../')) . $relativeFilename);
1172 }
1173 }
1174 return t3lib_div::resolveBackPath($filename);
1175 }
1176
1177 /**
1178 * Return a file name containing the main JS language array for HTMLArea
1179 *
1180 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
1181 *
1182 * @return string filename
1183 */
1184 function buildJSMainLangFile($RTEcounter) {
1185 $contents = $this->buildJSMainLangArray() . LF;
1186 foreach ($this->pluginEnabledCumulativeArray[$RTEcounter] as $pluginId) {
1187 $contents .= $this->buildJSLangArray($pluginId) . LF;
1188 }
1189 return $this->writeTemporaryFile('', $this->language.'_'.$this->OutputCharset, 'js', $contents, TRUE);
1190 }
1191
1192 /**
1193 * Return a Javascript localization array for the plugin
1194 *
1195 * @param string $plugin: identification string of the plugin
1196 *
1197 * @return string Javascript localization array
1198 */
1199
1200 function buildJSLangArray($plugin) {
1201 $LOCAL_LANG = FALSE;
1202 $extensionKey = is_object($this->registeredPlugins[$plugin]) ? $this->registeredPlugins[$plugin]->getExtensionKey() : $this->ID;
1203 $LOCAL_LANG = t3lib_div::readLLfile('EXT:' . $extensionKey . '/htmlarea/plugins/' . $plugin . '/locallang.xml', $this->language, 'utf-8', 1);
1204 $linebreak = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->ID]['enableCompressedScripts'] ? '' : LF;
1205 $JSLanguageArray = 'HTMLArea.I18N["' . $plugin . '"] = new Object();' . $linebreak;
1206 if (is_array($LOCAL_LANG)) {
1207 if (!empty($LOCAL_LANG[$this->language])) {
1208 $LOCAL_LANG[$this->language] = t3lib_div::array_merge_recursive_overrule($LOCAL_LANG['default'],$LOCAL_LANG[$this->language]);
1209 } else {
1210 $LOCAL_LANG[$this->language] = $LOCAL_LANG['default'];
1211 }
1212 $JSLanguageArray .= 'HTMLArea.I18N["' . $plugin . '"] = ' . json_encode($LOCAL_LANG[$this->language]) . ';'. LF;
1213 }
1214 return $JSLanguageArray;
1215 }
1216
1217 /**
1218 * Return the JS code of the toolbar configuration for the HTMLArea editor
1219 *
1220 * @return string the JS code as nested JS arrays
1221 */
1222 protected function getJSToolbarArray() {
1223 // The toolbar array
1224 $toolbar = array();
1225 // The current row; a "linebreak" ends the current row
1226 $row = array();
1227 // The current group; each group is between "bar"s; a "linebreak" ends the current group
1228 $group = array();
1229 // Process each toolbar item in the toolbar order list
1230 foreach ($this->toolbarOrderArray as $item) {
1231 switch ($item) {
1232 case 'linebreak':
1233 // Add row to toolbar if not empty
1234 if (!empty($group)) {
1235 $row[] = $group;
1236 $group = array();
1237 }
1238 if (!empty($row)) {
1239 $toolbar[] = $row;
1240 $row = array();
1241 }
1242 break;
1243 case 'bar':
1244 // Add group to row if not empty
1245 if (!empty($group)) {
1246 $row[] = $group;
1247 $group = array();
1248 }
1249 break;
1250 case 'space':
1251 if (end($group) != $this->convertToolbarForHTMLArea($item)) {
1252 $group[] = $this->convertToolbarForHTMLArea($item);
1253 }
1254 break;
1255 default:
1256 if (in_array($item, $this->toolbar)) {
1257 // Add the item to the group
1258 $convertedItem = $this->convertToolbarForHTMLArea($item);
1259 if ($convertedItem) {
1260 $group[] = $convertedItem;
1261 }
1262 }
1263 break;
1264 }
1265 }
1266 // Add the last group and last line, if not empty
1267 if (!empty($group)) {
1268 $row[] = $group;
1269 }
1270 if (!empty($row)) {
1271 $toolbar[] = $row;
1272 }
1273 return json_encode($toolbar);
1274 }
1275
1276 public function getLLContent($string) {
1277 global $LANG;
1278
1279 $BE_lang = $LANG->lang;
1280 $BE_charSet = $LANG->charSet;
1281 $LANG->lang = $this->contentTypo3Language;
1282 $LANG->charSet = $this->contentCharset;
1283 $LLString = $LANG->JScharCode($LANG->sL($string));
1284 $LANG->lang = $BE_lang;
1285 $LANG->charSet = $BE_charSet;
1286 return $LLString;
1287 }
1288
1289 public function getPageConfigLabel($string,$JScharCode=1) {
1290 global $LANG, $TSFE, $TYPO3_CONF_VARS;
1291
1292 if ($this->is_FE()) {
1293 if (strcmp(substr($string,0,4),'LLL:') && $TYPO3_CONF_VARS['BE']['forceCharset']) {
1294 // A pure string coming from Page TSConfig must be in forceCharset, otherwise we just don't know..
1295 $label = $TSFE->csConvObj->conv($TSFE->sL(trim($string)), $TYPO3_CONF_VARS['BE']['forceCharset'], $this->OutputCharset);
1296 } else {
1297 $label = $TSFE->csConvObj->conv($TSFE->sL(trim($string)), $this->charset, $this->OutputCharset);
1298 }
1299 $label = str_replace('"', '\"', str_replace('\\\'', '\'', $label));
1300 $label = $JScharCode ? $this->feJScharCode($label) : $label;
1301 } else {
1302 if (strcmp(substr($string,0,4),'LLL:')) {
1303 $label = $string;
1304 } else {
1305 $label = $LANG->sL(trim($string));
1306 }
1307 $label = str_replace('"', '\"', str_replace('\\\'', '\'', $label));
1308 $label = $JScharCode ? $LANG->JScharCode($label): $label;
1309 }
1310 return $label;
1311 }
1312
1313 function feJScharCode($str) {
1314 global $TSFE;
1315 // Convert string to UTF-8:
1316 if ($this->OutputCharset != 'utf-8') $str = $TSFE->csConvObj->utf8_encode($str,$this->OutputCharset);
1317 // Convert the UTF-8 string into a array of char numbers:
1318 $nArr = $TSFE->csConvObj->utf8_to_numberarray($str);
1319 return 'String.fromCharCode('.implode(',',$nArr).')';
1320 }
1321
1322 public function getFullFileName($filename) {
1323 if (substr($filename,0,4)=='EXT:') { // extension
1324 list($extKey,$local) = explode('/',substr($filename,4),2);
1325 $newFilename = '';
1326 if (strcmp($extKey,'') && t3lib_extMgm::isLoaded($extKey) && strcmp($local,'')) {
1327 $newFilename = (($this->is_FE() || $this->isFrontendEditActive()) ? t3lib_extMgm::siteRelPath($extKey) : $this->backPath . t3lib_extMgm::extRelPath($extKey)) . $local;
1328 }
1329 } elseif (substr($filename,0,1) != '/') {
1330 $newFilename = (($this->is_FE() || $this->isFrontendEditActive()) ? '' : ($this->backPath . '../')) . $filename;
1331 } else {
1332 $newFilename = (($this->is_FE() || $this->isFrontendEditActive()) ? '' : ($this->backPath . '../')) . substr($filename, 1);
1333 }
1334 return t3lib_div::resolveBackPath($newFilename);
1335 }
1336
1337 /**
1338 * Return the Javascript code for copying the HTML code from the editor into the hidden input field.
1339 * This is for submit function of the form.
1340 *
1341 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
1342 * @param string $formName: the name of the form
1343 * @param string $textareaId: the id of the textarea
1344 *
1345 * @return string Javascript code
1346 */
1347 function setSaveRTE($RTEcounter, $formName, $textareaId) {
1348 return 'if (RTEarea["' . $textareaId . '"]) { document.' . $formName . '["' . $textareaId . '"].value = RTEarea["' . $textareaId . '"].editor.getHTML(); } else { OK = 0; };';
1349 }
1350
1351 /**
1352 * Return the Javascript code for copying the HTML code from the editor into the hidden input field.
1353 * This is for submit function of the form.
1354 *
1355 * @param integer $RTEcounter: The index number of the current RTE editing area within the form.
1356 * @param string $formName: the name of the form
1357 * @param string $textareaId: the id of the textarea
1358 *
1359 * @return string Javascript code
1360 */
1361 function setDeleteRTE($RTEcounter, $formName, $textareaId) {
1362 return 'if (RTEarea["' . $textareaId . '"]) { RTEarea["' . $textareaId . '"].deleted = true;}';
1363 }
1364
1365 /**
1366 * Return true if we are in the FE, but not in the FE editing feature of BE.
1367 *
1368 * @return boolean
1369 */
1370
1371 function is_FE() {
1372 return is_object($GLOBALS['TSFE']) && !$this->isFrontendEditActive();
1373 }
1374
1375 /**
1376 * Checks whether frontend editing is active.
1377 *
1378 * @return boolean
1379 */
1380 public function isFrontendEditActive() {
1381 return is_object($GLOBALS['TSFE']) && $GLOBALS['TSFE']->beUserLogin && ($GLOBALS['BE_USER']->frontendEdit instanceof t3lib_frontendedit);
1382 }
1383 /**
1384 * Client Browser Information
1385 *
1386 * @param string $userAgent: The useragent string, t3lib_div::getIndpEnv('HTTP_USER_AGENT')
1387 * @return array Contains keys "useragent", "browser", "version", "system"
1388 * where "browser" is limited to the engines
1389 * and where "version" is a floating number
1390 */
1391 function clientInfo ($userAgent='') {
1392 if (!$userAgent) {
1393 $userAgent = t3lib_div::getIndpEnv('HTTP_USER_AGENT');
1394 }
1395 $browserInfo = t3lib_utility_Client::getBrowserInfo($userAgent);
1396 // Known engines: order is not irrelevant!
1397 $knownEngines = array('opera', 'msie', 'gecko', 'webkit');
1398 if (is_array($browserInfo['all'])) {
1399 foreach ($knownEngines as $engine) {
1400 if ($browserInfo['all'][$engine]) {
1401 $browserInfo['browser'] = $engine;
1402 $browserInfo['version'] = t3lib_utility_Client::getVersion($browserInfo['all'][$engine]);
1403 break;
1404 }
1405 }
1406 }
1407 if ($browserInfo['system'] == 'mac') {
1408 if (strstr($userAgent,'iPad')) {
1409 $browserInfo['system'] = 'iPad';
1410 } elseif (strstr($userAgent,'iPhone')) {
1411 $browserInfo['system'] = 'iPhone';
1412 } elseif (strstr($userAgent,'iPod')) {
1413 $browserInfo['system'] = 'iPod';
1414 }
1415 }
1416 return $browserInfo;
1417 }
1418 /***************************
1419 *
1420 * OTHER FUNCTIONS: (from Classic RTE)
1421 *
1422 ***************************/
1423 /**
1424 * @return [type] ...
1425 * @desc
1426 */
1427
1428 function RTEtsConfigParams() {
1429 if($this->is_FE()) {
1430 return '';
1431 } else {
1432 $p = t3lib_BEfunc::getSpecConfParametersFromArray($this->specConf['rte_transform']['parameters']);
1433 return $this->elementParts[0].':'.$this->elementParts[1].':'.$this->elementParts[2].':'.$this->thePid.':'.$this->typeVal.':'.$this->tscPID.':'.$p['imgpath'];
1434 }
1435 }
1436
1437 public function cleanList($str) {
1438 if (strstr($str,'*')) {
1439 $str = '*';
1440 } else {
1441 $str = implode(',',array_unique(t3lib_div::trimExplode(',',$str,1)));
1442 }
1443 return $str;
1444 }
1445
1446 function filterStyleEl($elValue,$matchList) {
1447 $matchParts = t3lib_div::trimExplode(',',$matchList,1);
1448 $styleParts = explode(';',$elValue);
1449 $nStyle=array();
1450 foreach ($styleParts as $k => $p) {
1451 $pp = t3lib_div::trimExplode(':',$p);
1452 if ($pp[0]&&$pp[1]) {
1453 foreach ($matchParts as $el) {
1454 $star=substr($el,-1)=='*';
1455 if (!strcmp($pp[0],$el) || ($star && t3lib_div::isFirstPartOfStr($pp[0],substr($el,0,-1)) )) {
1456 $nStyle[]=$pp[0].':'.$pp[1];
1457 } else unset($styleParts[$k]);
1458 }
1459 } else {
1460 unset($styleParts[$k]);
1461 }
1462 }
1463 return implode('; ',$nStyle);
1464 }
1465
1466 // Hook on lorem_ipsum extension to insert text into the RTE in wysiwyg mode
1467 function loremIpsumInsert($params) {
1468 return "
1469 if (typeof(lorem_ipsum) == 'function' && " . $params['element'] . ".tagName.toLowerCase() == 'textarea' ) lorem_ipsum(" . $params['element'] . ", lipsum_temp_strings[lipsum_temp_pointer]);
1470 ";
1471 }
1472 }
1473 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/rtehtmlarea/class.tx_rtehtmlarea_base.php']) {
1474 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/rtehtmlarea/class.tx_rtehtmlarea_base.php']);
1475 }
1476 ?>