mirror of
https://github.com/Helium314/HeliBoard.git
synced 2025-05-02 12:54:27 +00:00
Merge pull request #504 from MajeurAndroid/emoji-tools
Added emoji tables generation tool
This commit is contained in:
commit
e590fa78cd
18 changed files with 14692 additions and 168 deletions
|
@ -1,15 +1,31 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
|
||||
!!!!! DO NOT EDIT THIS FILE !!!!!
|
||||
|
||||
This file is generated by tools/make-emoji-keys. The base template file is
|
||||
tools/make-emoji-keys/src/main/resources/values/emoji-categories.tmpl
|
||||
|
||||
This file must be updated when any a new release of unicode comes out. Base data
|
||||
can be found at https://unicode.org/Public/emoji/. Table must be defined in
|
||||
tools/make-emoji-keys/src/main/resources/emoji/UNICODE_VERSION/emoji-test.txt.
|
||||
|
||||
To update this file, please run the following commands.
|
||||
$ gradle :tools:make-emoji-keys:makeEmoji
|
||||
|
||||
The updated source file will be generated to the following path (this file).
|
||||
app/src/main/res/values/emoji-categories.xml
|
||||
|
||||
Unicode version 14.0.
|
||||
Platform compatibility up to API level 32.
|
||||
|
||||
-->
|
||||
|
||||
<!-- Note: This emoji code point list includes emojis from Unicode 13.1 supported
|
||||
in Android up to platform level 30.
|
||||
Emoji data generated from https://unicode.org/Public/emoji/13.1/emoji-test.txt.
|
||||
Platform compatibility data from https://emojipedia.org/. -->
|
||||
<resources>
|
||||
|
||||
<array
|
||||
name="emoji_smileys_emotion"
|
||||
format="string"
|
||||
>
|
||||
format="string">
|
||||
<item>1F600</item>
|
||||
<item>1F603</item>
|
||||
<item>1F604</item>
|
||||
|
@ -20,6 +36,7 @@
|
|||
<item>1F602</item>
|
||||
<item>1F642||23</item>
|
||||
<item>1F643||23</item>
|
||||
<item>1FAE0||32</item>
|
||||
<item>1F609</item>
|
||||
<item>1F60A</item>
|
||||
<item>1F607</item>
|
||||
|
@ -40,17 +57,23 @@
|
|||
<item>1F911||23</item>
|
||||
<item>1F917||23</item>
|
||||
<item>1F92D||26</item>
|
||||
<item>1FAE2||32</item>
|
||||
<item>1FAE3||32</item>
|
||||
<item>1F92B||26</item>
|
||||
<item>1F914||23</item>
|
||||
<item>1FAE1||32</item>
|
||||
<item>1F910||23</item>
|
||||
<item>1F928||26</item>
|
||||
<item>1F610</item>
|
||||
<item>1F611</item>
|
||||
<item>1F636</item>
|
||||
<item>1FAE5||32</item>
|
||||
<item>1F636,200D,1F32B,FE0F||31</item>
|
||||
<item>1F60F</item>
|
||||
<item>1F612</item>
|
||||
<item>1F644||23</item>
|
||||
<item>1F62C</item>
|
||||
<item>1F62E,200D,1F4A8||31</item>
|
||||
<item>1F925||24</item>
|
||||
<item>1F60C</item>
|
||||
<item>1F614</item>
|
||||
|
@ -66,6 +89,8 @@
|
|||
<item>1F975||28</item>
|
||||
<item>1F976||28</item>
|
||||
<item>1F974||28</item>
|
||||
<item>1F635</item>
|
||||
<item>1F635,200D,1F4AB||31</item>
|
||||
<item>1F92F||26</item>
|
||||
<item>1F920||24</item>
|
||||
<item>1F973||28</item>
|
||||
|
@ -74,6 +99,7 @@
|
|||
<item>1F913||23</item>
|
||||
<item>1F9D0||26</item>
|
||||
<item>1F615</item>
|
||||
<item>1FAE4||32</item>
|
||||
<item>1F61F</item>
|
||||
<item>1F641||23</item>
|
||||
<item>2639,FE0F||23</item>
|
||||
|
@ -82,6 +108,7 @@
|
|||
<item>1F632</item>
|
||||
<item>1F633</item>
|
||||
<item>1F97A||28</item>
|
||||
<item>1F979||32</item>
|
||||
<item>1F626</item>
|
||||
<item>1F627</item>
|
||||
<item>1F628</item>
|
||||
|
@ -137,6 +164,8 @@
|
|||
<item>1F49F</item>
|
||||
<item>2763,FE0F||23</item>
|
||||
<item>1F494</item>
|
||||
<item>2764,FE0F,200D,1F525||31</item>
|
||||
<item>2764,FE0F,200D,1FA79||31</item>
|
||||
<item>2764,FE0F</item>
|
||||
<item>1F9E1||26</item>
|
||||
<item>1F49B</item>
|
||||
|
@ -164,18 +193,22 @@
|
|||
|
||||
<array
|
||||
name="emoji_people_body"
|
||||
format="string"
|
||||
>
|
||||
format="string">
|
||||
<item>1F44B</item>
|
||||
<item>1F91A||24</item>
|
||||
<item>1F590,FE0F||23</item>
|
||||
<item>270B</item>
|
||||
<item>1F596||23</item>
|
||||
<item>1FAF1||32</item>
|
||||
<item>1FAF2||32</item>
|
||||
<item>1FAF3||32</item>
|
||||
<item>1FAF4||32</item>
|
||||
<item>1F44C</item>
|
||||
<item>1F90C||30</item>
|
||||
<item>1F90F||29</item>
|
||||
<item>270C,FE0F</item>
|
||||
<item>1F91E||24</item>
|
||||
<item>1FAF0||32</item>
|
||||
<item>1F91F||26</item>
|
||||
<item>1F918||23</item>
|
||||
<item>1F919||24</item>
|
||||
|
@ -185,6 +218,7 @@
|
|||
<item>1F595||23</item>
|
||||
<item>1F447</item>
|
||||
<item>261D,FE0F</item>
|
||||
<item>1FAF5||32</item>
|
||||
<item>1F44D</item>
|
||||
<item>1F44E</item>
|
||||
<item>270A</item>
|
||||
|
@ -193,6 +227,7 @@
|
|||
<item>1F91C||24</item>
|
||||
<item>1F44F</item>
|
||||
<item>1F64C</item>
|
||||
<item>1FAF6||32</item>
|
||||
<item>1F450</item>
|
||||
<item>1F932||26</item>
|
||||
<item>1F91D||24</item>
|
||||
|
@ -202,8 +237,8 @@
|
|||
<item>1F933||24</item>
|
||||
<item>1F4AA</item>
|
||||
<item>1F9BE||29</item>
|
||||
<item>1F9B5||28</item>
|
||||
<item>1F9BF||29</item>
|
||||
<item>1F9B5||28</item>
|
||||
<item>1F9B6||28</item>
|
||||
<item>1F442</item>
|
||||
<item>1F9BB||29</item>
|
||||
|
@ -217,25 +252,32 @@
|
|||
<item>1F441,FE0F||23</item>
|
||||
<item>1F445</item>
|
||||
<item>1F444</item>
|
||||
<item>1FAE6||32</item>
|
||||
<item>1F476</item>
|
||||
<item>1F9D2||26</item>
|
||||
<item>1F466</item>
|
||||
<item>1F467</item>
|
||||
<item>1F9D1||26</item>
|
||||
<item>1F471</item>
|
||||
<item>1F468</item>
|
||||
<item>1F9D4||26</item>
|
||||
<item>1F469</item>
|
||||
<item>1F468,200D,1F9B1||28</item>
|
||||
<item>1F469,200D,1F9B1||28</item>
|
||||
<item>1F9D4,200D,2642,FE0F||31</item>
|
||||
<item>1F9D4,200D,2640,FE0F||31</item>
|
||||
<item>1F468,200D,1F9B0||28</item>
|
||||
<item>1F469,200D,1F9B0||28</item>
|
||||
<item>1F471</item>
|
||||
<item>1F471,200D,2642,FE0F||25</item>
|
||||
<item>1F471,200D,2640,FE0F||25</item>
|
||||
<item>1F468,200D,1F9B2||28</item>
|
||||
<item>1F469,200D,1F9B2||28</item>
|
||||
<item>1F468,200D,1F9B1||28</item>
|
||||
<item>1F468,200D,1F9B3||28</item>
|
||||
<item>1F468,200D,1F9B2||28</item>
|
||||
<item>1F469</item>
|
||||
<item>1F469,200D,1F9B0||28</item>
|
||||
<item>1F9D1,200D,1F9B0||30</item>
|
||||
<item>1F469,200D,1F9B1||28</item>
|
||||
<item>1F9D1,200D,1F9B1||30</item>
|
||||
<item>1F469,200D,1F9B3||28</item>
|
||||
<item>1F9D1,200D,1F9B3||30</item>
|
||||
<item>1F469,200D,1F9B2||28</item>
|
||||
<item>1F9D1,200D,1F9B2||30</item>
|
||||
<item>1F471,200D,2640,FE0F||25</item>
|
||||
<item>1F471,200D,2642,FE0F||25</item>
|
||||
<item>1F9D3||26</item>
|
||||
<item>1F474</item>
|
||||
<item>1F475</item>
|
||||
|
@ -269,36 +311,52 @@
|
|||
<item>1F937||24</item>
|
||||
<item>1F937,200D,2642,FE0F||25</item>
|
||||
<item>1F937,200D,2640,FE0F||25</item>
|
||||
<item>1F9D1,200D,2695,FE0F||30</item>
|
||||
<item>1F468,200D,2695,FE0F||25</item>
|
||||
<item>1F469,200D,2695,FE0F||25</item>
|
||||
<item>1F9D1,200D,1F393||30</item>
|
||||
<item>1F468,200D,1F393||25</item>
|
||||
<item>1F469,200D,1F393||25</item>
|
||||
<item>1F9D1,200D,1F3EB||30</item>
|
||||
<item>1F468,200D,1F3EB||25</item>
|
||||
<item>1F469,200D,1F3EB||25</item>
|
||||
<item>1F9D1,200D,2696,FE0F||30</item>
|
||||
<item>1F468,200D,2696,FE0F||25</item>
|
||||
<item>1F469,200D,2696,FE0F||25</item>
|
||||
<item>1F9D1,200D,1F33E||30</item>
|
||||
<item>1F468,200D,1F33E||25</item>
|
||||
<item>1F469,200D,1F33E||25</item>
|
||||
<item>1F9D1,200D,1F373||30</item>
|
||||
<item>1F468,200D,1F373||25</item>
|
||||
<item>1F469,200D,1F373||25</item>
|
||||
<item>1F9D1,200D,1F527||30</item>
|
||||
<item>1F468,200D,1F527||25</item>
|
||||
<item>1F469,200D,1F527||25</item>
|
||||
<item>1F9D1,200D,1F3ED||30</item>
|
||||
<item>1F468,200D,1F3ED||25</item>
|
||||
<item>1F469,200D,1F3ED||25</item>
|
||||
<item>1F9D1,200D,1F4BC||30</item>
|
||||
<item>1F468,200D,1F4BC||25</item>
|
||||
<item>1F469,200D,1F4BC||25</item>
|
||||
<item>1F9D1,200D,1F52C||30</item>
|
||||
<item>1F468,200D,1F52C||25</item>
|
||||
<item>1F469,200D,1F52C||25</item>
|
||||
<item>1F9D1,200D,1F4BB||30</item>
|
||||
<item>1F468,200D,1F4BB||25</item>
|
||||
<item>1F469,200D,1F4BB||25</item>
|
||||
<item>1F9D1,200D,1F3A4||30</item>
|
||||
<item>1F468,200D,1F3A4||25</item>
|
||||
<item>1F469,200D,1F3A4||25</item>
|
||||
<item>1F9D1,200D,1F3A8||30</item>
|
||||
<item>1F468,200D,1F3A8||25</item>
|
||||
<item>1F469,200D,1F3A8||25</item>
|
||||
<item>1F9D1,200D,2708,FE0F||30</item>
|
||||
<item>1F468,200D,2708,FE0F||25</item>
|
||||
<item>1F469,200D,2708,FE0F||25</item>
|
||||
<item>1F9D1,200D,1F680||30</item>
|
||||
<item>1F468,200D,1F680||25</item>
|
||||
<item>1F469,200D,1F680||25</item>
|
||||
<item>1F9D1,200D,1F692||30</item>
|
||||
<item>1F468,200D,1F692||25</item>
|
||||
<item>1F469,200D,1F692||25</item>
|
||||
<item>1F46E</item>
|
||||
|
@ -314,6 +372,7 @@
|
|||
<item>1F477</item>
|
||||
<item>1F477,200D,2642,FE0F||25</item>
|
||||
<item>1F477,200D,2640,FE0F||25</item>
|
||||
<item>1FAC5||32</item>
|
||||
<item>1F934||24</item>
|
||||
<item>1F478</item>
|
||||
<item>1F473</item>
|
||||
|
@ -328,6 +387,8 @@
|
|||
<item>1F470,200D,2642,FE0F||30</item>
|
||||
<item>1F470,200D,2640,FE0F||30</item>
|
||||
<item>1F930||24</item>
|
||||
<item>1FAC3||32</item>
|
||||
<item>1FAC4||32</item>
|
||||
<item>1F931||26</item>
|
||||
<item>1F469,200D,1F37C||30</item>
|
||||
<item>1F468,200D,1F37C||30</item>
|
||||
|
@ -363,6 +424,7 @@
|
|||
<item>1F9DF||26</item>
|
||||
<item>1F9DF,200D,2642,FE0F||26</item>
|
||||
<item>1F9DF,200D,2640,FE0F||26</item>
|
||||
<item>1F9CC||32</item>
|
||||
<item>1F486</item>
|
||||
<item>1F486,200D,2642,FE0F||25</item>
|
||||
<item>1F486,200D,2640,FE0F||25</item>
|
||||
|
@ -378,10 +440,13 @@
|
|||
<item>1F9CE||29</item>
|
||||
<item>1F9CE,200D,2642,FE0F||29</item>
|
||||
<item>1F9CE,200D,2640,FE0F||29</item>
|
||||
<item>1F9D1,200D,1F9AF||30</item>
|
||||
<item>1F468,200D,1F9AF||29</item>
|
||||
<item>1F469,200D,1F9AF||29</item>
|
||||
<item>1F9D1,200D,1F9BC||30</item>
|
||||
<item>1F468,200D,1F9BC||29</item>
|
||||
<item>1F469,200D,1F9BC||29</item>
|
||||
<item>1F9D1,200D,1F9BD||30</item>
|
||||
<item>1F468,200D,1F9BD||29</item>
|
||||
<item>1F469,200D,1F9BD||29</item>
|
||||
<item>1F3C3</item>
|
||||
|
@ -448,59 +513,9 @@
|
|||
<item>1F6C0</item>
|
||||
<item>1F6CC||23</item>
|
||||
<item>1F9D1,200D,1F91D,200D,1F9D1||29</item>
|
||||
<!--<item>1F9D1,1F3FC,200D,1F91D,200D,1F9D1,1F3FB||29</item>
|
||||
<item>1F9D1,1F3FD,200D,1F91D,200D,1F9D1,1F3FB||29</item>
|
||||
<item>1F9D1,1F3FD,200D,1F91D,200D,1F9D1,1F3FC||29</item>
|
||||
<item>1F9D1,1F3FE,200D,1F91D,200D,1F9D1,1F3FB||29</item>
|
||||
<item>1F9D1,1F3FE,200D,1F91D,200D,1F9D1,1F3FC||29</item>
|
||||
<item>1F9D1,1F3FE,200D,1F91D,200D,1F9D1,1F3FD||29</item>
|
||||
<item>1F9D1,1F3FF,200D,1F91D,200D,1F9D1,1F3FB||29</item>
|
||||
<item>1F9D1,1F3FF,200D,1F91D,200D,1F9D1,1F3FC||29</item>
|
||||
<item>1F9D1,1F3FF,200D,1F91D,200D,1F9D1,1F3FD||29</item>
|
||||
<item>1F9D1,1F3FF,200D,1F91D,200D,1F9D1,1F3FE||29</item>-->
|
||||
<item>1F46D</item>
|
||||
<!--<item>1F469,1F3FC,200D,1F91D,200D,1F469,1F3FB||29</item>
|
||||
<item>1F469,1F3FD,200D,1F91D,200D,1F469,1F3FB||29</item>
|
||||
<item>1F469,1F3FD,200D,1F91D,200D,1F469,1F3FC||29</item>
|
||||
<item>1F469,1F3FE,200D,1F91D,200D,1F469,1F3FB||29</item>
|
||||
<item>1F469,1F3FE,200D,1F91D,200D,1F469,1F3FC||29</item>
|
||||
<item>1F469,1F3FE,200D,1F91D,200D,1F469,1F3FD||29</item>
|
||||
<item>1F469,1F3FF,200D,1F91D,200D,1F469,1F3FB||29</item>
|
||||
<item>1F469,1F3FF,200D,1F91D,200D,1F469,1F3FC||29</item>
|
||||
<item>1F469,1F3FF,200D,1F91D,200D,1F469,1F3FD||29</item>
|
||||
<item>1F469,1F3FF,200D,1F91D,200D,1F469,1F3FE||29</item>-->
|
||||
<item>1F46B</item>
|
||||
<!--<item>1F469,1F3FB,200D,1F91D,200D,1F468,1F3FC||29</item>
|
||||
<item>1F469,1F3FB,200D,1F91D,200D,1F468,1F3FD||29</item>
|
||||
<item>1F469,1F3FB,200D,1F91D,200D,1F468,1F3FE||29</item>
|
||||
<item>1F469,1F3FB,200D,1F91D,200D,1F468,1F3FF||29</item>
|
||||
<item>1F469,1F3FC,200D,1F91D,200D,1F468,1F3FB||29</item>
|
||||
<item>1F469,1F3FC,200D,1F91D,200D,1F468,1F3FD||29</item>
|
||||
<item>1F469,1F3FC,200D,1F91D,200D,1F468,1F3FE||29</item>
|
||||
<item>1F469,1F3FC,200D,1F91D,200D,1F468,1F3FF||29</item>
|
||||
<item>1F469,1F3FD,200D,1F91D,200D,1F468,1F3FB||29</item>
|
||||
<item>1F469,1F3FD,200D,1F91D,200D,1F468,1F3FC||29</item>
|
||||
<item>1F469,1F3FD,200D,1F91D,200D,1F468,1F3FE||29</item>
|
||||
<item>1F469,1F3FD,200D,1F91D,200D,1F468,1F3FF||29</item>
|
||||
<item>1F469,1F3FE,200D,1F91D,200D,1F468,1F3FB||29</item>
|
||||
<item>1F469,1F3FE,200D,1F91D,200D,1F468,1F3FC||29</item>
|
||||
<item>1F469,1F3FE,200D,1F91D,200D,1F468,1F3FD||29</item>
|
||||
<item>1F469,1F3FE,200D,1F91D,200D,1F468,1F3FF||29</item>
|
||||
<item>1F469,1F3FF,200D,1F91D,200D,1F468,1F3FB||29</item>
|
||||
<item>1F469,1F3FF,200D,1F91D,200D,1F468,1F3FC||29</item>
|
||||
<item>1F469,1F3FF,200D,1F91D,200D,1F468,1F3FD||29</item>
|
||||
<item>1F469,1F3FF,200D,1F91D,200D,1F468,1F3FE||29</item>-->
|
||||
<item>1F46C</item>
|
||||
<!--<item>1F468,1F3FC,200D,1F91D,200D,1F468,1F3FB||29</item>
|
||||
<item>1F468,1F3FD,200D,1F91D,200D,1F468,1F3FB||29</item>
|
||||
<item>1F468,1F3FD,200D,1F91D,200D,1F468,1F3FC||29</item>
|
||||
<item>1F468,1F3FE,200D,1F91D,200D,1F468,1F3FB||29</item>
|
||||
<item>1F468,1F3FE,200D,1F91D,200D,1F468,1F3FC||29</item>
|
||||
<item>1F468,1F3FE,200D,1F91D,200D,1F468,1F3FD||29</item>
|
||||
<item>1F468,1F3FF,200D,1F91D,200D,1F468,1F3FB||29</item>
|
||||
<item>1F468,1F3FF,200D,1F91D,200D,1F468,1F3FC||29</item>
|
||||
<item>1F468,1F3FF,200D,1F91D,200D,1F468,1F3FD||29</item>
|
||||
<item>1F468,1F3FF,200D,1F91D,200D,1F468,1F3FE||29</item>-->
|
||||
<item>1F48F</item>
|
||||
<item>1F469,200D,2764,FE0F,200D,1F48B,200D,1F468||26</item>
|
||||
<item>1F468,200D,2764,FE0F,200D,1F48B,200D,1F468||23</item>
|
||||
|
@ -544,18 +559,22 @@
|
|||
|
||||
<array
|
||||
name="emoji_people_body_more"
|
||||
format="string"
|
||||
>
|
||||
format="string">
|
||||
<item>1F44B,1F3FB||24;1F44B,1F3FC||24;1F44B,1F3FD||24;1F44B,1F3FE||24;1F44B,1F3FF||24</item>
|
||||
<item>1F91A,1F3FB||24;1F91A,1F3FC||24;1F91A,1F3FD||24;1F91A,1F3FE||24;1F91A,1F3FF||24</item>
|
||||
<item>1F590,1F3FB||24;1F590,1F3FC||24;1F590,1F3FD||24;1F590,1F3FE||24;1F590,1F3FF||24</item>
|
||||
<item>270B,1F3FB||24;270B,1F3FC||24;270B,1F3FD||24;270B,1F3FE||24;270B,1F3FF||24</item>
|
||||
<item>1F596,1F3FB||24;1F596,1F3FC||24;1F596,1F3FD||24;1F596,1F3FE||24;1F596,1F3FF||24</item>
|
||||
<item>1FAF1,1F3FB||32;1FAF1,1F3FC||32;1FAF1,1F3FD||32;1FAF1,1F3FE||32;1FAF1,1F3FF||32</item>
|
||||
<item>1FAF2,1F3FB||32;1FAF2,1F3FC||32;1FAF2,1F3FD||32;1FAF2,1F3FE||32;1FAF2,1F3FF||32</item>
|
||||
<item>1FAF3,1F3FB||32;1FAF3,1F3FC||32;1FAF3,1F3FD||32;1FAF3,1F3FE||32;1FAF3,1F3FF||32</item>
|
||||
<item>1FAF4,1F3FB||32;1FAF4,1F3FC||32;1FAF4,1F3FD||32;1FAF4,1F3FE||32;1FAF4,1F3FF||32</item>
|
||||
<item>1F44C,1F3FB||24;1F44C,1F3FC||24;1F44C,1F3FD||24;1F44C,1F3FE||24;1F44C,1F3FF||24</item>
|
||||
<item>1F90C,1F3FB||30;1F90C,1F3FC||30;1F90C,1F3FD||30;1F90C,1F3FE||30;1F90C,1F3FF||30</item>
|
||||
<item>1F90F,1F3FB||29;1F90F,1F3FC||29;1F90F,1F3FD||29;1F90F,1F3FE||29;1F90F,1F3FF||29</item>
|
||||
<item>270C,1F3FB||24;270C,1F3FC||24;270C,1F3FD||24;270C,1F3FE||24;270C,1F3FF||24</item>
|
||||
<item>1F91E,1F3FB||24;1F91E,1F3FC||24;1F91E,1F3FD||24;1F91E,1F3FE||24;1F91E,1F3FF||24</item>
|
||||
<item>1FAF0,1F3FB||32;1FAF0,1F3FC||32;1FAF0,1F3FD||32;1FAF0,1F3FE||32;1FAF0,1F3FF||32</item>
|
||||
<item>1F91F,1F3FB||26;1F91F,1F3FC||26;1F91F,1F3FD||26;1F91F,1F3FE||26;1F91F,1F3FF||26</item>
|
||||
<item>1F918,1F3FB||24;1F918,1F3FC||24;1F918,1F3FD||24;1F918,1F3FE||24;1F918,1F3FF||24</item>
|
||||
<item>1F919,1F3FB||24;1F919,1F3FC||24;1F919,1F3FD||24;1F919,1F3FE||24;1F919,1F3FF||24</item>
|
||||
|
@ -565,6 +584,7 @@
|
|||
<item>1F595,1F3FB||24;1F595,1F3FC||24;1F595,1F3FD||24;1F595,1F3FE||24;1F595,1F3FF||24</item>
|
||||
<item>1F447,1F3FB||24;1F447,1F3FC||24;1F447,1F3FD||24;1F447,1F3FE||24;1F447,1F3FF||24</item>
|
||||
<item>261D,1F3FB||24;261D,1F3FC||24;261D,1F3FD||24;261D,1F3FE||24;261D,1F3FF||24</item>
|
||||
<item>1FAF5,1F3FB||32;1FAF5,1F3FC||32;1FAF5,1F3FD||32;1FAF5,1F3FE||32;1FAF5,1F3FF||32</item>
|
||||
<item>1F44D,1F3FB||24;1F44D,1F3FC||24;1F44D,1F3FD||24;1F44D,1F3FE||24;1F44D,1F3FF||24</item>
|
||||
<item>1F44E,1F3FB||24;1F44E,1F3FC||24;1F44E,1F3FD||24;1F44E,1F3FE||24;1F44E,1F3FF||24</item>
|
||||
<item>270A,1F3FB||24;270A,1F3FC||24;270A,1F3FD||24;270A,1F3FE||24;270A,1F3FF||24</item>
|
||||
|
@ -573,17 +593,18 @@
|
|||
<item>1F91C,1F3FB||24;1F91C,1F3FC||24;1F91C,1F3FD||24;1F91C,1F3FE||24;1F91C,1F3FF||24</item>
|
||||
<item>1F44F,1F3FB||24;1F44F,1F3FC||24;1F44F,1F3FD||24;1F44F,1F3FE||24;1F44F,1F3FF||24</item>
|
||||
<item>1F64C,1F3FB||24;1F64C,1F3FC||24;1F64C,1F3FD||24;1F64C,1F3FE||24;1F64C,1F3FF||24</item>
|
||||
<item>1FAF6,1F3FB||32;1FAF6,1F3FC||32;1FAF6,1F3FD||32;1FAF6,1F3FE||32;1FAF6,1F3FF||32</item>
|
||||
<item>1F450,1F3FB||24;1F450,1F3FC||24;1F450,1F3FD||24;1F450,1F3FE||24;1F450,1F3FF||24</item>
|
||||
<item>1F932,1F3FB||26;1F932,1F3FC||26;1F932,1F3FD||26;1F932,1F3FE||26;1F932,1F3FF||26</item>
|
||||
<item/>
|
||||
<item>1F91D,1F3FB||25;1F91D,1F3FC||25;1F91D,1F3FD||25;1F91D,1F3FE||25;1F91D,1F3FF||25</item>
|
||||
<item>1F64F,1F3FB||24;1F64F,1F3FC||24;1F64F,1F3FD||24;1F64F,1F3FE||24;1F64F,1F3FF||24</item>
|
||||
<item>270D,1F3FB||24;270D,1F3FC||24;270D,1F3FD||24;270D,1F3FE||24;270D,1F3FF||24</item>
|
||||
<item>1F485,1F3FB||24;1F485,1F3FC||24;1F485,1F3FD||24;1F485,1F3FE||24;1F485,1F3FF||24</item>
|
||||
<item>1F933,1F3FB||24;1F933,1F3FC||24;1F933,1F3FD||24;1F933,1F3FE||24;1F933,1F3FF||24</item>
|
||||
<item>1F4AA,1F3FB||24;1F4AA,1F3FC||24;1F4AA,1F3FD||24;1F4AA,1F3FE||24;1F4AA,1F3FF||24;</item>
|
||||
<item>1F4AA,1F3FB||24;1F4AA,1F3FC||24;1F4AA,1F3FD||24;1F4AA,1F3FE||24;1F4AA,1F3FF||24</item>
|
||||
<item/>
|
||||
<item/>
|
||||
<item>1F9B5,1F3FB||28;1F9B5,1F3FC||28;1F9B5,1F3FD||28;1F9B5,1F3FE||28;1F9B5,1F3FF||28</item>
|
||||
<item/>
|
||||
<item>1F9B6,1F3FB||28;1F9B6,1F3FC||28;1F9B6,1F3FD||28;1F9B6,1F3FE||28;1F9B6,1F3FF||28</item>
|
||||
<item>1F442,1F3FB||24;1F442,1F3FC||24;1F442,1F3FD||24;1F442,1F3FE||24;1F442,1F3FF||24</item>
|
||||
<item>1F9BB,1F3FB||29;1F9BB,1F3FC||29;1F9BB,1F3FD||29;1F9BB,1F3FE||29;1F9BB,1F3FF||29</item>
|
||||
|
@ -597,25 +618,32 @@
|
|||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item>1F476,1F3FB||24;1F476,1F3FC||24;1F476,1F3FD||24;1F476,1F3FE||24;1F476,1F3FF||24</item>
|
||||
<item>1F9D2,1F3FB||26;1F9D2,1F3FC||26;1F9D2,1F3FD||26;1F9D2,1F3FE||26;1F9D2,1F3FF||26</item>
|
||||
<item>1F466,1F3FB||24;1F466,1F3FC||24;1F466,1F3FD||24;1F466,1F3FE||24;1F466,1F3FF||24</item>
|
||||
<item>1F467,1F3FB||24;1F467,1F3FC||24;1F467,1F3FD||24;1F467,1F3FE||24;1F467,1F3FF||24</item>
|
||||
<item>1F9D1,1F3FB||26;1F9D1,1F3FC||26;1F9D1,1F3FD||26;1F9D1,1F3FE||26;1F9D1,1F3FF||26</item>
|
||||
<item>1F471,1F3FB||24;1F471,1F3FC||24;1F471,1F3FD||24;1F471,1F3FE||24;1F471,1F3FF||24</item>
|
||||
<item>1F468,1F3FB||24;1F468,1F3FC||24;1F468,1F3FD||24;1F468,1F3FE||24;1F468,1F3FF||24</item>
|
||||
<item>1F9D4,1F3FB||26;1F9D4,1F3FC||26;1F9D4,1F3FD||26;1F9D4,1F3FE||26;1F9D4,1F3FF||26</item>
|
||||
<item>1F469,1F3FB||24;1F469,1F3FC||24;1F469,1F3FD||24;1F469,1F3FE||24;1F469,1F3FF||24</item>
|
||||
<item>1F468,1F3FB,200D,1F9B1||28;1F468,1F3FC,200D,1F9B1||28;1F468,1F3FD,200D,1F9B1||28;1F468,1F3FE,200D,1F9B1||28;1F468,1F3FF,200D,1F9B1||28</item>
|
||||
<item>1F469,1F3FB,200D,1F9B1||28;1F469,1F3FC,200D,1F9B1||28;1F469,1F3FD,200D,1F9B1||28;1F469,1F3FE,200D,1F9B1||28;1F469,1F3FF,200D,1F9B1||28</item>
|
||||
<item>1F9D4,1F3FB,200D,2642,FE0F||31;1F9D4,1F3FC,200D,2642,FE0F||31;1F9D4,1F3FD,200D,2642,FE0F||31;1F9D4,1F3FE,200D,2642,FE0F||31;1F9D4,1F3FF,200D,2642,FE0F||31</item>
|
||||
<item>1F9D4,1F3FB,200D,2640,FE0F||31;1F9D4,1F3FC,200D,2640,FE0F||31;1F9D4,1F3FD,200D,2640,FE0F||31;1F9D4,1F3FE,200D,2640,FE0F||31;1F9D4,1F3FF,200D,2640,FE0F||31</item>
|
||||
<item>1F468,1F3FB,200D,1F9B0||28;1F468,1F3FC,200D,1F9B0||28;1F468,1F3FD,200D,1F9B0||28;1F468,1F3FE,200D,1F9B0||28;1F468,1F3FF,200D,1F9B0||28</item>
|
||||
<item>1F469,1F3FB,200D,1F9B0||28;1F469,1F3FC,200D,1F9B0||28;1F469,1F3FD,200D,1F9B0||28;1F469,1F3FE,200D,1F9B0||28;1F469,1F3FF,200D,1F9B0||28</item>
|
||||
<item>1F471,1F3FB||24;1F471,1F3FC||24;1F471,1F3FD||24;1F471,1F3FE||24;1F471,1F3FF||24</item>
|
||||
<item>1F471,1F3FB,200D,2642,FE0F||25;1F471,1F3FC,200D,2642,FE0F||25;1F471,1F3FD,200D,2642,FE0F||25;1F471,1F3FE,200D,2642,FE0F||25;1F471,1F3FF,200D,2642,FE0F||25</item>
|
||||
<item>1F471,1F3FB,200D,2640,FE0F||25;1F471,1F3FC,200D,2640,FE0F||25;1F471,1F3FD,200D,2640,FE0F||25;1F471,1F3FE,200D,2640,FE0F||25;1F471,1F3FF,200D,2640,FE0F||25</item>
|
||||
<item>1F468,1F3FB,200D,1F9B2||28;1F468,1F3FC,200D,1F9B2||28;1F468,1F3FD,200D,1F9B2||28;1F468,1F3FE,200D,1F9B2||28;1F468,1F3FF,200D,1F9B2||28</item>
|
||||
<item>1F469,1F3FB,200D,1F9B2||28;1F469,1F3FC,200D,1F9B2||28;1F469,1F3FD,200D,1F9B2||28;1F469,1F3FE,200D,1F9B2||28;1F469,1F3FF,200D,1F9B2||28</item>
|
||||
<item>1F468,1F3FB,200D,1F9B1||28;1F468,1F3FC,200D,1F9B1||28;1F468,1F3FD,200D,1F9B1||28;1F468,1F3FE,200D,1F9B1||28;1F468,1F3FF,200D,1F9B1||28</item>
|
||||
<item>1F468,1F3FB,200D,1F9B3||28;1F468,1F3FC,200D,1F9B3||28;1F468,1F3FD,200D,1F9B3||28;1F468,1F3FE,200D,1F9B3||28;1F468,1F3FF,200D,1F9B3||28</item>
|
||||
<item>1F468,1F3FB,200D,1F9B2||28;1F468,1F3FC,200D,1F9B2||28;1F468,1F3FD,200D,1F9B2||28;1F468,1F3FE,200D,1F9B2||28;1F468,1F3FF,200D,1F9B2||28</item>
|
||||
<item>1F469,1F3FB||24;1F469,1F3FC||24;1F469,1F3FD||24;1F469,1F3FE||24;1F469,1F3FF||24</item>
|
||||
<item>1F469,1F3FB,200D,1F9B0||28;1F469,1F3FC,200D,1F9B0||28;1F469,1F3FD,200D,1F9B0||28;1F469,1F3FE,200D,1F9B0||28;1F469,1F3FF,200D,1F9B0||28</item>
|
||||
<item>1F9D1,1F3FB,200D,1F9B0||30;1F9D1,1F3FC,200D,1F9B0||30;1F9D1,1F3FD,200D,1F9B0||30;1F9D1,1F3FE,200D,1F9B0||30;1F9D1,1F3FF,200D,1F9B0||30</item>
|
||||
<item>1F469,1F3FB,200D,1F9B1||28;1F469,1F3FC,200D,1F9B1||28;1F469,1F3FD,200D,1F9B1||28;1F469,1F3FE,200D,1F9B1||28;1F469,1F3FF,200D,1F9B1||28</item>
|
||||
<item>1F9D1,1F3FB,200D,1F9B1||30;1F9D1,1F3FC,200D,1F9B1||30;1F9D1,1F3FD,200D,1F9B1||30;1F9D1,1F3FE,200D,1F9B1||30;1F9D1,1F3FF,200D,1F9B1||30</item>
|
||||
<item>1F469,1F3FB,200D,1F9B3||28;1F469,1F3FC,200D,1F9B3||28;1F469,1F3FD,200D,1F9B3||28;1F469,1F3FE,200D,1F9B3||28;1F469,1F3FF,200D,1F9B3||28</item>
|
||||
<item>1F9D1,1F3FB,200D,1F9B3||30;1F9D1,1F3FC,200D,1F9B3||30;1F9D1,1F3FD,200D,1F9B3||30;1F9D1,1F3FE,200D,1F9B3||30;1F9D1,1F3FF,200D,1F9B3||30</item>
|
||||
<item>1F469,1F3FB,200D,1F9B2||28;1F469,1F3FC,200D,1F9B2||28;1F469,1F3FD,200D,1F9B2||28;1F469,1F3FE,200D,1F9B2||28;1F469,1F3FF,200D,1F9B2||28</item>
|
||||
<item>1F9D1,1F3FB,200D,1F9B2||30;1F9D1,1F3FC,200D,1F9B2||30;1F9D1,1F3FD,200D,1F9B2||30;1F9D1,1F3FE,200D,1F9B2||30;1F9D1,1F3FF,200D,1F9B2||30</item>
|
||||
<item>1F471,1F3FB,200D,2640,FE0F||25;1F471,1F3FC,200D,2640,FE0F||25;1F471,1F3FD,200D,2640,FE0F||25;1F471,1F3FE,200D,2640,FE0F||25;1F471,1F3FF,200D,2640,FE0F||25</item>
|
||||
<item>1F471,1F3FB,200D,2642,FE0F||25;1F471,1F3FC,200D,2642,FE0F||25;1F471,1F3FD,200D,2642,FE0F||25;1F471,1F3FE,200D,2642,FE0F||25;1F471,1F3FF,200D,2642,FE0F||25</item>
|
||||
<item>1F9D3,1F3FB||26;1F9D3,1F3FC||26;1F9D3,1F3FD||26;1F9D3,1F3FE||26;1F9D3,1F3FF||26</item>
|
||||
<item>1F474,1F3FB||24;1F474,1F3FC||24;1F474,1F3FD||24;1F474,1F3FE||24;1F474,1F3FF||24</item>
|
||||
<item>1F475,1F3FB||24;1F475,1F3FC||24;1F475,1F3FD||24;1F475,1F3FE||24;1F475,1F3FF||24</item>
|
||||
|
@ -649,36 +677,52 @@
|
|||
<item>1F937,1F3FB||24;1F937,1F3FC||24;1F937,1F3FD||24;1F937,1F3FE||24;1F937,1F3FF||24</item>
|
||||
<item>1F937,1F3FB,200D,2642,FE0F||25;1F937,1F3FC,200D,2642,FE0F||25;1F937,1F3FD,200D,2642,FE0F||25;1F937,1F3FE,200D,2642,FE0F||25;1F937,1F3FF,200D,2642,FE0F||25</item>
|
||||
<item>1F937,1F3FB,200D,2640,FE0F||25;1F937,1F3FC,200D,2640,FE0F||25;1F937,1F3FD,200D,2640,FE0F||25;1F937,1F3FE,200D,2640,FE0F||25;1F937,1F3FF,200D,2640,FE0F||25</item>
|
||||
<item>1F9D1,1F3FB,200D,2695,FE0F||30;1F9D1,1F3FC,200D,2695,FE0F||30;1F9D1,1F3FD,200D,2695,FE0F||30;1F9D1,1F3FE,200D,2695,FE0F||30;1F9D1,1F3FF,200D,2695,FE0F||30</item>
|
||||
<item>1F468,1F3FB,200D,2695,FE0F||25;1F468,1F3FC,200D,2695,FE0F||25;1F468,1F3FD,200D,2695,FE0F||25;1F468,1F3FE,200D,2695,FE0F||25;1F468,1F3FF,200D,2695,FE0F||25</item>
|
||||
<item>1F469,1F3FB,200D,2695,FE0F||25;1F469,1F3FC,200D,2695,FE0F||25;1F469,1F3FD,200D,2695,FE0F||25;1F469,1F3FE,200D,2695,FE0F||25;1F469,1F3FF,200D,2695,FE0F||25</item>
|
||||
<item>1F9D1,1F3FB,200D,1F393||30;1F9D1,1F3FC,200D,1F393||30;1F9D1,1F3FD,200D,1F393||30;1F9D1,1F3FE,200D,1F393||30;1F9D1,1F3FF,200D,1F393||30</item>
|
||||
<item>1F468,1F3FB,200D,1F393||25;1F468,1F3FC,200D,1F393||25;1F468,1F3FD,200D,1F393||25;1F468,1F3FE,200D,1F393||25;1F468,1F3FF,200D,1F393||25</item>
|
||||
<item>1F469,1F3FB,200D,1F393||25;1F469,1F3FC,200D,1F393||25;1F469,1F3FD,200D,1F393||25;1F469,1F3FE,200D,1F393||25;1F469,1F3FF,200D,1F393||25</item>
|
||||
<item>1F9D1,1F3FB,200D,1F3EB||30;1F9D1,1F3FC,200D,1F3EB||30;1F9D1,1F3FD,200D,1F3EB||30;1F9D1,1F3FE,200D,1F3EB||30;1F9D1,1F3FF,200D,1F3EB||30</item>
|
||||
<item>1F468,1F3FB,200D,1F3EB||25;1F468,1F3FC,200D,1F3EB||25;1F468,1F3FD,200D,1F3EB||25;1F468,1F3FE,200D,1F3EB||25;1F468,1F3FF,200D,1F3EB||25</item>
|
||||
<item>1F469,1F3FB,200D,1F3EB||25;1F469,1F3FC,200D,1F3EB||25;1F469,1F3FD,200D,1F3EB||25;1F469,1F3FE,200D,1F3EB||25;1F469,1F3FF,200D,1F3EB||25</item>
|
||||
<item>1F9D1,1F3FB,200D,2696,FE0F||30;1F9D1,1F3FC,200D,2696,FE0F||30;1F9D1,1F3FD,200D,2696,FE0F||30;1F9D1,1F3FE,200D,2696,FE0F||30;1F9D1,1F3FF,200D,2696,FE0F||30</item>
|
||||
<item>1F468,1F3FB,200D,2696,FE0F||25;1F468,1F3FC,200D,2696,FE0F||25;1F468,1F3FD,200D,2696,FE0F||25;1F468,1F3FE,200D,2696,FE0F||25;1F468,1F3FF,200D,2696,FE0F||25</item>
|
||||
<item>1F469,1F3FB,200D,2696,FE0F||25;1F469,1F3FC,200D,2696,FE0F||25;1F469,1F3FD,200D,2696,FE0F||25;1F469,1F3FE,200D,2696,FE0F||25;1F469,1F3FF,200D,2696,FE0F||25</item>
|
||||
<item>1F9D1,1F3FB,200D,1F33E||30;1F9D1,1F3FC,200D,1F33E||30;1F9D1,1F3FD,200D,1F33E||30;1F9D1,1F3FE,200D,1F33E||30;1F9D1,1F3FF,200D,1F33E||30</item>
|
||||
<item>1F468,1F3FB,200D,1F33E||25;1F468,1F3FC,200D,1F33E||25;1F468,1F3FD,200D,1F33E||25;1F468,1F3FE,200D,1F33E||25;1F468,1F3FF,200D,1F33E||25</item>
|
||||
<item>1F469,1F3FB,200D,1F33E||25;1F469,1F3FC,200D,1F33E||25;1F469,1F3FD,200D,1F33E||25;1F469,1F3FE,200D,1F33E||25;1F469,1F3FF,200D,1F33E||25</item>
|
||||
<item>1F9D1,1F3FB,200D,1F373||30;1F9D1,1F3FC,200D,1F373||30;1F9D1,1F3FD,200D,1F373||30;1F9D1,1F3FE,200D,1F373||30;1F9D1,1F3FF,200D,1F373||30</item>
|
||||
<item>1F468,1F3FB,200D,1F373||25;1F468,1F3FC,200D,1F373||25;1F468,1F3FD,200D,1F373||25;1F468,1F3FE,200D,1F373||25;1F468,1F3FF,200D,1F373||25</item>
|
||||
<item>1F469,1F3FB,200D,1F373||25;1F469,1F3FC,200D,1F373||25;1F469,1F3FD,200D,1F373||25;1F469,1F3FE,200D,1F373||25;1F469,1F3FF,200D,1F373||25</item>
|
||||
<item>1F9D1,1F3FB,200D,1F527||30;1F9D1,1F3FC,200D,1F527||30;1F9D1,1F3FD,200D,1F527||30;1F9D1,1F3FE,200D,1F527||30;1F9D1,1F3FF,200D,1F527||30</item>
|
||||
<item>1F468,1F3FB,200D,1F527||25;1F468,1F3FC,200D,1F527||25;1F468,1F3FD,200D,1F527||25;1F468,1F3FE,200D,1F527||25;1F468,1F3FF,200D,1F527||25</item>
|
||||
<item>1F469,1F3FB,200D,1F527||25;1F469,1F3FC,200D,1F527||25;1F469,1F3FD,200D,1F527||25;1F469,1F3FE,200D,1F527||25;1F469,1F3FF,200D,1F527||25</item>
|
||||
<item>1F9D1,1F3FB,200D,1F3ED||30;1F9D1,1F3FC,200D,1F3ED||30;1F9D1,1F3FD,200D,1F3ED||30;1F9D1,1F3FE,200D,1F3ED||30;1F9D1,1F3FF,200D,1F3ED||30</item>
|
||||
<item>1F468,1F3FB,200D,1F3ED||25;1F468,1F3FC,200D,1F3ED||25;1F468,1F3FD,200D,1F3ED||25;1F468,1F3FE,200D,1F3ED||25;1F468,1F3FF,200D,1F3ED||25</item>
|
||||
<item>1F469,1F3FB,200D,1F3ED||25;1F469,1F3FC,200D,1F3ED||25;1F469,1F3FD,200D,1F3ED||25;1F469,1F3FE,200D,1F3ED||25;1F469,1F3FF,200D,1F3ED||25</item>
|
||||
<item>1F9D1,1F3FB,200D,1F4BC||30;1F9D1,1F3FC,200D,1F4BC||30;1F9D1,1F3FD,200D,1F4BC||30;1F9D1,1F3FE,200D,1F4BC||30;1F9D1,1F3FF,200D,1F4BC||30</item>
|
||||
<item>1F468,1F3FB,200D,1F4BC||25;1F468,1F3FC,200D,1F4BC||25;1F468,1F3FD,200D,1F4BC||25;1F468,1F3FE,200D,1F4BC||25;1F468,1F3FF,200D,1F4BC||25</item>
|
||||
<item>1F469,1F3FB,200D,1F4BC||25;1F469,1F3FC,200D,1F4BC||25;1F469,1F3FD,200D,1F4BC||25;1F469,1F3FE,200D,1F4BC||25;1F469,1F3FF,200D,1F4BC||25</item>
|
||||
<item>1F9D1,1F3FB,200D,1F52C||30;1F9D1,1F3FC,200D,1F52C||30;1F9D1,1F3FD,200D,1F52C||30;1F9D1,1F3FE,200D,1F52C||30;1F9D1,1F3FF,200D,1F52C||30</item>
|
||||
<item>1F468,1F3FB,200D,1F52C||25;1F468,1F3FC,200D,1F52C||25;1F468,1F3FD,200D,1F52C||25;1F468,1F3FE,200D,1F52C||25;1F468,1F3FF,200D,1F52C||25</item>
|
||||
<item>1F469,1F3FB,200D,1F52C||25;1F469,1F3FC,200D,1F52C||25;1F469,1F3FD,200D,1F52C||25;1F469,1F3FE,200D,1F52C||25;1F469,1F3FF,200D,1F52C||25</item>
|
||||
<item>1F9D1,1F3FB,200D,1F4BB||30;1F9D1,1F3FC,200D,1F4BB||30;1F9D1,1F3FD,200D,1F4BB||30;1F9D1,1F3FE,200D,1F4BB||30;1F9D1,1F3FF,200D,1F4BB||30</item>
|
||||
<item>1F468,1F3FB,200D,1F4BB||25;1F468,1F3FC,200D,1F4BB||25;1F468,1F3FD,200D,1F4BB||25;1F468,1F3FE,200D,1F4BB||25;1F468,1F3FF,200D,1F4BB||25</item>
|
||||
<item>1F469,1F3FB,200D,1F4BB||25;1F469,1F3FC,200D,1F4BB||25;1F469,1F3FD,200D,1F4BB||25;1F469,1F3FE,200D,1F4BB||25;1F469,1F3FF,200D,1F4BB||25</item>
|
||||
<item>1F9D1,1F3FB,200D,1F3A4||30;1F9D1,1F3FC,200D,1F3A4||30;1F9D1,1F3FD,200D,1F3A4||30;1F9D1,1F3FE,200D,1F3A4||30;1F9D1,1F3FF,200D,1F3A4||30</item>
|
||||
<item>1F468,1F3FB,200D,1F3A4||25;1F468,1F3FC,200D,1F3A4||25;1F468,1F3FD,200D,1F3A4||25;1F468,1F3FE,200D,1F3A4||25;1F468,1F3FF,200D,1F3A4||25</item>
|
||||
<item>1F469,1F3FB,200D,1F3A4||25;1F469,1F3FC,200D,1F3A4||25;1F469,1F3FD,200D,1F3A4||25;1F469,1F3FE,200D,1F3A4||25;1F469,1F3FF,200D,1F3A4||25</item>
|
||||
<item>1F9D1,1F3FB,200D,1F3A8||30;1F9D1,1F3FC,200D,1F3A8||30;1F9D1,1F3FD,200D,1F3A8||30;1F9D1,1F3FE,200D,1F3A8||30;1F9D1,1F3FF,200D,1F3A8||30</item>
|
||||
<item>1F468,1F3FB,200D,1F3A8||25;1F468,1F3FC,200D,1F3A8||25;1F468,1F3FD,200D,1F3A8||25;1F468,1F3FE,200D,1F3A8||25;1F468,1F3FF,200D,1F3A8||25</item>
|
||||
<item>1F469,1F3FB,200D,1F3A8||25;1F469,1F3FC,200D,1F3A8||25;1F469,1F3FD,200D,1F3A8||25;1F469,1F3FE,200D,1F3A8||25;1F469,1F3FF,200D,1F3A8||25</item>
|
||||
<item>1F9D1,1F3FB,200D,2708,FE0F||30;1F9D1,1F3FC,200D,2708,FE0F||30;1F9D1,1F3FD,200D,2708,FE0F||30;1F9D1,1F3FE,200D,2708,FE0F||30;1F9D1,1F3FF,200D,2708,FE0F||30</item>
|
||||
<item>1F468,1F3FB,200D,2708,FE0F||25;1F468,1F3FC,200D,2708,FE0F||25;1F468,1F3FD,200D,2708,FE0F||25;1F468,1F3FE,200D,2708,FE0F||25;1F468,1F3FF,200D,2708,FE0F||25</item>
|
||||
<item>1F469,1F3FB,200D,2708,FE0F||25;1F469,1F3FC,200D,2708,FE0F||25;1F469,1F3FD,200D,2708,FE0F||25;1F469,1F3FE,200D,2708,FE0F||25;1F469,1F3FF,200D,2708,FE0F||25</item>
|
||||
<item>1F9D1,1F3FB,200D,1F680||30;1F9D1,1F3FC,200D,1F680||30;1F9D1,1F3FD,200D,1F680||30;1F9D1,1F3FE,200D,1F680||30;1F9D1,1F3FF,200D,1F680||30</item>
|
||||
<item>1F468,1F3FB,200D,1F680||25;1F468,1F3FC,200D,1F680||25;1F468,1F3FD,200D,1F680||25;1F468,1F3FE,200D,1F680||25;1F468,1F3FF,200D,1F680||25</item>
|
||||
<item>1F469,1F3FB,200D,1F680||25;1F469,1F3FC,200D,1F680||25;1F469,1F3FD,200D,1F680||25;1F469,1F3FE,200D,1F680||25;1F469,1F3FF,200D,1F680||25</item>
|
||||
<item>1F9D1,1F3FB,200D,1F692||30;1F9D1,1F3FC,200D,1F692||30;1F9D1,1F3FD,200D,1F692||30;1F9D1,1F3FE,200D,1F692||30;1F9D1,1F3FF,200D,1F692||30</item>
|
||||
<item>1F468,1F3FB,200D,1F692||25;1F468,1F3FC,200D,1F692||25;1F468,1F3FD,200D,1F692||25;1F468,1F3FE,200D,1F692||25;1F468,1F3FF,200D,1F692||25</item>
|
||||
<item>1F469,1F3FB,200D,1F692||25;1F469,1F3FC,200D,1F692||25;1F469,1F3FD,200D,1F692||25;1F469,1F3FE,200D,1F692||25;1F469,1F3FF,200D,1F692||25</item>
|
||||
<item>1F46E,1F3FB||24;1F46E,1F3FC||24;1F46E,1F3FD||24;1F46E,1F3FE||24;1F46E,1F3FF||24</item>
|
||||
|
@ -694,6 +738,7 @@
|
|||
<item>1F477,1F3FB||24;1F477,1F3FC||24;1F477,1F3FD||24;1F477,1F3FE||24;1F477,1F3FF||24</item>
|
||||
<item>1F477,1F3FB,200D,2642,FE0F||25;1F477,1F3FC,200D,2642,FE0F||25;1F477,1F3FD,200D,2642,FE0F||25;1F477,1F3FE,200D,2642,FE0F||25;1F477,1F3FF,200D,2642,FE0F||25</item>
|
||||
<item>1F477,1F3FB,200D,2640,FE0F||25;1F477,1F3FC,200D,2640,FE0F||25;1F477,1F3FD,200D,2640,FE0F||25;1F477,1F3FE,200D,2640,FE0F||25;1F477,1F3FF,200D,2640,FE0F||25</item>
|
||||
<item>1FAC5,1F3FB||32;1FAC5,1F3FC||32;1FAC5,1F3FD||32;1FAC5,1F3FE||32;1FAC5,1F3FF||32</item>
|
||||
<item>1F934,1F3FB||24;1F934,1F3FC||24;1F934,1F3FD||24;1F934,1F3FE||24;1F934,1F3FF||24</item>
|
||||
<item>1F478,1F3FB||24;1F478,1F3FC||24;1F478,1F3FD||24;1F478,1F3FE||24;1F478,1F3FF||24</item>
|
||||
<item>1F473,1F3FB||24;1F473,1F3FC||24;1F473,1F3FD||24;1F473,1F3FE||24;1F473,1F3FF||24</item>
|
||||
|
@ -708,6 +753,8 @@
|
|||
<item>1F470,1F3FB,200D,2642,FE0F||30;1F470,1F3FC,200D,2642,FE0F||30;1F470,1F3FD,200D,2642,FE0F||30;1F470,1F3FE,200D,2642,FE0F||30;1F470,1F3FF,200D,2642,FE0F||30</item>
|
||||
<item>1F470,1F3FB,200D,2640,FE0F||30;1F470,1F3FC,200D,2640,FE0F||30;1F470,1F3FD,200D,2640,FE0F||30;1F470,1F3FE,200D,2640,FE0F||30;1F470,1F3FF,200D,2640,FE0F||30</item>
|
||||
<item>1F930,1F3FB||24;1F930,1F3FC||24;1F930,1F3FD||24;1F930,1F3FE||24;1F930,1F3FF||24</item>
|
||||
<item>1FAC3,1F3FB||32;1FAC3,1F3FD||32;1FAC3,1F3FE||32;1FAC3,1F3FF||32</item>
|
||||
<item>1FAC4,1F3FB||32;1FAC4,1F3FC||32;1FAC4,1F3FD||32;1FAC4,1F3FE||32;1FAC4,1F3FF||32</item>
|
||||
<item>1F931,1F3FB||26;1F931,1F3FC||26;1F931,1F3FD||26;1F931,1F3FE||26;1F931,1F3FF||26</item>
|
||||
<item>1F469,1F3FB,200D,1F37C||30;1F469,1F3FC,200D,1F37C||30;1F469,1F3FD,200D,1F37C||30;1F469,1F3FE,200D,1F37C||30;1F469,1F3FF,200D,1F37C||30</item>
|
||||
<item>1F468,1F3FB,200D,1F37C||30;1F468,1F3FC,200D,1F37C||30;1F468,1F3FD,200D,1F37C||30;1F468,1F3FE,200D,1F37C||30;1F468,1F3FF,200D,1F37C||30</item>
|
||||
|
@ -743,6 +790,7 @@
|
|||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item>1F486,1F3FB||24;1F486,1F3FC||24;1F486,1F3FD||24;1F486,1F3FE||24;1F486,1F3FF||24</item>
|
||||
<item>1F486,1F3FB,200D,2642,FE0F||25;1F486,1F3FC,200D,2642,FE0F||25;1F486,1F3FD,200D,2642,FE0F||25;1F486,1F3FE,200D,2642,FE0F||25;1F486,1F3FF,200D,2642,FE0F||25</item>
|
||||
<item>1F486,1F3FB,200D,2640,FE0F||25;1F486,1F3FC,200D,2640,FE0F||25;1F486,1F3FD,200D,2640,FE0F||25;1F486,1F3FE,200D,2640,FE0F||25;1F486,1F3FF,200D,2640,FE0F||25</item>
|
||||
|
@ -758,10 +806,13 @@
|
|||
<item>1F9CE,1F3FB||29;1F9CE,1F3FC||29;1F9CE,1F3FD||29;1F9CE,1F3FE||29;1F9CE,1F3FF||29</item>
|
||||
<item>1F9CE,1F3FB,200D,2642,FE0F||29;1F9CE,1F3FC,200D,2642,FE0F||29;1F9CE,1F3FD,200D,2642,FE0F||29;1F9CE,1F3FE,200D,2642,FE0F||29;1F9CE,1F3FF,200D,2642,FE0F||29</item>
|
||||
<item>1F9CE,1F3FB,200D,2640,FE0F||29;1F9CE,1F3FC,200D,2640,FE0F||29;1F9CE,1F3FD,200D,2640,FE0F||29;1F9CE,1F3FE,200D,2640,FE0F||29;1F9CE,1F3FF,200D,2640,FE0F||29</item>
|
||||
<item>1F9D1,1F3FB,200D,1F9AF||30;1F9D1,1F3FC,200D,1F9AF||30;1F9D1,1F3FD,200D,1F9AF||30;1F9D1,1F3FE,200D,1F9AF||30;1F9D1,1F3FF,200D,1F9AF||30</item>
|
||||
<item>1F468,1F3FB,200D,1F9AF||29;1F468,1F3FC,200D,1F9AF||29;1F468,1F3FD,200D,1F9AF||29;1F468,1F3FE,200D,1F9AF||29;1F468,1F3FF,200D,1F9AF||29</item>
|
||||
<item>1F469,1F3FB,200D,1F9AF||29;1F469,1F3FC,200D,1F9AF||29;1F469,1F3FD,200D,1F9AF||29;1F469,1F3FE,200D,1F9AF||29;1F469,1F3FF,200D,1F9AF||29</item>
|
||||
<item>1F9D1,1F3FB,200D,1F9BC||30;1F9D1,1F3FC,200D,1F9BC||30;1F9D1,1F3FD,200D,1F9BC||30;1F9D1,1F3FE,200D,1F9BC||30;1F9D1,1F3FF,200D,1F9BC||30</item>
|
||||
<item>1F468,1F3FB,200D,1F9BC||29;1F468,1F3FC,200D,1F9BC||29;1F468,1F3FD,200D,1F9BC||29;1F468,1F3FE,200D,1F9BC||29;1F468,1F3FF,200D,1F9BC||29</item>
|
||||
<item>1F469,1F3FB,200D,1F9BC||29;1F469,1F3FC,200D,1F9BC||29;1F469,1F3FD,200D,1F9BC||29;1F469,1F3FE,200D,1F9BC||29;1F469,1F3FF,200D,1F9BC||29</item>
|
||||
<item>1F9D1,1F3FB,200D,1F9BD||30;1F9D1,1F3FC,200D,1F9BD||30;1F9D1,1F3FD,200D,1F9BD||30;1F9D1,1F3FE,200D,1F9BD||30;1F9D1,1F3FF,200D,1F9BD||30</item>
|
||||
<item>1F468,1F3FB,200D,1F9BD||29;1F468,1F3FC,200D,1F9BD||29;1F468,1F3FD,200D,1F9BD||29;1F468,1F3FE,200D,1F9BD||29;1F468,1F3FF,200D,1F9BD||29</item>
|
||||
<item>1F469,1F3FB,200D,1F9BD||29;1F469,1F3FC,200D,1F9BD||29;1F469,1F3FD,200D,1F9BD||29;1F469,1F3FE,200D,1F9BD||29;1F469,1F3FF,200D,1F9BD||29</item>
|
||||
<item>1F3C3,1F3FB||24;1F3C3,1F3FC||24;1F3C3,1F3FD||24;1F3C3,1F3FE||24;1F3C3,1F3FF||24</item>
|
||||
|
@ -827,65 +878,15 @@
|
|||
<item>1F9D8,1F3FB,200D,2640,FE0F||26;1F9D8,1F3FC,200D,2640,FE0F||26;1F9D8,1F3FD,200D,2640,FE0F||26;1F9D8,1F3FE,200D,2640,FE0F||26;1F9D8,1F3FF,200D,2640,FE0F||26</item>
|
||||
<item>1F6C0,1F3FB||24;1F6C0,1F3FC||24;1F6C0,1F3FD||24;1F6C0,1F3FE||24;1F6C0,1F3FF||24</item>
|
||||
<item>1F6CC,1F3FB||26;1F6CC,1F3FC||26;1F6CC,1F3FD||26;1F6CC,1F3FE||26;1F6CC,1F3FF||26</item>
|
||||
<item>1F9D1,1F3FB,200D,1F91D,200D,1F9D1,1F3FB||29;1F9D1,1F3FC,200D,1F91D,200D,1F9D1,1F3FC||29;1F9D1,1F3FD,200D,1F91D,200D,1F9D1,1F3FD||29;1F9D1,1F3FE,200D,1F91D,200D,1F9D1,1F3FE||29;1F9D1,1F3FF,200D,1F91D,200D,1F9D1,1F3FF||29</item>
|
||||
<!--<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>-->
|
||||
<item>1F46D,1F3FB||29;1F46D,1F3FC||29;1F46D,1F3FD||29;1F46D,1F3FE||29;1F46D,1F3FF||29</item>
|
||||
<!--<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>-->
|
||||
<item>1F46B,1F3FB||29;1F46B,1F3FC||29;1F46B,1F3FD||29;1F46B,1F3FE||29;1F46B,1F3FF||29</item>
|
||||
<!--<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>-->
|
||||
<item>1F46C,1F3FB||29;1F46C,1F3FC||29;1F46C,1F3FD||29;1F46C,1F3FE||29;1F46C,1F3FF||29</item>
|
||||
<!--<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>-->
|
||||
<item/>
|
||||
<item/>
|
||||
<item>1F48F,1F3FB||31;1F48F,1F3FC||31;1F48F,1F3FD||31;1F48F,1F3FE||31;1F48F,1F3FF||31</item>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
<item>1F491,1F3FB||31;1F491,1F3FC||31;1F491,1F3FD||31;1F491,1F3FE||31;1F491,1F3FF||31</item>
|
||||
<item/>
|
||||
<item/>
|
||||
<item/>
|
||||
|
@ -1026,6 +1027,7 @@
|
|||
<item>1F988||24</item>
|
||||
<item>1F419</item>
|
||||
<item>1F41A</item>
|
||||
<item>1FAB8||32</item>
|
||||
<item>1F40C</item>
|
||||
<item>1F98B||24</item>
|
||||
<item>1F41B</item>
|
||||
|
@ -1045,6 +1047,7 @@
|
|||
<item>1F490</item>
|
||||
<item>1F338</item>
|
||||
<item>1F4AE</item>
|
||||
<item>1FAB7||32</item>
|
||||
<item>1F3F5,FE0F||23</item>
|
||||
<item>1F339</item>
|
||||
<item>1F940||24</item>
|
||||
|
@ -1065,6 +1068,8 @@
|
|||
<item>1F341</item>
|
||||
<item>1F342</item>
|
||||
<item>1F343</item>
|
||||
<item>1FAB9||32</item>
|
||||
<item>1FABA||32</item>
|
||||
</array>
|
||||
|
||||
<array
|
||||
|
@ -1103,6 +1108,7 @@
|
|||
<item>1F9C5||29</item>
|
||||
<item>1F344</item>
|
||||
<item>1F95C||24</item>
|
||||
<item>1FAD8||32</item>
|
||||
<item>1F330</item>
|
||||
<item>1F35E</item>
|
||||
<item>1F950||24</item>
|
||||
|
@ -1188,6 +1194,7 @@
|
|||
<item>1F37B</item>
|
||||
<item>1F942||24</item>
|
||||
<item>1F943||24</item>
|
||||
<item>1FAD7||32</item>
|
||||
<item>1F964||26</item>
|
||||
<item>1F9CB||30</item>
|
||||
<item>1F9C3||29</item>
|
||||
|
@ -1198,6 +1205,7 @@
|
|||
<item>1F374</item>
|
||||
<item>1F944||24</item>
|
||||
<item>1F52A</item>
|
||||
<item>1FAD9||32</item>
|
||||
<item>1F3FA||23</item>
|
||||
</array>
|
||||
|
||||
|
@ -1265,6 +1273,7 @@
|
|||
<item>1F309</item>
|
||||
<item>2668,FE0F</item>
|
||||
<item>1F3A0</item>
|
||||
<item>1F6DD||32</item>
|
||||
<item>1F3A1</item>
|
||||
<item>1F3A2</item>
|
||||
<item>1F488</item>
|
||||
|
@ -1313,12 +1322,14 @@
|
|||
<item>1F6E4,FE0F||23</item>
|
||||
<item>1F6E2,FE0F||23</item>
|
||||
<item>26FD</item>
|
||||
<item>1F6DE||32</item>
|
||||
<item>1F6A8</item>
|
||||
<item>1F6A5</item>
|
||||
<item>1F6A6</item>
|
||||
<item>1F6D1||24</item>
|
||||
<item>1F6A7</item>
|
||||
<item>2693</item>
|
||||
<item>1F6DF||32</item>
|
||||
<item>26F5</item>
|
||||
<item>1F6F6||24</item>
|
||||
<item>1F6A4</item>
|
||||
|
@ -1423,8 +1434,7 @@
|
|||
|
||||
<array
|
||||
name="emoji_activities"
|
||||
format="string"
|
||||
>
|
||||
format="string">
|
||||
<item>1F383</item>
|
||||
<item>1F384</item>
|
||||
<item>1F386</item>
|
||||
|
@ -1479,12 +1489,14 @@
|
|||
<item>1F3BF</item>
|
||||
<item>1F6F7||26</item>
|
||||
<item>1F94C||26</item>
|
||||
<item>1F3AF</item>
|
||||
<item>1FA80||29</item>
|
||||
<item>1FA81||29</item>
|
||||
<item>1F3B1</item>
|
||||
<item>1F52E</item>
|
||||
<item>1FA84||30</item>
|
||||
<item>1F9FF||28</item>
|
||||
<item>1FAAC||32</item>
|
||||
<item>1F3AE</item>
|
||||
<item>1F579,FE0F||23</item>
|
||||
<item>1F3B0</item>
|
||||
|
@ -1492,6 +1504,7 @@
|
|||
<item>1F9E9||28</item>
|
||||
<item>1F9F8||28</item>
|
||||
<item>1FA85||30</item>
|
||||
<item>1FAA9||32</item>
|
||||
<item>1FA86||30</item>
|
||||
<item>2660,FE0F</item>
|
||||
<item>2665,FE0F</item>
|
||||
|
@ -1592,6 +1605,7 @@
|
|||
<item>1F4DF</item>
|
||||
<item>1F4E0</item>
|
||||
<item>1F50B</item>
|
||||
<item>1FAAB||32</item>
|
||||
<item>1F50C</item>
|
||||
<item>1F4BB</item>
|
||||
<item>1F5A5,FE0F||23</item>
|
||||
|
@ -1703,6 +1717,7 @@
|
|||
<item>1F6E0,FE0F||23</item>
|
||||
<item>1F5E1,FE0F||23</item>
|
||||
<item>2694,FE0F||23</item>
|
||||
<item>1F52B</item>
|
||||
<item>1FA83||30</item>
|
||||
<item>1F3F9||23</item>
|
||||
<item>1F6E1,FE0F||23</item>
|
||||
|
@ -1731,7 +1746,9 @@
|
|||
<item>1FA78||29</item>
|
||||
<item>1F48A</item>
|
||||
<item>1FA79||29</item>
|
||||
<item>1FA7C||32</item>
|
||||
<item>1FA7A||29</item>
|
||||
<item>1FA7B||32</item>
|
||||
<item>1F6AA</item>
|
||||
<item>1F6D7||30</item>
|
||||
<item>1FA9E||30</item>
|
||||
|
@ -1752,6 +1769,7 @@
|
|||
<item>1F9FB||28</item>
|
||||
<item>1FAA3||30</item>
|
||||
<item>1F9FC||28</item>
|
||||
<item>1FAE7||32</item>
|
||||
<item>1FAA5||30</item>
|
||||
<item>1F9FD||28</item>
|
||||
<item>1F9EF||28</item>
|
||||
|
@ -1762,12 +1780,12 @@
|
|||
<item>26B1,FE0F||23</item>
|
||||
<item>1F5FF</item>
|
||||
<item>1FAA7||30</item>
|
||||
<item>1FAAA||32</item>
|
||||
</array>
|
||||
|
||||
<array
|
||||
name="emoji_symbols"
|
||||
format="string"
|
||||
>
|
||||
format="string">
|
||||
<item>1F3E7</item>
|
||||
<item>1F6AE</item>
|
||||
<item>1F6B0</item>
|
||||
|
@ -1871,11 +1889,14 @@
|
|||
<item>2795</item>
|
||||
<item>2796</item>
|
||||
<item>2797</item>
|
||||
<item>1F7F0||32</item>
|
||||
<item>267E,FE0F||28</item>
|
||||
<item>203C,FE0F</item>
|
||||
<item>2049,FE0F</item>
|
||||
<item>2753</item>
|
||||
<item>2754</item>
|
||||
<item>2755</item>
|
||||
<item>2757</item>
|
||||
<item>3030,FE0F</item>
|
||||
<item>1F4B1</item>
|
||||
<item>1F4B2</item>
|
||||
|
@ -1897,9 +1918,47 @@
|
|||
<item>2733,FE0F</item>
|
||||
<item>2734,FE0F</item>
|
||||
<item>2747,FE0F</item>
|
||||
<item>00A9,FE0F</item>
|
||||
<item>00AE,FE0F</item>
|
||||
<item>A9,FE0F</item>
|
||||
<item>AE,FE0F</item>
|
||||
<item>2122,FE0F</item>
|
||||
<item>1F1E6</item>
|
||||
<item>1F1E7</item>
|
||||
<item>1F1E8</item>
|
||||
<item>1F1E9</item>
|
||||
<item>1F1EA</item>
|
||||
<item>1F1EB</item>
|
||||
<item>1F1EC</item>
|
||||
<item>1F1ED</item>
|
||||
<item>1F1EE</item>
|
||||
<item>1F1EF</item>
|
||||
<item>1F1F0</item>
|
||||
<item>1F1F1</item>
|
||||
<item>1F1F2</item>
|
||||
<item>1F1F3</item>
|
||||
<item>1F1F4</item>
|
||||
<item>1F1F5</item>
|
||||
<item>1F1F6</item>
|
||||
<item>1F1F7</item>
|
||||
<item>1F1F8</item>
|
||||
<item>1F1F9</item>
|
||||
<item>1F1FA</item>
|
||||
<item>1F1FB</item>
|
||||
<item>1F1FC</item>
|
||||
<item>1F1FD</item>
|
||||
<item>1F1FE</item>
|
||||
<item>1F1FF</item>
|
||||
<item>23,FE0F,20E3||21</item>
|
||||
<item>2A,FE0F,20E3||23</item>
|
||||
<item>30,FE0F,20E3||21</item>
|
||||
<item>31,FE0F,20E3||21</item>
|
||||
<item>32,FE0F,20E3||21</item>
|
||||
<item>33,FE0F,20E3||21</item>
|
||||
<item>34,FE0F,20E3||21</item>
|
||||
<item>35,FE0F,20E3||21</item>
|
||||
<item>36,FE0F,20E3||21</item>
|
||||
<item>37,FE0F,20E3||21</item>
|
||||
<item>38,FE0F,20E3||21</item>
|
||||
<item>39,FE0F,20E3||21</item>
|
||||
<item>1F51F</item>
|
||||
<item>1F520</item>
|
||||
<item>1F521</item>
|
||||
|
@ -1978,8 +2037,7 @@
|
|||
|
||||
<array
|
||||
name="emoji_flags"
|
||||
format="string"
|
||||
>
|
||||
format="string">
|
||||
<item>1F3C1</item>
|
||||
<item>1F6A9</item>
|
||||
<item>1F38C</item>
|
||||
|
@ -2243,8 +2301,7 @@
|
|||
Do not remove these keys, because they are used as a template. -->
|
||||
<array
|
||||
name="emoji_recents"
|
||||
format="string"
|
||||
>
|
||||
format="string">
|
||||
<!-- These code point should be aligned with {@link RecentsKeyboard#TEMPLATE_KEY_CODE_*. -->
|
||||
<item>30</item>
|
||||
<item>31</item>
|
||||
|
@ -2252,8 +2309,7 @@
|
|||
|
||||
<array
|
||||
name="emoji_emoticons"
|
||||
format="string"
|
||||
>
|
||||
format="string">
|
||||
<item>:-)</item>
|
||||
<item>;-)</item>
|
||||
<item>:-(</item>
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
include ':app'
|
||||
include ':tools'
|
||||
include ':tools:make-keyboard-text'
|
||||
include ':tools:make-emoji-keys'
|
||||
|
|
21
tools/make-emoji-keys/README.md
Normal file
21
tools/make-emoji-keys/README.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
# make-emoji-keys
|
||||
|
||||
This module takes care of generating emoji data bundled with Openboard.
|
||||
Basically data is generated in three steps:
|
||||
1. Unicode emoji table provides code points and grouping plus ordering.
|
||||
2. Local file lists every new emojis supported for every android version since 4.4.
|
||||
3. Emoji sequences are merged with their base version and formatted into android resource file.
|
||||
|
||||
### Generate emoji-categories.xml
|
||||
|
||||
A gradle task called 'makeEmoji' builds and runs this tool to generate android resouce file which. Path to openboard's res directory is automatically set so the file is ready to be bundled at build.
|
||||
|
||||
### Update to latest emoji version
|
||||
|
||||
* Get new emoji data from Unicode official repository located here: https://unicode.org/Public/emoji.
|
||||
* Create a new directory in [/src/main/resources/emoji/ucd](/tools/make-emoji-keys/src/main/resources/emoji/ucd) and name it as a decimal number corresponding to Unicode's version.
|
||||
* Update [android-emoji-support.txt](/tools/make-emoji-keys/src/main/resources/emoji/android-emoji-support.txt) with new emojis supported in latest Android versions.
|
||||
* Run :
|
||||
```sh
|
||||
./gradlew tools:make-emoji-keys:makeEmoji
|
||||
```
|
40
tools/make-emoji-keys/build.gradle
Normal file
40
tools/make-emoji-keys/build.gradle
Normal file
|
@ -0,0 +1,40 @@
|
|||
apply plugin: 'java'
|
||||
apply plugin: 'kotlin'
|
||||
|
||||
version 'unspecified'
|
||||
|
||||
jar {
|
||||
manifest {
|
||||
attributes["Main-Class"] = 'com/majeur/inputmethod/tools/emoji/MakeEmojiKeys'
|
||||
}
|
||||
from {
|
||||
configurations.runtimeClasspath.collect {
|
||||
it.isDirectory() ? it : zipTree(it)
|
||||
}
|
||||
}
|
||||
from("src/main/ressources")
|
||||
|
||||
}
|
||||
|
||||
task makeEmoji(type: JavaExec, dependsOn: ['jar']) {
|
||||
main = '-jar'
|
||||
args jar.archiveFile.get()
|
||||
args '-res'
|
||||
args project.rootProject.project('app').projectDir.path + File.separator + 'src' +
|
||||
File.separator + 'main' + File.separator + 'res'
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||
}
|
||||
|
||||
|
||||
|
||||
java {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
package com.majeur.inputmethod.tools.emoji
|
||||
|
||||
|
||||
class AndroidEmojiSupportFileParser : TextFileParser<Map<Int, Int>>() {
|
||||
|
||||
private val map = mutableMapOf<Int, Int>()
|
||||
private var currentApiLevel = 0
|
||||
|
||||
override fun getParseResult() = map
|
||||
|
||||
override fun parseLine(content: String) {
|
||||
ifStartsWith(content,
|
||||
API_LEVEL_MARK to ::parseApiLevel,
|
||||
UNICODE_MARK to ::parseCodePoints)
|
||||
}
|
||||
|
||||
private fun parseApiLevel(content: String) {
|
||||
currentApiLevel = content
|
||||
.substringBefore("#")
|
||||
.trim()
|
||||
.toInt()
|
||||
}
|
||||
|
||||
private fun parseCodePoints(content: String) {
|
||||
val codePointsHash = content
|
||||
.substringBefore("#")
|
||||
.trim()
|
||||
.split(" ")
|
||||
.map { it
|
||||
.trim()
|
||||
.removePrefix("U+")
|
||||
.toInt(radix = 16) }
|
||||
.joinToString(separator = "")
|
||||
.hashCode()
|
||||
map[codePointsHash] = currentApiLevel
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
private const val API_LEVEL_MARK = "@"
|
||||
private const val UNICODE_MARK = "U"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,153 @@
|
|||
package com.majeur.inputmethod.tools.emoji
|
||||
|
||||
import com.majeur.inputmethod.tools.emoji.model.EmojiData
|
||||
import com.majeur.inputmethod.tools.emoji.model.EmojiGroup
|
||||
import java.io.*
|
||||
import java.nio.charset.Charset
|
||||
import java.util.jar.JarFile
|
||||
|
||||
class EmojiCategoriesResource(private val jarFile: JarFile) {
|
||||
|
||||
fun writeToAndroidRes(outDir: String?, emojiData: EmojiData, supportData: Map<Int, Int>) {
|
||||
val template = JarUtils.getAndroidResTemplateResource(jarFile)
|
||||
val resourceDir = template.substring(0, template.lastIndexOf('/'))
|
||||
var ps: PrintStream? = null
|
||||
var lnr: LineNumberReader? = null
|
||||
try {
|
||||
ps = if (outDir == null) {
|
||||
System.out
|
||||
} else {
|
||||
val outDir = File(outDir, resourceDir)
|
||||
val outputFile = File(outDir,
|
||||
ANDROID_RES_TEMPLATE.replace(".tmpl", ".xml"))
|
||||
outDir.mkdirs()
|
||||
println("Building android resource file into ${outputFile.absoluteFile}")
|
||||
PrintStream(outputFile, Charset.forName("UTF-8"))
|
||||
}
|
||||
lnr = LineNumberReader(InputStreamReader(JarUtils.openResource(template), Charset.forName("UTF-8")))
|
||||
inflateTemplate(lnr, ps!!, emojiData, supportData)
|
||||
} catch (e: IOException) {
|
||||
throw RuntimeException(e)
|
||||
} finally {
|
||||
JarUtils.close(lnr)
|
||||
JarUtils.close(ps)
|
||||
}
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
private fun inflateTemplate(reader: LineNumberReader, out: PrintStream,
|
||||
emojis: EmojiData, supportData: Map<Int, Int>) {
|
||||
reader.lines().forEach {
|
||||
when {
|
||||
it.contains(MARK_UNICODE_VER) ->
|
||||
out.println(it.replace(MARK_UNICODE_VER, emojis.unicodeVersion))
|
||||
it.contains(MARK_API_LEVEL) ->
|
||||
out.println(it.replace(MARK_API_LEVEL, supportData.values.maxOrNull().toString()))
|
||||
it.contains(MARK_SMILEYS_AND_EMOTION) ->
|
||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.SMILEYS_AND_EMOTION)
|
||||
it.contains(MARK_PEOPLE_AND_BODY) ->
|
||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.PEOPLE_AND_BODY)
|
||||
it.contains(MARK_ANIMALS_AND_NATURE) ->
|
||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.ANIMALS_AND_NATURE)
|
||||
it.contains(MARK_FOOD_AND_DRINK) ->
|
||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.FOOD_AND_DRINK)
|
||||
it.contains(MARK_TRAVEL_AND_PLACES) ->
|
||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.TRAVEL_AND_PLACES)
|
||||
it.contains(MARK_ACTIVITIES) ->
|
||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.ACTIVITIES)
|
||||
it.contains(MARK_OBJECTS) ->
|
||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.OBJECTS)
|
||||
it.contains(MARK_SYMBOLS) ->
|
||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.SYMBOLS)
|
||||
it.contains(MARK_FLAGS) ->
|
||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.FLAGS)
|
||||
it.contains(MARK_PEOPLE_AND_BODY_MORE) ->
|
||||
dumpEmojiSpecsVariant(out, emojis, supportData,EmojiGroup.PEOPLE_AND_BODY)
|
||||
else -> out.println(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun dumpEmojiSpecs(out: PrintStream, emojiData: EmojiData, supportData: Map<Int, Int>,
|
||||
group: EmojiGroup) {
|
||||
emojiData[group].forEach { emoji ->
|
||||
val minApi = getMinApi(emoji.codes, supportData)
|
||||
if (minApi < 0) {
|
||||
// We have no clue of which android version supports this emoji,
|
||||
// so we ignore it.
|
||||
printCompatNotFound(emoji.codes)
|
||||
return@forEach
|
||||
}
|
||||
val text = makeEmojiKey(emoji.codes, minApi)
|
||||
out.println(" <item>$text</item>")
|
||||
}
|
||||
}
|
||||
|
||||
private fun dumpEmojiSpecsVariant(out: PrintStream, emojiData: EmojiData, supportData: Map<Int, Int>,
|
||||
group: EmojiGroup) {
|
||||
emojiData[group].forEach { baseEmoji ->
|
||||
val minApi = getMinApi(baseEmoji.codes, supportData)
|
||||
if (minApi < 0) {
|
||||
// Same thing, we already encountered it when dumping base emoji,
|
||||
// ignoring this one silently.
|
||||
return@forEach
|
||||
}
|
||||
|
||||
val text = baseEmoji.variants.filter { emoji ->
|
||||
if (getMinApi(emoji.codes, supportData) < 0) {
|
||||
// Again
|
||||
printCompatNotFound(emoji.codes)
|
||||
return@filter false
|
||||
}
|
||||
true
|
||||
}.map { emoji ->
|
||||
// Not very efficient, minApi is accessed twice,
|
||||
// but hey, we are making tooling here
|
||||
makeEmojiKey(emoji.codes, getMinApi(emoji.codes, supportData))
|
||||
}.filter { key ->
|
||||
key.isNotBlank()
|
||||
}.joinToString(separator = ";")
|
||||
|
||||
if (text.isNotBlank()) out.println(" <item>$text</item>")
|
||||
else out.println(" <item/>")
|
||||
}
|
||||
}
|
||||
|
||||
private fun makeEmojiKey(codes: IntArray, minApi: Int): String {
|
||||
val cps = codes
|
||||
.joinToString(separator = ",") {
|
||||
it.toString(radix = 16)
|
||||
.uppercase()
|
||||
}
|
||||
return if (minApi > 19) "$cps||$minApi" else cps
|
||||
}
|
||||
|
||||
private fun getMinApi(codes: IntArray, supportData: Map<Int, Int>): Int {
|
||||
val hash = codes
|
||||
.joinToString(separator = "")
|
||||
.hashCode()
|
||||
return supportData[hash] ?: -1
|
||||
}
|
||||
|
||||
private fun printCompatNotFound(codes: IntArray) {
|
||||
val formattedCps = codes.joinToString(" ") { "U+" + it.toString(radix = 16).uppercase() }
|
||||
println(" - No android compatibility found for emoji $formattedCps, ignoring...")
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val ANDROID_RES_TEMPLATE = "emoji-categories.tmpl"
|
||||
private const val MARK_UNICODE_VER = "@UNICODE_VERSION@"
|
||||
private const val MARK_API_LEVEL = "@ANDROID_API_LEVEL@"
|
||||
private const val MARK_SMILEYS_AND_EMOTION = "@SMILEYS_AND_EMOTION@"
|
||||
private const val MARK_PEOPLE_AND_BODY = "@PEOPLE_AND_BODY@"
|
||||
private const val MARK_PEOPLE_AND_BODY_MORE = "@PEOPLE_AND_BODY MORE@"
|
||||
private const val MARK_ANIMALS_AND_NATURE = "@ANIMALS_AND_NATURE@"
|
||||
private const val MARK_FOOD_AND_DRINK = "@FOOD_AND_DRINKS@"
|
||||
private const val MARK_TRAVEL_AND_PLACES = "@TRAVEL_AND_PLACES@"
|
||||
private const val MARK_ACTIVITIES = "@ACTIVITIES@"
|
||||
private const val MARK_OBJECTS = "@OBJECTS@"
|
||||
private const val MARK_SYMBOLS = "@SYMBOLS@"
|
||||
private const val MARK_FLAGS = "@FLAGS@"
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,88 @@
|
|||
package com.majeur.inputmethod.tools.emoji
|
||||
|
||||
import com.majeur.inputmethod.tools.emoji.model.EmojiData
|
||||
import com.majeur.inputmethod.tools.emoji.model.EmojiGroup
|
||||
|
||||
class EmojiUCDTestFileParser: TextFileParser<EmojiData>() {
|
||||
|
||||
private var count = 0
|
||||
private var emojiData = EmojiData()
|
||||
|
||||
private var currentGroup = EmojiGroup.SMILEYS_AND_EMOTION
|
||||
|
||||
override fun getParseResult() = emojiData
|
||||
|
||||
override fun parseLine(content: String) {
|
||||
ifStartsWith(content,
|
||||
"#" to ::parseComment,
|
||||
"" to ::parseEmojiSpec
|
||||
)
|
||||
}
|
||||
|
||||
private fun parseComment(content: String) {
|
||||
ifStartsWith(content,
|
||||
PROP_DATE to { emojiData.dataDate = it},
|
||||
PROP_UNICODE_VER to {
|
||||
emojiData.unicodeVersion = it
|
||||
println("Parsing emoji table from Unicode $it")
|
||||
},
|
||||
PROP_GROUP to ::parseGroup,
|
||||
PROP_SUBGROUP to { },
|
||||
"${currentGroup.rawName} subtotal:" to ::parseGroupSubtotal,
|
||||
EOF to { println("Parsed a total of $count emojis") }
|
||||
)
|
||||
}
|
||||
|
||||
private fun parseGroup(content: String) {
|
||||
currentGroup = EmojiGroup.get(content)
|
||||
}
|
||||
|
||||
private fun parseGroupSubtotal(content: String) {
|
||||
if (content.contains("w/o modifiers")) return
|
||||
val expected = content.toInt()
|
||||
val count = emojiData.emojiGroupCount(currentGroup)
|
||||
println(" - $count/$expected emojis for group ${currentGroup.rawName}")
|
||||
}
|
||||
|
||||
private fun parseEmojiSpec(content: String) {
|
||||
if (content.isEmpty()) return
|
||||
|
||||
val codePoints = content
|
||||
.substringBefore(';')
|
||||
.trim()
|
||||
val status = content
|
||||
.substringAfter(';')
|
||||
.substringBefore('#')
|
||||
.trim()
|
||||
val extras = content.substringAfter('#')
|
||||
|
||||
if (status != "fully-qualified") return
|
||||
|
||||
val rawVersion = EMOJI_VERSION_REGEX.find(extras)?.value ?: "O.0"
|
||||
val version = rawVersion.toFloat()
|
||||
val name = extras
|
||||
.substringAfter(rawVersion)
|
||||
.trim()
|
||||
|
||||
val cps = codePoints
|
||||
.split(" ")
|
||||
.map { it.toInt(radix = 16) }
|
||||
.toIntArray()
|
||||
|
||||
emojiData.insertEmoji(currentGroup, cps, version, name)
|
||||
count++
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
private const val PROP_UNICODE_VER = "Version:"
|
||||
private const val PROP_DATE = "Date:"
|
||||
private const val PROP_GROUP = "group:"
|
||||
private const val PROP_SUBGROUP = "subgroup:"
|
||||
private const val EOF = "EOF"
|
||||
|
||||
private val EMOJI_VERSION_REGEX = "[0-9]*[.]?[0-9]+".toRegex()
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
/*
|
||||
* Copyright (C) 2012 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.majeur.inputmethod.tools.emoji
|
||||
|
||||
import java.io.Closeable
|
||||
import java.io.IOException
|
||||
import java.io.InputStream
|
||||
import java.io.UnsupportedEncodingException
|
||||
import java.net.URLDecoder
|
||||
import java.util.HashMap
|
||||
import java.util.jar.JarFile
|
||||
import kotlin.RuntimeException
|
||||
|
||||
object JarUtils {
|
||||
|
||||
fun getJarFile(mainClass: Class<*>): JarFile {
|
||||
val mainClassPath = "/${mainClass.name.replace('.', '/')}.class"
|
||||
val resUrl = mainClass.getResource(mainClassPath)
|
||||
if (resUrl?.protocol != "jar") {
|
||||
throw RuntimeException("Should run as jar and not as " + resUrl?.protocol)
|
||||
}
|
||||
val path = resUrl.path
|
||||
if (!path.startsWith("file:")) {
|
||||
throw RuntimeException("Unknown jar path: $path")
|
||||
}
|
||||
val jarPath = path.substring("file:".length, path.indexOf('!'))
|
||||
try {
|
||||
return JarFile(URLDecoder.decode(jarPath, "UTF-8"))
|
||||
} catch (e: UnsupportedEncodingException) {
|
||||
throw RuntimeException(e)
|
||||
} catch (e: IOException) {
|
||||
throw RuntimeException(e)
|
||||
}
|
||||
}
|
||||
|
||||
fun openResource(name: String): InputStream {
|
||||
return javaClass.getResourceAsStream("/$name")
|
||||
}
|
||||
|
||||
fun getLatestEmojiTestResource(jar: JarFile) : String {
|
||||
var latestUnicodeVersion = 0.0
|
||||
var name = ""
|
||||
jar.entries().iterator().forEach {
|
||||
if (it.name.endsWith("emoji-test.txt")) {
|
||||
val ver = it.name
|
||||
.removeSuffix("/emoji-test.txt")
|
||||
.substringAfterLast("/")
|
||||
.toDouble()
|
||||
if (ver > latestUnicodeVersion) {
|
||||
latestUnicodeVersion = ver
|
||||
name = it.name
|
||||
}
|
||||
}
|
||||
}
|
||||
if (name.isEmpty())
|
||||
throw RuntimeException("No emoji specs provided in resources")
|
||||
return name
|
||||
}
|
||||
|
||||
fun getAndroidResTemplateResource(jar: JarFile) : String {
|
||||
jar.entries().iterator().forEach {
|
||||
if (it.name.endsWith("emoji-categories.tmpl")) {
|
||||
return it.name
|
||||
}
|
||||
}
|
||||
throw RuntimeException("No template provided in resources")
|
||||
}
|
||||
|
||||
fun close(stream: Closeable?) {
|
||||
try {
|
||||
stream?.close()
|
||||
} catch (e: IOException) {
|
||||
}
|
||||
}
|
||||
|
||||
fun getEmojiSupportResource(jar: JarFile): String {
|
||||
jar.entries().iterator().forEach {
|
||||
if (it.name.endsWith("android-emoji-support.txt")) {
|
||||
return it.name
|
||||
}
|
||||
}
|
||||
throw RuntimeException("No emoji support file provided in resources")
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
package com.majeur.inputmethod.tools.emoji
|
||||
|
||||
import java.util.*
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
class MakeEmojiKeys {
|
||||
|
||||
class Options(argsArray: Array<String>) {
|
||||
|
||||
private val OPTION_RES = "-res"
|
||||
|
||||
var resPath: String? = null
|
||||
|
||||
init {
|
||||
val args = listOf(*argsArray).toMutableList()
|
||||
var arg: String? = null
|
||||
try {
|
||||
while (args.isNotEmpty()) {
|
||||
arg = args.removeFirst()
|
||||
if (arg == OPTION_RES) {
|
||||
resPath = args.removeFirst()
|
||||
} else {
|
||||
usage("Unknown option: $arg")
|
||||
}
|
||||
}
|
||||
} catch (e: NoSuchElementException) {
|
||||
usage("Option $arg needs argument")
|
||||
}
|
||||
}
|
||||
|
||||
fun usage(message: String?) {
|
||||
message?.let { System.err.println(it) }
|
||||
System.err.println("usage: make-emoji-keys $OPTION_RES <res_output_dir>")
|
||||
exitProcess(1)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
@JvmStatic fun main(args: Array<String>) {
|
||||
val options = Options(args)
|
||||
val jar = JarUtils.getJarFile(Companion::class.java)
|
||||
|
||||
val parser = EmojiUCDTestFileParser()
|
||||
parser.parse(JarUtils.getLatestEmojiTestResource(jar))
|
||||
val emojis = parser.getParsedData()
|
||||
|
||||
val parser2 = AndroidEmojiSupportFileParser()
|
||||
parser2.parse(JarUtils.getEmojiSupportResource(jar))
|
||||
val supportData = parser2.getParsedData()
|
||||
|
||||
EmojiCategoriesResource(jar).writeToAndroidRes(options.resPath, emojis, supportData)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
package com.majeur.inputmethod.tools.emoji
|
||||
|
||||
import java.io.InputStreamReader
|
||||
import java.io.LineNumberReader
|
||||
import java.lang.IllegalStateException
|
||||
|
||||
abstract class TextFileParser<T> {
|
||||
|
||||
private var parsed = false
|
||||
|
||||
fun parse(resource: String) {
|
||||
if (parsed) throw IllegalStateException("parse() has already been called")
|
||||
LineNumberReader(InputStreamReader(JarUtils.openResource(resource))).use { reader ->
|
||||
reader.lines().forEach { content ->
|
||||
parseLine(content)
|
||||
}
|
||||
}
|
||||
parsed = true
|
||||
}
|
||||
|
||||
fun getParsedData(): T {
|
||||
if (!parsed) throw IllegalStateException("parse() must be called before calling getParsedData()")
|
||||
return getParseResult()
|
||||
}
|
||||
|
||||
protected fun ifStartsWith(content: String, vararg pairs: Pair<String, (String) -> Unit>) : Boolean {
|
||||
pairs.forEach { pair ->
|
||||
if (ifStartsWith(content, pair.first, pair.second)) return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
protected fun ifStartsWith(content: String, prefix: String, call: (String) -> Unit) : Boolean {
|
||||
if (content.startsWith(prefix)) {
|
||||
call.invoke(content.removePrefix(prefix).trim())
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
protected abstract fun getParseResult(): T
|
||||
|
||||
protected abstract fun parseLine(content: String)
|
||||
|
||||
}
|
|
@ -0,0 +1,170 @@
|
|||
package com.majeur.inputmethod.tools.emoji.model
|
||||
|
||||
class EmojiData {
|
||||
|
||||
var unicodeVersion = ""
|
||||
var dataDate = ""
|
||||
|
||||
private var emojiGroups = mutableMapOf<EmojiGroup, MutableList<EmojiSpec>>()
|
||||
|
||||
operator fun get(group: EmojiGroup) = emojiGroups.getValue(group)
|
||||
|
||||
fun emojiCount(group: EmojiGroup): Int {
|
||||
var acc = 0
|
||||
emojiGroups.values.forEach { acc += it.size }
|
||||
return acc
|
||||
}
|
||||
|
||||
fun emojiGroupCount(group: EmojiGroup) = emojiGroups[group]?.size ?: 0
|
||||
|
||||
fun insertEmoji(group: EmojiGroup, codes: IntArray, unicodeVer: Float, name: String): EmojiSpec {
|
||||
return EmojiSpec(codes, unicodeVer, name).also { emoji ->
|
||||
val baseEmoji = findBaseEmoji(group, emoji)
|
||||
if (baseEmoji != null && onEmojiVariantInserted(group, baseEmoji, emoji)) {
|
||||
baseEmoji.variants.add(emoji)
|
||||
} else if (onEmojiInserted(group, emoji)) {
|
||||
emojiGroups.getOrPut(group) { mutableListOf() }.add(emoji)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun onEmojiInserted(group: EmojiGroup, emoji: EmojiSpec): Boolean {
|
||||
// Unicode RGI does not include letter symbols but Android supports them, so we inject them manually.
|
||||
if (emoji.codes contentEquals RAW_CPS_KEYCAP_HASH) {
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_A), 2.0f, "regional indicator symbol letter a")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_B), 2.0f, "regional indicator symbol letter b")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_C), 2.0f, "regional indicator symbol letter c")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_D), 2.0f, "regional indicator symbol letter d")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_E), 2.0f, "regional indicator symbol letter e")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_F), 2.0f, "regional indicator symbol letter f")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_G), 2.0f, "regional indicator symbol letter g")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_H), 2.0f, "regional indicator symbol letter h")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_I), 2.0f, "regional indicator symbol letter i")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_J), 2.0f, "regional indicator symbol letter j")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_K), 2.0f, "regional indicator symbol letter k")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_L), 2.0f, "regional indicator symbol letter l")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_M), 2.0f, "regional indicator symbol letter m")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_N), 2.0f, "regional indicator symbol letter n")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_O), 2.0f, "regional indicator symbol letter o")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_P), 2.0f, "regional indicator symbol letter p")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_Q), 2.0f, "regional indicator symbol letter q")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_R), 2.0f, "regional indicator symbol letter r")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_S), 2.0f, "regional indicator symbol letter s")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_T), 2.0f, "regional indicator symbol letter t")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_U), 2.0f, "regional indicator symbol letter u")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_V), 2.0f, "regional indicator symbol letter v")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_W), 2.0f, "regional indicator symbol letter w")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_X), 2.0f, "regional indicator symbol letter x")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_Y), 2.0f, "regional indicator symbol letter y")
|
||||
insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_Z), 2.0f, "regional indicator symbol letter z")
|
||||
}
|
||||
|
||||
if (hasMultipleSkinModifiers(emoji.codes)) {
|
||||
// For now Openboard implementation is not robust enough to handle such complicated sequences.
|
||||
// Emoji palettes get polluted with too much emoji variations, so we'll ignore them.
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
private fun hasMultipleSkinModifiers(codes: IntArray): Boolean {
|
||||
var count = 0
|
||||
codes.forEach {
|
||||
when (it) {
|
||||
CP_LIGHT_SKIN_TONE, CP_MEDIUM_LIGHT_SKIN_TONE, CP_MEDIUM_SKIN_TONE,
|
||||
CP_MEDIUM_DARK_SKIN_TONE, CP_DARK_SKIN_TONE ->
|
||||
count += 1
|
||||
}
|
||||
}
|
||||
return count > 1
|
||||
}
|
||||
|
||||
private fun onEmojiVariantInserted(group: EmojiGroup, baseSpec: EmojiSpec, emojiSpec: EmojiSpec): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
private fun findBaseEmoji(group: EmojiGroup, emoji: EmojiSpec): EmojiSpec? {
|
||||
val (baseCodePoints, componentCode) = withoutComponentCodes(emoji.codes)
|
||||
|
||||
// No component codes found, this emoji is a standalone one
|
||||
if (componentCode == CP_NUL) return null
|
||||
|
||||
// Second try for emojis with U+FE0F suffix
|
||||
val baseCodePoints2 = baseCodePoints + CP_VARIANT_SELECTOR
|
||||
|
||||
// Third try for emojis with U+FE0F prefix before an eventual ZWJ
|
||||
val baseCodePoints3 = emoji.codes.toMutableList()
|
||||
.apply { set(emoji.codes.indexOf(componentCode), CP_VARIANT_SELECTOR) }.toIntArray()
|
||||
|
||||
val base = emojiGroups[group]?.firstOrNull { it.codes contentEquals baseCodePoints }
|
||||
?: emojiGroups[group]?.firstOrNull { it.codes contentEquals baseCodePoints2 }
|
||||
?: emojiGroups[group]?.firstOrNull { it.codes contentEquals baseCodePoints3 }
|
||||
|
||||
// We keep track the component modifier of this emoji
|
||||
if (base != null) emoji.component = componentCode
|
||||
|
||||
return base
|
||||
}
|
||||
|
||||
private fun withoutComponentCodes(codes: IntArray) : Pair<IntArray, Int> {
|
||||
codes.forEach { code ->
|
||||
when (code) {
|
||||
CP_LIGHT_SKIN_TONE, CP_MEDIUM_LIGHT_SKIN_TONE, CP_MEDIUM_SKIN_TONE,
|
||||
CP_MEDIUM_DARK_SKIN_TONE, CP_DARK_SKIN_TONE ->
|
||||
return codes.asList().minus(code).toIntArray() to code
|
||||
}
|
||||
}
|
||||
return codes to CP_NUL
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
private val RAW_CPS_KEYCAP_HASH = intArrayOf(0x0023, 0xFE0F, 0x20E3)
|
||||
|
||||
const val CP_NUL = 0x0000
|
||||
|
||||
private const val CP_ZWJ = 0x200D
|
||||
private const val CP_FEMALE_SIGN = 0x2640
|
||||
private const val CP_MALE_SIGN = 0x2642
|
||||
private const val CP_LIGHT_SKIN_TONE = 0x1F3FB
|
||||
private const val CP_MEDIUM_LIGHT_SKIN_TONE = 0x1F3FC
|
||||
private const val CP_MEDIUM_SKIN_TONE = 0x1F3FD
|
||||
private const val CP_MEDIUM_DARK_SKIN_TONE = 0x1F3FE
|
||||
private const val CP_DARK_SKIN_TONE = 0x1F3FF
|
||||
private const val CP_RED_HAIR = 0x1F9B0
|
||||
private const val CP_CURLY_HAIR = 0x1F9B1
|
||||
private const val CP_WHITE_HAIR = 0x1F9B3
|
||||
private const val CP_BARLD = 0x1F9B2
|
||||
private const val CP_VARIANT_SELECTOR = 0xFE0F
|
||||
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_A = 0x1F1E6
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_B = 0x1F1E7
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_C = 0x1F1E8
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_D = 0x1F1E9
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_E = 0x1F1EA
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_F = 0x1F1EB
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_G = 0x1F1EC
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_H = 0x1F1ED
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_I = 0x1F1EE
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_J = 0x1F1EF
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_K = 0x1F1F0
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_L = 0x1F1F1
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_M = 0x1F1F2
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_N = 0x1F1F3
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_O = 0x1F1F4
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_P = 0x1F1F5
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_Q = 0x1F1F6
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_R = 0x1F1F7
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_S = 0x1F1F8
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_T = 0x1F1F9
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_U = 0x1F1FA
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_V = 0x1F1FB
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_W = 0x1F1FC
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_X = 0x1F1FD
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_Y = 0x1F1FE
|
||||
private const val CP_REGIONAL_INDICATOR_SYMBOL_LETTER_Z = 0x1F1FF
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package com.majeur.inputmethod.tools.emoji.model
|
||||
|
||||
enum class EmojiGroup(val rawName: String) {
|
||||
SMILEYS_AND_EMOTION("Smileys & Emotion"),
|
||||
PEOPLE_AND_BODY("People & Body"),
|
||||
COMPONENT("Component"),
|
||||
ANIMALS_AND_NATURE("Animals & Nature"),
|
||||
FOOD_AND_DRINK("Food & Drink"),
|
||||
TRAVEL_AND_PLACES("Travel & Places"),
|
||||
ACTIVITIES("Activities"),
|
||||
OBJECTS("Objects"),
|
||||
SYMBOLS("Symbols"),
|
||||
FLAGS("Flags");
|
||||
|
||||
companion object {
|
||||
fun get(rawName: String) = values().first { it.rawName == rawName }
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
package com.majeur.inputmethod.tools.emoji.model
|
||||
|
||||
import com.majeur.inputmethod.tools.emoji.model.EmojiData.Companion.CP_NUL
|
||||
|
||||
data class EmojiSpec(val codes: IntArray, val unicodeVer: Float, val name: String) {
|
||||
|
||||
var component = CP_NUL
|
||||
|
||||
val variants by lazy { mutableListOf<EmojiSpec>() }
|
||||
|
||||
override fun toString() = name
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (this === other) return true
|
||||
if (javaClass != other?.javaClass) return false
|
||||
other as EmojiSpec
|
||||
return codes contentEquals other.codes
|
||||
}
|
||||
|
||||
override fun hashCode() = codes.contentHashCode()
|
||||
}
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,127 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
|
||||
!!!!! DO NOT EDIT THIS FILE !!!!!
|
||||
|
||||
This file is generated by tools/make-emoji-keys. The base template file is
|
||||
tools/make-emoji-keys/src/main/resources/values/emoji-categories.tmpl
|
||||
|
||||
This file must be updated when any a new release of unicode comes out. Base data
|
||||
can be found at https://unicode.org/Public/emoji/. Table must be defined in
|
||||
tools/make-emoji-keys/src/main/resources/emoji/UNICODE_VERSION/emoji-test.txt.
|
||||
|
||||
To update this file, please run the following commands.
|
||||
$ gradle :tools:make-emoji-keys:makeEmoji
|
||||
|
||||
The updated source file will be generated to the following path (this file).
|
||||
app/src/main/res/values/emoji-categories.xml
|
||||
|
||||
Unicode version @UNICODE_VERSION@.
|
||||
Platform compatibility up to API level @ANDROID_API_LEVEL@.
|
||||
|
||||
-->
|
||||
|
||||
<resources>
|
||||
|
||||
<array
|
||||
name="emoji_smileys_emotion"
|
||||
format="string">
|
||||
<!-- @SMILEYS_AND_EMOTION@ -->
|
||||
</array>
|
||||
|
||||
<array
|
||||
name="emoji_people_body"
|
||||
format="string">
|
||||
<!-- @PEOPLE_AND_BODY@ -->
|
||||
</array>
|
||||
|
||||
<array
|
||||
name="emoji_people_body_more"
|
||||
format="string">
|
||||
<!-- @PEOPLE_AND_BODY MORE@ -->
|
||||
</array>
|
||||
|
||||
<array
|
||||
name="emoji_animals_nature"
|
||||
format="string">
|
||||
<!-- @ANIMALS_AND_NATURE@ -->
|
||||
</array>
|
||||
|
||||
<array
|
||||
name="emoji_food_drink"
|
||||
format="string">
|
||||
<!-- @FOOD_AND_DRINKS@ -->
|
||||
</array>
|
||||
|
||||
<array
|
||||
name="emoji_travel_places"
|
||||
format="string">
|
||||
<!-- @TRAVEL_AND_PLACES@ -->
|
||||
</array>
|
||||
|
||||
<array
|
||||
name="emoji_activities"
|
||||
format="string">
|
||||
<!-- @ACTIVITIES@ -->
|
||||
</array>
|
||||
|
||||
<array
|
||||
name="emoji_objects"
|
||||
format="string">
|
||||
<!-- @OBJECTS@ -->
|
||||
</array>
|
||||
|
||||
<array
|
||||
name="emoji_symbols"
|
||||
format="string">
|
||||
<!-- @SYMBOLS@ -->
|
||||
</array>
|
||||
|
||||
<array
|
||||
name="emoji_flags"
|
||||
format="string">
|
||||
<!-- @FLAGS@ -->
|
||||
</array>
|
||||
|
||||
<!-- Dummy codeArrays for recents emoji keyboard.
|
||||
Do not remove these keys, because they are used as a template. -->
|
||||
<array
|
||||
name="emoji_recents"
|
||||
format="string">
|
||||
<!-- These code point should be aligned with {@link RecentsKeyboard#TEMPLATE_KEY_CODE_*. -->
|
||||
<item>30</item>
|
||||
<item>31</item>
|
||||
</array>
|
||||
|
||||
<array
|
||||
name="emoji_emoticons"
|
||||
format="string">
|
||||
<item>:-)</item>
|
||||
<item>;-)</item>
|
||||
<item>:-(</item>
|
||||
<item>:-!</item>
|
||||
<item>:-$</item>
|
||||
<item>B-)</item>
|
||||
<item>=-O</item>
|
||||
<item>:-P</item>
|
||||
<item>:O</item>
|
||||
<item>:-*</item>
|
||||
<item>:-D</item>
|
||||
<item>:\'(</item>
|
||||
<item>:-\\</item>
|
||||
<item>O:-)</item>
|
||||
<item>:-[</item>
|
||||
<item>(╯°</item>
|
||||
<item>□°)</item>
|
||||
<item>╯︵</item>
|
||||
<item>┻━┻</item>
|
||||
<item>¯\\_</item>
|
||||
<item>(ツ)</item>
|
||||
<item>_/¯</item>
|
||||
<item>┬─┬</item>
|
||||
<item>︵ /(</item>
|
||||
<item>.□.\\</item>
|
||||
</array>
|
||||
|
||||
</resources>
|
||||
|
Loading…
Add table
Reference in a new issue