Fixed bug #9386: Acronym plugin encoding problem
[Packages/TYPO3.CMS.git] / typo3 / sysext / rtehtmlarea / extensions / Acronym / class.tx_rtehtmlarea_acronym.php
index 7ff79e1..1721772 100644 (file)
@@ -2,7 +2,7 @@
 /***************************************************************
 *  Copyright notice
 *
-*  (c) 2008 Stanislas Rolland <stanislas.rolland(arobas)fructifor.ca>
+*  (c) 2008 Stanislas Rolland <typo3(arobas)sjbr.ca>
 *  All rights reserved
 *
 *  This script is part of the Typo3 project. The Typo3 project is
@@ -24,7 +24,7 @@
 /**
  * Acronym extension for htmlArea RTE
  *
- * @author Stanislas Rolland <stanislas.rolland(arobas)fructifor.ca>
+ * @author Stanislas Rolland <typo3(arobas)sjbr.ca>
  *
  * TYPO3 SVN ID: $Id$
  *
@@ -42,17 +42,14 @@ class tx_rtehtmlarea_acronym extends tx_rtehtmlareaapi {
        protected $thisConfig;                                  // Reference to RTE PageTSConfig
        protected $toolbar;                                     // Reference to RTE toolbar array
        protected $LOCAL_LANG;                                  // Frontend language array
-       
+
        protected $pluginButtons = 'acronym';
        protected $convertToolbarForHtmlAreaArray = array (
                'acronym'       => 'Acronym',
                );
-       
-       public function main($parentObject) {
-               return parent::main($parentObject) && !($this->htmlAreaRTE->client['BROWSER'] == 'msie' && $this->htmlAreaRTE->client['VERSION'] < 7);
-               
-       }
-       
+       protected $acronymIndex = 0;
+       protected $abbraviationIndex = 0;
+
        /**
         * Return tranformed content
         *
@@ -61,16 +58,16 @@ class tx_rtehtmlarea_acronym extends tx_rtehtmlareaapi {
         * @return      string          the transformed content
         */
        public function transformContent($content) {
-               
+
                        // <abbr> was not supported by IE before verison 7
                if ($this->htmlAreaRTE->client['BROWSER'] == 'msie' && $this->htmlAreaRTE->client['VERSION'] < 7) {
                                // change <abbr> to <acronym>
                        $content = preg_replace('/<(\/?)abbr/i', "<$1acronym", $content);
                }
-               
+
                return $content;
        }
-       
+
        /**
         * Return JS configuration of the htmlArea plugins registered by the extension
         *
@@ -83,47 +80,61 @@ class tx_rtehtmlarea_acronym extends tx_rtehtmlareaapi {
         *      RTEarea['.$RTEcounter.']["buttons"]["button-id"]["property"] = "value";
         */
        public function buildJavascriptConfiguration($RTEcounter) {
-               
+
                $registerRTEinJavascriptString = '';
                $button = 'acronym';
                if (in_array($button, $this->toolbar)) {
-                       if (!is_array( $this->thisConfig['buttons.']) || !is_array( $this->thisConfig['buttons.'][$button.'.'])) {
+                       if (!is_array($this->thisConfig['buttons.']) || !is_array($this->thisConfig['buttons.'][$button.'.'])) {
                                        $registerRTEinJavascriptString .= '
                        RTEarea['.$RTEcounter.']["buttons"]["'. $button .'"] = new Object();';
                        }
                        $registerRTEinJavascriptString .= '
                        RTEarea['.$RTEcounter.'].buttons.'. $button .'.pathAcronymModule = "../../mod2/acronym.php";
                        RTEarea['.$RTEcounter.'].buttons.'. $button .'.acronymUrl = "' . $this->htmlAreaRTE->writeTemporaryFile('', 'acronym_'.$this->htmlAreaRTE->contentLanguageUid, 'js', $this->buildJSAcronymArray($this->htmlAreaRTE->contentLanguageUid)) . '";';
+
+                               // <abbr> was not supported by IE before version 7
+                       if ($this->htmlAreaRTE->client['BROWSER'] == 'msie' && $this->htmlAreaRTE->client['VERSION'] < 7) {
+                               $this->AbbreviationIndex = 0;
+                       }
+                       $registerRTEinJavascriptString .= '
+                       RTEarea['.$RTEcounter.'].buttons.'. $button .'.noAcronym = ' . ($this->acronymIndex ? 'false' : 'true') . ';
+                       RTEarea['.$RTEcounter.'].buttons.'. $button .'.noAbbr =  ' . ($this->AbbreviationIndex ? 'false' : 'true') . ';';
                }
-               
+
                return $registerRTEinJavascriptString;
        }
-       
+
        /**
         * Return an acronym array for the Acronym plugin
         *
         * @return      string          acronym Javascript array
         */
        function buildJSAcronymArray($languageUid) {
-               global $TYPO3_CONF_VARS, $TYPO3_DB;
-               
-               $linebreak = $TYPO3_CONF_VARS['EXTCONF'][$this->htmlAreaRTE->ID]['enableCompressedScripts'] ? '' : chr(10);
-               $acronymIndex = 0;
-               $abbraviationIndex = 0;
+               global $TYPO3_DB;
+
+               $charset = $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'] ? $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'] : 'iso-8859-1';
+
+               $button = 'acronym';
+               $PIDList = 0;
+               if (is_array($this->thisConfig['buttons.']) && is_array($this->thisConfig['buttons.'][$button.'.']) && trim($this->thisConfig['buttons.'][$button.'.']['PIDList'])) {
+                       $PIDList = implode(',', t3lib_div::trimExplode(',', $this->thisConfig['buttons.'][$button.'.']['PIDList']));
+               }
+               $linebreak = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$this->htmlAreaRTE->ID]['enableCompressedScripts'] ? '' : chr(10);
                $JSAcronymArray .= 'acronyms = { ' . $linebreak;
                $JSAbbreviationArray .= 'abbreviations = { ' . $linebreak;
                $table = 'tx_rtehtmlarea_acronym';
                if ($languageUid > -1) {
-                       $whereClause = '(sys_language_uid=' . $languageUid . ' OR sys_language_uid=-1)';
+                       $whereClause = '(sys_language_uid=' . $languageUid . ' OR sys_language_uid=-1) ';
                } else {
-                       $whereClause = '1 = 1';
+                       $whereClause = '1 = 1 ';
                }
+               $whereClause .= ($PIDList ? ' AND '. $table . '.pid IN (' . $TYPO3_DB->fullQuoteStr($PIDList, $table) . ') ' : '');
                $whereClause .= t3lib_BEfunc::BEenableFields($table);
                $whereClause .= t3lib_BEfunc::deleteClause($table);
                $res = $TYPO3_DB->exec_SELECTquery('type,term,acronym', $table, $whereClause);
                while($acronymRow = $TYPO3_DB->sql_fetch_assoc($res))    {
-                       if($acronymRow['type'] == 1) $JSAcronymArray .= (($acronymIndex++)?',':'') . '"' . $acronymRow['acronym'] . '":"' . $acronymRow['term'] . '"' . $linebreak;
-                       if($acronymRow['type'] == 2) $JSAbbreviationArray .= (($AbbreviationIndex++)?',':'') . '"' . $acronymRow['acronym'] . '":"' . $acronymRow['term'] . '"' . $linebreak;
+                       if( $acronymRow['type'] == 1) $JSAcronymArray .= (($this->acronymIndex++)?',':'') . '"' . $GLOBALS['LANG']->csConvObj->utf8_encode($acronymRow['term'], $charset) . '":"' . $GLOBALS['LANG']->csConvObj->utf8_encode($acronymRow['acronym'], $charset) . '"' . $linebreak;
+                       if ($acronymRow['type'] == 2) $JSAbbreviationArray .= (($this->AbbreviationIndex++)?',':'') . '"' . $GLOBALS['LANG']->csConvObj->utf8_encode($acronymRow['term'], $charset) . '":"' . $GLOBALS['LANG']->csConvObj->utf8_encode($acronymRow['acronym'], $charset) . '"' . $linebreak;
                }
                $JSAcronymArray .= '};' . $linebreak;
                $JSAbbreviationArray .= '};' . $linebreak;