Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d195dcd

Browse files
[Emoji] More ordering and minor fixes
1 parent cce36cd commit d195dcd

File tree

131 files changed

+4241
-4105
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

131 files changed

+4241
-4105
lines changed

src/Symfony/Component/Emoji/EmojiTransliterator.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public function transliterate(string $string, int $start = 0, int $end = -1): st
119119
}
120120

121121
// Here we rely on intl to validate the $string, $start and $end arguments
122-
// and to slice the string. Slicing is done by replacing the part if $string
122+
// and to slice the string. Slicing is done by replacing the part of $string
123123
// between $start and $end by a unique cookie that can be reliably used to
124124
// identify which part of $string should be transliterated.
125125

src/Symfony/Component/Emoji/Resources/bin/build.php

+34-67
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,6 @@ public static function buildRules(array $emojisCodePoints): Generator
9898
];
9999
continue;
100100
}
101-
if (!self::testEmoji($emoji, $locale, $emojiCodePoints)) {
102-
continue;
103-
}
104101
$codePointsCount = mb_strlen($emoji);
105102
$mapsByLocale[$locale][$codePointsCount][$emoji] = $name;
106103
}
@@ -131,105 +128,73 @@ public static function buildRules(array $emojisCodePoints): Generator
131128
public static function buildGitHubRules(array $emojisCodePoints): iterable
132129
{
133130
$emojis = json_decode((new Filesystem())->readFile(__DIR__.'/vendor/github-emojis.json'), true, flags: JSON_THROW_ON_ERROR);
134-
135-
$ignored = [];
136131
$maps = [];
137132

138133
foreach ($emojis as $shortCode => $url) {
139134
$emojiCodePoints = str_replace('-', ' ', strtolower(basename(parse_url($url, \PHP_URL_PATH), '.png')));
135+
140136
if (!array_key_exists($emojiCodePoints, $emojisCodePoints)) {
141-
$ignored[] = [
142-
'emojiCodePoints' => $emojiCodePoints,
143-
'shortCode' => $shortCode,
144-
];
145137
continue;
146138
}
147139
$emoji = $emojisCodePoints[$emojiCodePoints];
148-
if (!self::testEmoji($emoji, 'github', $emojiCodePoints)) {
149-
continue;
150-
}
151-
$codePointsCount = mb_strlen($emoji);
152-
$maps[$codePointsCount][$emoji] = ":$shortCode:";
140+
$maps[mb_strlen($emoji)][":$shortCode:"] = $emoji;
153141
}
154142

155-
$maps = self::createRules($maps);
143+
[$map, $reverse] = self::createRules($maps, true);
156144

157-
return ['emoji-github' => $maps, 'github-emoji' => array_flip($maps)];
145+
return ['emoji-github' => $map, 'github-emoji' => $reverse];
158146
}
159147

160148
public static function buildGitlabRules(array $emojisCodePoints): iterable
161149
{
162150
$emojis = json_decode((new Filesystem())->readFile(__DIR__.'/vendor/gitlab-emojis.json'), true, flags: JSON_THROW_ON_ERROR);
163-
164-
$ignored = [];
165151
$maps = [];
166152

167153
foreach ($emojis as $emojiItem) {
168154
$emojiCodePoints = strtolower($emojiItem['unicode']);
155+
169156
if (!array_key_exists($emojiCodePoints, $emojisCodePoints)) {
170-
$ignored[] = [
171-
'emojiCodePoints' => $emojiCodePoints,
172-
'name' => $emojiItem['name'],
173-
];
174157
continue;
175158
}
176159
$emoji = $emojisCodePoints[$emojiCodePoints];
177-
if (!self::testEmoji($emoji, 'gitlab', $emojiCodePoints)) {
178-
continue;
179-
}
180-
$codePointsCount = mb_strlen($emoji);
181-
$maps[$codePointsCount][$emoji] = $emojiItem['shortname'];
160+
$maps[mb_strlen($emoji)][$emojiItem['shortname']] = $emoji;
182161
}
183162

184-
$maps = self::createRules($maps);
163+
[$map, $reverse] = self::createRules($maps, true);
185164

186-
return ['emoji-gitlab' => $maps, 'gitlab-emoji' => array_flip($maps)];
165+
return ['emoji-gitlab' => $map, 'gitlab-emoji' => $reverse];
187166
}
188167

189168
public static function buildSlackRules(array $emojisCodePoints): iterable
190169
{
191170
$emojis = json_decode((new Filesystem())->readFile(__DIR__.'/vendor/slack-emojis.json'), true, flags: JSON_THROW_ON_ERROR);
192-
193-
$ignored = [];
194-
$emojiSlackMaps = [];
195-
$slackEmojiMaps = [];
171+
$maps = [];
196172

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

203176
if (!array_key_exists($emojiCodePoints, $emojisCodePoints)) {
204-
$ignored[] = [
205-
'emojiCodePoints' => $emojiCodePoints,
206-
'shortCode' => $shortCode,
207-
];
208177
continue;
209178
}
210179
$emoji = $emojisCodePoints[$emojiCodePoints];
211-
if (!self::testEmoji($emoji, 'slack', $emojiCodePoints)) {
212-
continue;
213-
}
214-
$codePointsCount = mb_strlen($emoji);
215-
$emojiSlackMaps[$codePointsCount][$emoji] = ":$shortCode:";
216-
foreach ($shortCodes as $short_name) {
217-
$slackEmojiMaps[$codePointsCount][$short_name] = $emoji;
180+
$codePointsCount = mb_strlen($emoji) << 1;
181+
$maps[($codePointsCount << 1) + 1][":{$data['short_name']}:"] = $emoji;
182+
183+
foreach ($data['short_names'] as $shortName) {
184+
$maps[$codePointsCount << 1][":$shortName:"] = $emoji;
218185
}
219186
}
220187

221-
return ['emoji-slack' => self::createRules($emojiSlackMaps), 'slack-emoji' => self::createRules($slackEmojiMaps)];
188+
[$map, $reverse] = self::createRules($maps, true);
189+
190+
return ['emoji-slack' => $map, 'slack-emoji' => $reverse];
222191
}
223192

224193
public static function buildStripRules(array $emojisCodePoints): iterable
225194
{
226195
$maps = [];
227-
foreach ($emojisCodePoints as $codePoints => $emoji) {
228-
if (!self::testEmoji($emoji, 'strip', $codePoints)) {
229-
continue;
230-
}
231-
$codePointsCount = mb_strlen($emoji);
232-
$maps[$codePointsCount][$emoji] = '';
196+
foreach ($emojisCodePoints as $emoji) {
197+
$maps[mb_strlen($emoji)][$emoji] = '';
233198
}
234199

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

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

277-
return false;
243+
if (!$reverse) {
244+
return array_merge(...$maps);
278245
}
279246

280-
return true;
281-
}
247+
$emojiText = $textEmoji = [];
282248

283-
private static function createRules(array $maps): array
284-
{
285-
// We must sort the maps by the number of code points, because the order really matters:
286-
// 🫶🏼 must be before 🫶
287-
krsort($maps);
288-
$maps = array_merge(...$maps);
249+
foreach ($maps as $map) {
250+
uksort($map, 'strnatcmp');
251+
$textEmoji = $map + $textEmoji;
252+
253+
$map = array_flip($map);
254+
$emojiText += $map;
255+
}
289256

290-
return $maps;
257+
return [$emojiText, $textEmoji];
291258
}
292259
}

src/Symfony/Component/Emoji/Resources/data/emoji-af.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-am.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-ar.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-ar_sa.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-as.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-az.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-be.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-bg.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-bn.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-bs.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-ca.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-chr.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-cs.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-cy.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-da.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-de.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-de_ch.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-dsb.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-el.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-en.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-en_001.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-en_au.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-en_ca.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-en_gb.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-en_in.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-es.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Symfony/Component/Emoji/Resources/data/emoji-es_419.php

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)