From 643b9d2f53e90507ee3c85d1731ce7fce990f66f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Pineau?= Date: Thu, 28 Mar 2024 14:43:38 +0100 Subject: [PATCH] [TwigBridge] Add `emojify` twig filter --- src/Symfony/Bridge/Twig/CHANGELOG.md | 5 +++ .../Bridge/Twig/Extension/EmojiExtension.php | 42 +++++++++++++++++++ .../Tests/Extension/EmojiExtensionTest.php | 33 +++++++++++++++ src/Symfony/Bridge/Twig/composer.json | 1 + 4 files changed, 81 insertions(+) create mode 100644 src/Symfony/Bridge/Twig/Extension/EmojiExtension.php create mode 100644 src/Symfony/Bridge/Twig/Tests/Extension/EmojiExtensionTest.php diff --git a/src/Symfony/Bridge/Twig/CHANGELOG.md b/src/Symfony/Bridge/Twig/CHANGELOG.md index cc2d334538c34..a3cbe34260027 100644 --- a/src/Symfony/Bridge/Twig/CHANGELOG.md +++ b/src/Symfony/Bridge/Twig/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +7.1 +--- + + * Add `emojify` twig filter + 7.0 --- diff --git a/src/Symfony/Bridge/Twig/Extension/EmojiExtension.php b/src/Symfony/Bridge/Twig/Extension/EmojiExtension.php new file mode 100644 index 0000000000000..bbda98f64605b --- /dev/null +++ b/src/Symfony/Bridge/Twig/Extension/EmojiExtension.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\Twig\Extension; + +use Symfony\Component\Emoji\EmojiTransliterator; +use Twig\Extension\AbstractExtension; +use Twig\TwigFilter; + +/** + * @author Grégoire Pineau + */ +final class EmojiExtension extends AbstractExtension +{ + private static array $transliterators = []; + + public function getFilters(): array + { + return [ + new TwigFilter('emojify', $this->emojify(...)), + ]; + } + + public function emojify(string $string, string $catalog = 'slack'): string + { + if (!in_array($catalog, $catalogs = ['slack', 'github'], true)) { + throw new \InvalidArgumentException(sprintf('The catalog "%s" is not supported. Try one among "%s".', $catalog, implode('", "', $catalogs))); + } + + $tr = self::$transliterators[$catalog] ??= EmojiTransliterator::create('emoji-'.$catalog, EmojiTransliterator::REVERSE); + + return (string) $tr->transliterate($string); + } +} diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/EmojiExtensionTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/EmojiExtensionTest.php new file mode 100644 index 0000000000000..0ac3bc5685802 --- /dev/null +++ b/src/Symfony/Bridge/Twig/Tests/Extension/EmojiExtensionTest.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\Twig\Tests\Extension; + +use PHPUnit\Framework\TestCase; +use Symfony\Bridge\Twig\Extension\EmojiExtension; + +class EmojiExtensionTest extends TestCase +{ + /** + * @testWith ["😂", ":joy:"] + * ["😂", ":joy:", "slack"] + * ["😂", ":joy:", "github"] + */ + public function testEmojify(string $expected, string $string, ?string $catalog = null): void + { + $extension = new EmojiExtension(); + if ($catalog){ + $this->assertSame($expected, $extension->emojify($string, $catalog)); + } else { + $this->assertSame($expected, $extension->emojify($string)); + } + } +} diff --git a/src/Symfony/Bridge/Twig/composer.json b/src/Symfony/Bridge/Twig/composer.json index 71fb6a2f8af23..90eb69ed0c645 100644 --- a/src/Symfony/Bridge/Twig/composer.json +++ b/src/Symfony/Bridge/Twig/composer.json @@ -27,6 +27,7 @@ "symfony/asset": "^6.4|^7.0", "symfony/asset-mapper": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", + "symfony/emoji": "^7.1", "symfony/finder": "^6.4|^7.0", "symfony/form": "^6.4|^7.0", "symfony/html-sanitizer": "^6.4|^7.0",