[!!!][TASK] Remove GraphicalFunctions->nativeCharset 76/45376/4
authorBenni Mack <benni@typo3.org>
Sat, 19 Dec 2015 20:42:00 +0000 (21:42 +0100)
committerWouter Wolters <typo3@wouterwolters.nl>
Wed, 30 Dec 2015 17:48:44 +0000 (18:48 +0100)
GraphicalFunctions contains an option called
"nativeCharset" which is set to utf8 at all times,
changing encoding functionality to use csConv.

This can be simplified by always using csConv.

The functions "singleChars" and "recodeString" are then
obsolete and completely removed, as well as the
functionality to set "nativeCharset" to something else than utf-8.

Resolves: #72338
Releases: master
Change-Id: I9a5931bb5fd49a1434707f36b303aabf393465dc
Reviewed-on: https://review.typo3.org/45376
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Tested-by: Markus Klein <markus.klein@typo3.org>
Reviewed-by: Andreas Fernandez <typo3@scripting-base.de>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
typo3/sysext/core/Classes/Imaging/GraphicalFunctions.php
typo3/sysext/core/Documentation/Changelog/master/Breaking-72338-RemovedGraphicalFunctions-nativeCharset.rst [new file with mode: 0644]
typo3/sysext/frontend/Classes/Imaging/GifBuilder.php

index 1d83888..8603a7f 100644 (file)
@@ -284,13 +284,6 @@ class GraphicalFunctions
     public $csConvObj;
 
     /**
-     * Is set to the native character set of the input strings.
-     *
-     * @var string
-     */
-    public $nativeCharset = '';
-
-    /**
      * Init function. Must always call this when using the class.
      * This function will read the configuration information from $GLOBALS['TYPO3_CONF_VARS']['GFX'] can set some values in internal variables.
      *
@@ -356,16 +349,7 @@ class GraphicalFunctions
         if ($gfxConf['im_noScaleUp']) {
             $this->mayScaleUp = 0;
         }
-        if (TYPO3_MODE == 'FE') {
-            $this->csConvObj = $GLOBALS['TSFE']->csConvObj;
-        } elseif (is_object($GLOBALS['LANG'])) {
-            // BE assumed:
-            $this->csConvObj = $GLOBALS['LANG']->csConvObj;
-        } else {
-            // The object may not exist yet, so we need to create it now. Happens in the Install Tool for example.
-            $this->csConvObj = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Charset\CharsetConverter::class);
-        }
-        $this->nativeCharset = 'utf-8';
+        $this->csConvObj = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Charset\CharsetConverter::class);
     }
 
     /*************************************************
@@ -610,7 +594,7 @@ class GraphicalFunctions
         list($spacing, $wordSpacing) = $this->calcWordSpacing($conf);
         // Position
         $txtPos = $this->txtPosition($conf, $workArea, $conf['BBOX']);
-        $theText = $this->recodeString($conf['text']);
+        $theText = $conf['text'];
         if ($conf['imgMap'] && is_array($conf['imgMap.'])) {
             $this->addToMap($this->calcTextCordsForMap($conf['BBOX'][2], $txtPos, $conf['imgMap.']), $conf['imgMap.']);
         }
@@ -764,7 +748,7 @@ class GraphicalFunctions
     {
         $sF = $this->getTextScalFactor($conf);
         list($spacing, $wordSpacing) = $this->calcWordSpacing($conf, $sF);
-        $theText = $this->recodeString($conf['text']);
+        $theText = $conf['text'];
         $charInf = $this->ImageTTFBBoxWrapper($conf['fontSize'], $conf['angle'], $conf['fontFile'], $theText, $conf['splitRendering.'], $sF);
         $theBBoxInfo = $charInf;
         if ($conf['angle']) {
@@ -790,7 +774,7 @@ class GraphicalFunctions
                     $x += $wordW + $wordSpacing;
                 }
             } else {
-                $utf8Chars = $this->singleChars($theText);
+                $utf8Chars = $this->csConvObj->utf8_to_numberarray($theText, true, true);
                 // For each UTF-8 char, do:
                 foreach ($utf8Chars as $char) {
                     $charInf = $this->ImageTTFBBoxWrapper($conf['fontSize'], $conf['angle'], $conf['fontFile'], $char, $conf['splitRendering.'], $sF);
@@ -907,7 +891,7 @@ class GraphicalFunctions
                 $x += $wordW + $wordSpacing;
             }
         } else {
-            $utf8Chars = $this->singleChars($text);
+            $utf8Chars = $this->csConvObj->utf8_to_numberarray($text, true, true);
             // For each UTF-8 char, do:
             foreach ($utf8Chars as $char) {
                 $charInf = $this->ImageTTFBBoxWrapper($fontSize, $angle, $fontFile, $char, $splitRenderingConf, $sF);
@@ -938,7 +922,7 @@ class GraphicalFunctions
             } else {
                 do {
                     // Determine bounding box.
-                    $bounds = $this->ImageTTFBBoxWrapper($conf['fontSize'], $conf['angle'], $conf['fontFile'], $this->recodeString($conf['text']), $conf['splitRendering.']);
+                    $bounds = $this->ImageTTFBBoxWrapper($conf['fontSize'], $conf['angle'], $conf['fontFile'], $conf['text'], $conf['splitRendering.']);
                     if ($conf['angle'] < 0) {
                         $pixelWidth = abs($bounds[4] - $bounds[0]);
                     } elseif ($conf['angle'] > 0) {
@@ -1131,7 +1115,7 @@ class GraphicalFunctions
                                 $currentState = -1;
                                 $bankAccum = '';
                                 // Explode the string value by the word value to highlight:
-                                $utf8Chars = $this->singleChars($part['str']);
+                                $utf8Chars = $this->csConvObj->utf8_to_numberarray($part['str'], true, true);
                                 foreach ($utf8Chars as $utfChar) {
                                     // Find number and evaluate position:
                                     $uNumber = (int)$this->csConvObj->utf8CharToUnumber($utfChar);
@@ -1306,7 +1290,7 @@ class GraphicalFunctions
      */
     protected function getRenderedTextWidth($text, $conf)
     {
-        $bounds = $this->ImageTTFBBoxWrapper($conf['fontSize'], $conf['angle'], $conf['fontFile'], $this->recodeString($text), $conf['splitRendering.']);
+        $bounds = $this->ImageTTFBBoxWrapper($conf['fontSize'], $conf['angle'], $conf['fontFile'], $text, $conf['splitRendering.']);
         if ($conf['angle'] < 0) {
             $pixelWidth = abs($bounds[4] - $bounds[0]);
         } elseif ($conf['angle'] > 0) {
@@ -2088,46 +2072,6 @@ class GraphicalFunctions
     }
 
     /**
-     * Recode string
-     * Used with text strings for fonts when languages has other character sets.
-     *
-     * @param string The text to recode
-     * @return string The recoded string. Should be UTF-8 output. MAY contain entities (eg. &#123; or &#quot; which should render as real chars).
-     */
-    public function recodeString($string)
-    {
-        // Recode string to UTF-8 from $this->nativeCharset:
-        if ($this->nativeCharset && $this->nativeCharset != 'utf-8') {
-            // Convert to UTF-8
-            $string = $this->csConvObj->utf8_encode($string, $this->nativeCharset);
-        }
-        return $string;
-    }
-
-    /**
-     * Split a string into an array of individual characters
-     * The function will look at $this->nativeCharset and if that is set, the input string is expected to be UTF-8 encoded, possibly with entities in it. Otherwise the string is supposed to be a single-byte charset which is just splitted by a for-loop.
-     *
-     * @param string $theText The text string to split
-     * @param bool $returnUnicodeNumber Return Unicode numbers instead of chars.
-     * @return array Numerical array with a char as each value.
-     */
-    public function singleChars($theText, $returnUnicodeNumber = false)
-    {
-        if ($this->nativeCharset) {
-            // Get an array of separated UTF-8 chars
-            return $this->csConvObj->utf8_to_numberarray($theText, 1, $returnUnicodeNumber ? 0 : 1);
-        } else {
-            $output = array();
-            $c = strlen($theText);
-            for ($a = 0; $a < $c; $a++) {
-                $output[] = substr($theText, $a, 1);
-            }
-            return $output;
-        }
-    }
-
-    /**
      * Create an array with object position/boundaries based on input TypoScript configuration (such as the "align" property is used), the work area definition and $BB array
      *
      * @param array $conf TypoScript configuration for a GIFBUILDER object
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-72338-RemovedGraphicalFunctions-nativeCharset.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-72338-RemovedGraphicalFunctions-nativeCharset.rst
new file mode 100644 (file)
index 0000000..d6009f9
--- /dev/null
@@ -0,0 +1,33 @@
+============================================================
+Breaking: #72338 - Removed GraphicalFunctions->nativeCharset
+============================================================
+
+Description
+===========
+
+The property ``nativeCharset`` to allow GifBuilder to use other character-sets than UTF-8 for rendering text
+for was removed. The default behaviour is now to always consider multi-byte strings via CharsetConverter,
+as the data is expected to be UTF-8 at all times.
+
+Additionally the methods ``recodeString()`` and ``singleChars()`` have been removed as the direct equivalent from
+CharsetConverter is used.
+
+
+Impact
+======
+
+Calling any of the two methods above directly in PHP will result in a fatal error.
+
+Setting $nativeCharset to something else than UTF-8 will have no effect anymore.
+
+
+Affected Installations
+======================
+
+Installations with custom setups and third-party PHP code using GifBuilder or GraphicalFunctions and the ``$nativeCharset`` option.
+
+
+Migration
+=========
+
+Use ``CharsetConverter->utf8_to_numberarray()`` instead of the method ``singleChars()``.
\ No newline at end of file
index 932a55c..8d40967 100644 (file)
@@ -627,11 +627,7 @@ class GifBuilder extends GraphicalFunctions
         // Max length = 100 if automatic line braks are not defined:
         if (!isset($conf['breakWidth']) || !$conf['breakWidth']) {
             $tlen = (int)$conf['textMaxLength'] ?: 100;
-            if ($this->nativeCharset) {
-                $conf['text'] = $this->csConvObj->substr($this->nativeCharset, $conf['text'], 0, $tlen);
-            } else {
-                $conf['text'] = substr($conf['text'], 0, $tlen);
-            }
+            $conf['text'] = $this->csConvObj->substr('utf-8', $conf['text'], 0, $tlen);
         }
         if ((string)$conf['text'] != '') {
             // Char range map thingie: