Skip to content

Commit

Permalink
[Emoji] More ordering and minor fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolas-grekas committed Apr 3, 2024
1 parent cce36cd commit 63a6bd7
Show file tree
Hide file tree
Showing 131 changed files with 5,484 additions and 5,347 deletions.
2 changes: 1 addition & 1 deletion src/Symfony/Component/Emoji/EmojiTransliterator.php
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public function transliterate(string $string, int $start = 0, int $end = -1): st
}

// 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
// and to slice the string. Slicing is done by replacing the part of $string
// between $start and $end by a unique cookie that can be reliably used to
// identify which part of $string should be transliterated.

Expand Down
102 changes: 35 additions & 67 deletions src/Symfony/Component/Emoji/Resources/bin/build.php
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,6 @@ public static function buildRules(array $emojisCodePoints): Generator
];
continue;
}
if (!self::testEmoji($emoji, $locale, $emojiCodePoints)) {
continue;
}
$codePointsCount = mb_strlen($emoji);
$mapsByLocale[$locale][$codePointsCount][$emoji] = $name;
}
Expand Down Expand Up @@ -131,105 +128,73 @@ public static function buildRules(array $emojisCodePoints): Generator
public static function buildGitHubRules(array $emojisCodePoints): iterable
{
$emojis = json_decode((new Filesystem())->readFile(__DIR__.'/vendor/github-emojis.json'), true, flags: JSON_THROW_ON_ERROR);

$ignored = [];
$maps = [];

foreach ($emojis as $shortCode => $url) {
$emojiCodePoints = str_replace('-', ' ', strtolower(basename(parse_url($url, \PHP_URL_PATH), '.png')));

if (!array_key_exists($emojiCodePoints, $emojisCodePoints)) {
$ignored[] = [
'emojiCodePoints' => $emojiCodePoints,
'shortCode' => $shortCode,
];
continue;
}
$emoji = $emojisCodePoints[$emojiCodePoints];
if (!self::testEmoji($emoji, 'github', $emojiCodePoints)) {
continue;
}
$codePointsCount = mb_strlen($emoji);
$maps[$codePointsCount][$emoji] = ":$shortCode:";
$maps[mb_strlen($emoji)][":$shortCode:"] = $emoji;
}

$maps = self::createRules($maps);
[$map, $reverse] = self::createRules($maps, true);

return ['emoji-github' => $maps, 'github-emoji' => array_flip($maps)];
return ['emoji-github' => $map, 'github-emoji' => $reverse];
}

public static function buildGitlabRules(array $emojisCodePoints): iterable
{
$emojis = json_decode((new Filesystem())->readFile(__DIR__.'/vendor/gitlab-emojis.json'), true, flags: JSON_THROW_ON_ERROR);

$ignored = [];
$maps = [];

foreach ($emojis as $emojiItem) {
$emojiCodePoints = strtolower($emojiItem['unicode']);

if (!array_key_exists($emojiCodePoints, $emojisCodePoints)) {
$ignored[] = [
'emojiCodePoints' => $emojiCodePoints,
'name' => $emojiItem['name'],
];
continue;
}
$emoji = $emojisCodePoints[$emojiCodePoints];
if (!self::testEmoji($emoji, 'gitlab', $emojiCodePoints)) {
continue;
}
$codePointsCount = mb_strlen($emoji);
$maps[$codePointsCount][$emoji] = $emojiItem['shortname'];
$maps[mb_strlen($emoji)][$emojiItem['shortname']] = $emoji;
}

$maps = self::createRules($maps);
[$map, $reverse] = self::createRules($maps, true);

return ['emoji-gitlab' => $maps, 'gitlab-emoji' => array_flip($maps)];
return ['emoji-gitlab' => $map, 'gitlab-emoji' => $reverse];
}

public static function buildSlackRules(array $emojisCodePoints): iterable
{
$emojis = json_decode((new Filesystem())->readFile(__DIR__.'/vendor/slack-emojis.json'), true, flags: JSON_THROW_ON_ERROR);

$ignored = [];
$emojiSlackMaps = [];
$slackEmojiMaps = [];
$maps = [];

foreach ($emojis as $data) {
$emojiCodePoints = str_replace('-', ' ', strtolower($data['unified']));
$shortCode = $data['short_name'];
$shortCodes = $data['short_names'];
$shortCodes = array_map(fn ($v) => ":$v:", $shortCodes);

if (!array_key_exists($emojiCodePoints, $emojisCodePoints)) {
$ignored[] = [
'emojiCodePoints' => $emojiCodePoints,
'shortCode' => $shortCode,
];
continue;
}
$emoji = $emojisCodePoints[$emojiCodePoints];
if (!self::testEmoji($emoji, 'slack', $emojiCodePoints)) {
continue;
}
$codePointsCount = mb_strlen($emoji);
$emojiSlackMaps[$codePointsCount][$emoji] = ":$shortCode:";
foreach ($shortCodes as $short_name) {
$slackEmojiMaps[$codePointsCount][$short_name] = $emoji;
$codePointsCount = mb_strlen($emoji) << 1;
$maps[($codePointsCount << 1) + 1][":{$data['short_name']}:"] = $emoji;

foreach ($data['short_names'] as $shortName) {
$maps[$codePointsCount << 1][":$shortName:"] = $emoji;
}
}

return ['emoji-slack' => self::createRules($emojiSlackMaps), 'slack-emoji' => self::createRules($slackEmojiMaps)];
[$map, $reverse] = self::createRules($maps, true);

return ['emoji-slack' => $map, 'slack-emoji' => $reverse];
}

public static function buildStripRules(array $emojisCodePoints): iterable
{
$maps = [];
foreach ($emojisCodePoints as $codePoints => $emoji) {
if (!self::testEmoji($emoji, 'strip', $codePoints)) {
continue;
}
$codePointsCount = mb_strlen($emoji);
$maps[$codePointsCount][$emoji] = '';
foreach ($emojisCodePoints as $emoji) {
$maps[mb_strlen($emoji)][$emoji] = '';
}

return ['emoji-strip' => self::createRules($maps)];
Expand Down Expand Up @@ -269,24 +234,27 @@ public static function saveRules(iterable $rulesByLocale): void
$fs->dumpFile($file, preg_replace('/QUICK_CHECK = .*;/m', "QUICK_CHECK = {$quickCheck};", $fs->readFile($file)));
}

private static function testEmoji(string $emoji, string $locale, string $codePoints): bool
private static function createRules(array $maps, bool $reverse = false): array
{
if (!Transliterator::createFromRules("\\$emoji > test ;")) {
printf('Could not create transliterator for "%s" in "%s" locale. Code Point: "%s". Error: "%s".'."\n", $emoji, $locale, $codePoints, intl_get_error_message());
// We must sort the maps by the number of code points, because the order really matters:
// 🫶🏼 must be before 🫶
krsort($maps);

return false;
if (!$reverse) {
return array_merge(...$maps);
}

return true;
}
$emojiText = $textEmoji = [];

private static function createRules(array $maps): array
{
// We must sort the maps by the number of code points, because the order really matters:
// 🫶🏼 must be before 🫶
krsort($maps);
$maps = array_merge(...$maps);
foreach ($maps as $map) {
uksort($map, 'strnatcmp');
$textEmoji = $map + $textEmoji;

$map = array_flip($map);
ksort($map);
$emojiText += $map;
}

return $maps;
return [$emojiText, $textEmoji];
}
}
1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-af.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-am.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-ar.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-ar_sa.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-as.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-az.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-be.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-bg.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-bn.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-bs.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-ca.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-chr.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-cs.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-cy.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-da.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-de.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-de_ch.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-dsb.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-el.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-en.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-en_au.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-en_ca.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-en_gb.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-en_in.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/Symfony/Component/Emoji/Resources/data/emoji-es.php

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 63a6bd7

Please sign in to comment.