[TASK] Remove iconv support and use mbstring-polyfill 07/50607/10
authorMarkus Klein <markus.klein@typo3.org>
Sat, 12 Nov 2016 15:21:22 +0000 (16:21 +0100)
committerBenni Mack <benni@typo3.org>
Mon, 5 Dec 2016 05:35:48 +0000 (06:35 +0100)
We remove the iconv support in the CharsetConverter as the PHP internal
implementation of some functions differ from their mb_string pendants.
This gives us a real headache in edge-cases.

We already have the mbstring-polyfill as an indirect dependency in
the Core (by symfony), so we simply require it our own now and use
mb_string all over the places.

This renders quite a few methods of CharsetConverter useless
and we therefore deprecate those.

Resolves: #78670
Releases: master
Change-Id: I88479f7939e0afb46f704d4e8f347abd2e10fc6d
Reviewed-on: https://review.typo3.org/50607
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
22 files changed:
composer.json
composer.lock
typo3/sysext/compatibility7/Classes/Controller/SearchFormController.php
typo3/sysext/core/Classes/Charset/CharsetConverter.php
typo3/sysext/core/Classes/DataHandling/DataHandler.php
typo3/sysext/core/Classes/Encoder/JavaScriptEncoder.php
typo3/sysext/core/Classes/Resource/Driver/AbstractHierarchicalFilesystemDriver.php
typo3/sysext/core/Classes/Utility/GeneralUtility.php
typo3/sysext/core/Documentation/Changelog/8.0/Breaking-72497-RemovedRecodeSupportForCharsetConversion.rst
typo3/sysext/core/Documentation/Changelog/8.0/Feature-72337-CharsetConversionAutodetection.rst
typo3/sysext/core/Documentation/Changelog/8.3/Deprecation-76804-DeprecateGeneralUtilitystrtoupperStrtolower.rst
typo3/sysext/core/Documentation/Changelog/master/Deprecation-78670-DeprecatedCharsetConverterMethods.rst [new file with mode: 0644]
typo3/sysext/extbase/Classes/Persistence/Generic/Query.php
typo3/sysext/fluid/Classes/ViewHelpers/Format/CaseViewHelper.php
typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php
typo3/sysext/frontend/Classes/Imaging/GifBuilder.php
typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php
typo3/sysext/indexed_search/Classes/Controller/SearchController.php
typo3/sysext/indexed_search/Classes/Indexer.php
typo3/sysext/indexed_search/Classes/Lexer.php
typo3/sysext/rtehtmlarea/Classes/Controller/SpellCheckingController.php
typo3/sysext/tstemplate/Classes/Controller/TypoScriptTemplateObjectBrowserModuleFunctionController.php

index 4a51f88..52ff451 100644 (file)
@@ -41,6 +41,7 @@
                "symfony/console": "^2.7 || ^3.0",
                "symfony/finder": "^2.7 || ^3.0",
                "symfony/yaml": "^2.7 || ^3.0",
+               "symfony/polyfill-mbstring": "^1.2",
                "doctrine/instantiator": "~1.0.4",
                "typo3/class-alias-loader": "^1.0",
                "typo3/cms-composer-installers": "^1.2.8",
@@ -58,8 +59,7 @@
                "se/selenium-server-standalone": "~2.53",
                "7elix/styleguide": "~8.0.0",
                "friendsofphp/php-cs-fixer": "^1.12",
-               "fiunchinho/phpunit-randomizer": "~2.0.3",
-               "symfony/polyfill-mbstring": "~1.0"
+               "fiunchinho/phpunit-randomizer": "~2.0.3"
        },
        "suggest": {
                "ext-gd": "GDlib/Freetype is required for building images with text (GIFBUILDER) and can also be used to scale images",
                },
                "classmap": ["typo3/sysext/extbase/Tests/Unit/Object/Container/Fixtures/"]
        }
-}
+}
\ No newline at end of file
index 82eb5ca..6b49f2e 100644 (file)
@@ -4,8 +4,8 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "hash": "817115618162896b9209f33975f48b61",
-    "content-hash": "52d660629158861352603cad26032273",
+    "hash": "603484fbb74f2a357f787ecd0ecb4e13",
+    "content-hash": "40dde6fea5fca829a627ed88d053a45d",
     "packages": [
         {
             "name": "cogpowered/finediff",
         },
         {
             "name": "doctrine/cache",
-            "version": "v1.6.0",
+            "version": "v1.6.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/cache.git",
-                "reference": "f8af318d14bdb0eff0336795b428b547bd39ccb6"
+                "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/cache/zipball/f8af318d14bdb0eff0336795b428b547bd39ccb6",
-                "reference": "f8af318d14bdb0eff0336795b428b547bd39ccb6",
+                "url": "https://api.github.com/repos/doctrine/cache/zipball/b6f544a20f4807e81f7044d31e679ccbb1866dc3",
+                "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3",
                 "shasum": ""
             },
             "require": {
                 "cache",
                 "caching"
             ],
-            "time": "2015-12-31 16:37:02"
+            "time": "2016-10-29 11:16:17"
         },
         {
             "name": "doctrine/collections",
         },
         {
             "name": "doctrine/common",
-            "version": "v2.6.1",
+            "version": "v2.6.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/common.git",
-                "reference": "a579557bc689580c19fee4e27487a67fe60defc0"
+                "reference": "7bce00698899aa2c06fe7365c76e4d78ddb15fa3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/common/zipball/a579557bc689580c19fee4e27487a67fe60defc0",
-                "reference": "a579557bc689580c19fee4e27487a67fe60defc0",
+                "url": "https://api.github.com/repos/doctrine/common/zipball/7bce00698899aa2c06fe7365c76e4d78ddb15fa3",
+                "reference": "7bce00698899aa2c06fe7365c76e4d78ddb15fa3",
                 "shasum": ""
             },
             "require": {
                 "persistence",
                 "spl"
             ],
-            "time": "2015-12-25 13:18:31"
+            "time": "2016-11-30 16:50:46"
         },
         {
             "name": "doctrine/dbal",
         },
         {
             "name": "guzzlehttp/promises",
-            "version": "1.2.0",
+            "version": "1.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/guzzle/promises.git",
-                "reference": "c10d860e2a9595f8883527fa0021c7da9e65f579"
+                "reference": "2693c101803ca78b27972d84081d027fca790a1e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/guzzle/promises/zipball/c10d860e2a9595f8883527fa0021c7da9e65f579",
-                "reference": "c10d860e2a9595f8883527fa0021c7da9e65f579",
+                "url": "https://api.github.com/repos/guzzle/promises/zipball/2693c101803ca78b27972d84081d027fca790a1e",
+                "reference": "2693c101803ca78b27972d84081d027fca790a1e",
                 "shasum": ""
             },
             "require": {
             "keywords": [
                 "promise"
             ],
-            "time": "2016-05-18 16:56:05"
+            "time": "2016-11-18 17:47:58"
         },
         {
             "name": "guzzlehttp/psr7",
         },
         {
             "name": "swiftmailer/swiftmailer",
-            "version": "v5.4.3",
+            "version": "v5.4.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/swiftmailer/swiftmailer.git",
-                "reference": "4cc92842069c2bbc1f28daaaf1d2576ec4dfe153"
+                "reference": "545ce9136690cea74f98f86fbb9c92dd9ab1a756"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/4cc92842069c2bbc1f28daaaf1d2576ec4dfe153",
-                "reference": "4cc92842069c2bbc1f28daaaf1d2576ec4dfe153",
+                "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/545ce9136690cea74f98f86fbb9c92dd9ab1a756",
+                "reference": "545ce9136690cea74f98f86fbb9c92dd9ab1a756",
                 "shasum": ""
             },
             "require": {
                 "mail",
                 "mailer"
             ],
-            "time": "2016-07-08 11:51:25"
+            "time": "2016-11-24 01:01:23"
         },
         {
             "name": "symfony/console",
-            "version": "v3.0.9",
+            "version": "v3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "926061e74229e935d3c5b4e9ba87237316c6693f"
+                "reference": "09d0fd33560e3573185a2ea17614e37ba38716c5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/926061e74229e935d3c5b4e9ba87237316c6693f",
-                "reference": "926061e74229e935d3c5b4e9ba87237316c6693f",
+                "url": "https://api.github.com/repos/symfony/console/zipball/09d0fd33560e3573185a2ea17614e37ba38716c5",
+                "reference": "09d0fd33560e3573185a2ea17614e37ba38716c5",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.5.9",
+                "symfony/debug": "~2.8|~3.0",
                 "symfony/polyfill-mbstring": "~1.0"
             },
             "require-dev": {
                 "psr/log": "~1.0",
                 "symfony/event-dispatcher": "~2.8|~3.0",
+                "symfony/filesystem": "~2.8|~3.0",
                 "symfony/process": "~2.8|~3.0"
             },
             "suggest": {
                 "psr/log": "For using the console logger",
                 "symfony/event-dispatcher": "",
+                "symfony/filesystem": "",
                 "symfony/process": ""
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.0-dev"
+                    "dev-master": "3.2-dev"
                 }
             },
             "autoload": {
             ],
             "description": "Symfony Console Component",
             "homepage": "https://symfony.com",
-            "time": "2016-07-30 07:22:48"
+            "time": "2016-11-16 22:18:16"
+        },
+        {
+            "name": "symfony/debug",
+            "version": "v3.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/debug.git",
+                "reference": "9f923e68d524a3095c5a2ae5fc7220c7cbc12231"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/debug/zipball/9f923e68d524a3095c5a2ae5fc7220c7cbc12231",
+                "reference": "9f923e68d524a3095c5a2ae5fc7220c7cbc12231",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "psr/log": "~1.0"
+            },
+            "conflict": {
+                "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+            },
+            "require-dev": {
+                "symfony/class-loader": "~2.8|~3.0",
+                "symfony/http-kernel": "~2.8|~3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Debug\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Debug Component",
+            "homepage": "https://symfony.com",
+            "time": "2016-11-16 22:18:16"
         },
         {
             "name": "symfony/finder",
-            "version": "v3.0.9",
+            "version": "v3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/finder.git",
-                "reference": "3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9"
+                "reference": "4263e35a1e342a0f195c9349c0dee38148f8a14f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9",
-                "reference": "3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/4263e35a1e342a0f195c9349c0dee38148f8a14f",
+                "reference": "4263e35a1e342a0f195c9349c0dee38148f8a14f",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.0-dev"
+                    "dev-master": "3.2-dev"
                 }
             },
             "autoload": {
             ],
             "description": "Symfony Finder Component",
             "homepage": "https://symfony.com",
-            "time": "2016-06-29 05:40:00"
+            "time": "2016-11-03 08:11:03"
         },
         {
             "name": "symfony/polyfill-mbstring",
-            "version": "v1.2.0",
+            "version": "v1.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-mbstring.git",
-                "reference": "dff51f72b0706335131b00a7f49606168c582594"
+                "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/dff51f72b0706335131b00a7f49606168c582594",
-                "reference": "dff51f72b0706335131b00a7f49606168c582594",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4",
+                "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.2-dev"
+                    "dev-master": "1.3-dev"
                 }
             },
             "autoload": {
                 "portable",
                 "shim"
             ],
-            "time": "2016-05-18 14:26:46"
+            "time": "2016-11-14 01:06:16"
         },
         {
             "name": "symfony/yaml",
-            "version": "v3.1.6",
+            "version": "v3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/yaml.git",
-                "reference": "7ff51b06c6c3d5cc6686df69004a42c69df09e27"
+                "reference": "f2300ba8fbb002c028710b92e1906e7457410693"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/yaml/zipball/7ff51b06c6c3d5cc6686df69004a42c69df09e27",
-                "reference": "7ff51b06c6c3d5cc6686df69004a42c69df09e27",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/f2300ba8fbb002c028710b92e1906e7457410693",
+                "reference": "f2300ba8fbb002c028710b92e1906e7457410693",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.5.9"
             },
+            "require-dev": {
+                "symfony/console": "~2.8|~3.0"
+            },
+            "suggest": {
+                "symfony/console": "For validating YAML files using the lint command"
+            },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.1-dev"
+                    "dev-master": "3.2-dev"
                 }
             },
             "autoload": {
             ],
             "description": "Symfony Yaml Component",
             "homepage": "https://symfony.com",
-            "time": "2016-10-24 18:41:13"
+            "time": "2016-11-18 21:17:59"
         },
         {
             "name": "typo3/class-alias-loader",
         },
         {
             "name": "behat/gherkin",
-            "version": "v4.4.4",
+            "version": "v4.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/Behat/Gherkin.git",
-                "reference": "cf8cc94647101e02a33d690245896d83d880aea1"
+                "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Behat/Gherkin/zipball/cf8cc94647101e02a33d690245896d83d880aea1",
-                "reference": "cf8cc94647101e02a33d690245896d83d880aea1",
+                "url": "https://api.github.com/repos/Behat/Gherkin/zipball/5c14cff4f955b17d20d088dec1bde61c0539ec74",
+                "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74",
                 "shasum": ""
             },
             "require": {
                 "gherkin",
                 "parser"
             ],
-            "time": "2016-09-18 12:16:14"
+            "time": "2016-10-30 11:50:56"
         },
         {
             "name": "codeception/codeception",
         },
         {
             "name": "friendsofphp/php-cs-fixer",
-            "version": "v1.12.2",
+            "version": "v1.13.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
-                "reference": "baa7112bef3b86c65fcfaae9a7a50436e3902b41"
+                "reference": "0ea4f7ed06ca55da1d8fc45da26ff87f261c4088"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/baa7112bef3b86c65fcfaae9a7a50436e3902b41",
-                "reference": "baa7112bef3b86c65fcfaae9a7a50436e3902b41",
+                "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/0ea4f7ed06ca55da1d8fc45da26ff87f261c4088",
+                "reference": "0ea4f7ed06ca55da1d8fc45da26ff87f261c4088",
                 "shasum": ""
             },
             "require": {
                 }
             ],
             "description": "A tool to automatically fix PHP code style",
-            "time": "2016-09-27 07:57:59"
+            "time": "2016-12-01 00:05:05"
         },
         {
             "name": "mikey179/vfsStream",
         },
         {
             "name": "myclabs/deep-copy",
-            "version": "1.5.4",
+            "version": "1.5.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/myclabs/DeepCopy.git",
-                "reference": "ea74994a3dc7f8d2f65a06009348f2d63c81e61f"
+                "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/ea74994a3dc7f8d2f65a06009348f2d63c81e61f",
-                "reference": "ea74994a3dc7f8d2f65a06009348f2d63c81e61f",
+                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/399c1f9781e222f6eb6cc238796f5200d1b7f108",
+                "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108",
                 "shasum": ""
             },
             "require": {
                 "object",
                 "object graph"
             ],
-            "time": "2016-09-16 13:37:59"
+            "time": "2016-10-31 17:19:45"
         },
         {
             "name": "phpdocumentor/reflection-common",
         },
         {
             "name": "phpdocumentor/type-resolver",
-            "version": "0.2",
+            "version": "0.2.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpDocumentor/TypeResolver.git",
-                "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443"
+                "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443",
-                "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443",
+                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb",
+                "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb",
                 "shasum": ""
             },
             "require": {
                     "email": "me@mikevanriel.com"
                 }
             ],
-            "time": "2016-06-10 07:14:17"
+            "time": "2016-11-25 06:54:22"
         },
         {
             "name": "phpspec/prophecy",
-            "version": "v1.6.1",
+            "version": "v1.6.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpspec/prophecy.git",
-                "reference": "58a8137754bc24b25740d4281399a4a3596058e0"
+                "reference": "6c52c2722f8460122f96f86346600e1077ce22cb"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0",
-                "reference": "58a8137754bc24b25740d4281399a4a3596058e0",
+                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/6c52c2722f8460122f96f86346600e1077ce22cb",
+                "reference": "6c52c2722f8460122f96f86346600e1077ce22cb",
                 "shasum": ""
             },
             "require": {
                 "php": "^5.3|^7.0",
                 "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
                 "sebastian/comparator": "^1.1",
-                "sebastian/recursion-context": "^1.0"
+                "sebastian/recursion-context": "^1.0|^2.0"
             },
             "require-dev": {
-                "phpspec/phpspec": "^2.0"
+                "phpspec/phpspec": "^2.0",
+                "phpunit/phpunit": "^4.8 || ^5.6.5"
             },
             "type": "library",
             "extra": {
                 "spy",
                 "stub"
             ],
-            "time": "2016-06-07 08:13:47"
+            "time": "2016-11-21 14:58:47"
         },
         {
             "name": "phpunit/php-code-coverage",
-            "version": "4.0.1",
+            "version": "4.0.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "5f3f7e736d6319d5f1fc402aff8b026da26709a3"
+                "reference": "903fd6318d0a90b4770a009ff73e4a4e9c437929"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5f3f7e736d6319d5f1fc402aff8b026da26709a3",
-                "reference": "5f3f7e736d6319d5f1fc402aff8b026da26709a3",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/903fd6318d0a90b4770a009ff73e4a4e9c437929",
+                "reference": "903fd6318d0a90b4770a009ff73e4a4e9c437929",
                 "shasum": ""
             },
             "require": {
                 "testing",
                 "xunit"
             ],
-            "time": "2016-07-26 14:39:29"
+            "time": "2016-11-28 16:00:31"
         },
         {
             "name": "phpunit/php-file-iterator",
-            "version": "1.4.1",
+            "version": "1.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
-                "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
+                "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
-                "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+                "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
                 "shasum": ""
             },
             "require": {
                 "filesystem",
                 "iterator"
             ],
-            "time": "2015-06-21 13:08:43"
+            "time": "2016-10-03 07:40:28"
         },
         {
             "name": "phpunit/php-text-template",
         },
         {
             "name": "phpunit/php-token-stream",
-            "version": "1.4.8",
+            "version": "1.4.9",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-token-stream.git",
-                "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da"
+                "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
-                "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b",
+                "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b",
                 "shasum": ""
             },
             "require": {
             "keywords": [
                 "tokenizer"
             ],
-            "time": "2015-09-15 10:49:45"
+            "time": "2016-11-15 14:06:22"
         },
         {
             "name": "phpunit/phpunit",
-            "version": "5.6.2",
+            "version": "5.7.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "cd13b23ac5a519a4708e00736c26ee0bb28b2e01"
+                "reference": "336aff0ac52e306c98e7455bc3e8d7b0bf777a5e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/cd13b23ac5a519a4708e00736c26ee0bb28b2e01",
-                "reference": "cd13b23ac5a519a4708e00736c26ee0bb28b2e01",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/336aff0ac52e306c98e7455bc3e8d7b0bf777a5e",
+                "reference": "336aff0ac52e306c98e7455bc3e8d7b0bf777a5e",
                 "shasum": ""
             },
             "require": {
                 "myclabs/deep-copy": "~1.3",
                 "php": "^5.6 || ^7.0",
                 "phpspec/prophecy": "^1.3.1",
-                "phpunit/php-code-coverage": "^4.0.1",
+                "phpunit/php-code-coverage": "^4.0.3",
                 "phpunit/php-file-iterator": "~1.4",
                 "phpunit/php-text-template": "~1.2",
                 "phpunit/php-timer": "^1.0.6",
                 "phpunit/phpunit-mock-objects": "^3.2",
-                "sebastian/comparator": "~1.1",
+                "sebastian/comparator": "~1.2.2",
                 "sebastian/diff": "~1.2",
-                "sebastian/environment": "^1.3 || ^2.0",
-                "sebastian/exporter": "~1.2",
+                "sebastian/environment": "^1.3.4 || ^2.0",
+                "sebastian/exporter": "~2.0",
                 "sebastian/global-state": "~1.0",
-                "sebastian/object-enumerator": "~1.0",
+                "sebastian/object-enumerator": "~2.0",
                 "sebastian/resource-operations": "~1.0",
                 "sebastian/version": "~1.0|~2.0",
                 "symfony/yaml": "~2.1|~3.0"
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "5.6.x-dev"
+                    "dev-master": "5.7.x-dev"
                 }
             },
             "autoload": {
                 "testing",
                 "xunit"
             ],
-            "time": "2016-10-25 07:40:25"
+            "time": "2016-12-03 08:33:00"
         },
         {
             "name": "phpunit/phpunit-mock-objects",
-            "version": "3.4.0",
+            "version": "3.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
-                "reference": "238d7a2723bce689c79eeac9c7d5e1d623bb9dc2"
+                "reference": "90a08f5deed5f7ac35463c161f2e8fa0e5652faf"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/238d7a2723bce689c79eeac9c7d5e1d623bb9dc2",
-                "reference": "238d7a2723bce689c79eeac9c7d5e1d623bb9dc2",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/90a08f5deed5f7ac35463c161f2e8fa0e5652faf",
+                "reference": "90a08f5deed5f7ac35463c161f2e8fa0e5652faf",
                 "shasum": ""
             },
             "require": {
                 "doctrine/instantiator": "^1.0.2",
                 "php": "^5.6 || ^7.0",
                 "phpunit/php-text-template": "^1.2",
-                "sebastian/exporter": "^1.2"
+                "sebastian/exporter": "^1.2 || ^2.0"
             },
             "conflict": {
                 "phpunit/phpunit": "<5.4.0"
                 "mock",
                 "xunit"
             ],
-            "time": "2016-10-09 07:01:45"
+            "time": "2016-11-27 07:52:03"
         },
         {
             "name": "se/selenium-server-standalone",
         },
         {
             "name": "sebastian/comparator",
-            "version": "1.2.0",
+            "version": "1.2.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/comparator.git",
-                "reference": "937efb279bd37a375bcadf584dec0726f84dbf22"
+                "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22",
-                "reference": "937efb279bd37a375bcadf584dec0726f84dbf22",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1ed12e8b2409076ab22e3897126211ff8b1f7f",
+                "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3",
                 "sebastian/diff": "~1.2",
-                "sebastian/exporter": "~1.2"
+                "sebastian/exporter": "~1.2 || ~2.0"
             },
             "require-dev": {
                 "phpunit/phpunit": "~4.4"
                 "compare",
                 "equality"
             ],
-            "time": "2015-07-26 15:48:44"
+            "time": "2016-11-19 09:18:40"
         },
         {
             "name": "sebastian/diff",
         },
         {
             "name": "sebastian/environment",
-            "version": "1.3.8",
+            "version": "2.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/environment.git",
-                "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea"
+                "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea",
-                "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+                "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.3.3 || ^7.0"
+                "php": "^5.6 || ^7.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^4.8 || ^5.0"
+                "phpunit/phpunit": "^5.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.3.x-dev"
+                    "dev-master": "2.0.x-dev"
                 }
             },
             "autoload": {
                 "environment",
                 "hhvm"
             ],
-            "time": "2016-08-18 05:49:44"
+            "time": "2016-11-26 07:53:53"
         },
         {
             "name": "sebastian/exporter",
-            "version": "1.2.2",
+            "version": "2.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/exporter.git",
-                "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
+                "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
-                "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+                "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3",
-                "sebastian/recursion-context": "~1.0"
+                "sebastian/recursion-context": "~2.0"
             },
             "require-dev": {
                 "ext-mbstring": "*",
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.3.x-dev"
+                    "dev-master": "2.0.x-dev"
                 }
             },
             "autoload": {
                 "export",
                 "exporter"
             ],
-            "time": "2016-06-17 09:04:28"
+            "time": "2016-11-19 08:54:04"
         },
         {
             "name": "sebastian/global-state",
         },
         {
             "name": "sebastian/object-enumerator",
-            "version": "1.0.0",
+            "version": "2.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/object-enumerator.git",
-                "reference": "d4ca2fb70344987502567bc50081c03e6192fb26"
+                "reference": "96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/d4ca2fb70344987502567bc50081c03e6192fb26",
-                "reference": "d4ca2fb70344987502567bc50081c03e6192fb26",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35",
+                "reference": "96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.6",
-                "sebastian/recursion-context": "~1.0"
+                "sebastian/recursion-context": "~2.0"
             },
             "require-dev": {
                 "phpunit/phpunit": "~5"
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0.x-dev"
+                    "dev-master": "2.0.x-dev"
                 }
             },
             "autoload": {
             ],
             "description": "Traverses array structures and object graphs to enumerate all referenced objects",
             "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
-            "time": "2016-01-28 13:25:10"
+            "time": "2016-11-19 07:35:10"
         },
         {
             "name": "sebastian/recursion-context",
-            "version": "1.0.2",
+            "version": "2.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/recursion-context.git",
-                "reference": "913401df809e99e4f47b27cdd781f4a258d58791"
+                "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791",
-                "reference": "913401df809e99e4f47b27cdd781f4a258d58791",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+                "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0.x-dev"
+                    "dev-master": "2.0.x-dev"
                 }
             },
             "autoload": {
             ],
             "description": "Provides functionality to recursively process PHP variables",
             "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
-            "time": "2015-11-11 19:50:13"
+            "time": "2016-11-19 07:33:16"
         },
         {
             "name": "sebastian/resource-operations",
         },
         {
             "name": "sebastian/version",
-            "version": "2.0.0",
+            "version": "2.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/version.git",
-                "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5"
+                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5",
-                "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5",
+                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
+                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
                 "shasum": ""
             },
             "require": {
             ],
             "description": "Library that helps with managing the version number of Git-hosted PHP projects",
             "homepage": "https://github.com/sebastianbergmann/version",
-            "time": "2016-02-04 12:56:52"
+            "time": "2016-10-03 07:35:21"
         },
         {
             "name": "symfony/browser-kit",
-            "version": "v3.1.6",
+            "version": "v3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/browser-kit.git",
-                "reference": "901319a31c9b3cee7857b4aeeb81b5d64dfa34fc"
+                "reference": "34348c2691ce6254e8e008026f4c5e72c22bb318"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/browser-kit/zipball/901319a31c9b3cee7857b4aeeb81b5d64dfa34fc",
-                "reference": "901319a31c9b3cee7857b4aeeb81b5d64dfa34fc",
+                "url": "https://api.github.com/repos/symfony/browser-kit/zipball/34348c2691ce6254e8e008026f4c5e72c22bb318",
+                "reference": "34348c2691ce6254e8e008026f4c5e72c22bb318",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.1-dev"
+                    "dev-master": "3.2-dev"
                 }
             },
             "autoload": {
             ],
             "description": "Symfony BrowserKit Component",
             "homepage": "https://symfony.com",
-            "time": "2016-09-06 11:02:40"
+            "time": "2016-10-13 13:35:11"
         },
         {
             "name": "symfony/css-selector",
-            "version": "v3.1.6",
+            "version": "v3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/css-selector.git",
-                "reference": "ca809c64072e0fe61c1c7fb3c76cdc32265042ac"
+                "reference": "e1241f275814827c411d922ba8e64cf2a00b2994"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/css-selector/zipball/ca809c64072e0fe61c1c7fb3c76cdc32265042ac",
-                "reference": "ca809c64072e0fe61c1c7fb3c76cdc32265042ac",
+                "url": "https://api.github.com/repos/symfony/css-selector/zipball/e1241f275814827c411d922ba8e64cf2a00b2994",
+                "reference": "e1241f275814827c411d922ba8e64cf2a00b2994",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.1-dev"
+                    "dev-master": "3.2-dev"
                 }
             },
             "autoload": {
             ],
             "description": "Symfony CssSelector Component",
             "homepage": "https://symfony.com",
-            "time": "2016-09-06 11:02:40"
+            "time": "2016-11-03 08:11:03"
         },
         {
             "name": "symfony/dom-crawler",
-            "version": "v3.1.6",
+            "version": "v3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/dom-crawler.git",
-                "reference": "59eee3c76eb89f21857798620ebdad7a05ad14f4"
+                "reference": "c6b6111f5aae7c58698cdc10220785627ac44a2c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/59eee3c76eb89f21857798620ebdad7a05ad14f4",
-                "reference": "59eee3c76eb89f21857798620ebdad7a05ad14f4",
+                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/c6b6111f5aae7c58698cdc10220785627ac44a2c",
+                "reference": "c6b6111f5aae7c58698cdc10220785627ac44a2c",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.1-dev"
+                    "dev-master": "3.2-dev"
                 }
             },
             "autoload": {
             ],
             "description": "Symfony DomCrawler Component",
             "homepage": "https://symfony.com",
-            "time": "2016-10-18 15:46:07"
+            "time": "2016-11-25 12:32:42"
         },
         {
             "name": "symfony/event-dispatcher",
-            "version": "v3.1.6",
+            "version": "v3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher.git",
-                "reference": "28b0832b2553ffb80cabef6a7a812ff1e670c0bc"
+                "reference": "e8f47a327c2f0fd5aa04fa60af2b693006ed7283"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/28b0832b2553ffb80cabef6a7a812ff1e670c0bc",
-                "reference": "28b0832b2553ffb80cabef6a7a812ff1e670c0bc",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e8f47a327c2f0fd5aa04fa60af2b693006ed7283",
+                "reference": "e8f47a327c2f0fd5aa04fa60af2b693006ed7283",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.1-dev"
+                    "dev-master": "3.2-dev"
                 }
             },
             "autoload": {
             ],
             "description": "Symfony EventDispatcher Component",
             "homepage": "https://symfony.com",
-            "time": "2016-10-13 06:28:43"
+            "time": "2016-10-13 06:29:04"
         },
         {
             "name": "symfony/filesystem",
-            "version": "v3.1.6",
+            "version": "v3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/filesystem.git",
-                "reference": "0565b61bf098cb4dc09f4f103f033138ae4f42c6"
+                "reference": "8d4cf7561a5b17e5eb7a02b80d0b8f014a3796d4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/filesystem/zipball/0565b61bf098cb4dc09f4f103f033138ae4f42c6",
-                "reference": "0565b61bf098cb4dc09f4f103f033138ae4f42c6",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/8d4cf7561a5b17e5eb7a02b80d0b8f014a3796d4",
+                "reference": "8d4cf7561a5b17e5eb7a02b80d0b8f014a3796d4",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.1-dev"
+                    "dev-master": "3.2-dev"
                 }
             },
             "autoload": {
             ],
             "description": "Symfony Filesystem Component",
             "homepage": "https://symfony.com",
-            "time": "2016-10-18 04:30:12"
+            "time": "2016-11-24 00:46:43"
         },
         {
             "name": "symfony/process",
-            "version": "v3.1.6",
+            "version": "v3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "66de154ae86b1a07001da9fbffd620206e4faf94"
+                "reference": "02ea84847aad71be7e32056408bb19f3a616cdd3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/66de154ae86b1a07001da9fbffd620206e4faf94",
-                "reference": "66de154ae86b1a07001da9fbffd620206e4faf94",
+                "url": "https://api.github.com/repos/symfony/process/zipball/02ea84847aad71be7e32056408bb19f3a616cdd3",
+                "reference": "02ea84847aad71be7e32056408bb19f3a616cdd3",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.1-dev"
+                    "dev-master": "3.2-dev"
                 }
             },
             "autoload": {
             ],
             "description": "Symfony Process Component",
             "homepage": "https://symfony.com",
-            "time": "2016-09-29 14:13:09"
+            "time": "2016-11-24 10:40:28"
         },
         {
             "name": "symfony/stopwatch",
-            "version": "v3.1.6",
+            "version": "v3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/stopwatch.git",
-                "reference": "bb42806b12c5f89db4ebf64af6741afe6d8457e1"
+                "reference": "5b139e1c4290e6c7640ba80d9c9b5e49ef22b841"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/stopwatch/zipball/bb42806b12c5f89db4ebf64af6741afe6d8457e1",
-                "reference": "bb42806b12c5f89db4ebf64af6741afe6d8457e1",
+                "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b139e1c4290e6c7640ba80d9c9b5e49ef22b841",
+                "reference": "5b139e1c4290e6c7640ba80d9c9b5e49ef22b841",
                 "shasum": ""
             },
             "require": {
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.1-dev"
+                    "dev-master": "3.2-dev"
                 }
             },
             "autoload": {
             ],
             "description": "Symfony Stopwatch Component",
             "homepage": "https://symfony.com",
-            "time": "2016-06-29 05:41:56"
+            "time": "2016-06-29 05:43:10"
         },
         {
             "name": "webmozart/assert",
-            "version": "1.1.0",
+            "version": "1.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/webmozart/assert.git",
-                "reference": "bb2d123231c095735130cc8f6d31385a44c7b308"
+                "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/webmozart/assert/zipball/bb2d123231c095735130cc8f6d31385a44c7b308",
-                "reference": "bb2d123231c095735130cc8f6d31385a44c7b308",
+                "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f",
+                "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.3.3|^7.0"
+                "php": "^5.3.3 || ^7.0"
             },
             "require-dev": {
                 "phpunit/phpunit": "^4.6",
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.2-dev"
+                    "dev-master": "1.3-dev"
                 }
             },
             "autoload": {
                 "check",
                 "validate"
             ],
-            "time": "2016-08-09 15:02:57"
+            "time": "2016-11-23 20:04:58"
         }
     ],
     "aliases": [],
index 5ae865f..e0966af 100644 (file)
@@ -340,9 +340,9 @@ class SearchFormController extends \TYPO3\CMS\Frontend\Plugin\AbstractPlugin
         }
         // Add operators for various languages
         // Converts the operators to lowercase
-        $this->operator_translate_table[] = [$this->charsetConverter->conv_case('utf-8', $this->pi_getLL('local_operator_AND'), 'toLower'), 'AND'];
-        $this->operator_translate_table[] = [$this->charsetConverter->conv_case('utf-8', $this->pi_getLL('local_operator_OR'), 'toLower'), 'OR'];
-        $this->operator_translate_table[] = [$this->charsetConverter->conv_case('utf-8', $this->pi_getLL('local_operator_NOT'), 'toLower'), 'AND NOT'];
+        $this->operator_translate_table[] = [mb_strtolower($this->pi_getLL('local_operator_AND'), 'utf-8'), 'AND'];
+        $this->operator_translate_table[] = [mb_strtolower($this->pi_getLL('local_operator_OR'), 'utf-8'), 'OR'];
+        $this->operator_translate_table[] = [mb_strtolower($this->pi_getLL('local_operator_NOT'), 'utf-8'), 'AND NOT'];
         // This is the id of the site root. This value may be a commalist of integer (prepared for this)
         $this->wholeSiteIdList = (int)$this->frontendController->config['rootLine'][0]['uid'];
         // Creating levels for section menu:
@@ -2173,7 +2173,7 @@ class SearchFormController extends \TYPO3\CMS\Frontend\Plugin\AbstractPlugin
         foreach ($parts as $k => $strP) {
             if ($k % 2 == 0) {
                 // Find length of the summary part:
-                $strLen = $this->charsetConverter->strlen('utf-8', $parts[$k]);
+                $strLen = mb_strlen($parts[$k], 'utf-8');
                 $output[$k] = $parts[$k];
                 // Possibly shorten string:
                 if (!$k) {
@@ -2192,7 +2192,7 @@ class SearchFormController extends \TYPO3\CMS\Frontend\Plugin\AbstractPlugin
                         $output[$k] = preg_replace('/[[:space:]][^[:space:]]+$/', '', $this->charsetConverter->crop('utf-8', $parts[$k], ($postPreLgd - $postPreLgd_offset))) . $divider . preg_replace('/^[^[:space:]]+[[:space:]]/', '', $this->charsetConverter->crop('utf-8', $parts[$k], -($postPreLgd - $postPreLgd_offset)));
                     }
                 }
-                $summaryLgd += $this->charsetConverter->strlen('utf-8', $output[$k]);
+                $summaryLgd += mb_strlen($output[$k], 'utf-8');
                 // Protect output:
                 $output[$k] = htmlspecialchars($output[$k]);
                 // If summary lgd is exceed, break the process:
@@ -2200,7 +2200,7 @@ class SearchFormController extends \TYPO3\CMS\Frontend\Plugin\AbstractPlugin
                     break;
                 }
             } else {
-                $summaryLgd += $this->charsetConverter->strlen('utf-8', $strP);
+                $summaryLgd += mb_strlen($strP, 'utf-8');
                 $output[$k] = '<strong class="tx-indexedsearch-redMarkup">' . htmlspecialchars($parts[$k]) . '</strong>';
             }
         }
index e52d62d..faa0681 100644 (file)
@@ -54,22 +54,6 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
 class CharsetConverter implements SingletonInterface
 {
     /**
-     * Possible strategies for handling multi-byte data
-     * Only used for internal purpose
-     * @internal
-     */
-    const STRATEGY_MBSTRING = 'mbstring';
-    const STRATEGY_ICONV = 'iconv';
-    const STRATEGY_FALLBACK = 'fallback';
-
-    /**
-     * Set to one of the strategies above, based on the availability of the environment.
-     *
-     * @var string
-     */
-    protected $conversionStrategy = null;
-
-    /**
      * ASCII Value for chars with no equivalent.
      *
      * @var int
@@ -110,6 +94,7 @@ class CharsetConverter implements SingletonInterface
      * This tells the converter which charsets has four bytes per char:
      *
      * @var array
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9
      */
     public $fourByteSets = [
         'ucs-4' => 1, // 4-byte Unicode
@@ -332,21 +317,11 @@ class CharsetConverter implements SingletonInterface
         }
         // PHP-libs don't support fallback to SGML entities, but UTF-8 handles everything
         if ($toCharset === 'utf-8' || !$useEntityForNoChar) {
-            switch ($this->getConversionStrategy()) {
-                case self::STRATEGY_MBSTRING:
-                    $convertedString = mb_convert_encoding($inputString, $toCharset, $fromCharset);
-                    if (false !== $convertedString) {
-                        return $convertedString;
-                    }
-                    // Returns FALSE for unsupported charsets
-                    break;
-                case self::STRATEGY_ICONV:
-                    $convertedString = iconv($fromCharset, $toCharset . '//TRANSLIT', $inputString);
-                    if (false !== $convertedString) {
-                        return $convertedString;
-                    }
-                    break;
+            $convertedString = mb_convert_encoding($inputString, $toCharset, $fromCharset);
+            if (false !== $convertedString) {
+                return $convertedString;
             }
+            // Returns FALSE for unsupported charsets
         }
         if ($fromCharset !== 'utf-8') {
             $inputString = $this->utf8_encode($inputString, $fromCharset);
@@ -436,6 +411,7 @@ class CharsetConverter implements SingletonInterface
             }
             return $outStr;
         }
+        return '';
     }
 
     /**
@@ -504,6 +480,7 @@ class CharsetConverter implements SingletonInterface
             }
             return $outStr;
         }
+        return '';
     }
 
     /**
@@ -773,6 +750,8 @@ class CharsetConverter implements SingletonInterface
                             if (!$detectedType) {
                                 $detectedType = preg_match('/[[:space:]]*0x([[:alnum:]]*)[[:space:]]+0x([[:alnum:]]*)[[:space:]]+/', $value) ? 'whitespaced' : 'ms-token';
                             }
+                            $hexbyte = '';
+                            $utf8 = '';
                             if ($detectedType === 'ms-token') {
                                 list($hexbyte, $utf8) = preg_split('/[=:]/', $value, 3);
                             } elseif ($detectedType === 'whitespaced') {
@@ -1159,49 +1138,12 @@ class CharsetConverter implements SingletonInterface
      * @param int $len Length (in characters)
      * @return string The substring
      * @see substr(), mb_substr()
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9, use mb_substr() directly
      */
     public function substr($charset, $string, $start, $len = null)
     {
-        if ($len === 0 || $string === '') {
-            return '';
-        }
-        if ($this->getConversionStrategy() === self::STRATEGY_MBSTRING) {
-            // Cannot omit $len, when specifying charset
-            if ($len === null) {
-                // Save internal encoding
-                $enc = mb_internal_encoding();
-                mb_internal_encoding($charset);
-                $str = mb_substr($string, $start);
-                // Restore internal encoding
-                mb_internal_encoding($enc);
-                return $str;
-            } else {
-                return mb_substr($string, $start, $len, $charset);
-            }
-        } elseif ($this->getConversionStrategy() === self::STRATEGY_ICONV) {
-            // Cannot omit $len, when specifying charset
-            if ($len === null) {
-                // Save internal encoding
-                $enc = iconv_get_encoding('internal_encoding');
-                iconv_set_encoding('internal_encoding', $charset);
-                $str = iconv_substr($string, $start);
-                // Restore internal encoding
-                iconv_set_encoding('internal_encoding', $enc);
-                return $str;
-            } else {
-                return iconv_substr($string, $start, $len, $charset);
-            }
-        } elseif ($charset === 'utf-8') {
-            return $this->utf8_substr($string, $start, $len);
-        } elseif ($this->eucBasedSets[$charset]) {
-            return $this->euc_substr($string, $start, $charset, $len);
-        } elseif ($this->twoByteSets[$charset]) {
-            return substr($string, $start * 2, $len * 2);
-        } elseif ($this->fourByteSets[$charset]) {
-            return substr($string, $start * 4, $len * 4);
-        }
-        // Treat everything else as single-byte encoding
-        return $len === null ? substr($string, $start) : substr($string, $start, $len);
+        GeneralUtility::logDeprecatedFunction();
+        return mb_substr($string, $start, $len, $charset);
     }
 
     /**
@@ -1212,47 +1154,12 @@ class CharsetConverter implements SingletonInterface
      * @param string $string Character string
      * @return int The number of characters
      * @see strlen()
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9, use mb_strlen() directly
      */
     public function strlen($charset, $string)
     {
-        if ($this->getConversionStrategy() === self::STRATEGY_MBSTRING) {
-            return mb_strlen($string, $charset);
-        } elseif ($this->getConversionStrategy() === self::STRATEGY_ICONV) {
-            return iconv_strlen($string, $charset);
-        } elseif ($charset === 'utf-8') {
-            return $this->utf8_strlen($string);
-        } elseif ($this->eucBasedSets[$charset]) {
-            return $this->euc_strlen($string, $charset);
-        } elseif ($this->twoByteSets[$charset]) {
-            return strlen($string) / 2;
-        } elseif ($this->fourByteSets[$charset]) {
-            return strlen($string) / 4;
-        }
-        // Treat everything else as single-byte encoding
-        return strlen($string);
-    }
-
-    /**
-     * Method to crop strings using the mb_substr function.
-     *
-     * @param string $charset The character set
-     * @param string $string String to be cropped
-     * @param int $len Crop length (in characters)
-     * @param string $crop Crop signifier
-     * @return string The shortened string
-     * @see mb_strlen(), mb_substr()
-     */
-    protected function cropMbstring($charset, $string, $len, $crop = '')
-    {
-        if ((int)$len === 0 || mb_strlen($string, $charset) <= abs($len)) {
-            return $string;
-        }
-        if ($len > 0) {
-            $string = mb_substr($string, 0, $len, $charset) . $crop;
-        } else {
-            $string = $crop . mb_substr($string, $len, mb_strlen($string, $charset), $charset);
-        }
-        return $string;
+        GeneralUtility::logDeprecatedFunction();
+        return mb_strlen($string, $charset);
     }
 
     /**
@@ -1268,39 +1175,13 @@ class CharsetConverter implements SingletonInterface
      */
     public function crop($charset, $string, $len, $crop = '')
     {
-        if ($this->getConversionStrategy() === self::STRATEGY_MBSTRING) {
-            return $this->cropMbstring($charset, $string, $len, $crop);
-        }
-        if ((int)$len === 0) {
+        if ((int)$len === 0 || mb_strlen($string, $charset) <= abs($len)) {
             return $string;
         }
-        if ($charset === 'utf-8') {
-            $i = $this->utf8_char2byte_pos($string, $len);
-        } elseif ($this->eucBasedSets[$charset]) {
-            $i = $this->euc_char2byte_pos($string, $len, $charset);
-        } else {
-            if ($len > 0) {
-                $i = $len;
-            } else {
-                $i = strlen($string) + $len;
-                if ($i <= 0) {
-                    $i = false;
-                }
-            }
-        }
-        // $len outside actual string length
-        if ($i === false) {
-            return $string;
+        if ($len > 0) {
+            $string = mb_substr($string, 0, $len, $charset) . $crop;
         } else {
-            if ($len > 0) {
-                if (isset($string[$i])) {
-                    return substr($string, 0, $i) . $crop;
-                }
-            } else {
-                if (isset($string[$i - 1])) {
-                    return $crop . substr($string, $i);
-                }
-            }
+            $string = $crop . mb_substr($string, $len, mb_strlen($string, $charset), $charset);
         }
         return $string;
     }
@@ -1319,23 +1200,7 @@ class CharsetConverter implements SingletonInterface
         if ($len <= 0) {
             return '';
         }
-        if ($this->getConversionStrategy() === self::STRATEGY_MBSTRING) {
-            return mb_strcut($string, 0, $len, $charset);
-        } elseif ($charset === 'utf-8') {
-            return $this->utf8_strtrunc($string, $len);
-        } elseif ($this->eucBasedSets[$charset]) {
-            return $this->euc_strtrunc($string, $len, $charset);
-        } elseif ($this->twoByteSets[$charset]) {
-            if ($len % 2) {
-                $len--;
-            }
-        } elseif ($this->fourByteSets[$charset]) {
-            $x = $len % 4;
-            // Realign to position dividable by four
-            $len -= $x;
-        }
-        // Treat everything else as single-byte encoding
-        return substr($string, 0, $len);
+        return mb_strcut($string, 0, $len, $charset);
     }
 
     /**
@@ -1351,24 +1216,14 @@ class CharsetConverter implements SingletonInterface
      * @param string $case Case keyword: "toLower" means lowercase conversion, anything else is uppercase (use "toUpper" )
      * @return string The converted string
      * @see strtolower(), strtoupper()
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9, use mb_strtolower() or mb_strtoupper() directly
      */
     public function conv_case($charset, $string, $case)
     {
-        if ($this->getConversionStrategy() === self::STRATEGY_MBSTRING) {
-            if ($case === 'toLower') {
-                $string = mb_strtolower($string, $charset);
-            } else {
-                $string = mb_strtoupper($string, $charset);
-            }
-        } elseif ($charset === 'utf-8') {
-            $string = $this->utf8_char_mapping($string, 'case', $case);
-        } elseif (isset($this->eucBasedSets[$charset])) {
-            $string = $this->euc_char_mapping($string, $charset, 'case', $case);
-        } else {
-            // Treat everything else as single-byte encoding
-            $string = $this->sb_char_mapping($string, $charset, 'case', $case);
-        }
-        return $string;
+        GeneralUtility::logDeprecatedFunction();
+        return $case === 'toLower'
+            ? mb_strtolower($string, $charset)
+            : mb_strtoupper($string, $charset);
     }
 
     /**
@@ -1376,15 +1231,16 @@ class CharsetConverter implements SingletonInterface
      *
      * @param string $charset
      * @param string $string
-     * @param string $case
+     * @param string $case can be 'toLower' or 'toUpper'
      * @return string
-     * @see \TYPO3\CMS\Core\Charset\CharsetConverter::conv_case()
      */
     public function convCaseFirst($charset, $string, $case)
     {
-        $firstChar = $this->substr($charset, $string, 0, 1);
-        $firstChar = $this->conv_case($charset, $firstChar, $case);
-        $remainder = $this->substr($charset, $string, 1);
+        $firstChar = mb_substr($string, 0, 1, $charset);
+        $firstChar = $case === 'toLower'
+            ? mb_strtolower($firstChar, $charset)
+            : mb_strtoupper($firstChar, $charset);
+        $remainder = mb_substr($string, 1, null, $charset);
         return $firstChar . $remainder;
     }
 
@@ -1394,14 +1250,12 @@ class CharsetConverter implements SingletonInterface
      * @param string $charset
      * @param string $string
      * @return string
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9, use mb_convert_case() directly
      */
     public function convCapitalize($charset, $string)
     {
-        if ($this->getConversionStrategy() === self::STRATEGY_MBSTRING) {
-            return mb_convert_case($string, MB_CASE_TITLE, $charset);
-        } else {
-            return ucwords($string);
-        }
+        GeneralUtility::logDeprecatedFunction();
+        return mb_convert_case($string, MB_CASE_TITLE, $charset);
     }
 
     /**
@@ -1500,9 +1354,11 @@ class CharsetConverter implements SingletonInterface
      * @param int $len Length (in characters)
      * @return string The substring
      * @see substr()
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9, use mb_substr() directly
      */
     public function utf8_substr($str, $start, $len = null)
     {
+        GeneralUtility::logDeprecatedFunction();
         if ((string)$len === '0') {
             return '';
         }
@@ -1535,9 +1391,11 @@ class CharsetConverter implements SingletonInterface
      * @param string $str UTF-8 multibyte character string
      * @return int The number of characters
      * @see strlen()
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9, use mb_strlen() directly
      */
     public function utf8_strlen($str)
     {
+        GeneralUtility::logDeprecatedFunction();
         $n = 0;
         for ($i = 0; isset($str[$i]); $i++) {
             $c = ord($str[$i]);
@@ -1559,9 +1417,11 @@ class CharsetConverter implements SingletonInterface
      * @param int $len The byte length
      * @return string The shortened string
      * @see mb_strcut()
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9, use mb_strcut() directly
      */
     public function utf8_strtrunc($str, $len)
     {
+        GeneralUtility::logDeprecatedFunction();
         $i = $len - 1;
         // Part of a multibyte sequence
         if (ord($str[$i]) & 128) {
@@ -1590,25 +1450,12 @@ class CharsetConverter implements SingletonInterface
      * @param int $offset Position to start the search
      * @return int The character position
      * @see strpos()
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9, use mb_strpos() directly
      */
     public function utf8_strpos($haystack, $needle, $offset = 0)
     {
-        if ($this->getConversionStrategy() === self::STRATEGY_MBSTRING) {
-            return mb_strpos($haystack, $needle, $offset, 'utf-8');
-        } elseif ($this->getConversionStrategy() === self::STRATEGY_ICONV) {
-            return iconv_strpos($haystack, $needle, $offset, 'utf-8');
-        }
-        $byte_offset = $this->utf8_char2byte_pos($haystack, $offset);
-        if ($byte_offset === false) {
-            // Offset beyond string length
-            return false;
-        }
-        $byte_pos = strpos($haystack, $needle, $byte_offset);
-        if ($byte_pos === false) {
-            // Needle not found
-            return false;
-        }
-        return $this->utf8_byte2char_pos($haystack, $byte_pos);
+        GeneralUtility::logDeprecatedFunction();
+        return mb_strpos($haystack, $needle, $offset, 'utf-8');
     }
 
     /**
@@ -1618,20 +1465,12 @@ class CharsetConverter implements SingletonInterface
      * @param string $needle UTF-8 character to search for (single character)
      * @return int The character position
      * @see strrpos()
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9, use mb_strrpos() directly
      */
     public function utf8_strrpos($haystack, $needle)
     {
-        if ($this->getConversionStrategy() === self::STRATEGY_MBSTRING) {
-            return mb_strrpos($haystack, $needle, 'utf-8');
-        } elseif ($this->getConversionStrategy() === self::STRATEGY_ICONV) {
-            return iconv_strrpos($haystack, $needle, 'utf-8');
-        }
-        $byte_pos = strrpos($haystack, $needle);
-        if ($byte_pos === false) {
-            // Needle not found
-            return false;
-        }
-        return $this->utf8_byte2char_pos($haystack, $byte_pos);
+        GeneralUtility::logDeprecatedFunction();
+        return mb_strrpos($haystack, $needle, 'utf-8');
     }
 
     /**
@@ -1688,9 +1527,11 @@ class CharsetConverter implements SingletonInterface
      * @param string $str UTF-8 string
      * @param int $pos Byte position
      * @return int Character position
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9, former internal function only
      */
     public function utf8_byte2char_pos($str, $pos)
     {
+        GeneralUtility::logDeprecatedFunction();
         // Number of characters
         $n = 0;
         for ($i = $pos; $i > 0; $i--) {
@@ -1737,6 +1578,7 @@ class CharsetConverter implements SingletonInterface
         }
         for ($i = 0; isset($str[$i]); $i++) {
             $c = ord($str[$i]);
+            $mbc = '';
             // single-byte (0xxxxxx)
             if (!($c & 128)) {
                 $mbc = $str[$i];
@@ -1777,9 +1619,11 @@ class CharsetConverter implements SingletonInterface
      * @param string $charset The charset
      * @return string The shortened string
      * @see mb_strcut()
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9, use mb_strcut() directly
      */
     public function euc_strtrunc($str, $len, $charset)
     {
+        GeneralUtility::logDeprecatedFunction();
         $shiftJis = $charset === 'shift_jis';
         for ($i = 0; isset($str[$i]) && $i < $len; $i++) {
             $c = ord($str[$i]);
@@ -1813,9 +1657,11 @@ class CharsetConverter implements SingletonInterface
      * @param string $charset The charset
      * @param int $len Length (in characters)
      * @return string the substring
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9, use mb_substr() directly
      */
     public function euc_substr($str, $start, $charset, $len = null)
     {
+        GeneralUtility::logDeprecatedFunction();
         $byte_start = $this->euc_char2byte_pos($str, $start, $charset);
         if ($byte_start === false) {
             // $start outside string length
@@ -1842,9 +1688,11 @@ class CharsetConverter implements SingletonInterface
      * @param string $charset The charset
      * @return int The number of characters
      * @see strlen()
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9, use mb_strlen() directly
      */
     public function euc_strlen($str, $charset)
     {
+        GeneralUtility::logDeprecatedFunction();
         $sjis = $charset === 'shift_jis';
         $n = 0;
         for ($i = 0; isset($str[$i]); $i++) {
@@ -1870,9 +1718,11 @@ class CharsetConverter implements SingletonInterface
      * @param int $pos Character position (negative values start from the end)
      * @param string $charset The charset
      * @return int Byte position
+     * @deprecated since TYPO3 v8, will be removed with TYPO3 v9, former internal function only
      */
     public function euc_char2byte_pos($str, $pos, $charset)
     {
+        GeneralUtility::logDeprecatedFunction();
         $sjis = $charset === 'shift_jis';
         // Number of characters seen
         $n = 0;
@@ -1964,25 +1814,4 @@ class CharsetConverter implements SingletonInterface
         }
         return $out;
     }
-
-    /**
-     * Checks the selected strategy based on which method is available in the system.
-     * "mbstring" takes precedence over "iconv".
-     * See http://stackoverflow.com/questions/8233517/what-is-the-difference-between-iconv-and-mb-convert-encoding-in-php
-     *
-     * @return string could be "mbstring", "iconv" or "fallback"
-     */
-    protected function getConversionStrategy()
-    {
-        if ($this->conversionStrategy === null) {
-            if (extension_loaded('mbstring')) {
-                $this->conversionStrategy = self::STRATEGY_MBSTRING;
-            } elseif (extension_loaded('iconv')) {
-                $this->conversionStrategy = self::STRATEGY_ICONV;
-            } else {
-                $this->conversionStrategy = self::STRATEGY_FALLBACK;
-            }
-        }
-        return $this->conversionStrategy;
-    }
 }
index 4b68583..c5437d9 100644 (file)
@@ -21,7 +21,6 @@ use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Core\Cache\Frontend\VariableFrontend;
-use TYPO3\CMS\Core\Charset\CharsetConverter;
 use TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools;
 use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Database\ConnectionPool;
@@ -1765,9 +1764,7 @@ class DataHandler
         }
         // Secures the string-length to be less than max.
         if ((int)$tcaFieldConf['max'] > 0) {
-            /** @var CharsetConverter $charsetConverter */
-            $charsetConverter = GeneralUtility::makeInstance(CharsetConverter::class);
-            $value = $charsetConverter->substr('utf-8', (string)$value, 0, (int)$tcaFieldConf['max']);
+            $value = mb_substr((string)$value, 0, (int)$tcaFieldConf['max'], 'utf-8');
         }
         // Checking range of value:
         // @todo: The "checkbox" option was removed for type=input, this check could be probably relaxed?
@@ -2750,14 +2747,10 @@ class DataHandler
                     $value = trim($value);
                     break;
                 case 'upper':
-                    /** @var CharsetConverter $charsetConverter */
-                    $charsetConverter = GeneralUtility::makeInstance(CharsetConverter::class);
-                    $value = $charsetConverter->conv_case('utf-8', $value, 'toUpper');
+                    $value = mb_strtoupper($value, 'utf-8');
                     break;
                 case 'lower':
-                    /** @var CharsetConverter $charsetConverter */
-                    $charsetConverter = GeneralUtility::makeInstance(CharsetConverter::class);
-                    $value = $charsetConverter->conv_case('utf-8', $value, 'toLower');
+                    $value = mb_strtolower($value, 'utf-8');
                     break;
                 case 'required':
                     if (!isset($value) || $value === '') {
index 804daf2..dacd7b9 100644 (file)
@@ -72,10 +72,10 @@ class JavaScriptEncoder implements \TYPO3\CMS\Core\SingletonInterface
      */
     public function encode($input)
     {
-        $stringLength = $this->charsetConversion->strlen('utf-8', $input);
+        $stringLength = mb_strlen($input, 'utf-8');
         $encodedString = '';
         for ($i = 0; $i < $stringLength; $i++) {
-            $c = $this->charsetConversion->substr('utf-8', $input, $i, 1);
+            $c = mb_substr($input, $i, 1, 'utf-8');
             $encodedString .= $this->encodeCharacter($c);
         }
         return $encodedString;
index 920f40a..28fb94c 100644 (file)
@@ -86,7 +86,7 @@ abstract class AbstractHierarchicalFilesystemDriver extends AbstractDriver
             $fileIdentifier = $this->canonicalizeAndCheckFilePath($fileIdentifier);
             $fileIdentifier = '/' . ltrim($fileIdentifier, '/');
             if (!$this->isCaseSensitiveFileSystem()) {
-                $fileIdentifier = $this->getCharsetConversion()->conv_case('utf-8', $fileIdentifier, 'toLower');
+                $fileIdentifier = mb_strtolower($fileIdentifier, 'utf-8');
             }
         }
         return $fileIdentifier;
index 3bca874..caab50e 100644 (file)
@@ -1034,7 +1034,7 @@ class GeneralUtility
      *
      * @param string $str Input string
      * @return string Uppercase String
-     * @deprecated since TYPO3 CMS v8, this method will be removed in TYPO3 CMS v9, Use \TYPO3\CMS\Core\Charset\CharsetConverter->conv_case() instead
+     * @deprecated since TYPO3 CMS v8, this method will be removed in TYPO3 CMS v9, use mb_strtoupper() instead
      */
     public static function strtoupper($str)
     {
@@ -1050,7 +1050,7 @@ class GeneralUtility
      *
      * @param string $str Input string
      * @return string Lowercase String
-     * @deprecated since TYPO3 CMS v8, this method will be removed in TYPO3 CMS v9, Use \TYPO3\CMS\Core\Charset\CharsetConverter->conv_case() instead
+     * @deprecated since TYPO3 CMS v8, this method will be removed in TYPO3 CMS v9, use mb_strtolower() instead
      */
     public static function strtolower($str)
     {
@@ -1136,9 +1136,8 @@ class GeneralUtility
      */
     public static function camelCaseToLowerCaseUnderscored($string)
     {
-        $charsetConverter = self::makeInstance(\TYPO3\CMS\Core\Charset\CharsetConverter::class);
         $value = preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $string);
-        return $charsetConverter->conv_case('utf-8', $value, 'toLower');
+        return mb_strtolower($value, 'utf-8');
     }
 
     /**
index 434c75a..d16c5d3 100644 (file)
@@ -11,7 +11,7 @@ Description
 ===========
 
 The support for GNU-recode when converting from one charset to another has been dropped. The CharsetConverter
-now only supports `mbstring` and `iconv` as well as the home-made TYPO3-internal conversion.
+now only supports `mbstring`. In case `mbstring` is not present a polyfill will kick in.
 
 
 Impact
@@ -30,7 +30,6 @@ Installations that have the option `$TYPO3_CONF_VARS[SYS][t3lib_cs_convMethod]`
 Migration
 =========
 
-Use the Install Tool and the Preset information to see which other, better supported conversion libraries (mbstring
-or iconv) are available.
+No migration.
 
 .. index:: PHP-API, LocalConfiguration
index eee1ef2..926c56f 100644 (file)
@@ -11,18 +11,13 @@ Description
 ===========
 
 The Charset Converter which is used to handle multi-byte charset conversions now
-auto-detects which conversion strategy - either `mbstring`, `iconv` or the
-TYPO3-internal functionality - should be used, based on the available PHP modules
-in the system.
-
-`mbstring` takes precedence over `iconv` and the TYPO3-internal functionality.
-
+always uses `mbstring`. In case `mbstring` is not present a polyfill will kick in.
 
 Impact
 ======
 
 The options `$TYPO3_CONF_VARS['SYS'][t3lib_cs_utils]` and
 `$TYPO3_CONF_VARS[SYS][t3lib_cs_convMethod]` have no effect anymore and can be
-removed. TYPO3 chooses the best strategy at runtime.
+removed.
 
 .. index:: LocalConfiguration
index b799612..8b4ba78 100644 (file)
@@ -35,17 +35,15 @@ Instead of :php:`GeneralUtility::strtoupper($value)` use:
 
 .. code-block:: php
 
-    $charsetConverter = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Charset\CharsetConverter::class);
-    $charsetConverter->conv_case('utf-8', $value, 'toUpper');
+    mb_strtoupper($value, 'utf-8');
 
 Instead of :php:`GeneralUtility::strtolower($value)` use:
 
 .. code-block:: php
 
-    $charsetConverter = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Charset\CharsetConverter::class);
-    $charsetConverter->conv_case('utf-8', $value, 'toLower');
+    mb_strtolower($value, 'utf-8');
 
 Alternatively use the native implementation of :php:`strtoupper($value)` or :php:`strtolower($value)`
-if the handled string consists of ascii characters only and has no multi-byte characters like umlauts.
+if the handled string consists of ascii characters only.
 
-.. index:: PHP-API
\ No newline at end of file
+.. index:: PHP-API
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-78670-DeprecatedCharsetConverterMethods.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-78670-DeprecatedCharsetConverterMethods.rst
new file mode 100644 (file)
index 0000000..e6cad2a
--- /dev/null
@@ -0,0 +1,48 @@
+.. include:: ../../Includes.txt
+
+=========================================================
+Deprecation: #78670 - Deprecated CharsetConverter methods
+=========================================================
+
+See :issue:`78670`
+
+Description
+===========
+
+The ``symfony/polyfill-mbstring`` package provides us with mb_string functionality in all installations.
+Therefore some methods of :php:`CharsetConverter` have been deprecated, since the equivalent mb_string functions can be used directly:
+
+- :php:`strlen()`: use :php:`mb_strlen()` directly
+- :php:`substr()`: use :php:`mb_substr()` directly
+- :php:`convCapitalize()`: use :php:`mb_convert_case()` directly
+- :php:`conv_case()`: use :php:`mb_strtolower()` or :php:`mb_strtoupper()` directly
+- :php:`utf8_substr()`: use :php:`mb_substr()` directly
+- :php:`utf8_strlen()`: use :php:`mb_strlen()` directly
+- :php:`utf8_strtrunc()`: use :php:`mb_strcut()` directly
+- :php:`utf8_strpos()`: use :php:`mb_strpos()` directly
+- :php:`utf8_strrpos()`: use :php:`mb_strrpos()` directly
+- :php:`utf8_byte2char_pos()`: no replacement
+- :php:`euc_strtrunc()`: use :php:`mb_strcut()` directly
+- :php:`euc_substr()`: use :php:`mb_substr()` directly
+- :php:`euc_strlen()`: use :php:`mb_strlen()` directly
+- :php:`euc_char2byte_pos()`: no replacement
+- :php:`$fourByteSets`: no replacement
+
+Impact
+======
+
+Calling the deprecated :php:`CharsetConverter` methods will trigger a deprecation log entry.
+
+
+Affected Installations
+======================
+
+Any installation using third party extensions leveraging the mentioned :php:`CharsetConverter` functionalities.
+
+
+Migration
+=========
+
+Use the equivalent mb_string methods directly as denoted above.
+
+.. index:: PHP-API
index d0ae444..75b33e9 100644 (file)
@@ -483,7 +483,7 @@ class Query implements QueryInterface
             $comparison = $this->qomFactory->comparison(
                 $this->qomFactory->lowerCase($this->qomFactory->propertyValue($propertyName, $this->getSelectorName())),
                 QueryInterface::OPERATOR_EQUAL_TO,
-                \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Charset\CharsetConverter::class)->conv_case(\TYPO3\CMS\Extbase\Persistence\Generic\Query::CHARSET, $operand, 'toLower')
+                mb_strtolower($operand, \TYPO3\CMS\Extbase\Persistence\Generic\Query::CHARSET)
             );
         }
         return $comparison;
index 39b48d1..a803e1a 100644 (file)
@@ -99,11 +99,6 @@ class CaseViewHelper extends AbstractViewHelper
     protected $escapeChildren = false;
 
     /**
-     * @var NULL|CharsetConverter
-     */
-    protected static $charsetConverter = null;
-
-    /**
      * Initialize ViewHelper arguments
      *
      * @return void
@@ -150,23 +145,18 @@ class CaseViewHelper extends AbstractViewHelper
             $value = $renderChildrenClosure();
         }
 
-        if (is_null(static::$charsetConverter)) {
-            static::$charsetConverter = GeneralUtility::makeInstance(CharsetConverter::class);
-        }
-        $charsetConverter = static::$charsetConverter;
-
         switch ($mode) {
             case self::CASE_LOWER:
-                $output = $charsetConverter->conv_case('utf-8', $value, 'toLower');
+                $output = mb_strtolower($value, 'utf-8');
                 break;
             case self::CASE_UPPER:
-                $output = $charsetConverter->conv_case('utf-8', $value, 'toUpper');
+                $output = mb_strtoupper($value, 'utf-8');
                 break;
             case self::CASE_CAPITAL:
-                $output = $charsetConverter->substr('utf-8', $charsetConverter->convCaseFirst('utf-8', $value, 'toUpper'), 0, 1) . $charsetConverter->substr('utf-8', $value, 1);
+                $output = GeneralUtility::makeInstance(CharsetConverter::class)->convCaseFirst('utf-8', $value, 'toUpper');
                 break;
             case self::CASE_UNCAPITAL:
-                $output = $charsetConverter->substr('utf-8', $charsetConverter->convCaseFirst('utf-8', $value, 'toLower'), 0, 1) . $charsetConverter->substr('utf-8', $value, 1);
+                $output = GeneralUtility::makeInstance(CharsetConverter::class)->convCaseFirst('utf-8', $value, 'toLower');
                 break;
             case self::CASE_CAPITAL_WORDS:
                 // @todo: Implement method once there is a proper solution with using the CharsetConverter
index 875f0ea..e6880b4 100644 (file)
@@ -3828,13 +3828,11 @@ class ContentObjectRenderer
      */
     public function substring($content, $options)
     {
-        /** @var CharsetConverter $charsetConverter */
-        $charsetConverter = GeneralUtility::makeInstance(CharsetConverter::class);
         $options = GeneralUtility::intExplode(',', $options . ',');
         if ($options[1]) {
-            return $charsetConverter->substr('utf-8', $content, $options[0], $options[1]);
+            return mb_substr($content, $options[0], $options[1], 'utf-8');
         } else {
-            return $charsetConverter->substr('utf-8', $content, $options[0]);
+            return mb_substr($content, $options[0], null, 'utf-8');
         }
     }
 
@@ -3854,18 +3852,16 @@ class ContentObjectRenderer
         $afterstring = trim($options[1]);
         $crop2space = trim($options[2]);
         if ($chars) {
-            /** @var CharsetConverter $charsetConverter */
-            $charsetConverter = GeneralUtility::makeInstance(CharsetConverter::class);
-            if ($charsetConverter->strlen('utf-8', $content) > abs($chars)) {
+            if (mb_strlen($content, 'utf-8') > abs($chars)) {
                 $truncatePosition = false;
                 if ($chars < 0) {
-                    $content = $charsetConverter->substr('utf-8', $content, $chars);
+                    $content = mb_substr($content, $chars, null, 'utf-8');
                     if ($crop2space) {
                         $truncatePosition = strpos($content, ' ');
                     }
                     $content = $truncatePosition ? $afterstring . substr($content, $truncatePosition) : $afterstring . $content;
                 } else {
-                    $content = $charsetConverter->substr('utf-8', $content, 0, $chars);
+                    $content = mb_substr($content, 0, $chars, 'utf-8');
                     if ($crop2space) {
                         $truncatePosition = strrpos($content, ' ');
                     }
@@ -3947,13 +3943,11 @@ class ContentObjectRenderer
         $strLen = 0;
         // This is the offset of the content item which was cropped.
         $croppedOffset = null;
-        /** @var CharsetConverter $charsetConverter */
-        $charsetConverter = GeneralUtility::makeInstance(CharsetConverter::class);
         $countSplittedContent = count($splittedContent);
         for ($offset = 0; $offset < $countSplittedContent; $offset++) {
             if ($offset % 2 === 0) {
                 $tempContent = $splittedContent[$offset];
-                $thisStrLen = $charsetConverter->strlen('utf-8', html_entity_decode($tempContent, ENT_COMPAT, 'UTF-8'));
+                $thisStrLen = mb_strlen(html_entity_decode($tempContent, ENT_COMPAT, 'UTF-8'), 'utf-8');
                 if ($strLen + $thisStrLen > $absChars) {
                     $croppedOffset = $offset;
                     $cropPosition = $absChars - $strLen;
@@ -6768,13 +6762,13 @@ class ContentObjectRenderer
         $charsetConverter = GeneralUtility::makeInstance(CharsetConverter::class);
         switch (strtolower($case)) {
             case 'upper':
-                $theValue = $charsetConverter->conv_case('utf-8', $theValue, 'toUpper');
+                $theValue = mb_strtoupper($theValue, 'utf-8');
                 break;
             case 'lower':
-                $theValue = $charsetConverter->conv_case('utf-8', $theValue, 'toLower');
+                $theValue = mb_strtolower($theValue, 'utf-8');
                 break;
             case 'capitalize':
-                $theValue = $charsetConverter->convCapitalize('utf-8', $theValue);
+                $theValue = mb_convert_case($theValue, MB_CASE_TITLE, 'utf-8');
                 break;
             case 'ucfirst':
                 $theValue = $charsetConverter->convCaseFirst('utf-8', $theValue, 'toUpper');
index 1280dcc..be78d32 100644 (file)
@@ -583,7 +583,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;
-            $conf['text'] = $this->csConvObj->substr('utf-8', $conf['text'], 0, $tlen);
+            $conf['text'] = mb_substr($conf['text'], 0, $tlen, 'utf-8');
         }
         if ((string)$conf['text'] != '') {
             // Char range map thingie:
index 631a9be..c19e0f8 100644 (file)
@@ -4616,7 +4616,7 @@ class ContentObjectRendererTest extends UnitTestCase
         return [
             'empty string from ISO-8859-15' => [
                 '',
-                iconv('UTF-8', 'ISO-8859-15', ''),
+                mb_convert_encoding('', 'ISO-8859-15', 'UTF-8'),
                 ['csConv' => 'ISO-8859-15']
             ],
             'empty string from BIG-5' => [
@@ -4626,7 +4626,7 @@ class ContentObjectRendererTest extends UnitTestCase
             ],
             '"0" from ISO-8859-15' => [
                 '0',
-                iconv('UTF-8', 'ISO-8859-15', '0'),
+                mb_convert_encoding('0', 'ISO-8859-15', 'UTF-8'),
                 ['csConv' => 'ISO-8859-15']
             ],
             '"0" from BIG-5' => [
@@ -4636,7 +4636,7 @@ class ContentObjectRendererTest extends UnitTestCase
             ],
             'euro symbol from ISO-88859-15' => [
                 '€',
-                iconv('UTF-8', 'ISO-8859-15', '€'),
+                mb_convert_encoding('€', 'ISO-8859-15', 'UTF-8'),
                 ['csConv' => 'ISO-8859-15']
             ],
             'good morning from BIG-5' => [
index 47cd684..4c44e59 100644 (file)
@@ -758,7 +758,7 @@ class SearchController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionControlle
         foreach ($parts as $k => $strP) {
             if ($k % 2 == 0) {
                 // Find length of the summary part:
-                $strLen = $this->charsetConverter->strlen('utf-8', $parts[$k]);
+                $strLen = mb_strlen($parts[$k], 'utf-8');
                 $output[$k] = $parts[$k];
                 // Possibly shorten string:
                 if (!$k) {
@@ -776,7 +776,7 @@ class SearchController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionControlle
                         $output[$k] = preg_replace('/[[:space:]][^[:space:]]+$/', '', $this->charsetConverter->crop('utf-8', $parts[$k], ($postPreLgd - $postPreLgd_offset))) . $divider . preg_replace('/^[^[:space:]]+[[:space:]]/', '', $this->charsetConverter->crop('utf-8', $parts[$k], -($postPreLgd - $postPreLgd_offset)));
                     }
                 }
-                $summaryLgd += $this->charsetConverter->strlen('utf-8', $output[$k]);
+                $summaryLgd += mb_strlen($output[$k], 'utf-8');
                 // Protect output:
                 $output[$k] = htmlspecialchars($output[$k]);
                 // If summary lgd is exceed, break the process:
@@ -784,7 +784,7 @@ class SearchController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionControlle
                     break;
                 }
             } else {
-                $summaryLgd += $this->charsetConverter->strlen('utf-8', $strP);
+                $summaryLgd += mb_strlen($strP, 'utf-8');
                 $output[$k] = '<strong class="tx-indexedsearch-redMarkup">' . htmlspecialchars($parts[$k]) . '</strong>';
             }
         }
@@ -880,9 +880,9 @@ class SearchController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionControlle
                     ['-', 'AND NOT'],
                     // Add operators for various languages
                     // Converts the operators to lowercase
-                    [$this->charsetConverter->conv_case('utf-8', LocalizationUtility::translate('localizedOperandAnd', 'IndexedSearch'), 'toLower'), 'AND'],
-                    [$this->charsetConverter->conv_case('utf-8', LocalizationUtility::translate('localizedOperandOr', 'IndexedSearch'), 'toLower'), 'OR'],
-                    [$this->charsetConverter->conv_case('utf-8', LocalizationUtility::translate('localizedOperandNot', 'IndexedSearch'), 'toLower'), 'AND NOT']
+                    [mb_strtolower(LocalizationUtility::translate('localizedOperandAnd', 'IndexedSearch'), 'utf-8'), 'AND'],
+                    [mb_strtolower(LocalizationUtility::translate('localizedOperandOr', 'IndexedSearch'), 'utf-8'), 'OR'],
+                    [mb_strtolower(LocalizationUtility::translate('localizedOperandNot', 'IndexedSearch'), 'utf-8'), 'AND NOT']
                 ];
                 $swordArray = \TYPO3\CMS\IndexedSearch\Utility\IndexedSearchUtility::getExplodedSearchString($searchWords, $defaultOperator == 1 ? 'OR' : 'AND', $operatorTranslateTable);
                 if (is_array($swordArray)) {
index a9afc00..d3cb7ed 100644 (file)
@@ -1324,7 +1324,7 @@ class Indexer
         if ($maxL) {
             $bodyDescription = preg_replace('/\s+/u', ' ', $contentArr['body']);
             // Shorten the string:
-            $bodyDescription = $this->csObj->strtrunc('utf-8', $bodyDescription, $maxL);
+            $bodyDescription = mb_strcut($bodyDescription, 0, $maxL, 'utf-8');
         }
         return $bodyDescription;
     }
index f486065..d9175ac 100644 (file)
@@ -76,7 +76,7 @@ class Lexer
         $this->debugString = '';
         // Then convert the string to lowercase:
         if (!$this->lexerConf['casesensitive']) {
-            $wordString = $this->csObj->conv_case('utf-8', $wordString, 'toLower');
+            $wordString = mb_strtolower($wordString, 'utf-8');
         }
         // Now, splitting words:
         $len = 0;
@@ -136,11 +136,11 @@ class Lexer
          */
         if ($cType == 'cjk') {
             // Find total string length:
-            $strlen = $this->csObj->strlen('utf-8', $theWord);
+            $strlen = mb_strlen($theWord, 'utf-8');
             // Traverse string length and add words as pairs of two chars:
             for ($a = 0; $a < $strlen; $a++) {
                 if ($strlen == 1 || $a < $strlen - 1) {
-                    $words[] = $this->csObj->substr('utf-8', $theWord, $a, 2);
+                    $words[] = mb_substr($theWord, $a, 2, 'utf-8');
                 }
             }
         } else {
index 8f52a95..749bfc0 100644 (file)
@@ -520,14 +520,14 @@ var selectedDictionary = "' . $this->dictionary . '";
             case 'area':
 
             case 'AREA':
-                $this->text .= '<' . $this->csConvObj->conv_case($this->parserCharset, $tag, 'toLower') . ' ';
+                $this->text .= '<' . mb_strtolower($tag, $this->parserCharset) . ' ';
                 foreach ($attributes as $key => $val) {
                     $this->text .= $key . '="' . $val . '" ';
                 }
                 $this->text .= ' />';
                 break;
             default:
-                $this->text .= '<' . $this->csConvObj->conv_case($this->parserCharset, $tag, 'toLower') . ' ';
+                $this->text .= '<' . mb_strtolower($tag, $this->parserCharset) . ' ';
                 foreach ($attributes as $key => $val) {
                     $this->text .= $key . '="' . $val . '" ';
                 }
index db2b456..fd1f968 100644 (file)
@@ -16,7 +16,6 @@ namespace TYPO3\CMS\Tstemplate\Controller;
 
 use TYPO3\CMS\Backend\Module\AbstractFunctionModule;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
-use TYPO3\CMS\Core\Charset\CharsetConverter;
 use TYPO3\CMS\Core\DataHandling\DataHandler;
 use TYPO3\CMS\Core\Exception;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
@@ -75,8 +74,6 @@ class TypoScriptTemplateObjectBrowserModuleFunctionController extends AbstractFu
     public function modMenu()
     {
         $lang = $this->getLanguageService();
-        /** @var CharsetConverter $charsetConverter */
-        $charsetConverter = GeneralUtility::makeInstance(CharsetConverter::class);
         $lang->includeLLFile('EXT:tstemplate/Resources/Private/Language/locallang_objbrowser.xlf');
         $modMenu = [
             'ts_browser_type' => [
@@ -84,10 +81,10 @@ class TypoScriptTemplateObjectBrowserModuleFunctionController extends AbstractFu
                 'setup' => $lang->getLL('setup')
             ],
             'ts_browser_toplevel_setup' => [
-                '0' => $charsetConverter->conv_case('utf-8', $lang->getLL('all'), 'toUpper')
+                '0' => mb_strtolower($lang->getLL('all'), 'utf-8')
             ],
             'ts_browser_toplevel_const' => [
-                '0' => $charsetConverter->conv_case('utf-8', $lang->getLL('all'), 'toUpper')
+                '0' => mb_strtolower($lang->getLL('all'), 'utf-8')
             ],
             'ts_browser_const' => [
                 '0' => $lang->getLL('plainSubstitution'),