diff --git a/.github/workflows/intl-data-tests.yml b/.github/workflows/intl-data-tests.yml index 01401fedc232f..a02bd73ac5b8f 100644 --- a/.github/workflows/intl-data-tests.yml +++ b/.github/workflows/intl-data-tests.yml @@ -1,8 +1,11 @@ -name: Intl data +name: Intl/Emoji data on: push: paths: + - 'src/Symfony/Component/Emoji/*.php' + - 'src/Symfony/Component/Emoji/Resources/data/**' + - 'src/Symfony/Component/Emoji/Tests/*Test.php' - 'src/Symfony/Component/Intl/*.php' - 'src/Symfony/Component/Intl/Util/GitRepository.php' - 'src/Symfony/Component/Intl/Resources/data/**' @@ -10,6 +13,9 @@ on: - 'src/Symfony/Component/Intl/Tests/Util/GitRepositoryTest.php' pull_request: paths: + - 'src/Symfony/Component/Emoji/*.php' + - 'src/Symfony/Component/Emoji/Resources/data/**' + - 'src/Symfony/Component/Emoji/Tests/*Test.php' - 'src/Symfony/Component/Intl/*.php' - 'src/Symfony/Component/Intl/Util/GitRepository.php' - 'src/Symfony/Component/Intl/Resources/data/**' @@ -29,7 +35,7 @@ permissions: jobs: tests: - name: Intl data + name: Intl/Emoji data runs-on: Ubuntu-20.04 steps: @@ -80,15 +86,23 @@ jobs: - name: Run intl-data tests run: ./phpunit --group intl-data -v - - name: Test with compressed data + - name: Test intl-data with compressed data run: | [ -f src/Symfony/Component/Intl/Resources/data/locales/en.php ] [ ! -f src/Symfony/Component/Intl/Resources/data/locales/en.php.gz ] - [ -f src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en.php ] - [ ! -f src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en.php.gz ] src/Symfony/Component/Intl/Resources/bin/compress [ ! -f src/Symfony/Component/Intl/Resources/data/locales/en.php ] [ -f src/Symfony/Component/Intl/Resources/data/locales/en.php.gz ] - [ ! -f src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en.php ] - [ -f src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en.php.gz ] ./phpunit src/Symfony/Component/Intl + + - name: Run Emoji tests + run: ./phpunit src/Symfony/Component/Emoji -v + + - name: Test Emoji with compressed data + run: | + [ -f src/Symfony/Component/Emoji/Resources/data/emoji-en.php ] + [ ! -f src/Symfony/Component/Emoji/Resources/data/emoji-en.php.gz ] + src/Symfony/Component/Emoji/Resources/bin/compress + [ ! -f src/Symfony/Component/Emoji/Resources/data/emoji-en.php ] + [ -f src/Symfony/Component/Emoji/Resources/data/emoji-en.php.gz ] + ./phpunit src/Symfony/Component/Emoji diff --git a/.github/workflows/package-tests.yml b/.github/workflows/package-tests.yml index 96b7451b7f945..bc6f8eec683c7 100644 --- a/.github/workflows/package-tests.yml +++ b/.github/workflows/package-tests.yml @@ -21,7 +21,7 @@ jobs: - name: Find packages id: find-packages - run: echo "packages=$(php .github/get-modified-packages.php $(find src/Symfony -mindepth 2 -type f -name composer.json -printf '%h\n' | grep -v src/Symfony/Component/Intl/Resources/emoji |jq -R -s -c 'split("\n")[:-1]') $(git diff --name-only origin/${{ github.base_ref }} HEAD | grep src/ | jq -R -s -c 'split("\n")[:-1]'))" >> $GITHUB_OUTPUT + run: echo "packages=$(php .github/get-modified-packages.php $(find src/Symfony -mindepth 2 -type f -name composer.json -printf '%h\n' | grep -v src/Symfony/Component/Emoji/Resources/bin |jq -R -s -c 'split("\n")[:-1]') $(git diff --name-only origin/${{ github.base_ref }} HEAD | grep src/ | jq -R -s -c 'split("\n")[:-1]'))" >> $GITHUB_OUTPUT - name: Verify meta files are correct run: | diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 9daf71108dcaa..0dfc798c94fac 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -95,7 +95,7 @@ jobs: echo SYMFONY_DEPRECATIONS_HELPER=weak >> $GITHUB_ENV cp composer.json composer.json.orig echo -e '{\n"require":{'"$(grep phpunit-bridge composer.json)"'"php":"*"},"minimum-stability":"dev"}' > composer.json - php .github/build-packages.php HEAD^ $SYMFONY_VERSION $(find src/Symfony -mindepth 2 -type f -name composer.json -printf '%h\n' | grep -v src/Symfony/Component/Intl/Resources/emoji) + php .github/build-packages.php HEAD^ $SYMFONY_VERSION $(find src/Symfony -mindepth 2 -type f -name composer.json -printf '%h\n' | grep -v src/Symfony/Component/Emoji/Resources/bin) mv composer.json composer.json.phpunit mv composer.json.orig composer.json fi diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 48c4f276b34a5..b5712f07b352d 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -53,6 +53,7 @@ 'Symfony/Bundle/FrameworkBundle/Resources/views/Form', // explicit trigger_error tests 'Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/', + 'Symfony/Component/Emoji/Resources/', 'Symfony/Component/Intl/Resources/data/', ]) // explicit tests for ommited @param type, against `no_superfluous_phpdoc_tags` diff --git a/composer.json b/composer.json index 1894d70b6ccfb..710625257988a 100644 --- a/composer.json +++ b/composer.json @@ -71,6 +71,7 @@ "symfony/doctrine-bridge": "self.version", "symfony/dom-crawler": "self.version", "symfony/dotenv": "self.version", + "symfony/emoji": "self.version", "symfony/error-handler": "self.version", "symfony/event-dispatcher": "self.version", "symfony/expression-language": "self.version", diff --git a/psalm.xml b/psalm.xml index a21be22fe248f..f5f9c5b4c4e88 100644 --- a/psalm.xml +++ b/psalm.xml @@ -17,7 +17,8 @@ - + + diff --git a/src/Symfony/Component/Emoji/.gitattributes b/src/Symfony/Component/Emoji/.gitattributes new file mode 100644 index 0000000000000..9e72316d442f0 --- /dev/null +++ b/src/Symfony/Component/Emoji/.gitattributes @@ -0,0 +1,8 @@ +/Resources/bin/build.php export-ignore +/Resources/bin/composer.json export-ignore +/Resources/bin/Makefile export-ignore +/Resources/bin/README.md export-ignore +/Tests export-ignore +/phpunit.xml.dist export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore diff --git a/src/Symfony/Component/Emoji/.gitignore b/src/Symfony/Component/Emoji/.gitignore new file mode 100644 index 0000000000000..c49a5d8df5c65 --- /dev/null +++ b/src/Symfony/Component/Emoji/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/src/Symfony/Component/Emoji/CHANGELOG.md b/src/Symfony/Component/Emoji/CHANGELOG.md new file mode 100644 index 0000000000000..5f941ae21a99a --- /dev/null +++ b/src/Symfony/Component/Emoji/CHANGELOG.md @@ -0,0 +1,7 @@ +CHANGELOG +========= + +7.1 +--- + + * Add the component diff --git a/src/Symfony/Component/Emoji/EmojiTransliterator.php b/src/Symfony/Component/Emoji/EmojiTransliterator.php new file mode 100644 index 0000000000000..2a19f89cfc548 --- /dev/null +++ b/src/Symfony/Component/Emoji/EmojiTransliterator.php @@ -0,0 +1,141 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Emoji; + +use Symfony\Component\Emoji\Util\GzipStreamWrapper; + +if (!class_exists(\Transliterator::class)) { + throw new \LogicException(sprintf('You cannot use the "%s\EmojiTransliterator" class as the "intl" extension is not installed. See https://php.net/intl.', __NAMESPACE__)); +} + +final class EmojiTransliterator extends \Transliterator +{ + private const QUICK_CHECK = "\xA9\xAE\xE2\xE3\xF0"; + private const REVERSEABLE_IDS = [ + 'emoji-github' => 'github-emoji', + 'emoji-slack' => 'slack-emoji', + 'github-emoji' => 'emoji-github', + 'slack-emoji' => 'emoji-slack', + ]; + + public readonly string $id; + + private array $map; + + private string $quickCheck; + + private \Transliterator $transliterator; + + public static function create(string $id, int $direction = self::FORWARD): self + { + $id = strtolower($id); + + if (!isset(self::REVERSEABLE_IDS[$id]) && !str_starts_with($id, 'emoji-')) { + $id = 'emoji-'.$id; + } + + if (self::REVERSE === $direction) { + if (!isset(self::REVERSEABLE_IDS[$id])) { + // Create a failing reverse-transliterator to populate intl_get_error_*() + \Transliterator::createFromRules('A > B')->createInverse(); + + throw new \IntlException(intl_get_error_message(), intl_get_error_code()); + } + $id = self::REVERSEABLE_IDS[$id]; + } + + $file = __DIR__."/Resources/data/{$id}.php"; + if (!preg_match('/^[a-z0-9@_\\.\\-]*$/', $id) || !is_file($file) && !is_file($file .= '.gz')) { + \Transliterator::create($id); // Populate intl_get_error_*() + + throw new \IntlException(intl_get_error_message(), intl_get_error_code()); + } + + /** + * @var array $maps + */ + static $maps; + + // Create an instance of \Transliterator with a custom id; that's the only way + static $newInstance; + $instance = ($newInstance ??= (new \ReflectionClass(self::class))->newInstanceWithoutConstructor(...))(); + $instance->id = $id; + $instance->map = $maps[$id] ??= str_ends_with($file, '.gz') ? GzipStreamWrapper::require($file) : require $file; + + return $instance; + } + + public function createInverse(): self + { + return self::create($this->id, \Transliterator::REVERSE); + } + + public function getErrorCode(): int|false + { + return $this->transliterator?->getErrorCode() ?? 0; + } + + public function getErrorMessage(): string|false + { + return $this->transliterator?->getErrorMessage() ?? false; + } + + public static function listIDs(): array + { + static $ids = []; + + if ($ids) { + return $ids; + } + + foreach (scandir(__DIR__.'/Resources/data/') as $file) { + if (str_ends_with($file, '.php.gz')) { + $ids[] = substr($file, 0, -7); + } elseif (str_ends_with($file, '.php')) { + $ids[] = substr($file, 0, -4); + } + } + + return $ids; + } + + public function transliterate(string $string, int $start = 0, int $end = -1): string|false + { + $this->quickCheck ??= str_starts_with(array_key_first($this->map), ':') ? ':' : self::QUICK_CHECK; + + if (0 === $start && -1 === $end && preg_match('//u', $string)) { + return \strlen($string) === strcspn($string, $this->quickCheck) ? $string : strtr($string, $this->map); + } + + // Here we rely on intl to validate the $string, $start and $end arguments + // and to slice the string. Slicing is done by replacing the part if $string + // between $start and $end by a unique cookie that can be reliably used to + // identify which part of $string should be transliterated. + + static $cookie; + static $transliterator; + + $cookie ??= hash('xxh128', random_bytes(8)); + $this->transliterator ??= clone $transliterator ??= \Transliterator::createFromRules('[:any:]* > '.$cookie); + + if (false === $result = $this->transliterator->transliterate($string, $start, $end)) { + return false; + } + + $parts = explode($cookie, $result); + $start = \strlen($parts[0]); + $length = -\strlen($parts[1]) ?: null; + $string = substr($string, $start, $length); + + return $parts[0].(\strlen($string) === strcspn($string, $this->quickCheck) ? $string : strtr($string, $this->map)).$parts[1]; + } +} diff --git a/src/Symfony/Component/Emoji/LICENSE b/src/Symfony/Component/Emoji/LICENSE new file mode 100644 index 0000000000000..e374a5c8339d3 --- /dev/null +++ b/src/Symfony/Component/Emoji/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2024-present Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/src/Symfony/Component/Emoji/README.md b/src/Symfony/Component/Emoji/README.md new file mode 100644 index 0000000000000..b5027369514d6 --- /dev/null +++ b/src/Symfony/Component/Emoji/README.md @@ -0,0 +1,18 @@ +Emoji Component +=============== + +The Emoji component provides access to emoji characters and sequences from +the [Unicode CLDR](https://cldr.unicode.org/index). + +If you have the zlib extension enabled, you can compress the data by running: + + php vendor/symfony/emoji/Resources/bin/compress + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/emoji.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/src/Symfony/Component/Intl/Resources/emoji/Makefile b/src/Symfony/Component/Emoji/Resources/bin/Makefile similarity index 100% rename from src/Symfony/Component/Intl/Resources/emoji/Makefile rename to src/Symfony/Component/Emoji/Resources/bin/Makefile diff --git a/src/Symfony/Component/Intl/Resources/emoji/README.md b/src/Symfony/Component/Emoji/Resources/bin/README.md similarity index 100% rename from src/Symfony/Component/Intl/Resources/emoji/README.md rename to src/Symfony/Component/Emoji/Resources/bin/README.md diff --git a/src/Symfony/Component/Intl/Resources/emoji/build.php b/src/Symfony/Component/Emoji/Resources/bin/build.php similarity index 98% rename from src/Symfony/Component/Intl/Resources/emoji/build.php rename to src/Symfony/Component/Emoji/Resources/bin/build.php index a3546815865cf..088838cdd0466 100755 --- a/src/Symfony/Component/Intl/Resources/emoji/build.php +++ b/src/Symfony/Component/Emoji/Resources/bin/build.php @@ -25,7 +25,7 @@ final class Builder { - private const TARGET_DIR = __DIR__.'/../data/transliterator/emoji/'; + private const TARGET_DIR = __DIR__.'/../data/'; public static function getEmojisCodePoints(): array { @@ -233,7 +233,7 @@ public static function saveRules(iterable $rulesByLocale): void sort($firstChars); $quickCheck = '"'.str_replace('%', '\\x', rawurlencode(implode('', $firstChars))).'"'; - $file = dirname(__DIR__, 2).'/Transliterator/EmojiTransliterator.php'; + $file = dirname(__DIR__, 2).'/EmojiTransliterator.php'; file_put_contents($file, preg_replace('/QUICK_CHECK = .*;/m', "QUICK_CHECK = {$quickCheck};", file_get_contents($file))); } diff --git a/src/Symfony/Component/Intl/Resources/emoji/composer.json b/src/Symfony/Component/Emoji/Resources/bin/composer.json similarity index 100% rename from src/Symfony/Component/Intl/Resources/emoji/composer.json rename to src/Symfony/Component/Emoji/Resources/bin/composer.json diff --git a/src/Symfony/Component/Emoji/Resources/bin/compress b/src/Symfony/Component/Emoji/Resources/bin/compress new file mode 100755 index 0000000000000..174cbca59b041 --- /dev/null +++ b/src/Symfony/Component/Emoji/Resources/bin/compress @@ -0,0 +1,36 @@ +#!/usr/bin/env php + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if ('cli' !== PHP_SAPI) { + throw new Exception('This script must be run from the command line.'); +} +if (!extension_loaded('zlib')) { + throw new Exception('This script requires the zlib extension.'); +} + +$iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator( + dirname(__DIR__).'/data', + FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS + ) +); + +foreach ($iterator as $file) { + if ('php' !== $file->getExtension()) { + continue; + } + + $data = file_get_contents($file); + file_put_contents('compress.zlib://'.$file.'.gz', $data); + + unlink($file.(filesize($file.'.gz') >= strlen($data) ? '.gz' : '')); +} diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-af.php b/src/Symfony/Component/Emoji/Resources/data/emoji-af.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-af.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-af.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-am.php b/src/Symfony/Component/Emoji/Resources/data/emoji-am.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-am.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-am.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ar.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ar.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ar.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ar.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ar_sa.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ar_sa.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ar_sa.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ar_sa.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-as.php b/src/Symfony/Component/Emoji/Resources/data/emoji-as.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-as.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-as.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ast.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ast.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ast.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ast.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-az.php b/src/Symfony/Component/Emoji/Resources/data/emoji-az.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-az.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-az.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-be.php b/src/Symfony/Component/Emoji/Resources/data/emoji-be.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-be.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-be.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-bew.php b/src/Symfony/Component/Emoji/Resources/data/emoji-bew.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-bew.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-bew.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-bg.php b/src/Symfony/Component/Emoji/Resources/data/emoji-bg.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-bg.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-bg.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-bgn.php b/src/Symfony/Component/Emoji/Resources/data/emoji-bgn.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-bgn.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-bgn.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-bn.php b/src/Symfony/Component/Emoji/Resources/data/emoji-bn.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-bn.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-bn.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-br.php b/src/Symfony/Component/Emoji/Resources/data/emoji-br.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-br.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-br.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-bs.php b/src/Symfony/Component/Emoji/Resources/data/emoji-bs.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-bs.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-bs.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ca.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ca.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ca.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ca.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ccp.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ccp.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ccp.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ccp.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ceb.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ceb.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ceb.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ceb.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-chr.php b/src/Symfony/Component/Emoji/Resources/data/emoji-chr.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-chr.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-chr.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ckb.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ckb.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ckb.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ckb.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-cs.php b/src/Symfony/Component/Emoji/Resources/data/emoji-cs.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-cs.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-cs.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-cv.php b/src/Symfony/Component/Emoji/Resources/data/emoji-cv.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-cv.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-cv.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-cy.php b/src/Symfony/Component/Emoji/Resources/data/emoji-cy.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-cy.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-cy.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-da.php b/src/Symfony/Component/Emoji/Resources/data/emoji-da.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-da.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-da.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-de.php b/src/Symfony/Component/Emoji/Resources/data/emoji-de.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-de.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-de.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-de_ch.php b/src/Symfony/Component/Emoji/Resources/data/emoji-de_ch.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-de_ch.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-de_ch.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-dsb.php b/src/Symfony/Component/Emoji/Resources/data/emoji-dsb.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-dsb.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-dsb.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-el.php b/src/Symfony/Component/Emoji/Resources/data/emoji-el.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-el.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-el.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en.php b/src/Symfony/Component/Emoji/Resources/data/emoji-en.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-en.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en_001.php b/src/Symfony/Component/Emoji/Resources/data/emoji-en_001.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en_001.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-en_001.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en_au.php b/src/Symfony/Component/Emoji/Resources/data/emoji-en_au.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en_au.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-en_au.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en_ca.php b/src/Symfony/Component/Emoji/Resources/data/emoji-en_ca.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en_ca.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-en_ca.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en_gb.php b/src/Symfony/Component/Emoji/Resources/data/emoji-en_gb.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en_gb.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-en_gb.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en_in.php b/src/Symfony/Component/Emoji/Resources/data/emoji-en_in.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-en_in.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-en_in.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-es.php b/src/Symfony/Component/Emoji/Resources/data/emoji-es.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-es.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-es.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-es_419.php b/src/Symfony/Component/Emoji/Resources/data/emoji-es_419.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-es_419.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-es_419.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-es_mx.php b/src/Symfony/Component/Emoji/Resources/data/emoji-es_mx.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-es_mx.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-es_mx.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-es_us.php b/src/Symfony/Component/Emoji/Resources/data/emoji-es_us.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-es_us.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-es_us.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-et.php b/src/Symfony/Component/Emoji/Resources/data/emoji-et.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-et.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-et.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-eu.php b/src/Symfony/Component/Emoji/Resources/data/emoji-eu.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-eu.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-eu.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-fa.php b/src/Symfony/Component/Emoji/Resources/data/emoji-fa.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-fa.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-fa.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ff_adlm.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ff_adlm.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ff_adlm.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ff_adlm.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-fi.php b/src/Symfony/Component/Emoji/Resources/data/emoji-fi.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-fi.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-fi.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-fil.php b/src/Symfony/Component/Emoji/Resources/data/emoji-fil.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-fil.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-fil.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-fo.php b/src/Symfony/Component/Emoji/Resources/data/emoji-fo.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-fo.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-fo.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-fr.php b/src/Symfony/Component/Emoji/Resources/data/emoji-fr.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-fr.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-fr.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-fr_ca.php b/src/Symfony/Component/Emoji/Resources/data/emoji-fr_ca.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-fr_ca.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-fr_ca.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ga.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ga.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ga.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ga.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-gd.php b/src/Symfony/Component/Emoji/Resources/data/emoji-gd.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-gd.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-gd.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-github.php b/src/Symfony/Component/Emoji/Resources/data/emoji-github.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-github.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-github.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-gl.php b/src/Symfony/Component/Emoji/Resources/data/emoji-gl.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-gl.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-gl.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-gu.php b/src/Symfony/Component/Emoji/Resources/data/emoji-gu.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-gu.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-gu.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ha.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ha.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ha.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ha.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ha_ne.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ha_ne.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ha_ne.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ha_ne.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-he.php b/src/Symfony/Component/Emoji/Resources/data/emoji-he.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-he.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-he.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-hi.php b/src/Symfony/Component/Emoji/Resources/data/emoji-hi.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-hi.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-hi.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-hi_latn.php b/src/Symfony/Component/Emoji/Resources/data/emoji-hi_latn.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-hi_latn.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-hi_latn.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-hr.php b/src/Symfony/Component/Emoji/Resources/data/emoji-hr.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-hr.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-hr.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-hsb.php b/src/Symfony/Component/Emoji/Resources/data/emoji-hsb.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-hsb.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-hsb.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-hu.php b/src/Symfony/Component/Emoji/Resources/data/emoji-hu.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-hu.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-hu.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-hy.php b/src/Symfony/Component/Emoji/Resources/data/emoji-hy.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-hy.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-hy.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ia.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ia.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ia.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ia.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-id.php b/src/Symfony/Component/Emoji/Resources/data/emoji-id.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-id.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-id.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ig.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ig.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ig.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ig.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-is.php b/src/Symfony/Component/Emoji/Resources/data/emoji-is.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-is.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-is.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-it.php b/src/Symfony/Component/Emoji/Resources/data/emoji-it.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-it.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-it.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ja.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ja.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ja.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ja.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-jv.php b/src/Symfony/Component/Emoji/Resources/data/emoji-jv.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-jv.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-jv.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ka.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ka.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ka.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ka.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-kab.php b/src/Symfony/Component/Emoji/Resources/data/emoji-kab.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-kab.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-kab.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-kk.php b/src/Symfony/Component/Emoji/Resources/data/emoji-kk.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-kk.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-kk.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-kl.php b/src/Symfony/Component/Emoji/Resources/data/emoji-kl.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-kl.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-kl.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-km.php b/src/Symfony/Component/Emoji/Resources/data/emoji-km.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-km.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-km.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-kn.php b/src/Symfony/Component/Emoji/Resources/data/emoji-kn.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-kn.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-kn.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ko.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ko.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ko.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ko.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-kok.php b/src/Symfony/Component/Emoji/Resources/data/emoji-kok.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-kok.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-kok.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ku.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ku.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ku.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ku.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ky.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ky.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ky.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ky.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-lb.php b/src/Symfony/Component/Emoji/Resources/data/emoji-lb.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-lb.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-lb.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-lij.php b/src/Symfony/Component/Emoji/Resources/data/emoji-lij.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-lij.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-lij.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-lo.php b/src/Symfony/Component/Emoji/Resources/data/emoji-lo.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-lo.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-lo.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-lt.php b/src/Symfony/Component/Emoji/Resources/data/emoji-lt.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-lt.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-lt.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-lv.php b/src/Symfony/Component/Emoji/Resources/data/emoji-lv.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-lv.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-lv.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-mi.php b/src/Symfony/Component/Emoji/Resources/data/emoji-mi.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-mi.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-mi.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-mk.php b/src/Symfony/Component/Emoji/Resources/data/emoji-mk.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-mk.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-mk.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ml.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ml.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ml.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ml.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-mn.php b/src/Symfony/Component/Emoji/Resources/data/emoji-mn.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-mn.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-mn.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-mni.php b/src/Symfony/Component/Emoji/Resources/data/emoji-mni.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-mni.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-mni.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-mr.php b/src/Symfony/Component/Emoji/Resources/data/emoji-mr.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-mr.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-mr.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ms.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ms.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ms.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ms.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-mt.php b/src/Symfony/Component/Emoji/Resources/data/emoji-mt.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-mt.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-mt.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-my.php b/src/Symfony/Component/Emoji/Resources/data/emoji-my.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-my.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-my.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ne.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ne.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ne.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ne.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-nl.php b/src/Symfony/Component/Emoji/Resources/data/emoji-nl.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-nl.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-nl.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-nn.php b/src/Symfony/Component/Emoji/Resources/data/emoji-nn.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-nn.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-nn.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-no.php b/src/Symfony/Component/Emoji/Resources/data/emoji-no.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-no.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-no.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-nso.php b/src/Symfony/Component/Emoji/Resources/data/emoji-nso.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-nso.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-nso.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-oc.php b/src/Symfony/Component/Emoji/Resources/data/emoji-oc.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-oc.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-oc.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-or.php b/src/Symfony/Component/Emoji/Resources/data/emoji-or.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-or.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-or.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-pa.php b/src/Symfony/Component/Emoji/Resources/data/emoji-pa.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-pa.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-pa.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-pa_arab.php b/src/Symfony/Component/Emoji/Resources/data/emoji-pa_arab.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-pa_arab.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-pa_arab.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-pcm.php b/src/Symfony/Component/Emoji/Resources/data/emoji-pcm.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-pcm.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-pcm.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-pl.php b/src/Symfony/Component/Emoji/Resources/data/emoji-pl.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-pl.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-pl.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ps.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ps.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ps.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ps.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-pt.php b/src/Symfony/Component/Emoji/Resources/data/emoji-pt.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-pt.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-pt.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-pt_pt.php b/src/Symfony/Component/Emoji/Resources/data/emoji-pt_pt.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-pt_pt.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-pt_pt.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-qu.php b/src/Symfony/Component/Emoji/Resources/data/emoji-qu.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-qu.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-qu.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-quc.php b/src/Symfony/Component/Emoji/Resources/data/emoji-quc.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-quc.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-quc.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-rhg.php b/src/Symfony/Component/Emoji/Resources/data/emoji-rhg.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-rhg.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-rhg.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-rm.php b/src/Symfony/Component/Emoji/Resources/data/emoji-rm.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-rm.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-rm.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ro.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ro.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ro.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ro.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-root.php b/src/Symfony/Component/Emoji/Resources/data/emoji-root.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-root.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-root.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ru.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ru.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ru.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ru.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-rw.php b/src/Symfony/Component/Emoji/Resources/data/emoji-rw.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-rw.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-rw.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sat.php b/src/Symfony/Component/Emoji/Resources/data/emoji-sat.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sat.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-sat.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sc.php b/src/Symfony/Component/Emoji/Resources/data/emoji-sc.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sc.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-sc.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sd.php b/src/Symfony/Component/Emoji/Resources/data/emoji-sd.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sd.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-sd.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-si.php b/src/Symfony/Component/Emoji/Resources/data/emoji-si.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-si.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-si.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sk.php b/src/Symfony/Component/Emoji/Resources/data/emoji-sk.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sk.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-sk.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sl.php b/src/Symfony/Component/Emoji/Resources/data/emoji-sl.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sl.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-sl.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-slack.php b/src/Symfony/Component/Emoji/Resources/data/emoji-slack.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-slack.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-slack.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-so.php b/src/Symfony/Component/Emoji/Resources/data/emoji-so.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-so.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-so.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sq.php b/src/Symfony/Component/Emoji/Resources/data/emoji-sq.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sq.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-sq.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sr.php b/src/Symfony/Component/Emoji/Resources/data/emoji-sr.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sr.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-sr.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sr_cyrl.php b/src/Symfony/Component/Emoji/Resources/data/emoji-sr_cyrl.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sr_cyrl.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-sr_cyrl.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sr_cyrl_ba.php b/src/Symfony/Component/Emoji/Resources/data/emoji-sr_cyrl_ba.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sr_cyrl_ba.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-sr_cyrl_ba.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sr_latn.php b/src/Symfony/Component/Emoji/Resources/data/emoji-sr_latn.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sr_latn.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-sr_latn.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sr_latn_ba.php b/src/Symfony/Component/Emoji/Resources/data/emoji-sr_latn_ba.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sr_latn_ba.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-sr_latn_ba.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-strip.php b/src/Symfony/Component/Emoji/Resources/data/emoji-strip.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-strip.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-strip.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sv.php b/src/Symfony/Component/Emoji/Resources/data/emoji-sv.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sv.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-sv.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sw.php b/src/Symfony/Component/Emoji/Resources/data/emoji-sw.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sw.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-sw.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sw_ke.php b/src/Symfony/Component/Emoji/Resources/data/emoji-sw_ke.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-sw_ke.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-sw_ke.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ta.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ta.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ta.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ta.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-te.php b/src/Symfony/Component/Emoji/Resources/data/emoji-te.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-te.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-te.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-tg.php b/src/Symfony/Component/Emoji/Resources/data/emoji-tg.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-tg.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-tg.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-th.php b/src/Symfony/Component/Emoji/Resources/data/emoji-th.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-th.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-th.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ti.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ti.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ti.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ti.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-tk.php b/src/Symfony/Component/Emoji/Resources/data/emoji-tk.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-tk.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-tk.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-tn.php b/src/Symfony/Component/Emoji/Resources/data/emoji-tn.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-tn.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-tn.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-to.php b/src/Symfony/Component/Emoji/Resources/data/emoji-to.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-to.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-to.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-tr.php b/src/Symfony/Component/Emoji/Resources/data/emoji-tr.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-tr.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-tr.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ug.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ug.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ug.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ug.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-uk.php b/src/Symfony/Component/Emoji/Resources/data/emoji-uk.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-uk.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-uk.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ur.php b/src/Symfony/Component/Emoji/Resources/data/emoji-ur.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-ur.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-ur.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-uz.php b/src/Symfony/Component/Emoji/Resources/data/emoji-uz.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-uz.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-uz.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-vi.php b/src/Symfony/Component/Emoji/Resources/data/emoji-vi.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-vi.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-vi.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-wo.php b/src/Symfony/Component/Emoji/Resources/data/emoji-wo.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-wo.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-wo.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-xh.php b/src/Symfony/Component/Emoji/Resources/data/emoji-xh.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-xh.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-xh.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-yo.php b/src/Symfony/Component/Emoji/Resources/data/emoji-yo.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-yo.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-yo.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-yo_bj.php b/src/Symfony/Component/Emoji/Resources/data/emoji-yo_bj.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-yo_bj.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-yo_bj.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-yue.php b/src/Symfony/Component/Emoji/Resources/data/emoji-yue.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-yue.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-yue.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-yue_hans.php b/src/Symfony/Component/Emoji/Resources/data/emoji-yue_hans.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-yue_hans.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-yue_hans.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-zh.php b/src/Symfony/Component/Emoji/Resources/data/emoji-zh.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-zh.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-zh.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-zh_hant.php b/src/Symfony/Component/Emoji/Resources/data/emoji-zh_hant.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-zh_hant.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-zh_hant.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-zh_hant_hk.php b/src/Symfony/Component/Emoji/Resources/data/emoji-zh_hant_hk.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-zh_hant_hk.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-zh_hant_hk.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-zu.php b/src/Symfony/Component/Emoji/Resources/data/emoji-zu.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/emoji-zu.php rename to src/Symfony/Component/Emoji/Resources/data/emoji-zu.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/github-emoji.php b/src/Symfony/Component/Emoji/Resources/data/github-emoji.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/github-emoji.php rename to src/Symfony/Component/Emoji/Resources/data/github-emoji.php diff --git a/src/Symfony/Component/Intl/Resources/data/transliterator/emoji/slack-emoji.php b/src/Symfony/Component/Emoji/Resources/data/slack-emoji.php similarity index 100% rename from src/Symfony/Component/Intl/Resources/data/transliterator/emoji/slack-emoji.php rename to src/Symfony/Component/Emoji/Resources/data/slack-emoji.php diff --git a/src/Symfony/Component/Intl/Tests/Transliterator/EmojiTransliteratorTest.php b/src/Symfony/Component/Emoji/Tests/EmojiTransliteratorTest.php similarity index 96% rename from src/Symfony/Component/Intl/Tests/Transliterator/EmojiTransliteratorTest.php rename to src/Symfony/Component/Emoji/Tests/EmojiTransliteratorTest.php index ccc379b09ac2d..12a3682b16769 100644 --- a/src/Symfony/Component/Intl/Tests/Transliterator/EmojiTransliteratorTest.php +++ b/src/Symfony/Component/Emoji/Tests/EmojiTransliteratorTest.php @@ -9,11 +9,11 @@ * file that was distributed with this source code. */ -namespace Symfony\Component\Intl\Tests\Transliterator; +namespace Symfony\Component\Emoji\Tests; use PHPUnit\Framework\TestCase; +use Symfony\Component\Emoji\EmojiTransliterator; use Symfony\Component\Finder\Finder; -use Symfony\Component\Intl\Transliterator\EmojiTransliterator; /** * @requires extension intl @@ -95,7 +95,7 @@ public function testAllTransliterator(string $locale) public static function provideLocaleTest(): iterable { $file = (new Finder()) - ->in(__DIR__.'/../../Resources/data/transliterator/emoji') + ->in(__DIR__.'/../Resources/data') ->name('*.php') ->notName('emoji-strip.php') ->files() diff --git a/src/Symfony/Component/Emoji/Util/GzipStreamWrapper.php b/src/Symfony/Component/Emoji/Util/GzipStreamWrapper.php new file mode 100644 index 0000000000000..1ae158dd9cc38 --- /dev/null +++ b/src/Symfony/Component/Emoji/Util/GzipStreamWrapper.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Emoji\Util; + +/** + * @internal + */ +class GzipStreamWrapper +{ + /** @var resource|null */ + public $context; + + /** @var resource */ + private $handle; + private string $path; + + public static function require(string $path): array + { + if (!\extension_loaded('zlib')) { + throw new \LogicException(sprintf('The "zlib" extension is required to load the "%s/%s" map, please enable it in your php.ini file.', basename(\dirname($path)), basename($path))); + } + + if (!\function_exists('opcache_is_script_cached') || !@opcache_is_script_cached($path)) { + stream_wrapper_unregister('file'); + stream_wrapper_register('file', self::class); + } + + return require $path; + } + + public function stream_open(string $path, string $mode): bool + { + stream_wrapper_restore('file'); + $this->path = $path; + + return false !== $this->handle = fopen('compress.zlib://'.$path, $mode); + } + + public function stream_read(int $count): string|false + { + return fread($this->handle, $count); + } + + public function stream_eof(): bool + { + return feof($this->handle); + } + + public function stream_set_option(int $option, int $arg1, int $arg2): bool + { + return match ($option) { + \STREAM_OPTION_BLOCKING => stream_set_blocking($this->handle, $arg1), + \STREAM_OPTION_READ_TIMEOUT => stream_set_timeout($this->handle, $arg1, $arg2), + \STREAM_OPTION_WRITE_BUFFER => 0 === stream_set_write_buffer($this->handle, $arg2), + default => false, + }; + } + + public function stream_stat(): array|false + { + if (!$stat = stat($this->path)) { + return false; + } + + $h = fopen($this->path, 'r'); + fseek($h, -4, \SEEK_END); + $size = unpack('V', fread($h, 4)); + fclose($h); + + $stat[7] = $stat['size'] = end($size); + + return $stat; + } +} diff --git a/src/Symfony/Component/Emoji/composer.json b/src/Symfony/Component/Emoji/composer.json new file mode 100644 index 0000000000000..c4997c1b32b92 --- /dev/null +++ b/src/Symfony/Component/Emoji/composer.json @@ -0,0 +1,34 @@ +{ + "name": "symfony/emoji", + "type": "library", + "description": "Provides access to emoji characters and sequences from the Unicode CLDR", + "keywords": ["cldr", "emoji", "intl", "transliterator", "unicode"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=8.2", + "ext-intl": "*" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\Emoji\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev" +} diff --git a/src/Symfony/Component/Emoji/phpunit.xml.dist b/src/Symfony/Component/Emoji/phpunit.xml.dist new file mode 100644 index 0000000000000..5c74dab50b3ca --- /dev/null +++ b/src/Symfony/Component/Emoji/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + + + + + ./Tests/ + + + + + + ./ + + + ./Resources + ./Tests + ./vendor + + + diff --git a/src/Symfony/Component/Intl/CHANGELOG.md b/src/Symfony/Component/Intl/CHANGELOG.md index 1f372c4e46545..ed7abd49647ea 100644 --- a/src/Symfony/Component/Intl/CHANGELOG.md +++ b/src/Symfony/Component/Intl/CHANGELOG.md @@ -1,10 +1,16 @@ CHANGELOG ========= +7.1 +--- + + * Move all emoji code & data to a new `symfony/emoji` component + * Deprecate `EmojiTransliterator` in favor of `Symfony\Component\Emoji\EmojiTransliterator` + 6.4 --- - * Add support for ISO-3166-1 numeric codes with `Countries::getNumericCode()`, `Countries::getNumericCodes()`, + * Add support for ISO-3166-1 numeric codes with `Countries::getNumericCode()`, `Countries::getNumericCodes()`, `Countries::numericCodeExists()` and `Countries::getAlpha2FromNumeric()` 6.3 diff --git a/src/Symfony/Component/Intl/README.md b/src/Symfony/Component/Intl/README.md index a5d55ea40b63d..333e2fe80a812 100644 --- a/src/Symfony/Component/Intl/README.md +++ b/src/Symfony/Component/Intl/README.md @@ -3,6 +3,10 @@ Intl Component The Intl component provides access to the localization data of the ICU library. +If you have the zlib extension enabled, you can compress the data by running: + + php vendor/symfony/intl/Resources/bin/compress + Resources --------- diff --git a/src/Symfony/Component/Intl/Transliterator/EmojiTransliterator.php b/src/Symfony/Component/Intl/Transliterator/EmojiTransliterator.php index daa114316af74..7c36fe6abd7b9 100644 --- a/src/Symfony/Component/Intl/Transliterator/EmojiTransliterator.php +++ b/src/Symfony/Component/Intl/Transliterator/EmojiTransliterator.php @@ -11,133 +11,21 @@ namespace Symfony\Component\Intl\Transliterator; -use Symfony\Component\Intl\Util\GzipStreamWrapper; +use Symfony\Component\Emoji\EmojiTransliterator as EmojiEmojiTransliterator; -if (!class_exists(\Transliterator::class)) { - throw new \LogicException(sprintf('You cannot use the "%s\EmojiTransliterator" class as the "intl" extension is not installed. See https://php.net/intl.', __NAMESPACE__)); -} else { - /** - * @internal - */ - trait EmojiTransliteratorTrait - { - private array $map; - private \Transliterator $transliterator; - - public static function create(string $id, int $direction = self::FORWARD): self - { - $id = strtolower($id); - - if (!isset(self::REVERSEABLE_IDS[$id]) && !str_starts_with($id, 'emoji-')) { - $id = 'emoji-'.$id; - } - - if (self::REVERSE === $direction) { - if (!isset(self::REVERSEABLE_IDS[$id])) { - // Create a failing reverse-transliterator to populate intl_get_error_*() - \Transliterator::createFromRules('A > B')->createInverse(); - - throw new \IntlException(intl_get_error_message(), intl_get_error_code()); - } - $id = self::REVERSEABLE_IDS[$id]; - } - - $file = \dirname(__DIR__)."/Resources/data/transliterator/emoji/{$id}.php"; - if (!preg_match('/^[a-z0-9@_\\.\\-]*$/', $id) || !is_file($file) && !is_file($file .= '.gz')) { - \Transliterator::create($id); // Populate intl_get_error_*() - - throw new \IntlException(intl_get_error_message(), intl_get_error_code()); - } - - static $maps; - - // Create an instance of \Transliterator with a custom id; that's the only way - static $newInstance; - $instance = ($newInstance ??= (new \ReflectionClass(self::class))->newInstanceWithoutConstructor(...))(); - $instance->id = $id; - $instance->map = $maps[$id] ??= str_ends_with($file, '.gz') ? GzipStreamWrapper::require($file) : require $file; - - return $instance; - } - - public function createInverse(): self - { - return self::create($this->id, self::REVERSE); - } - - public function getErrorCode(): int|false - { - return $this->transliterator?->getErrorCode() ?? 0; - } - - public function getErrorMessage(): string|false - { - return $this->transliterator?->getErrorMessage() ?? false; - } - - public static function listIDs(): array - { - static $ids = []; +trigger_deprecation('symfony/intl', '7.1', 'The "%s" class is deprecated, use "%s" instead.', EmojiTransliterator::class, EmojiEmojiTransliterator::class); - if ($ids) { - return $ids; - } - - foreach (scandir(\dirname(__DIR__).'/Resources/data/transliterator/emoji/') as $file) { - if (str_ends_with($file, '.php.gz')) { - $ids[] = substr($file, 0, -7); - } elseif (str_ends_with($file, '.php')) { - $ids[] = substr($file, 0, -4); - } - } - - return $ids; - } - - public function transliterate(string $string, int $start = 0, int $end = -1): string|false - { - $quickCheck = ':' === array_key_first($this->map)[0] ? ':' : self::QUICK_CHECK; - - if (0 === $start && -1 === $end && preg_match('//u', $string)) { - return \strlen($string) === strcspn($string, $quickCheck) ? $string : strtr($string, $this->map); - } - - // Here we rely on intl to validate the $string, $start and $end arguments - // and to slice the string. Slicing is done by replacing the part if $string - // between $start and $end by a unique cookie that can be reliably used to - // identify which part of $string should be transliterated. - - static $cookie; - static $transliterator; - - $cookie ??= hash('xxh128', random_bytes(8)); - $this->transliterator ??= clone $transliterator ??= \Transliterator::createFromRules('[:any:]* > '.$cookie); - - if (false === $result = $this->transliterator->transliterate($string, $start, $end)) { - return false; - } - - $parts = explode($cookie, $result); - $start = \strlen($parts[0]); - $length = -\strlen($parts[1]) ?: null; - $string = substr($string, $start, $length); - - return $parts[0].(\strlen($string) === strcspn($string, $quickCheck) ? $string : strtr($string, $this->map)).$parts[1]; - } - } +if (!class_exists(EmojiEmojiTransliterator::class)) { + throw new \LogicException(sprintf('You cannot use the "%s" if the Emoji component is not available. Try running "composer require symfony/emoji".', EmojiEmojiTransliterator::class)); } -final class EmojiTransliterator extends \Transliterator -{ - use EmojiTransliteratorTrait; - - private const QUICK_CHECK = "\xA9\xAE\xE2\xE3\xF0"; - private const REVERSEABLE_IDS = [ - 'emoji-github' => 'github-emoji', - 'emoji-slack' => 'slack-emoji', - 'github-emoji' => 'emoji-github', - 'slack-emoji' => 'emoji-slack', - ]; +class_alias(EmojiEmojiTransliterator::class, EmojiTransliterator::class); - public readonly string $id; +if (false) { + /** + * @deprecated since Symfony 7.1, use Symfony\Component\Emoji\EmojiTransliterator instead + */ + class EmojiTransliterator extends \Transliterator + { + } } diff --git a/src/Symfony/Component/Intl/composer.json b/src/Symfony/Component/Intl/composer.json index 360918baa6df9..f1d1fbf9bfe24 100644 --- a/src/Symfony/Component/Intl/composer.json +++ b/src/Symfony/Component/Intl/composer.json @@ -24,13 +24,16 @@ } ], "require": { - "php": ">=8.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { "symfony/filesystem": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", "symfony/var-exporter": "^6.4|^7.0" }, + "conflict": { + "symfony/string": "<7.1" + }, "autoload": { "psr-4": { "Symfony\\Component\\Intl\\": "" }, "exclude-from-classmap": [ diff --git a/src/Symfony/Component/String/Slugger/AsciiSlugger.php b/src/Symfony/Component/String/Slugger/AsciiSlugger.php index 4f428da9603f0..c93731866f4bf 100644 --- a/src/Symfony/Component/String/Slugger/AsciiSlugger.php +++ b/src/Symfony/Component/String/Slugger/AsciiSlugger.php @@ -11,7 +11,7 @@ namespace Symfony\Component\String\Slugger; -use Symfony\Component\Intl\Transliterator\EmojiTransliterator; +use Symfony\Component\Emoji\EmojiTransliterator; use Symfony\Component\String\AbstractUnicodeString; use Symfony\Component\String\UnicodeString; use Symfony\Contracts\Translation\LocaleAwareInterface; @@ -92,7 +92,7 @@ public function getLocale(): string public function withEmoji(bool|string $emoji = true): static { if (false !== $emoji && !class_exists(EmojiTransliterator::class)) { - throw new \LogicException(sprintf('You cannot use the "%s()" method as the "symfony/intl" package is not installed. Try running "composer require symfony/intl".', __METHOD__)); + throw new \LogicException(sprintf('You cannot use the "%s()" method as the "symfony/emoji" package is not installed. Try running "composer require symfony/emoji".', __METHOD__)); } $new = clone $this; diff --git a/src/Symfony/Component/String/Tests/Slugger/AsciiSluggerTest.php b/src/Symfony/Component/String/Tests/Slugger/AsciiSluggerTest.php index 3544367b647fc..ab4b7990b1b24 100644 --- a/src/Symfony/Component/String/Tests/Slugger/AsciiSluggerTest.php +++ b/src/Symfony/Component/String/Tests/Slugger/AsciiSluggerTest.php @@ -9,7 +9,7 @@ * file that was distributed with this source code. */ -namespace Symfony\Component\String; +namespace Symfony\Component\String\Tests\Slugger; use PHPUnit\Framework\TestCase; use Symfony\Component\String\Slugger\AsciiSlugger; diff --git a/src/Symfony/Component/String/composer.json b/src/Symfony/Component/String/composer.json index 26ce26da3fe47..1959f5d2c277a 100644 --- a/src/Symfony/Component/String/composer.json +++ b/src/Symfony/Component/String/composer.json @@ -24,8 +24,9 @@ }, "require-dev": { "symfony/error-handler": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", + "symfony/emoji": "^7.0", "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3.0", "symfony/var-exporter": "^6.4|^7.0" },