Meta: Generate emoji.txt at build time from Unicode's emoji-test.txt

Instead of manually updating emoji.txt whenever new emoji are added,
we use Unicode's emoji-test.txt to generate emoji.txt on each build,
including only the emojis that Serenity supports at that time.

By using emoji-test.txt, we can also include all forms of each emoji
(fully-qualified, minimally-qualified, and unqualified) which can be
helpful when double-checking how certain forms are handled.
This commit is contained in:
Ryan Liptak 2022-08-20 02:20:22 -07:00 committed by Linus Groh
parent 8f4317e207
commit 221d9089e9
5 changed files with 86 additions and 509 deletions

1
Base/.gitignore vendored
View File

@ -1 +1,2 @@
!*
home/anon/Documents/emoji.txt

View File

@ -1,509 +0,0 @@
Faces & Misc Emoji
------------------
☀️ - U+2600 U+FE0F SUN
☁️ - U+2601 U+FE0F CLOUD
☹️ - U+2639 U+FE0F FROWNING FACE
☺️ - U+263A U+FE0F SMILING FACE
✌️ - U+270C U+FE0F VICTORY HAND
✍️ - U+270D U+FE0F WRITING HAND
🅰️ - U+1F170 A BUTTON (BLOOD TYPE)
🅱️ - U+1F171 B BUTTON (BLOOD TYPE)
🅾️ - U+1F17E O BUTTON (BLOOD TYPE)
🅿️ - U+1F17F P BUTTON
🆎 - U+1F18E AB BUTTON (BLOOD TYPE)
🆑 - U+1F191 CL BUTTON
🆔 - U+1F194 ID BUTTON
🆖 - U+1F196 NG BUTTON
🆗 - U+1F197 OK BUTTON
🆘 - U+1F198 SOS BUTTON
🆙 - U+1F199 UP! BUTTON
🆚 - U+1F19A VS BUTTON
🈁 - U+1F201 JAPANESE “HERE” BUTTON
🈂️ - U+1F202 JAPANESE “SERVICE CHARGE” BUTTON
🈳 - U+1F233 JAPANESE “VACANCY” BUTTON
🈴 - U+1F234 JAPANESE “PASSING GRADE” BUTTON
🈶 - U+1F236 JAPANESE “NOT FREE OF CHARGE” BUTTON
🈷️ - U+1F237 JAPANESE “MONTHLY AMOUNT” BUTTON
🈸 - U+1F238 JAPANESE “APPLICATION” BUTTON
🉑 - U+1F251 JAPANESE “ACCEPTABLE” BUTTON
🌈 - U+1F308 RAINBOW
🌋 - U+1F30B VOLCANO
🌍 - U+1F30D GLOBE SHOWING EUROPE-AFRICA
🌎 - U+1F30E GLOBE SHOWING AMERICAS
🌏 - U+1F30F GLOBE SHOWING ASIA-AUSTRALIA
🌑 - U+1F311 NEW MOON
🌒 - U+1F312 WAXING CRESCENT MOON
🌓 - U+1F313 FIRST QUARTER MOON
🌔 - U+1F314 WAXING GIBBOUS MOON
🌕 - U+1F315 FULL MOON
🌖 - U+1F316 WANING GIBBOUS MOON
🌗 - U+1F317 LAST QUARTER MOON
🌘 - U+1F318 WANING CRESCENT MOON
🌙 - U+1F319 CRESCENT MOON
🌚 - U+1F31A NEW MOON FACE
🌛 - U+1F31B FIRST QUARTER MOON FACE
🌜 - U+1F31C LAST QUARTER MOON FACE
🌝 - U+1F31D FULL MOON FACE
🌤️ - U+1F324 U+FE0F SUN BEHIND SMALL CLOUD
🌥️ - U+1F325 U+FE0F SUN BEHIND LARGE CLOUD
🌦️ - U+1F326 U+FE0F SUN BEHIND RAIN CLOUD
🌧️ - U+1F327 U+FE0F CLOUD WITH RAIN
🌨️ - U+1F328 U+FE0F CLOUD WITH SNOW
🌩️ - U+1F329 U+FE0F CLOUD WITH LIGHTNING
🌭 - U+1F32D HOT DOG
🌮 - U+1F32E TACO
🌯 - U+1F32F BURRITO
🌱 - U+1F331 SEEDLING
🌲 - U+1F332 EVERGREEN TREE
🌴 - U+1F334 PALM TREE
🌵 - U+1F335 CACTUS
🌻 - U+1F33B SUNFLOWER
🍄 - U+1F344 MUSHROOM
🍅 - U+1F345 TOMATO
🍆 - U+1F346 EGGPLANT
🍇 - U+1F347 GRAPES
🍈 - U+1F348 MELON
🍉 - U+1F349 WATERMELON
🍊 - U+1F34A TANGERINE
🍋 - U+1F34B LEMON
🍌 - U+1F34C BANANA
🍍 - U+1F34D PINEAPPLE
🍎 - U+1F34E RED APPLE
🍏 - U+1F34E GREEN APPLE
🍐 - U+1F350 PEAR
🍑 - U+1F351 PEACH
🍒 - U+1F352 CHERRIES
🍓 - U+1F353 STRAWBERRY
🍔 - U+1F354 HAMBURGER
🍕 - U+1F355 SLICE OF PIZZA
🍟 - U+1F35F FRENCH FRIES
🍩 - U+1F369 DOUGHNUT
🍪 - U+1F36A COOKIE
🍳 - U+1F373 COOKING
🍷 - U+1F377 WINE GLASS
🍹 - U+1F379 TROPICAL DRINK
🎄 - U+1F384 CHRISTMAS TREE
🎉 - U+1F389 PARTY POPPER
🎨 - U+1F3A8 ARTIST PALETTE
🎹 - U+1F3B9 MUSICAL KEYBOARD
🏔️ - U+1F3D4 SNOW-CAPPED MOUNTAIN
🏜️ - U+1F3DC DESERT
🏝️ - U+1F3DD DESERT ISLAND
🐌 - U+1F40C SNAIL
🐙 - U+1F419 OCTOPUS
🐞 - U+1F41E LADY BEETLE
👀 - U+1F440 EYES
👆 - U+1F446 BACKHAND INDEX POINTING UP
👇 - U+1F447 BACKHAND INDEX POINTING DOWN
👈 - U+1F448 BACKHAND INDEX POINTING LEFT
👉 - U+1F449 BACKHAND INDEX POINTING RIGHT
👋 - U+1F44B WAVING HAND
👌 - U+1F44C OK HAND
👍 - U+1F44D THUMBS UP SIGN
👎 - U+1F44E THUMBS DOWN SIGN
👏 - U+1F44F CLAPPING HANDS
👑 - U+1F451 CROWN
👽 - U+1F47D ALIEN
💀 - U+1F480 SKULL
💌 - U+1F48C LOVE LETTER
💖 - U+1F496 SPARKLING HEART
💡 - U+1F4A1 ELECTRIC LIGHT BULB
💣 - U+1F4A3 BOMB
💦 - U+1F4A6 SWEAT DROPLETS
💯 - U+1F4AF HUNDRED POINTS
💾 - U+1F4BE FLOPPY DISK
📈 - U+1F4C8 CHART INCREASING
📉 - U+1F4C9 CHART DECREASING
📊 - U+1F4CA BAR CHART
📌 - U+1F4CC PUSHPIN
📍 - U+1F4CD ROUND PUSHPIN
📵 - U+1F4F5 NO MOBILE PHONES
📷 - U+1F4F7 CAMERA
📸 - U+1F4F8 CAMERA WITH FLASH
📺 - U+1F4FA TELEVISION
📻 - U+1F4FB RADIO
🔥 - U+1F525 FIRE
🔴 - U+1F534 RED CIRCLE
🔵 - U+1F535 BLUE CIRCLE
🔶 - U+1F536 LARGE ORANGE DIAMOND
🔷 - U+1F537 LARGE BLUE DIAMOND
🔸 - U+1F538 SMALL ORANGE DIAMOND
🔹 - U+1F539 SMALL BLUE DIAMOND
🔺 - U+1F53A UP-POINTING RED TRIANGLE
🔻 - U+1F53B DOWN-POINTING RED TRIANGLE
🕊 - U+1F54A DOVE
🕐 - U+1F550 ONE OCLOCK
🕑 - U+1F551 TWO OCLOCK
🕒 - U+1F552 THREE OCLOCK
🕓 - U+1F553 FOUR OCLOCK
🕔 - U+1F554 FIVE OCLOCK
🕕 - U+1F555 SIX OCLOCK
🕖 - U+1F556 SEVEN OCLOCK
🕗 - U+1F557 EIGHT OCLOCK
🕘 - U+1F558 NINE OCLOCK
🕙 - U+1F559 TEN OCLOCK
🕚 - U+1F55A ELEVEN OCLOCK
🕛 - U+1F55B TWELVE OCLOCK
🕜 - U+1F55C ONE-THIRTY
🕝 - U+1F55D TWO-THIRTY
🕞 - U+1F55E THREE-THIRTY
🕟 - U+1F55F FOUR-THIRTY
🕠 - U+1F560 FIVE-THIRTY
🕡 - U+1F561 SIX-THIRTY
🕢 - U+1F562 SEVEN-THIRTY
🕣 - U+1F563 EIGHT-THIRTY
🕤 - U+1F564 NINE-THIRTY
🕥 - U+1F565 TEN-THIRTY
🕦 - U+1F566 ELEVEN-THIRTY
🕧 - U+1F567 TWELVE-THIRTY
🕯 - U+1F56F CANDLE
🕳️ - U+1F573 HOLE
🕶️ - U+1F576 SUNGLASSES
🖊 - U+1F58A PEN
🖋 - U+1F58B FOUNTAIN PEN
🖌 - U+1F58C PAINTBRUSH
🖍 - U+1F58D CRAYON
🖐️ - U+1F590 HAND WITH FINGERS SPLAYED
🗝 - U+1F5DD OLD KEY
🗞 - U+1F5DE ROLLED-UP NEWSPAPER
🗡 - U+1F5E1 DAGGER
🗽 - U+1F5FD STATUE OF LIBERTY
😀 - U+1F600 GRINNING FACE
😁 - U+1F601 GRINNING FACE WITH SMILING EYES
😂 - U+1F602 FACE WITH TEARS OF JOY
😃 - U+1F603 SMILING FACE WITH OPEN MOUTH
😄 - U+1F604 SMILING FACE WITH OPEN MOUTH AND SMILING EYES
😆 - U+1F606 SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES
😈 - U+1F608 SMILING FACE WITH HORNS
😊 - U+1F60A SMILING FACE WITH SMILING EYES
😎 - U+1F60E SMILING FACE WITH SUNGLASSES
😬 - U+1F62C GRIMACING FACE
😮‍💨 - U+1F62E U+200D U+1F4A8 FACE EXHALING
😵‍💫 - U+1F635 U+200D U+1F4AB FACE WITH SPIRAL EYES
😶 - U+1F636 FACE WITHOUT MOUTH
😶‍🌫️ - U+1F636 U+200D U+1F32B U+FE0F FACE IN CLOUDS
😸 - U+1F638 GRINNING CAT WITH SMILING EYES
😺 - U+1F63A SMILING CAT FACE
😼 - U+1F63C CAT FACE WITH WRY SMILE
😽 - U+1F63D KISSING CAT FACE WITH CLOSED EYES
😾 - U+1F63E POUTING CAT FACE
😿 - U+1F63F CRYING CAT FACE
😹 - U+1F639 CAT FACE WITH TEARS OF JOY
🙀 - U+1F640 WEARY CAT FACE
🙂 - U+1F642 SLIGHTLY SMILING FACE
🙃 - U+1F643 UPSIDE-DOWN FACE
🚀 - U+1F680 ROCKET
🚥 - U+1F6A5 HORIZONTAL TRAFFIC LIGHT
🚦 - U+1F6A6 VERTICAL TRAFFIC LIGHT
🛖 - U+1F6D6 HUT
🛠️ - U+1F6E0 HAMMER AND WRENCH
🛡 - U+1F6E1 SHIELD
🟠 - U+1F7E0 ORANGE CIRLE
🟡 - U+1F7E1 YELLOW CIRLE
🟢 - U+1F7E2 GREEN CIRLE
🟣 - U+1F7E3 PURPLE CIRLE
🟤 - U+1F7E4 BROWN CIRLE
🟥 - U+1F7E5 RED SQUARE
🟦 - U+1F7E6 BLUE SQUARE
🟧 - U+1F7E7 ORANGE SQUARE
🟨 - U+1F7E8 YELLOW SQUARE
🟩 - U+1F7E9 GREEN SQUARE
🟪 - U+1F7EA PURPLE SQUARE
🟫 - U+1F7EB BROWN SQUARE
🤍 - U+1F90D WHITE HEART
🤎 - U+1F90E BROWN HEART
🤏 - U+1F90F PINCHING HAND
🤔 - U+1F914 THINKING FACE
🤖 - U+1F916 ROBOT
🤗 - U+1F917 SMILING FACE WITH OPEN HANDS
🤙 - U+1F919 CALL ME HAND
🤚 - U+1F91A RAISED BACK OF HAND
🤝 - U+1F91D HANDSHAKE
🤡 - U+1F921 CLOWN FACE
🤣 - U+1F923 ROLLING ON THE FLOOR LAUGHING
🤤 - U+1F924 DROOLING FACE
🤦 - U+1F926 FACE PALM
🤧 - U+1F927 SNEEZING FACE
🤪 - U+1F92A ZANY FACE
🤫 - U+1F92B SHUSHING FACE
🤭 - U+1F92D FACE WITH HAND OVER MOUTH
🥇 - U+1F947 FIRST PLACE MEDAL
🥈 - U+1F948 SECOND PLACE MEDAL
🥑 - U+1F951 AVOCADO
🥓 - U+1F953 BACON
🥕 - U+1F955 CARROT
🥛 - U+1F95B GLASS OF MILK
🥝 - U+1F95D KIWIFRUIT
🥦 - U+1F966 BROCCOLI
🥱 - U+1F971 YAWNING FACE
🥲 - U+1F972 SMILING FACE WITH TEAR
🥳 - U+1F973 PARTYING FACE
🥴 - U+1F974 WOOZY FACE
🥸 - U+1F978 DISGUISED FACE
🥹 - U+1F979 FACE HOLDING BACK TEARS
🥺 - U+1F97A PLEADING FACE
🦁 - U+1F981 LION FACE
🦄 - U+1F984 UNICORN FACE
🧋 - U+1F9CB BUBBLE TEA
🧐 - U+1F9D0 FACE WITH MONOCLE
🪤 - U+1FAA4 MOUSE TRAP
🫠 - U+1FAE0 MELTING FACE
🫡 - U+1FAE1 SALUTING FACE
🫢 - U+1FAE2 FACE WITH OPEN EYES AND HAND OVER MOUTH
🫣 - U+1FAE3 FACE WITH PEEKING EYE
🫤 - U+1FAE4 FACE WITH DIAGONAL MOUTH
🫥 - U+1FAE5 DOTTED LINE FACE
🫧 - U+1FAE7 BUBBLES
🧱 - U+1F9F1 BRICK
🧲 - U+1F9F2 MAGNET
🩱 - U+1FA71 ONE-PIECE SWIMSUIT
🩲 - U+1FA72 BRIEFS
🩳 - U+1FA73 SHORTS
🩸 - U+1FA78 DROP OF BLOOD
🩹 - U+1FA79 ADHESIVE BANDAGE
🪀 - U+1FA80 YO-YO
🪑 - U+1FA91 CHAIR
🪜 - U+1FA9C LADDER
🪢 - U+1FAA2 KNOT
🪵 - U+1FAB5 WOOD
🫑 - U+1FAD1 BELL PEPPER
🫒 - U+1FAD2 OLIVE
🫱 - U+1FAF1 RIGHTWARDS HAND
🫲 - U+1FAF2 LEFTWARDS HAND
🫳 - U+1FAF3 PALM DOWN HAND
🫴 - U+1FAF4 PALM UP HAND
🫶 - U+1FAF6 HEART HANDS
• - U+2022 BULLET
☕ - U+2615 HOT BEVERAGE
♋ - U+264B CANCER
⚓ - U+2693 ANCHOR
⚠ - U+26A0 WARNING SIGN
⚡ - U+26A1 HIGH VOLTAGE SIGN
⛓️ - U+26D3 CHAINS
⛔ - U+26D4 NO ENTRY
⛰️ - U+26F0 MOUNTAIN
⛱️ - U+26F1 UMBRELLA ON GROUND
⛽ - U+26FD FUEL PUMP
✋ - U+270B RAISED HAND
✨ - U+2728 SPARKLES
❤ - U+2764 RED HEART
⬆ - U+2B06 UPWARDS BLACK ARROW
⬇ - U+2B07 DOWNWARDS BLACK ARROW
⭐ - U+2B50 STAR
ZWJ Sequence Emoji (limited cross-platform support)
---------
🐱‍🐶 - U+1F431 U+200D U+1F436 CATDOG FACE
Yak Emoji (limited cross-platform support)
---------
􌴀 - U+10CD00 HAIRYAK
􌴁 - U+10CD01 IMMINENTYAKSHAVE
􌴂 - U+10CD02 SHAVEDYAK
􌴃 - U+10CD03 YAKPLUS
􌴄 - U+10CD04 YAKPING
􌴅 - U+10CD05 YAKMINUS
􌴆 - U+10CD06 YAKTANGLE
􌴇 - U+10CD07 YAKBAIT
􌴈 - U+10CD08 REYAKTED
􌴉 - U+10CD09 SLEEPYAK
􌴊 - U+10CD0A YAKBRAIN
􌴋 - U+10CD0B GOLDYAK
􌴌 - U+10CD0C YAKKING
􌴍 - U+10CD0D YAKMAIL
􌴎 - U+10CD0E YAKMAGNET
􌴏 - U+10CD0F YAKFIRE
􌴐 - U+10CD10 YAKSPLODE
􌴑 - U+10CD11 YAKSHED
􌴒 - U+10CD12 YAKFUSED
􌴓 - U+10CD13 8BITYAK
􌴔 - U+10CD14 SKELEYAK
􌴕 - U+10CD15 NEOYAK
􌴖 - U+10CD16 YAKEA
􌴗 - U+10CD17 YAKID2
􌴘 - U+10CD18 YAKSLICE
􌴙 - U+10CD19 YAKSTICKER
􌴚 - U+10CD1A YAKKIE
􌴛 - U+10CD1B ANGELYAK
􌴜 - U+10CD1C YAK
􌴝 - U+10CD1D YAKGONE
􌴞 - U+10CD1E YAKMEASURE
􌴟 - U+10CD1F YAKCOWBOY
􌴠 - U+10CD20 YAKSPEED
􌴡 - U+10CD21 YAKMANDO
􌴢 - U+10CD22 NINJYAK
􌴣 - U+10CD23 YOWL
􌵠 - U+10CD60 PARTYAK
􌵡 - U+10CD61 YAKKISS
􌵢 - U+10CD62 THOUSANDYAKSTARE
􌵣 - U+10CD63 YAKBLUSH
􌵤 - U+10CD64 YAKSHRUG
􌵥 - U+10CD65 YAKTHONK
􌵦 - U+10CD66 YAKSAD
􌵧 - U+10CD67 BABYAK
􌵨 - U+10CD68 YAKKETYSAX
􌵩 - U+10CD69 YAKBANE
􌶐 - U+10CD90 YAKSTACK
􌶑 - U+10CD91 YAKCHAIN
􌶒 - U+10CD92 YAKRING
􌶓 - U+10CD93 YAKOVERFLOW
􌶰 - U+10CDB0 XMASYAK
􌶱 - U+10CDB1 YAKTOBERFEST
􌷐 - U+10CDD0 YAKSTEPS
􌷠 - U+10CDE0 YAKRAGE-FRAME-1
􌷡 - U+10CDE1 YAKRAGE-FRAME-2
􌷢 - U+10CDE2 YAKRAGE-FRAME-3
􌷣 - U+10CDE3 YAKRAGE-FRAME-4
􌷤 - U+10CDE4 YAKRAGE-FRAME-5
􌷥 - U+10CDE5 YAKRAGE-FRAME-6
ZWJ Sequence Flags
------------------
🏳️‍🐞 - U+1F3F3 U+FE0F U+200D U+1F41E SerenityOS flag (limited cross-platform support)
🏳️‍🌈 - U+1F3F3 U+FE0F U+200D U+1F308 Rainbow flag
🏳️‍⚧️ - U+1F3F3 U+FE0F U+200D U+26A7 U+FE0F Transgender flag
🏴‍☠️ - U+1F3F4 U+200D U+2620 U+FE0F Pirate flag
🏳️‍ - U+1F3F3 U+FE0F U+200D U+F8FF Klingon flag (limited cross-platform support)
🏳️‍🖖 - U+1F3F3 U+FE0F U+200D U+1F596 Vulcan flag (limited cross-platform support)
Regional Indicator Symbol Flags
-------------------------------
🇦🇪 - U+1F1E6 U+1F1EA AE United Arab Emirates
🇦🇲 - U+1F1E6 U+1F1F2 AM Armenia
🇦🇶 - U+1F1E6 U+1F1F6 AQ Antarctica
🇦🇹 - U+1F1E6 U+1F1F9 AT Austria
🇦🇽 - U+1F1E6 U+1F1FD AX Åland Islands
🇧🇮 - U+1F1E7 U+1F1EE BI Burundi
🇧🇻 - U+1F1E7 U+1F1FB BV Bouvet Island
🇨🇬 - U+1F1E8 U+1F1EC CG Congo - Brazzaville
🇨🇭 - U+1F1E8 U+1F1ED CH Switzerland
🇨🇮 - U+1F1E8 U+1F1EE CI Côte d'Ivoire
🇨🇵 - U+1F1E8 U+1F1F5 CP Clipperton Island
🇨🇷 - U+1F1E8 U+1F1F7 CR Costa Rica
🇨🇺 - U+1F1E8 U+1F1FA CU Cuba
🇩🇪 - U+1F1E9 U+1F1EA DE Germany
🇩🇯 - U+1F1E9 U+1F1EF DJ DJIBOUTI
🇩🇰 - U+1F1E9 U+1F1F0 DK Denmark
🇩🇴 - U+1F1E9 U+1F1F4 DO Dominican Republic
🇪🇦 - U+1F1EA U+1F1E6 EA Ceuta & Melilla
🇪🇭 - U+1F1EA U+1F1ED EH Western Sahara
🇪🇺 - U+1F1EA U+1F1FA EU European Union
🇫🇮 - U+1F1EB U+1F1EE FI Finland
🇫🇴 - U+1F1EB U+1F1F4 FO Faroe Islands
🇫🇷 - U+1F1EB U+1F1F7 FR France
🇬🇧 - U+1F1EC U+1F1E7 GB United Kingdom
🇬🇫 - U+1F1EC U+1F1EB GF French Guiana
🇬🇬 - U+1F1EC U+1F1EC GG Guernsey
🇬🇱 - U+1F1EC U+1F1F1 GL Greenland
🇬🇷 - U+1F1EC U+1F1F7 GR Greece
🇬🇹 - U+1F1EC U+1F1F9 GT Guatemala
🇭🇺 - U+1F1ED U+1F1FA HU Hungary
🇮🇩 - U+1F1EE_U+1F1E9 ID Indonesia
🇮🇱 - U+1F1EE U+1F1F1 IL Israel
🇮🇷 - U+1F1EE U+1F1F7 IR Iran
🇮🇸 - U+1F1EE U+1F1F8 IS Iceland
🇯🇴 - U+1F1EF U+1F1F4 JO Jordan
🇰🇳 - U+1F1F0 U+1F1F3 KN St. Kitts & Nevis
🇱🇦 - U+1F1F1 U+1F1E6 LA Laos
🇱🇧 - U+1F1F1 U+1F1E7 LB Lebanon
🇲🇫 - U+1F1F2_U+1F1EB MF St. Martin
🇲🇰 - U+1F1F2 U+1F1F0 MK North Macedonia
🇳🇫 - U+1F1F3 U+1F1EB NF Norfolk Island
🇳🇱 - U+1F1F3 U+1F1F1 NL Netherlands
🇳🇴 - U+1F1F3 U+1F1F4 NO Norway
🇵🇦 - U+1F1F5 U+1F1E6 PA Panama
🇵🇭 - U+1F1F5 U+1F1ED PH Philippines
🇵🇱 - U+1F1F5 U+1F1F1 PL Poland
🇵🇸 - U+1F1F5 U+1F1F8 PS Palestine
🇵🇼 - U+1F1F5 U+1F1FC PW Palau
🇷🇺 - U+1F1F7 U+1F1FA RU Russia
🇸🇪 - U+1F1F8 U+1F1EA SE Sweden
🇸🇯 - U+1F1F8 U+1F1EF SJ Svalbard & Jan Mayen
🇸🇹 - U+1F1F8 U+1F1F9 ST São Tomé & Príncipe
🇸🇾 - U+1F1F8 U+1F1FE SY Syria
🇹🇷 - U+1F1F9 U+1F1F7 TR Turkey
🇹🇼 - U+1F1F9 U+1F1FC TW Taiwan
🇺🇦 - U+1F1FA U+1F1E6 UA Ukraine
🇺🇲 - U+1F1FA_U+1F1F2 UM U.S. Outlying Islands
🇺🇳 - U+1F1FA U+1F1F3 UN United Nations
🇺🇸 - U+1F1FA U+1F1F8 US United States
🇻🇳 - U+1F1FB U+1F1F3 VN Vietnam
Emoji Tag Sequence Flags (limited cross-platform support)
------------------------
🏴󠁣󠁡󠁱󠁣󠁿 - U+1F3F4 U+E0063 U+E0061 U+E0071 U+E0063 U+E007F CA-QC Quebec
🏴󠁤󠁥󠁢󠁢󠁿 - U+1F3F4 U+E0064 U+E0065 U+E0062 U+E0062 U+E007F DE-BB Brandenburg
🏴󠁤󠁥󠁢󠁥󠁿 - U+1F3F4 U+E0064 U+E0065 U+E0062 U+E0065 U+E007F DE-BE Berlin
🏴󠁤󠁥󠁢󠁷󠁿 - U+1F3F4 U+E0064 U+E0065 U+E0062 U+E0077 U+E007F DE-BW Baden-Württemberg
🏴󠁤󠁥󠁢󠁹󠁿 - U+1F3F4 U+E0064 U+E0065 U+E0062 U+E0079 U+E007F DE-BY Bavaria
🏴󠁤󠁥󠁨󠁢󠁿 - U+1F3F4 U+E0064 U+E0065 U+E0068 U+E0062 U+E007F DE-HB Bremen
🏴󠁤󠁥󠁨󠁥󠁿 - U+1F3F4 U+E0064 U+E0065 U+E0068 U+E0065 U+E007F DE-HE Hesse
🏴󠁤󠁥󠁨󠁨󠁿 - U+1F3F4 U+E0064 U+E0065 U+E0068 U+E0068 U+E007F DE-HH Hamburg
🏴󠁤󠁥󠁭󠁶󠁿 - U+1F3F4 U+E0064 U+E0065 U+E006D U+E0076 U+E007F DE-MV Mecklenburg-Vorpommern
🏴󠁤󠁥󠁮󠁩󠁿 - U+1F3F4 U+E0064 U+E0065 U+E006E U+E0069 U+E007F DE-NI Lower Saxony
🏴󠁤󠁥󠁮󠁷󠁿 - U+1F3F4 U+E0064 U+E0065 U+E006E U+E0077 U+E007F DE-NW North Rhine-Westphalia
🏴󠁤󠁥󠁲󠁰󠁿 - U+1F3F4 U+E0064 U+E0065 U+E0072 U+E0070 U+E007F DE-RP Rhineland-Palatinate
🏴󠁤󠁥󠁳󠁨󠁿 - U+1F3F4 U+E0064 U+E0065 U+E0073 U+E0068 U+E007F DE-SH Schleswig-Holstein
🏴󠁤󠁥󠁳󠁬󠁿 - U+1F3F4 U+E0064 U+E0065 U+E0073 U+E006C U+E007F DE-SL Saarland
🏴󠁤󠁥󠁳󠁮󠁿 - U+1F3F4 U+E0064 U+E0065 U+E0073 U+E006E U+E007F DE-SN Saxony
🏴󠁤󠁥󠁳󠁴󠁿 - U+1F3F4 U+E0064 U+E0065 U+E0073 U+E0074 U+E007F DE-ST Saxony-Anhalt
🏴󠁤󠁥󠁴󠁨󠁿 - U+1F3F4 U+E0064 U+E0065 U+E0074 U+E0068 U+E007F DE-TH Thuringia
🏴󠁥󠁳󠁣󠁴󠁿 - U+1F3F4 U+E0065 U+E0073 U+E0063 U+E0074 U+E007F ES-CT Catalonia
🏴󠁥󠁳󠁰󠁶󠁿 - U+1F3F4 U+E0065 U+E0073 U+E0070 U+E0076 U+E007F ES-PV Basque Country
🏴󠁦󠁩󠀰󠀳󠁿 - U+1F3F4 U+E0066 U+E0069 U+E0030 U+E0033 U+E007F FI-03 South Ostrobothnia
🏴󠁦󠁩󠀰󠀴󠁿 - U+1F3F4 U+E0066 U+E0069 U+E0030 U+E0034 U+E007F FI-04 South Savonia
🏴󠁦󠁩󠀰󠀵󠁿 - U+1F3F4 U+E0066 U+E0069 U+E0030 U+E0035 U+E007F FI-05 Kainuu
🏴󠁦󠁩󠀰󠀶󠁿 - U+1F3F4 U+E0066 U+E0069 U+E0030 U+E0036 U+E007F FI-06 Kanta-Häme (Tavastia Proper)
🏴󠁦󠁩󠀰󠀷󠁿 - U+1F3F4 U+E0066 U+E0069 U+E0030 U+E0037 U+E007F FI-07 Central Ostrobothnia
🏴󠁦󠁩󠀰󠀸󠁿 - U+1F3F4 U+E0066 U+E0069 U+E0030 U+E0038 U+E007F FI-08 Central Finland
🏴󠁦󠁩󠀱󠀳󠁿 - U+1F3F4 U+E0066 U+E0069 U+E0031 U+E0033 U+E007F FI-13 North Karelia
🏴󠁦󠁩󠀱󠀵󠁿 - U+1F3F4 U+E0066 U+E0069 U+E0031 U+E0035 U+E007F FI-15 Northern Savonia
🏴󠁦󠁩󠀱󠀶󠁿 - U+1F3F4 U+E0066 U+E0069 U+E0031 U+E0036 U+E007F FI-16 Päijänne Tavastia
🏴󠁦󠁩󠀱󠀷󠁿 - U+1F3F4 U+E0066 U+E0069 U+E0031 U+E0037 U+E007F FI-17 Satakunta
🏴󠁦󠁩󠀱󠀸󠁿 - U+1F3F4 U+E0066 U+E0069 U+E0031 U+E0038 U+E007F FI-18 Uusimaa
🏴󠁩󠁥󠁬󠁿 - U+1F3F4 U+E0069 U+E0065 U+E006C U+E007F IE-L Leinster
🏴󠁩󠁥󠁭󠁿 - U+1F3F4 U+E0069 U+E0065 U+E006D U+E007F IE-M Munster
🏴󠁩󠁥󠁵󠁿 - U+1F3F4 U+E0069 U+E0065 U+E0075 U+E007F IE-U Ulster
🏴󠁳󠁥󠁭󠁿 - U+1F3F4 U+E0073 U+E0065 U+E006D U+E007F SE-M Skåne
🏴󠁳󠁫󠁢󠁣󠁿 - U+1F3F4 U+E0073 U+E006B U+E0062 U+E0063 U+E007F SK-BC Banská Bystrica
🏴󠁳󠁫󠁢󠁬󠁿 - U+1F3F4 U+E0073 U+E006B U+E0062 U+E006C U+E007F SK-BL Bratislava
🏴󠁳󠁫󠁫󠁩󠁿 - U+1F3F4 U+E0073 U+E006B U+E006B U+E0069 U+E007F SK-KI Košice
🏴󠁳󠁫󠁮󠁩󠁿 - U+1F3F4 U+E0073 U+E006B U+E006E U+E0069 U+E007F SK-NI Nitra
🏴󠁳󠁫󠁰󠁶󠁿 - U+1F3F4 U+E0073 U+E006B U+E0070 U+E0076 U+E007F SK-PV Prešov
🏴󠁳󠁫󠁴󠁡󠁿 - U+1F3F4 U+E0073 U+E006B U+E0074 U+E0061 U+E007F SK-TA Trnava
🏴󠁳󠁫󠁴󠁣󠁿 - U+1F3F4 U+E0073 U+E006B U+E0074 U+E0063 U+E007F SK-TC Trenčín
🏴󠁳󠁫󠁺󠁩󠁿 - U+1F3F4 U+E0073 U+E006B U+E007A U+E0069 U+E007F SK-ZI Žilina
🏴󠁵󠁡󠀰󠀵󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0030 U+E0035 U+E007F UA-05 Vinnychchyna
🏴󠁵󠁡󠀰󠀷󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0030 U+E0037 U+E007F UA-07 Volyn
🏴󠁵󠁡󠀰󠀹󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0030 U+E0039 U+E007F UA-09 Luhanshchyna
🏴󠁵󠁡󠀱󠀲󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0031 U+E0032 U+E007F UA-12 Dnipropetrovshchyna
🏴󠁵󠁡󠀱󠀴󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0031 U+E0034 U+E007F UA-14 Donechchyna
🏴󠁵󠁡󠀱󠀸󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0031 U+E0038 U+E007F UA-18 Zhytomyrshchyna
🏴󠁵󠁡󠀲󠀱󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0032 U+E0031 U+E007F UA-21 Zakarpattia
🏴󠁵󠁡󠀲󠀳󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0032 U+E0033 U+E007F UA-23 Zaporizhzhya
🏴󠁵󠁡󠀲󠀶󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0032 U+E0036 U+E007F UA-26 Prykarpattia
🏴󠁵󠁡󠀳󠀰󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0033 U+E0030 U+E007F UA-30 Kiev
🏴󠁵󠁡󠀳󠀲󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0033 U+E0032 U+E007F UA-32 Kyivshchyna
🏴󠁵󠁡󠀳󠀵󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0033 U+E0035 U+E007F UA-35 Kirovohradschyna
🏴󠁵󠁡󠀴󠀰󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0034 U+E0030 U+E007F UA-40 Sevastopol
🏴󠁵󠁡󠀴󠀳󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0034 U+E0033 U+E007F UA-43 Crimea
🏴󠁵󠁡󠀴󠀶󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0034 U+E0036 U+E007F UA-46 Lvivshchyna
🏴󠁵󠁡󠀴󠀸󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0034 U+E0038 U+E007F UA-48 Mykolayivschyna
🏴󠁵󠁡󠀵󠀱󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0035 U+E0031 U+E007F UA-51 Odeshchyna
🏴󠁵󠁡󠀵󠀳󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0035 U+E0033 U+E007F UA-53 Poltavshchyna
🏴󠁵󠁡󠀵󠀶󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0035 U+E0036 U+E007F UA-56 Rivnenshchyna
🏴󠁵󠁡󠀵󠀹󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0035 U+E0039 U+E007F UA-59 Sumshchyna
🏴󠁵󠁡󠀶󠀱󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0036 U+E0031 U+E007F UA-61 Ternopilshchyna
🏴󠁵󠁡󠀶󠀳󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0036 U+E0033 U+E007F UA-63 Kharkivshchyna
🏴󠁵󠁡󠀶󠀵󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0036 U+E0035 U+E007F UA-65 Khersonshchyna
🏴󠁵󠁡󠀶󠀸󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0036 U+E0038 U+E007F UA-68 Khmelnychchyna
🏴󠁵󠁡󠀷󠀱󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0037 U+E0031 U+E007F UA-71 Cherkashchyna
🏴󠁵󠁡󠀷󠀴󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0037 U+E0034 U+E007F UA-74 Chernihivshchyna
🏴󠁵󠁡󠀷󠀷󠁿 - U+1F3F4 U+E0075 U+E0061 U+E0037 U+E0037 U+E007F UA-77 Chernivtsi Oblast

View File

@ -206,6 +206,7 @@ option(BUILD_EVERYTHING "Build all optional components" ON)
include(utils)
include(wasm_spec_tests)
include(emoji_txt)
serenity_component(
Tests

View File

@ -0,0 +1,23 @@
option(ENABLE_EMOJI_TXT_GENERATION "Enable download of emoji-test.txt and generation of emoji.txt at build time" ON)
set(EMOJI_TEST_TXT_PATH ${CMAKE_BINARY_DIR}/emoji-test.txt)
set(EMOJI_TEST_TXT_URL https://unicode.org/Public/emoji/14.0/emoji-test.txt)
if(ENABLE_EMOJI_TXT_GENERATION)
if(NOT EXISTS ${EMOJI_TEST_TXT_PATH})
file(DOWNLOAD ${EMOJI_TEST_TXT_URL} ${EMOJI_TEST_TXT_PATH})
endif()
set(EMOJI_RES_PATH "${SerenityOS_SOURCE_DIR}/Base/res/emoji")
set(EMOJI_TXT_INSTALL_PATH "${SerenityOS_SOURCE_DIR}/Base/home/anon/Documents/emoji.txt")
add_custom_command(
OUTPUT ${EMOJI_TXT_INSTALL_PATH}
COMMAND ${SerenityOS_SOURCE_DIR}/Meta/generate-emoji-txt.sh "${EMOJI_TEST_TXT_PATH}" "${EMOJI_RES_PATH}" "${EMOJI_TXT_INSTALL_PATH}"
# This will make this command only run when the modified time of the directory changes,
# which only happens if files within it are added or deleted, but not when a file is modified.
# This is fine for this use-case, because the contents of a file changing should not affect
# the generated emoji.txt file.
MAIN_DEPENDENCY ${EMOJI_RES_PATH}
USES_TERMINAL
)
add_custom_target(generate_emoji_txt ALL DEPENDS ${EMOJI_TXT_INSTALL_PATH})
endif()

61
Meta/generate-emoji-txt.sh Executable file
View File

@ -0,0 +1,61 @@
#!/usr/bin/env bash
set -e
if [ $# -ne 3 ]; then
echo "Usage: $0 <input emoji-test.txt file> <emoji image directory> <output path>"
exit 1
fi
INPUT_FILE="$1"
EMOJI_DIR="$2"
OUTPUT_PATH="$3"
# empty the generated file first
:>| "$OUTPUT_PATH"
first_heading=true
while IFS= read -r line
do
if [[ $line == \#\ subgroup:\ * || $line == \#\ group:\ * ]]; then
if [ $first_heading = false ]; then
echo "" >> "$OUTPUT_PATH"
fi
echo "$line" >> "$OUTPUT_PATH"
first_heading=false
elif [[ ${#line} -ne 0 && $line != \#* ]]; then
codepoints_string=${line%%;*}
IFS=" " read -r -a codepoints <<< "$codepoints_string"
for i in "${!codepoints[@]}"; do
# strip leading zeros
codepoints[$i]="${codepoints[$i]#"${codepoints[$i]%%[!0]*}"}"
# add U+ prefix
codepoints[$i]="U+${codepoints[$i]}"
done
# when doing a lookup we want to remove all U+FE0F (emoji presentation specifier) codepoints
lookup_filename_parts=()
for codepoint in "${codepoints[@]}"; do
if [[ $codepoint != "U+FE0F" ]]; then
lookup_filename_parts+=("$codepoint")
fi
done
IFS=_
lookup_filename="${lookup_filename_parts[*]}.png"
if [ -f "$EMOJI_DIR/$lookup_filename" ]; then
emoji_and_name=${line#*# }
emoji=${emoji_and_name%% E*}
name_with_version=${emoji_and_name#* }
name=${name_with_version#* }
qualification=${line#*; }
qualification=${qualification%%#*}
# remove trailing whitespace characters
qualification="${qualification%"${qualification##*[![:space:]]}"}"
IFS=" "
echo "$emoji - ${codepoints[*]} ${name^^} ($qualification)" >> "$OUTPUT_PATH"
fi
fi
done < "$INPUT_FILE"