diff options
author | fujiwarat <takao.fujiwara1@gmail.com> | 2016-07-07 12:47:34 +0900 |
---|---|---|
committer | fujiwarat <takao.fujiwara1@gmail.com> | 2016-07-07 12:47:34 +0900 |
commit | 0ee1896a2b3e75494f8f9fd9d04c27436f0877b8 (patch) | |
tree | ef9cbcea25978518270e6eaaa4e856f44ee90eaa | |
parent | 0ed644cd2b6c1d15bdba0d1c6d45d162b9b34806 (diff) | |
download | ibus-0ee1896a2b3e75494f8f9fd9d04c27436f0877b8.tar.gz |
engine: Use annotations/en.xml from unocode.org but not emoji-list.html
Downloading emoji-list would cause a different build by build site.
Now save annotations/en.xml from unicode.org and get emoji.json from
Emoji One.
en.xml is used for Unicode annotations and emoji.json is used for
aliases_ascii, e.g. ":)", and category, e.g. "people".
BUG=https://github.com/ibus/ibus/issues/1865
R=Shawn.P.Huang@gmail.com
Review URL: https://codereview.appspot.com/299530044
-rw-r--r-- | COPYING.unicode | 52 | ||||
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | configure.ac | 14 | ||||
-rw-r--r-- | data/Makefile.am | 5 | ||||
-rw-r--r-- | data/annotations/Makefile.am | 27 | ||||
-rw-r--r-- | data/annotations/en.xml | 1042 | ||||
-rw-r--r-- | ibus.spec.in | 14 | ||||
-rw-r--r-- | src/Makefile.am | 31 | ||||
-rw-r--r-- | src/emoji-parser.c | 605 |
9 files changed, 1634 insertions, 157 deletions
diff --git a/COPYING.unicode b/COPYING.unicode new file mode 100644 index 00000000..28d30606 --- /dev/null +++ b/COPYING.unicode @@ -0,0 +1,52 @@ +(Apply to data/annotations/en.xml) + +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + + Unicode Data Files include all data files under the directories +http://www.unicode.org/Public/, http://www.unicode.org/reports/, and +http://www.unicode.org/cldr/data/. Unicode Data Files do not include PDF +online code charts under the directory http://www.unicode.org/Public/. +Software includes any source code published in the Unicode Standard or under +the directories http://www.unicode.org/Public/, +http://www.unicode.org/reports/, and http://www.unicode.org/cldr/data/. + + NOTICE TO USER: Carefully read the following legal agreement. BY +DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES +("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND +AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF +YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA +FILES OR SOFTWARE. + + COPYRIGHT AND PERMISSION NOTICE + + Copyright ยฉ 1991-2016 Unicode, Inc. All rights reserved. Distributed under +the Terms of Use in http://www.unicode.org/copyright.html. + + Permission is hereby granted, free of charge, to any person obtaining a +copy of the Unicode data files and any associated documentation (the "Data +Files") or Unicode software and any associated documentation (the "Software") +to deal in the Data Files or Software without restriction, including without +limitation the rights to use, copy, modify, merge, publish, distribute, and/or +sell copies of the Data Files or Software, and to permit persons to whom the +Data Files or Software are furnished to do so, provided that (a) the above +copyright notice(s) and this permission notice appear with all copies of the +Data Files or Software, (b) both the above copyright notice(s) and this +permission notice appear in associated documentation, and (c) there is clear +notice in each modified Data File or in the Software as well as in the +documentation associated with the Data File(s) or Software that the data or +software has been modified. + + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD +PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN +THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS +ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE +DATA FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in these Data Files or Software without prior written authorization +of the copyright holder. diff --git a/Makefile.am b/Makefile.am index 3c4702c1..425d1ec2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -69,6 +69,7 @@ pkgconfig_DATA = ibus-@IBUS_API_VERSION@.pc ibus_pc_in = ibus-@IBUS_API_VERSION@.pc.in EXTRA_DIST = \ + COPYING.unicode \ autogen.sh \ $(ibus_pc_in) \ ibus.spec.in \ diff --git a/configure.ac b/configure.ac index 3128ef98..f7898197 100644 --- a/configure.ac +++ b/configure.ac @@ -608,12 +608,20 @@ AC_ARG_ENABLE(emoji-dict, ) AM_CONDITIONAL([ENABLE_EMOJI_DICT], [test x"$enable_emoji_dict" = x"yes"]) if test x"$enable_emoji_dict" = x"yes"; then - PKG_CHECK_MODULES(LIBXML2, [ - libxml-2.0 + PKG_CHECK_MODULES(JSON_GLIB1, [ + json-glib-1.0 ]) enable_emoji_dict="yes (enabled, use --disable-emoji-dict to disable)" fi +AC_ARG_WITH(emoji-json-file, + AS_HELP_STRING([--with-emoji-json-file[=DIR/emoji.json]], + [Set emoji.json. (default: "/usr/lib/node_modules/emojione/emoji.json")]), + EMOJI_JSON_FILE=$with_emoji_json_file, + EMOJI_JSON_FILE="/usr/lib/node_modules/emojione/emoji.json" +) +AC_SUBST(EMOJI_JSON_FILE) + # Check iso-codes. PKG_CHECK_MODULES(ISOCODES, [ iso-codes @@ -639,6 +647,7 @@ engine/Makefile util/Makefile util/IMdkit/Makefile data/Makefile +data/annotations/Makefile.am data/icons/Makefile data/keymaps/Makefile data/dconf/Makefile @@ -698,6 +707,7 @@ Build options: Enable surrounding-text $enable_surrounding_text Enable libnotify $enable_libnotify Enable Emoji dict $enable_emoji_dict + emoji.json path $EMOJI_JSON_FILE Run test cases $enable_tests ]) diff --git a/data/Makefile.am b/data/Makefile.am index e41c9a26..d9d613fe 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -2,8 +2,8 @@ # # ibus - The Input Bus # -# Copyright (c) 2007-2010 Peng Huang <shawn.p.huang@gmail.com> -# Copyright (c) 2007-2010 Red Hat, Inc. +# Copyright (c) 2007-2016 Peng Huang <shawn.p.huang@gmail.com> +# Copyright (c) 2007-2016 Red Hat, Inc. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -21,6 +21,7 @@ # USA SUBDIRS = \ + annotations \ icons \ keymaps \ $(NULL) diff --git a/data/annotations/Makefile.am b/data/annotations/Makefile.am new file mode 100644 index 00000000..d87b933c --- /dev/null +++ b/data/annotations/Makefile.am @@ -0,0 +1,27 @@ +# vim:set noet ts=4: +# +# ibus - The Input Bus +# +# Copyright (c) 2016 Takao Fujiwara <takao.fujiwara1@gmail.com> +# Copyright (c) 2016 Red Hat, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 +# USA + +EXTRA_DIST = \ + en.xml \ + $(NULL) + +-include $(top_srcdir)/git.mk diff --git a/data/annotations/en.xml b/data/annotations/en.xml new file mode 100644 index 00000000..ff7aa890 --- /dev/null +++ b/data/annotations/en.xml @@ -0,0 +1,1042 @@ +<?xml version='1.0' encoding='UTF-8' ?> +<!DOCTYPE ldml SYSTEM '../../common/dtd/ldml.dtd'> +<!-- ยฉ 1991-2015 Unicode, Inc. + Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. + For terms of use, see http://www.unicode.org/copyright.html + CLDR data files are interpreted according to the LDML specification (http://unicode.org/reports/tr35/) + + DO NOT CHANGE MANUALLY! Generated by: GenerateOtherAnnotations + --> +<ldml> + <identity> + <version number="$Revision: 12320 $"/> + <language type='en'/> + </identity> + <annotations> + <annotation cp='[๐]' tts='grinning face'>face; grin</annotation> + <annotation cp='[๐]' tts='grinning face with smiling eyes'>eye; face; grin; smile</annotation> + <annotation cp='[๐]' tts='face with tears of joy'>face; joy; laugh; tear</annotation> + <annotation cp='[๐]' tts='smiling face with open mouth'>face; mouth; open; smile</annotation> + <annotation cp='[๐]' tts='smiling face with open mouth and smiling eyes'>eye; face; mouth; open; smile</annotation> + <annotation cp='[๐
]' tts='smiling face with open mouth and cold sweat'>cold; face; open; smile; sweat</annotation> + <annotation cp='[๐]' tts='smiling face with open mouth and tightly-closed eyes'>face; laugh; mouth; open; satisfied; smile</annotation> + <annotation cp='[๐]' tts='winking face'>face; wink</annotation> + <annotation cp='[๐]' tts='smiling face with smiling eyes'>blush; eye; face; smile</annotation> + <annotation cp='[๐]' tts='face savouring delicious food'>delicious; face; savouring; smile; um; yum</annotation> + <annotation cp='[๐]' tts='smiling face with sunglasses'>bright; cool; eye; eyewear; face; glasses; smile; sun; sunglasses; weather</annotation> + <annotation cp='[๐]' tts='smiling face with heart-shaped eyes'>eye; face; heart; love; smile</annotation> + <annotation cp='[๐]' tts='face throwing a kiss'>face; heart; kiss</annotation> + <annotation cp='[๐]' tts='kissing face'>face; kiss</annotation> + <annotation cp='[๐]' tts='kissing face with smiling eyes'>eye; face; kiss; smile</annotation> + <annotation cp='[๐]' tts='kissing face with closed eyes'>closed; eye; face; kiss</annotation> + <annotation cp='[โบ]' tts='smiling face'>face; outlined; relaxed; smile</annotation> + <annotation cp='[๐]' tts='slightly smiling face'>face; smile</annotation> + <annotation cp='[๐ค]' tts='hugging face'>face; hug; hugging</annotation> + <annotation cp='[๐]' tts='smiling face with halo'>angel; face; fairy tale; fantasy; halo; innocent; smile</annotation> + <annotation cp='[๐ค]' tts='thinking face'>face; thinking</annotation> + <annotation cp='[๐]' tts='neutral face'>deadpan; face; neutral</annotation> + <annotation cp='[๐]' tts='expressionless face'>expressionless; face; inexpressive; unexpressive</annotation> + <annotation cp='[๐ถ]' tts='face without mouth'>face; mouth; quiet; silent</annotation> + <annotation cp='[๐]' tts='face with rolling eyes'>eyes; face; rolling</annotation> + <annotation cp='[๐]' tts='smirking face'>face; smirk</annotation> + <annotation cp='[๐ฃ]' tts='persevering face'>face; persevere</annotation> + <annotation cp='[๐ฅ]' tts='disappointed but relieved face'>disappointed; face; relieved; whew</annotation> + <annotation cp='[๐ฎ]' tts='face with open mouth'>face; mouth; open; sympathy</annotation> + <annotation cp='[๐ค]' tts='zipper-mouth face'>face; mouth; zipper</annotation> + <annotation cp='[๐ฏ]' tts='hushed face'>face; hushed; stunned; surprised</annotation> + <annotation cp='[๐ช]' tts='sleepy face'>face; sleep</annotation> + <annotation cp='[๐ซ]' tts='tired face'>face; tired</annotation> + <annotation cp='[๐ด]' tts='sleeping face'>face; sleep; zzz</annotation> + <annotation cp='[๐]' tts='relieved face'>face; relieved</annotation> + <annotation cp='[๐ค]' tts='nerd face'>face; geek; nerd</annotation> + <annotation cp='[๐]' tts='face with stuck-out tongue'>face; tongue</annotation> + <annotation cp='[๐]' tts='face with stuck-out tongue and winking eye'>eye; face; joke; tongue; wink</annotation> + <annotation cp='[๐]' tts='face with stuck-out tongue and tightly-closed eyes'>eye; face; horrible; taste; tongue</annotation> + <annotation cp='[โน]' tts='frowning face'>face; frown</annotation> + <annotation cp='[๐]' tts='slightly frowning face'>face; frown</annotation> + <annotation cp='[๐]' tts='unamused face'>face; unamused; unhappy</annotation> + <annotation cp='[๐]' tts='face with cold sweat'>cold; face; sweat</annotation> + <annotation cp='[๐]' tts='pensive face'>dejected; face; pensive</annotation> + <annotation cp='[๐]' tts='confused face'>confused; face</annotation> + <annotation cp='[๐]' tts='confounded face'>confounded; face</annotation> + <annotation cp='[๐]' tts='upside-down face'>face; upside-down</annotation> + <annotation cp='[๐ท]' tts='face with medical mask'>cold; doctor; face; mask; medicine; sick</annotation> + <annotation cp='[๐ค]' tts='face with thermometer'>face; ill; sick; thermometer</annotation> + <annotation cp='[๐ค]' tts='face with head-bandage'>bandage; face; hurt; injury</annotation> + <annotation cp='[๐ค]' tts='money-mouth face'>face; money; mouth</annotation> + <annotation cp='[๐ฒ]' tts='astonished face'>astonished; face; shocked; totally</annotation> + <annotation cp='[๐]' tts='disappointed face'>disappointed; face</annotation> + <annotation cp='[๐]' tts='worried face'>face; worried</annotation> + <annotation cp='[๐ค]' tts='face with steam from nose'>face; triumph; won</annotation> + <annotation cp='[๐ข]' tts='crying face'>cry; face; sad; tear</annotation> + <annotation cp='[๐ญ]' tts='loudly crying face'>cry; face; sad; sob; tear</annotation> + <annotation cp='[๐ฆ]' tts='frowning face with open mouth'>face; frown; mouth; open</annotation> + <annotation cp='[๐ง]' tts='anguished face'>anguished; face</annotation> + <annotation cp='[๐จ]' tts='fearful face'>face; fear; fearful; scared</annotation> + <annotation cp='[๐ฉ]' tts='weary face'>face; tired; weary</annotation> + <annotation cp='[๐ฌ]' tts='grimacing face'>face; grimace</annotation> + <annotation cp='[๐ฐ]' tts='face with open mouth and cold sweat'>blue; cold; face; mouth; open; rushed; sweat</annotation> + <annotation cp='[๐ฑ]' tts='face screaming in fear'>face; fear; fearful; munch; scared; scream</annotation> + <annotation cp='[๐ณ]' tts='flushed face'>dazed; face; flushed</annotation> + <annotation cp='[๐ต]' tts='dizzy face'>dizzy; face</annotation> + <annotation cp='[๐ก]' tts='pouting face'>angry; face; mad; pouting; rage; red</annotation> + <annotation cp='[๐ ]' tts='angry face'>angry; face; mad</annotation> + <annotation cp='[๐]' tts='smiling face with horns'>face; fairy tale; fantasy; horns; smile</annotation> + <annotation cp='[๐ฟ]' tts='imp'>demon; devil; face; fairy tale; fantasy</annotation> + <annotation cp='[๐น]' tts='ogre'>creature; face; fairy tale; fantasy; japanese; monster</annotation> + <annotation cp='[๐บ]' tts='goblin'>creature; face; fairy tale; fantasy; japanese; monster</annotation> + <annotation cp='[๐]' tts='skull'>body; death; face; fairy tale; monster</annotation> + <annotation cp='[โ ]' tts='skull and crossbones'>body; crossbones; death; face; monster; skull</annotation> + <annotation cp='[๐ป]' tts='ghost'>creature; face; fairy tale; fantasy; monster</annotation> + <annotation cp='[๐ฝ]' tts='alien'>creature; extraterrestrial; face; fairy tale; fantasy; monster; space; ufo</annotation> + <annotation cp='[๐พ]' tts='alien monster'>alien; creature; extraterrestrial; face; fairy tale; fantasy; monster; space; ufo</annotation> + <annotation cp='[๐ค]' tts='robot face'>face; monster; robot</annotation> + <annotation cp='[๐ฉ]' tts='pile of poo'>comic; dung; face; monster; poo; poop</annotation> + <annotation cp='[๐บ]' tts='smiling cat face with open mouth'>cat; face; mouth; open; smile</annotation> + <annotation cp='[๐ธ]' tts='grinning cat face with smiling eyes'>cat; eye; face; grin; smile</annotation> + <annotation cp='[๐น]' tts='cat face with tears of joy'>cat; face; joy; tear</annotation> + <annotation cp='[๐ป]' tts='smiling cat face with heart-shaped eyes'>cat; eye; face; heart; love; smile</annotation> + <annotation cp='[๐ผ]' tts='cat face with wry smile'>cat; face; ironic; smile; wry</annotation> + <annotation cp='[๐ฝ]' tts='kissing cat face with closed eyes'>cat; eye; face; kiss</annotation> + <annotation cp='[๐]' tts='weary cat face'>cat; face; oh; surprised; weary</annotation> + <annotation cp='[๐ฟ]' tts='crying cat face'>cat; cry; face; sad; tear</annotation> + <annotation cp='[๐พ]' tts='pouting cat face'>cat; face; pouting</annotation> + <annotation cp='[๐]' tts='see-no-evil'>evil; face; forbidden; gesture; monkey; no; not; prohibited; see</annotation> + <annotation cp='[๐]' tts='hear-no-evil'>evil; face; forbidden; gesture; hear; monkey; no; not; prohibited</annotation> + <annotation cp='[๐]' tts='speak-no-evil'>evil; face; forbidden; gesture; monkey; no; not; prohibited; speak</annotation> + <annotation cp='[๐ฆ]' tts='boy'>boy</annotation> + <annotation cp='[๐ง]' tts='girl'>maiden; virgin; virgo; zodiac</annotation> + <annotation cp='[๐จ]' tts='man'>man</annotation> + <annotation cp='[๐ฉ]' tts='woman'>woman</annotation> + <annotation cp='[๐ด]' tts='old man'>man; old</annotation> + <annotation cp='[๐ต]' tts='old woman'>old; woman</annotation> + <annotation cp='[๐ถ]' tts='baby'>baby</annotation> + <annotation cp='[๐ฑ]' tts='person with blond hair'>blond</annotation> + <annotation cp='[๐ฎ]' tts='police officer'>cop; officer; police</annotation> + <annotation cp='[๐ฒ]' tts='man with chinese cap'>gua pi mao; hat; man</annotation> + <annotation cp='[๐ณ]' tts='man with turban'>man; turban</annotation> + <annotation cp='[๐ท]' tts='construction worker'>construction; hat; worker</annotation> + <annotation cp='[โ]' tts='helmet with white cross'>aid; cross; face; hat; helmet</annotation> + <annotation cp='[๐ธ]' tts='princess'>fairy tale; fantasy</annotation> + <annotation cp='[๐]' tts='guardsman'>guard</annotation> + <annotation cp='[๐ต]' tts='detective'>sleuth; spy</annotation> + <annotation cp='[๐
]' tts='santa claus'>celebration; christmas; fairy tale; fantasy; father; santa</annotation> + <annotation cp='[๐ผ]' tts='baby angel'>angel; baby; face; fairy tale; fantasy</annotation> + <annotation cp='[๐]' tts='face massage'>massage; salon</annotation> + <annotation cp='[๐]' tts='haircut'>barber; beauty; parlor</annotation> + <annotation cp='[๐ฐ]' tts='bride with veil'>bride; veil; wedding</annotation> + <annotation cp='[๐]' tts='person frowning'>frown; gesture</annotation> + <annotation cp='[๐]' tts='person pouting'>gesture; pouting</annotation> + <annotation cp='[๐
]' tts='gesturing no'>forbidden; gesture; hand; no; not; prohibited</annotation> + <annotation cp='[๐]' tts='gesturing ok'>gesture; hand; ok</annotation> + <annotation cp='[๐]' tts='information desk person'>hand; help; information; sassy</annotation> + <annotation cp='[๐]' tts='happy person raising hand'>gesture; hand; happy; raised</annotation> + <annotation cp='[๐]' tts='person bowing'>apology; bow; gesture; sorry</annotation> + <annotation cp='[๐]' tts='person raising hands'>body; celebration; gesture; hand; hooray; raised</annotation> + <annotation cp='[๐]' tts='folded hands'>ask; body; bow; folded; gesture; hand; please; pray; thanks</annotation> + <annotation cp='[๐ฃ]' tts='speaking head'>face; head; silhouette; speak; speaking</annotation> + <annotation cp='[๐ค]' tts='bust in silhouette'>bust; silhouette</annotation> + <annotation cp='[๐ฅ]' tts='busts in silhouette'>bust; silhouette</annotation> + <annotation cp='[๐ถ]' tts='pedestrian'>hike; walk; walking</annotation> + <annotation cp='[๐]' tts='runner'>marathon; running</annotation> + <annotation cp='[๐ฏ]' tts='women partying'>bunny; dancer; ear; girl; woman</annotation> + <annotation cp='[๐]' tts='dancer'>dancer</annotation> + <annotation cp='[๐ด]' tts='man in business suit levitating'>business; man; suit</annotation> + <annotation cp='[๐]' tts='kiss'>couple; romance</annotation> + <annotation cp='[๐]' tts='couple with heart'>couple; heart; love; romance</annotation> + <annotation cp='[๐ช]' tts='family'>child; father; mother</annotation> + <annotation cp='[๐ซ]' tts='man and woman holding hands'>couple; hand; hold; man; woman</annotation> + <annotation cp='[๐ฌ]' tts='two men holding hands'>couple; gemini; hand; hold; man; twins; zodiac</annotation> + <annotation cp='[๐ญ]' tts='two women holding hands'>couple; hand; hold; woman</annotation> + <annotation cp='[๐ป]' tts='skin type-1-2'>emoji modifier; fitzpatrick; skin; tone</annotation> + <annotation cp='[๐ผ]' tts='skin type-3'>emoji modifier; fitzpatrick; skin; tone</annotation> + <annotation cp='[๐ฝ]' tts='skin type-4'>emoji modifier; fitzpatrick; skin; tone</annotation> + <annotation cp='[๐พ]' tts='skin type-5'>emoji modifier; fitzpatrick; skin; tone</annotation> + <annotation cp='[๐ฟ]' tts='skin type-6'>emoji modifier; fitzpatrick; skin; tone</annotation> + <annotation cp='[๐ช]' tts='flexed biceps'>biceps; body; comic; flex; muscle</annotation> + <annotation cp='[๐]' tts='backhand index pointing left'>backhand; body; finger; hand; index; point</annotation> + <annotation cp='[๐]' tts='backhand index pointing right'>backhand; body; finger; hand; index; point</annotation> + <annotation cp='[โ]' tts='index pointing up'>body; finger; hand; index; point; up</annotation> + <annotation cp='[๐]' tts='backhand index pointing up'>backhand; body; finger; hand; index; point; up</annotation> + <annotation cp='[๐]' tts='middle finger'>body; finger; hand</annotation> + <annotation cp='[๐]' tts='backhand index pointing down'>backhand; body; down; finger; hand; index; point</annotation> + <annotation cp='[โ]' tts='victory hand'>body; hand; v; victory</annotation> + <annotation cp='[๐]' tts='vulcan salute'>body; finger; hand; spock; vulcan</annotation> + <annotation cp='[๐ค]' tts='sign of the horns'>body; finger; hand; horns; rock-on</annotation> + <annotation cp='[๐]' tts='raised hand with fingers splayed'>body; finger; hand; splayed</annotation> + <annotation cp='[โ]' tts='raised hand'>body; hand</annotation> + <annotation cp='[๐]' tts='ok hand'>body; hand; ok</annotation> + <annotation cp='[๐]' tts='thumbs up'>+1; body; hand; thumb; up</annotation> + <annotation cp='[๐]' tts='thumbs down'>-1; body; down; hand; thumb</annotation> + <annotation cp='[โ]' tts='raised fist'>body; clenched; fist; hand; punch</annotation> + <annotation cp='[๐]' tts='oncoming fist'>body; clenched; fist; hand; punch</annotation> + <annotation cp='[๐]' tts='waving hand'>body; hand; wave; waving</annotation> + <annotation cp='[๐]' tts='clapping hands'>body; clap; hand</annotation> + <annotation cp='[๐]' tts='open hands'>body; hand; open</annotation> + <annotation cp='[โ]' tts='writing hand'>body; hand; write</annotation> + <annotation cp='[๐
]' tts='nail polish'>body; care; cosmetics; manicure; nail; polish</annotation> + <annotation cp='[๐]' tts='ear'>body</annotation> + <annotation cp='[๐]' tts='nose'>body</annotation> + <annotation cp='[๐ฃ]' tts='footprints'>body; clothing; footprint; print</annotation> + <annotation cp='[๐]' tts='eyes'>body; eye; face</annotation> + <annotation cp='[๐]' tts='eye'>body</annotation> + <annotation cp='[๐
]' tts='tongue'>body</annotation> + <annotation cp='[๐]' tts='mouth'>body; lips</annotation> + <annotation cp='[๐]' tts='kiss mark'>heart; kiss; lips; mark; romance</annotation> + <annotation cp='[๐]' tts='heart with arrow'>arrow; cupid; heart; romance</annotation> + <annotation cp='[โค]' tts='red heart'>heart</annotation> + <annotation cp='[๐]' tts='beating heart'>beating; heart; heartbeat; pulsating</annotation> + <annotation cp='[๐]' tts='broken heart'>break; broken; heart</annotation> + <annotation cp='[๐]' tts='two hearts'>heart; love</annotation> + <annotation cp='[๐]' tts='sparkling heart'>excited; heart; sparkle</annotation> + <annotation cp='[๐]' tts='growing heart'>excited; growing; heart; heartpulse; nervous</annotation> + <annotation cp='[๐]' tts='blue heart'>blue; heart</annotation> + <annotation cp='[๐]' tts='green heart'>green; heart</annotation> + <annotation cp='[๐]' tts='yellow heart'>heart; yellow</annotation> + <annotation cp='[๐]' tts='purple heart'>heart; purple</annotation> + <annotation cp='[๐]' tts='heart with ribbon'>heart; ribbon; valentine</annotation> + <annotation cp='[๐]' tts='revolving hearts'>heart; revolving</annotation> + <annotation cp='[๐]' tts='heart decoration'>heart</annotation> + <annotation cp='[โฃ]' tts='heavy heart exclamation mark ornament'>exclamation; heart; mark; punctuation</annotation> + <annotation cp='[๐]' tts='love letter'>heart; letter; love; mail; romance</annotation> + <annotation cp='[๐ค]' tts='zzz'>comic; sleep</annotation> + <annotation cp='[๐ข]' tts='anger symbol'>angry; comic; mad</annotation> + <annotation cp='[๐ฃ]' tts='bomb'>comic</annotation> + <annotation cp='[๐ฅ]' tts='collision'>boom; comic</annotation> + <annotation cp='[๐ฆ]' tts='sweat droplets'>comic; splashing; sweat</annotation> + <annotation cp='[๐จ]' tts='dashing'>comic; dash; running</annotation> + <annotation cp='[๐ซ]' tts='dizzy'>comic; star</annotation> + <annotation cp='[๐ฌ]' tts='speech balloon'>balloon; bubble; comic; dialog; speech</annotation> + <annotation cp='[๐จ]' tts='left speech bubble'>dialog; speech</annotation> + <annotation cp='[๐ฏ]' tts='right anger bubble'>angry; balloon; bubble; mad</annotation> + <annotation cp='[๐ญ]' tts='thought balloon'>balloon; bubble; comic; thought</annotation> + <annotation cp='[๐ณ]' tts='hole'>hole</annotation> + <annotation cp='[๐]' tts='glasses'>clothing; eye; eyeglasses; eyewear</annotation> + <annotation cp='[๐ถ]' tts='sunglasses'>dark; eye; eyewear; glasses</annotation> + <annotation cp='[๐]' tts='necktie'>clothing</annotation> + <annotation cp='[๐]' tts='t-shirt'>clothing; shirt; tshirt</annotation> + <annotation cp='[๐]' tts='jeans'>clothing; pants; trousers</annotation> + <annotation cp='[๐]' tts='dress'>clothing</annotation> + <annotation cp='[๐]' tts='kimono'>clothing</annotation> + <annotation cp='[๐]' tts='bikini'>clothing; swim</annotation> + <annotation cp='[๐]' tts='womanโs clothes'>clothing; woman</annotation> + <annotation cp='[๐]' tts='purse'>clothing; coin</annotation> + <annotation cp='[๐]' tts='handbag'>bag; clothing</annotation> + <annotation cp='[๐]' tts='pouch'>bag; clothing</annotation> + <annotation cp='[๐]' tts='shopping bags'>bag; hotel; shopping</annotation> + <annotation cp='[๐]' tts='school backpack'>bag; satchel; school</annotation> + <annotation cp='[๐]' tts='manโs shoe'>clothing; man; shoe</annotation> + <annotation cp='[๐]' tts='running shoe'>athletic; clothing; shoe; sneaker</annotation> + <annotation cp='[๐ ]' tts='high-heeled shoe'>clothing; heel; shoe; woman</annotation> + <annotation cp='[๐ก]' tts='womanโs sandal'>clothing; sandal; shoe; woman</annotation> + <annotation cp='[๐ข]' tts='womanโs boot'>boot; clothing; shoe; woman</annotation> + <annotation cp='[๐]' tts='crown'>clothing; king; queen</annotation> + <annotation cp='[๐]' tts='womanโs hat'>clothing; hat; woman</annotation> + <annotation cp='[๐ฉ]' tts='top hat'>clothing; hat; top; tophat</annotation> + <annotation cp='[๐]' tts='graduation cap'>cap; celebration; clothing; graduation; hat</annotation> + <annotation cp='[๐ฟ]' tts='prayer beads'>beads; clothing; necklace; prayer; religion</annotation> + <annotation cp='[๐]' tts='lipstick'>cosmetics; makeup</annotation> + <annotation cp='[๐]' tts='ring'>diamond; romance</annotation> + <annotation cp='[๐]' tts='gem stone'>diamond; gem; jewel; romance</annotation> + <annotation cp='[๐ต]' tts='monkey face'>face; monkey</annotation> + <annotation cp='[๐]' tts='monkey'>monkey</annotation> + <annotation cp='[๐ถ]' tts='dog face'>dog; face; pet</annotation> + <annotation cp='[๐]' tts='dog'>pet</annotation> + <annotation cp='[๐ฉ]' tts='poodle'>dog</annotation> + <annotation cp='[๐บ]' tts='wolf face'>face; wolf</annotation> + <annotation cp='[๐ฑ]' tts='cat face'>cat; face; pet</annotation> + <annotation cp='[๐]' tts='cat'>pet</annotation> + <annotation cp='[๐ฆ]' tts='lion face'>face; leo; lion; zodiac</annotation> + <annotation cp='[๐ฏ]' tts='tiger face'>face; tiger</annotation> + <annotation cp='[๐
]' tts='tiger'>tiger</annotation> + <annotation cp='[๐]' tts='leopard'>leopard</annotation> + <annotation cp='[๐ด]' tts='horse face'>face; horse</annotation> + <annotation cp='[๐]' tts='horse'>racehorse; racing</annotation> + <annotation cp='[๐ฆ]' tts='unicorn face'>face; unicorn</annotation> + <annotation cp='[๐ฎ]' tts='cow face'>cow; face</annotation> + <annotation cp='[๐]' tts='ox'>bull; taurus; zodiac</annotation> + <annotation cp='[๐]' tts='water buffalo'>buffalo; water</annotation> + <annotation cp='[๐]' tts='cow'>cow</annotation> + <annotation cp='[๐ท]' tts='pig face'>face; pig</annotation> + <annotation cp='[๐]' tts='pig'>sow</annotation> + <annotation cp='[๐]' tts='boar'>pig</annotation> + <annotation cp='[๐ฝ]' tts='pig nose'>face; nose; pig</annotation> + <annotation cp='[๐]' tts='ram'>aries; sheep; zodiac</annotation> + <annotation cp='[๐]' tts='sheep'>ewe</annotation> + <annotation cp='[๐]' tts='goat'>capricorn; zodiac</annotation> + <annotation cp='[๐ช]' tts='camel'>dromedary; hump</annotation> + <annotation cp='[๐ซ]' tts='two-hump camel'>bactrian; camel; hump</annotation> + <annotation cp='[๐]' tts='elephant'>elephant</annotation> + <annotation cp='[๐ญ]' tts='mouse face'>face; mouse</annotation> + <annotation cp='[๐]' tts='mouse'>mouse</annotation> + <annotation cp='[๐]' tts='rat'>rat</annotation> + <annotation cp='[๐น]' tts='hamster face'>face; hamster; pet</annotation> + <annotation cp='[๐ฐ]' tts='rabbit face'>bunny; face; pet; rabbit</annotation> + <annotation cp='[๐]' tts='rabbit'>bunny; pet</annotation> + <annotation cp='[๐ฟ]' tts='chipmunk'>chipmunk</annotation> + <annotation cp='[๐ป]' tts='bear face'>bear; face</annotation> + <annotation cp='[๐จ]' tts='koala'>bear</annotation> + <annotation cp='[๐ผ]' tts='panda face'>face; panda</annotation> + <annotation cp='[๐พ]' tts='paw prints'>feet; paw; print</annotation> + <annotation cp='[๐ฆ]' tts='turkey'>turkey</annotation> + <annotation cp='[๐]' tts='chicken'>chicken</annotation> + <annotation cp='[๐]' tts='rooster'>rooster</annotation> + <annotation cp='[๐ฃ]' tts='hatching chick'>baby; chick; hatching</annotation> + <annotation cp='[๐ค]' tts='baby chick'>baby; chick</annotation> + <annotation cp='[๐ฅ]' tts='front-facing baby chick'>baby; chick</annotation> + <annotation cp='[๐ฆ]' tts='bird'>bird</annotation> + <annotation cp='[๐ง]' tts='penguin'>penguin</annotation> + <annotation cp='[๐]' tts='dove'>bird; fly; peace</annotation> + <annotation cp='[๐ธ]' tts='frog face'>face; frog</annotation> + <annotation cp='[๐]' tts='crocodile'>crocodile</annotation> + <annotation cp='[๐ข]' tts='turtle'>turtle</annotation> + <annotation cp='[๐]' tts='snake'>bearer; ophiuchus; serpent; zodiac</annotation> + <annotation cp='[๐ฒ]' tts='dragon face'>dragon; face; fairy tale</annotation> + <annotation cp='[๐]' tts='dragon'>fairy tale</annotation> + <annotation cp='[๐ณ]' tts='spouting whale'>face; spouting; whale</annotation> + <annotation cp='[๐]' tts='whale'>whale</annotation> + <annotation cp='[๐ฌ]' tts='dolphin'>flipper</annotation> + <annotation cp='[๐]' tts='fish'>pisces; zodiac</annotation> + <annotation cp='[๐ ]' tts='tropical fish'>fish; tropical</annotation> + <annotation cp='[๐ก]' tts='blowfish'>fish</annotation> + <annotation cp='[๐]' tts='octopus'>octopus</annotation> + <annotation cp='[๐]' tts='spiral shell'>shell; spiral</annotation> + <annotation cp='[๐ฆ]' tts='crab'>cancer; zodiac</annotation> + <annotation cp='[๐]' tts='snail'>snail</annotation> + <annotation cp='[๐]' tts='bug'>insect</annotation> + <annotation cp='[๐]' tts='ant'>insect</annotation> + <annotation cp='[๐]' tts='honeybee'>bee; insect</annotation> + <annotation cp='[๐]' tts='lady beetle'>beetle; insect; ladybird; ladybug</annotation> + <annotation cp='[๐ท]' tts='spider'>insect</annotation> + <annotation cp='[๐ธ]' tts='spider web'>spider; web</annotation> + <annotation cp='[๐ฆ]' tts='scorpion'>scorpio; scorpius; zodiac</annotation> + <annotation cp='[๐]' tts='bouquet'>flower; plant; romance</annotation> + <annotation cp='[๐ธ]' tts='cherry blossom'>blossom; cherry; flower; plant</annotation> + <annotation cp='[๐ฎ]' tts='white flower'>flower</annotation> + <annotation cp='[๐ต]' tts='rosette'>plant</annotation> + <annotation cp='[๐น]' tts='rose'>flower; plant</annotation> + <annotation cp='[๐บ]' tts='hibiscus'>flower; plant</annotation> + <annotation cp='[๐ป]' tts='sunflower'>flower; plant; sun</annotation> + <annotation cp='[๐ผ]' tts='blossom'>flower; plant</annotation> + <annotation cp='[๐ท]' tts='tulip'>flower; plant</annotation> + <annotation cp='[๐ฑ]' tts='seedling'>plant; young</annotation> + <annotation cp='[๐ฒ]' tts='evergreen'>plant; tree</annotation> + <annotation cp='[๐ณ]' tts='deciduous tree'>deciduous; plant; shedding; tree</annotation> + <annotation cp='[๐ด]' tts='palm tree'>palm; plant; tree</annotation> + <annotation cp='[๐ต]' tts='cactus'>plant</annotation> + <annotation cp='[๐พ]' tts='sheaf of rice'>ear; plant; rice</annotation> + <annotation cp='[๐ฟ]' tts='herb'>leaf; plant</annotation> + <annotation cp='[โ]' tts='shamrock'>plant</annotation> + <annotation cp='[๐]' tts='four leaf clover'>4; clover; four; leaf; plant</annotation> + <annotation cp='[๐]' tts='maple leaf'>falling; leaf; maple; plant</annotation> + <annotation cp='[๐]' tts='fallen leaf'>falling; leaf; plant</annotation> + <annotation cp='[๐]' tts='leaf fluttering in wind'>blow; flutter; leaf; plant; wind</annotation> + <annotation cp='[๐]' tts='grapes'>fruit; grape; plant</annotation> + <annotation cp='[๐]' tts='melon'>fruit; plant</annotation> + <annotation cp='[๐]' tts='watermelon'>fruit; plant</annotation> + <annotation cp='[๐]' tts='tangerine'>fruit; orange; plant</annotation> + <annotation cp='[๐]' tts='lemon'>citrus; fruit; plant</annotation> + <annotation cp='[๐]' tts='banana'>fruit; plant</annotation> + <annotation cp='[๐]' tts='pineapple'>fruit; plant</annotation> + <annotation cp='[๐]' tts='red apple'>apple; fruit; plant; red</annotation> + <annotation cp='[๐]' tts='green apple'>apple; fruit; green; plant</annotation> + <annotation cp='[๐]' tts='pear'>fruit; plant</annotation> + <annotation cp='[๐]' tts='peach'>fruit; plant</annotation> + <annotation cp='[๐]' tts='cherries'>cherry; fruit; plant</annotation> + <annotation cp='[๐]' tts='strawberry'>berry; fruit; plant</annotation> + <annotation cp='[๐
]' tts='tomato'>plant; vegetable</annotation> + <annotation cp='[๐]' tts='eggplant'>aubergine; plant; vegetable</annotation> + <annotation cp='[๐ฝ]' tts='ear of corn'>corn; ear; maize; maze; plant</annotation> + <annotation cp='[๐ถ]' tts='hot pepper'>hot; pepper; plant</annotation> + <annotation cp='[๐]' tts='mushroom'>plant</annotation> + <annotation cp='[๐ฐ]' tts='chestnut'>plant</annotation> + <annotation cp='[๐]' tts='bread'>loaf</annotation> + <annotation cp='[๐ง]' tts='cheese wedge'>cheese</annotation> + <annotation cp='[๐]' tts='meat on bone'>bone; meat</annotation> + <annotation cp='[๐]' tts='poultry leg'>bone; chicken; leg; poultry</annotation> + <annotation cp='[๐]' tts='hamburger'>burger</annotation> + <annotation cp='[๐]' tts='french fries'>french; fries</annotation> + <annotation cp='[๐]' tts='pizza'>cheese; slice</annotation> + <annotation cp='[๐ญ]' tts='hot dog'>frankfurter; hotdog; sausage</annotation> + <annotation cp='[๐ฎ]' tts='taco'>mexican</annotation> + <annotation cp='[๐ฏ]' tts='burrito'>mexican</annotation> + <annotation cp='[๐ฟ]' tts='popcorn'>popcorn</annotation> + <annotation cp='[๐ฒ]' tts='pot of food'>pot; stew</annotation> + <annotation cp='[๐ฑ]' tts='bento box'>bento; box</annotation> + <annotation cp='[๐]' tts='rice cracker'>cracker; rice</annotation> + <annotation cp='[๐]' tts='rice ball'>ball; japanese; rice</annotation> + <annotation cp='[๐]' tts='cooked rice'>cooked; rice</annotation> + <annotation cp='[๐]' tts='curry rice'>curry; rice</annotation> + <annotation cp='[๐]' tts='steaming bowl'>bowl; noodle; ramen; steaming</annotation> + <annotation cp='[๐]' tts='spaghetti'>pasta</annotation> + <annotation cp='[๐ ]' tts='roasted sweet potato'>potato; roasted; sweet</annotation> + <annotation cp='[๐ข]' tts='oden'>kebab; seafood; skewer; stick</annotation> + <annotation cp='[๐ฃ]' tts='sushi'>sushi</annotation> + <annotation cp='[๐ค]' tts='fried shrimp'>fried; prawn; shrimp; tempura</annotation> + <annotation cp='[๐ฅ]' tts='fish cake with swirl'>cake; fish; pastry; swirl</annotation> + <annotation cp='[๐ก]' tts='dango'>dessert; japanese; skewer; stick; sweet</annotation> + <annotation cp='[๐ฆ]' tts='soft ice cream'>cream; dessert; ice; icecream; soft; sweet</annotation> + <annotation cp='[๐ง]' tts='shaved ice'>dessert; ice; shaved; sweet</annotation> + <annotation cp='[๐จ]' tts='ice cream'>cream; dessert; ice; sweet</annotation> + <annotation cp='[๐ฉ]' tts='doughnut'>dessert; donut; sweet</annotation> + <annotation cp='[๐ช]' tts='cookie'>dessert; sweet</annotation> + <annotation cp='[๐]' tts='birthday cake'>birthday; cake; celebration; dessert; pastry; sweet</annotation> + <annotation cp='[๐ฐ]' tts='shortcake'>cake; dessert; pastry; slice; sweet</annotation> + <annotation cp='[๐ซ]' tts='chocolate bar'>bar; chocolate; dessert; sweet</annotation> + <annotation cp='[๐ฌ]' tts='candy'>dessert; sweet</annotation> + <annotation cp='[๐ญ]' tts='lollipop'>candy; dessert; sweet</annotation> + <annotation cp='[๐ฎ]' tts='custard'>dessert; pudding; sweet</annotation> + <annotation cp='[๐ฏ]' tts='honey pot'>honey; honeypot; pot; sweet</annotation> + <annotation cp='[๐ผ]' tts='baby bottle'>baby; bottle; drink; milk</annotation> + <annotation cp='[โ]' tts='hot beverage'>beverage; coffee; drink; hot; steaming; tea</annotation> + <annotation cp='[๐ต]' tts='teacup without handle'>beverage; cup; drink; tea; teacup</annotation> + <annotation cp='[๐ถ]' tts='sake'>bar; beverage; bottle; cup; drink</annotation> + <annotation cp='[๐พ]' tts='bottle with popping cork'>bar; bottle; cork; drink; popping</annotation> + <annotation cp='[๐ท]' tts='wine glass'>bar; beverage; drink; glass; wine</annotation> + <annotation cp='[๐ธ]' tts='cocktail glass'>bar; cocktail; drink; glass</annotation> + <annotation cp='[๐น]' tts='tropical drink'>bar; drink; tropical</annotation> + <annotation cp='[๐บ]' tts='beer mug'>bar; beer; drink; mug</annotation> + <annotation cp='[๐ป]' tts='clinking beer mugs'>bar; beer; clink; drink; mug</annotation> + <annotation cp='[๐ฝ]' tts='fork and knife with plate'>cooking; fork; knife; plate</annotation> + <annotation cp='[๐ด]' tts='fork and knife'>cooking; fork; knife</annotation> + <annotation cp='[๐ณ]' tts='cooking'>egg; frying; pan</annotation> + <annotation cp='[๐บ]' tts='amphora'>aquarius; cooking; drink; jug; tool; weapon; zodiac</annotation> + <annotation cp='[๐]' tts='globe showing europe-africa'>africa; earth; europe; globe; world</annotation> + <annotation cp='[๐]' tts='globe showing americas'>americas; earth; globe; world</annotation> + <annotation cp='[๐]' tts='globe showing asia-australia'>asia; australia; earth; globe; world</annotation> + <annotation cp='[๐]' tts='globe with meridians'>earth; globe; meridians; world</annotation> + <annotation cp='[๐บ]' tts='world map'>map; world</annotation> + <annotation cp='[๐]' tts='snow-capped mountain'>cold; mountain; snow</annotation> + <annotation cp='[โฐ]' tts='mountain'>mountain</annotation> + <annotation cp='[๐]' tts='volcano'>eruption; mountain; weather</annotation> + <annotation cp='[๐ป]' tts='mount fuji'>fuji; mountain</annotation> + <annotation cp='[๐]' tts='camping'>camping</annotation> + <annotation cp='[๐]' tts='beach with umbrella'>beach; umbrella</annotation> + <annotation cp='[๐]' tts='desert'>desert</annotation> + <annotation cp='[๐]' tts='desert island'>desert; island</annotation> + <annotation cp='[๐]' tts='national park'>park</annotation> + <annotation cp='[๐]' tts='stadium'>stadium</annotation> + <annotation cp='[๐]' tts='classical building'>building; classical</annotation> + <annotation cp='[๐]' tts='building construction'>building; construction</annotation> + <annotation cp='[๐]' tts='house buildings'>building; house</annotation> + <annotation cp='[๐]' tts='cityscape'>building; city</annotation> + <annotation cp='[๐]' tts='derelict house building'>building; derelict; house</annotation> + <annotation cp='[๐ ]' tts='house building'>building; home; house</annotation> + <annotation cp='[๐ก]' tts='house with garden'>building; garden; home; house</annotation> + <annotation cp='[โช]' tts='church'>building; christian; cross; religion</annotation> + <annotation cp='[๐]' tts='kaaba'>islam; muslim; religion</annotation> + <annotation cp='[๐]' tts='mosque'>islam; muslim; religion</annotation> + <annotation cp='[๐]' tts='synagogue'>jew; jewish; religion; temple</annotation> + <annotation cp='[โฉ]' tts='shinto shrine'>religion; shinto; shrine</annotation> + <annotation cp='[๐ข]' tts='office building'>building</annotation> + <annotation cp='[๐ฃ]' tts='japanese post office'>building; japanese; post</annotation> + <annotation cp='[๐ค]' tts='post office'>building; european; post</annotation> + <annotation cp='[๐ฅ]' tts='hospital'>building; doctor; medicine</annotation> + <annotation cp='[๐ฆ]' tts='bank'>building</annotation> + <annotation cp='[๐จ]' tts='hotel'>building</annotation> + <annotation cp='[๐ฉ]' tts='love hotel'>building; hotel; love</annotation> + <annotation cp='[๐ช]' tts='convenience store'>building; convenience; store</annotation> + <annotation cp='[๐ซ]' tts='school'>building</annotation> + <annotation cp='[๐ฌ]' tts='department store'>building; department; store</annotation> + <annotation cp='[๐ญ]' tts='factory'>building</annotation> + <annotation cp='[๐ฏ]' tts='japanese castle'>building; castle; japanese</annotation> + <annotation cp='[๐ฐ]' tts='castle'>building; european</annotation> + <annotation cp='[๐]' tts='wedding'>chapel; romance</annotation> + <annotation cp='[๐ผ]' tts='tokyo tower'>tokyo; tower</annotation> + <annotation cp='[๐ฝ]' tts='statue of liberty'>liberty; statue</annotation> + <annotation cp='[๐พ]' tts='map of japan'>japan; map</annotation> + <annotation cp='[โฒ]' tts='fountain'>fountain</annotation> + <annotation cp='[โบ]' tts='tent'>camping</annotation> + <annotation cp='[๐]' tts='foggy'>fog; weather</annotation> + <annotation cp='[๐]' tts='night with stars'>night; star; weather</annotation> + <annotation cp='[๐]' tts='sunrise over mountains'>morning; mountain; sun; sunrise; weather</annotation> + <annotation cp='[๐
]' tts='sunrise'>morning; sun; weather</annotation> + <annotation cp='[๐]' tts='cityscape at dusk'>building; city; dusk; evening; landscape; sun; sunset; weather</annotation> + <annotation cp='[๐]' tts='sunset'>building; dusk; sun; weather</annotation> + <annotation cp='[๐]' tts='bridge at night'>bridge; night; weather</annotation> + <annotation cp='[โจ]' tts='hot springs'>hot; hotsprings; springs; steaming</annotation> + <annotation cp='[๐]' tts='milky way'>space; weather</annotation> + <annotation cp='[๐ ]' tts='carousel horse'>carousel; horse</annotation> + <annotation cp='[๐ก]' tts='ferris wheel'>amusement park; ferris; wheel</annotation> + <annotation cp='[๐ข]' tts='roller coaster'>amusement park; coaster; roller</annotation> + <annotation cp='[๐]' tts='barber pole'>barber; haircut; pole</annotation> + <annotation cp='[๐ช]' tts='circus tent'>circus; tent</annotation> + <annotation cp='[๐ญ]' tts='performing arts'>art; mask; performing; theater; theatre</annotation> + <annotation cp='[๐ผ]' tts='frame with picture'>art; frame; museum; painting; picture</annotation> + <annotation cp='[๐จ]' tts='artist palette'>art; museum; painting; palette</annotation> + <annotation cp='[๐ฐ]' tts='slot machine'>game; slot</annotation> + <annotation cp='[๐]' tts='locomotive'>engine; railway; steam; train; vehicle</annotation> + <annotation cp='[๐]' tts='railway car'>car; electric; railway; train; tram; trolleybus; vehicle</annotation> + <annotation cp='[๐]' tts='high-speed train'>railway; shinkansen; speed; train; vehicle</annotation> + <annotation cp='[๐
]' tts='high-speed train with bullet nose'>bullet; railway; shinkansen; speed; train; vehicle</annotation> + <annotation cp='[๐]' tts='train'>railway; vehicle</annotation> + <annotation cp='[๐]' tts='metro'>subway; vehicle</annotation> + <annotation cp='[๐]' tts='light rail'>railway; vehicle</annotation> + <annotation cp='[๐]' tts='station'>railway; train; vehicle</annotation> + <annotation cp='[๐]' tts='tram'>trolleybus; vehicle</annotation> + <annotation cp='[๐]' tts='monorail'>vehicle</annotation> + <annotation cp='[๐]' tts='mountain railway'>car; mountain; railway; vehicle</annotation> + <annotation cp='[๐]' tts='tram car'>car; tram; trolleybus; vehicle</annotation> + <annotation cp='[๐]' tts='bus'>vehicle</annotation> + <annotation cp='[๐]' tts='oncoming bus'>bus; oncoming; vehicle</annotation> + <annotation cp='[๐]' tts='trolleybus'>bus; tram; trolley; vehicle</annotation> + <annotation cp='[๐]' tts='bus stop'>bus; busstop; stop</annotation> + <annotation cp='[๐]' tts='minibus'>bus; vehicle</annotation> + <annotation cp='[๐]' tts='ambulance'>vehicle</annotation> + <annotation cp='[๐]' tts='fire engine'>engine; fire; truck; vehicle</annotation> + <annotation cp='[๐]' tts='police car'>car; patrol; police; vehicle</annotation> + <annotation cp='[๐]' tts='oncoming police car'>car; oncoming; police; vehicle</annotation> + <annotation cp='[๐]' tts='taxi'>vehicle</annotation> + <annotation cp='[๐]' tts='oncoming taxi'>oncoming; taxi; vehicle</annotation> + <annotation cp='[๐]' tts='automobile'>car; vehicle</annotation> + <annotation cp='[๐]' tts='oncoming automobile'>automobile; car; oncoming; vehicle</annotation> + <annotation cp='[๐]' tts='recreational vehicle'>recreational; rv; vehicle</annotation> + <annotation cp='[๐]' tts='delivery truck'>delivery; truck; vehicle</annotation> + <annotation cp='[๐]' tts='articulated lorry'>lorry; semi; truck; vehicle</annotation> + <annotation cp='[๐]' tts='tractor'>vehicle</annotation> + <annotation cp='[๐ฒ]' tts='bicycle'>bike; vehicle</annotation> + <annotation cp='[โฝ]' tts='fuel pump'>fuel; fuelpump; gas; pump; station</annotation> + <annotation cp='[๐ฃ]' tts='motorway'>highway; road</annotation> + <annotation cp='[๐ค]' tts='railway track'>railway; train</annotation> + <annotation cp='[๐จ]' tts='police carโs light'>beacon; car; light; police; revolving; vehicle</annotation> + <annotation cp='[๐ฅ]' tts='horizontal traffic light'>light; signal; traffic</annotation> + <annotation cp='[๐ฆ]' tts='vertical traffic light'>light; signal; traffic</annotation> + <annotation cp='[๐ง]' tts='construction'>barrier</annotation> + <annotation cp='[โ]' tts='anchor'>ship; tool</annotation> + <annotation cp='[โต]' tts='sailboat'>boat; resort; sea; vehicle; yacht</annotation> + <annotation cp='[๐ฃ]' tts='rowboat'>boat; vehicle</annotation> + <annotation cp='[๐ค]' tts='speedboat'>boat; vehicle</annotation> + <annotation cp='[๐ณ]' tts='passenger ship'>passenger; ship; vehicle</annotation> + <annotation cp='[โด]' tts='ferry'>boat</annotation> + <annotation cp='[๐ฅ]' tts='motor boat'>boat; motorboat; vehicle</annotation> + <annotation cp='[๐ข]' tts='ship'>vehicle</annotation> + <annotation cp='[โ]' tts='airplane'>vehicle</annotation> + <annotation cp='[๐ฉ]' tts='small airplane'>airplane; vehicle</annotation> + <annotation cp='[๐ซ]' tts='airplane departure'>airplane; check-in; departure; departures; vehicle</annotation> + <annotation cp='[๐ฌ]' tts='airplane arrival'>airplane; arrivals; arriving; landing; vehicle</annotation> + <annotation cp='[๐บ]' tts='seat'>chair</annotation> + <annotation cp='[๐]' tts='helicopter'>vehicle</annotation> + <annotation cp='[๐]' tts='suspension railway'>railway; suspension; vehicle</annotation> + <annotation cp='[๐ ]' tts='mountain cableway'>cable; gondola; mountain; vehicle</annotation> + <annotation cp='[๐ก]' tts='aerial tramway'>aerial; cable; car; gondola; ropeway; tramway; vehicle</annotation> + <annotation cp='[๐]' tts='rocket'>space; vehicle</annotation> + <annotation cp='[๐ฐ]' tts='satellite'>space; vehicle</annotation> + <annotation cp='[๐]' tts='bellhop bell'>bell; bellhop; hotel</annotation> + <annotation cp='[๐ช]' tts='door'>door</annotation> + <annotation cp='[๐]' tts='person in bed'>hotel; sleep</annotation> + <annotation cp='[๐]' tts='bed'>hotel; sleep</annotation> + <annotation cp='[๐]' tts='couch and lamp'>couch; hotel; lamp</annotation> + <annotation cp='[๐ฝ]' tts='toilet'>toilet</annotation> + <annotation cp='[๐ฟ]' tts='shower'>water</annotation> + <annotation cp='[๐]' tts='person taking bath'>bathtub; bath</annotation> + <annotation cp='[๐]' tts='bathtub'>bath</annotation> + <annotation cp='[โ]' tts='hourglass'>sand; timer</annotation> + <annotation cp='[โณ]' tts='hourglass with flowing sand'>hourglass; sand; timer</annotation> + <annotation cp='[โ]' tts='watch'>clock</annotation> + <annotation cp='[โฐ]' tts='alarm clock'>alarm; clock</annotation> + <annotation cp='[โฑ]' tts='stopwatch'>clock</annotation> + <annotation cp='[โฒ]' tts='timer clock'>clock; timer</annotation> + <annotation cp='[๐ฐ]' tts='mantelpiece clock'>clock</annotation> + <annotation cp='[๐]' tts='twelve oโclock'>00; 12; 12:00; clock; oโclock; twelve</annotation> + <annotation cp='[๐ง]' tts='twelve-thirty'>12; 12:30; 30; clock; thirty; twelve</annotation> + <annotation cp='[๐]' tts='one oโclock'>00; 1; 1:00; clock; oโclock; one</annotation> + <annotation cp='[๐]' tts='one-thirty'>1; 1:30; 30; clock; one; thirty</annotation> + <annotation cp='[๐]' tts='two oโclock'>00; 2; 2:00; clock; oโclock; two</annotation> + <annotation cp='[๐]' tts='two-thirty'>2; 2:30; 30; clock; thirty; two</annotation> + <annotation cp='[๐]' tts='three oโclock'>00; 3; 3:00; clock; oโclock; three</annotation> + <annotation cp='[๐]' tts='three-thirty'>3; 3:30; 30; clock; thirty; three</annotation> + <annotation cp='[๐]' tts='four oโclock'>00; 4; 4:00; clock; four; oโclock</annotation> + <annotation cp='[๐]' tts='four-thirty'>30; 4; 4:30; clock; four; thirty</annotation> + <annotation cp='[๐]' tts='five oโclock'>00; 5; 5:00; clock; five; oโclock</annotation> + <annotation cp='[๐ ]' tts='five-thirty'>30; 5; 5:30; clock; five; thirty</annotation> + <annotation cp='[๐]' tts='six oโclock'>00; 6; 6:00; clock; oโclock; six</annotation> + <annotation cp='[๐ก]' tts='six-thirty'>30; 6; 6:30; clock; six; thirty</annotation> + <annotation cp='[๐]' tts='seven oโclock'>00; 7; 7:00; clock; oโclock; seven</annotation> + <annotation cp='[๐ข]' tts='seven-thirty'>30; 7; 7:30; clock; seven; thirty</annotation> + <annotation cp='[๐]' tts='eight oโclock'>00; 8; 8:00; clock; eight; oโclock</annotation> + <annotation cp='[๐ฃ]' tts='eight-thirty'>30; 8; 8:30; clock; eight; thirty</annotation> + <annotation cp='[๐]' tts='nine oโclock'>00; 9; 9:00; clock; nine; oโclock</annotation> + <annotation cp='[๐ค]' tts='nine-thirty'>30; 9; 9:30; clock; nine; thirty</annotation> + <annotation cp='[๐]' tts='ten oโclock'>00; 10; 10:00; clock; oโclock; ten</annotation> + <annotation cp='[๐ฅ]' tts='ten-thirty'>10; 10:30; 30; clock; ten; thirty</annotation> + <annotation cp='[๐]' tts='eleven oโclock'>00; 11; 11:00; clock; eleven; oโclock</annotation> + <annotation cp='[๐ฆ]' tts='eleven-thirty'>11; 11:30; 30; clock; eleven; thirty</annotation> + <annotation cp='[๐]' tts='new moon'>dark; moon; space; weather</annotation> + <annotation cp='[๐]' tts='waxing crescent moon'>crescent; moon; space; waxing; weather</annotation> + <annotation cp='[๐]' tts='first quarter moon'>moon; quarter; space; weather</annotation> + <annotation cp='[๐]' tts='waxing gibbous moon'>gibbous; moon; space; waxing; weather</annotation> + <annotation cp='[๐]' tts='full moon'>full; moon; space; weather</annotation> + <annotation cp='[๐]' tts='waning gibbous moon'>gibbous; moon; space; waning; weather</annotation> + <annotation cp='[๐]' tts='last quarter moon'>moon; quarter; space; weather</annotation> + <annotation cp='[๐]' tts='waning crescent moon'>crescent; moon; space; waning; weather</annotation> + <annotation cp='[๐]' tts='crescent moon'>crescent; moon; space; weather</annotation> + <annotation cp='[๐]' tts='new moon face'>face; moon; space; weather</annotation> + <annotation cp='[๐]' tts='first quarter moon with face'>face; moon; quarter; space; weather</annotation> + <annotation cp='[๐]' tts='last quarter moon with face'>face; moon; quarter; space; weather</annotation> + <annotation cp='[๐ก]' tts='thermometer'>weather</annotation> + <annotation cp='[โ]' tts='sun'>bright; rays; space; sunny; weather</annotation> + <annotation cp='[๐]' tts='full moon with face'>bright; face; full; moon; space; weather</annotation> + <annotation cp='[๐]' tts='sun with face'>bright; face; space; sun; weather</annotation> + <annotation cp='[โญ]' tts='white medium star'>star</annotation> + <annotation cp='[๐]' tts='glowing star'>glittery; glow; shining; sparkle; star</annotation> + <annotation cp='[๐ ]' tts='shooting star'>falling; shooting; space; star</annotation> + <annotation cp='[โ]' tts='cloud'>weather</annotation> + <annotation cp='[โ
]' tts='sun behind cloud'>cloud; sun; weather</annotation> + <annotation cp='[โ]' tts='cloud with lightning and rain'>cloud; rain; thunder; weather</annotation> + <annotation cp='[๐ค]' tts='sun behind small cloud'>cloud; sun; weather</annotation> + <annotation cp='[๐ฅ]' tts='sun behind large cloud'>cloud; sun; weather</annotation> + <annotation cp='[๐ฆ]' tts='sun behind cloud with rain'>cloud; rain; sun; weather</annotation> + <annotation cp='[๐ง]' tts='cloud with rain'>cloud; rain; weather</annotation> + <annotation cp='[๐จ]' tts='cloud with snow'>cloud; cold; snow; weather</annotation> + <annotation cp='[๐ฉ]' tts='cloud with lightning'>cloud; lightning; weather</annotation> + <annotation cp='[๐ช]' tts='tornado'>cloud; weather; whirlwind</annotation> + <annotation cp='[๐ซ]' tts='fog'>cloud; weather</annotation> + <annotation cp='[๐ฌ]' tts='wind face'>blow; cloud; face; weather; wind</annotation> + <annotation cp='[๐]' tts='cyclone'>dizzy; twister; typhoon; weather</annotation> + <annotation cp='[๐]' tts='rainbow'>rain; weather</annotation> + <annotation cp='[๐]' tts='closed umbrella'>clothing; rain; umbrella; weather</annotation> + <annotation cp='[โ]' tts='umbrella'>clothing; rain; weather</annotation> + <annotation cp='[โ]' tts='umbrella with rain drops'>clothing; drop; rain; umbrella; weather</annotation> + <annotation cp='[โฑ]' tts='umbrella on ground'>rain; sun; umbrella; weather</annotation> + <annotation cp='[โก]' tts='high voltage'>danger; electric; electricity; lightning; voltage; zap</annotation> + <annotation cp='[โ]' tts='snowflake'>cold; snow; weather</annotation> + <annotation cp='[โ]' tts='snowman'>cold; snow; weather</annotation> + <annotation cp='[โ]' tts='snowman without snow'>cold; snow; snowman; weather</annotation> + <annotation cp='[โ]' tts='comet'>space</annotation> + <annotation cp='[๐ฅ]' tts='fire'>flame; tool</annotation> + <annotation cp='[๐ง]' tts='droplet'>cold; comic; drop; sweat; weather</annotation> + <annotation cp='[๐]' tts='water wave'>ocean; water; wave; weather</annotation> + <annotation cp='[๐]' tts='jack-o-lantern'>celebration; halloween; jack; lantern</annotation> + <annotation cp='[๐]' tts='christmas tree'>celebration; christmas; tree</annotation> + <annotation cp='[๐]' tts='fireworks'>celebration</annotation> + <annotation cp='[๐]' tts='sparkler'>celebration; fireworks; sparkle</annotation> + <annotation cp='[โจ]' tts='sparkles'>sparkle; star</annotation> + <annotation cp='[๐]' tts='balloon'>celebration</annotation> + <annotation cp='[๐]' tts='party popper'>celebration; party; popper; tada</annotation> + <annotation cp='[๐]' tts='confetti ball'>ball; celebration; confetti</annotation> + <annotation cp='[๐]' tts='tanabata tree'>banner; celebration; japanese; tree</annotation> + <annotation cp='[๐]' tts='crossed flags'>celebration; cross; crossed; japanese</annotation> + <annotation cp='[๐]' tts='pine decoration'>bamboo; celebration; japanese; pine; plant</annotation> + <annotation cp='[๐]' tts='japanese dolls'>celebration; doll; festival; japanese</annotation> + <annotation cp='[๐]' tts='carp streamer'>carp; celebration; streamer</annotation> + <annotation cp='[๐]' tts='wind chime'>bell; celebration; chime; wind</annotation> + <annotation cp='[๐]' tts='moon ceremony'>celebration; ceremony; moon</annotation> + <annotation cp='[๐]' tts='ribbon'>celebration</annotation> + <annotation cp='[๐]' tts='wrapped present'>box; celebration; gift; present; wrapped</annotation> + <annotation cp='[๐]' tts='military medal'>celebration; medal; military</annotation> + <annotation cp='[๐]' tts='reminder ribbon'>celebration; reminder; ribbon</annotation> + <annotation cp='[๐]' tts='film frames'>cinema; film; frames; movie</annotation> + <annotation cp='[๐]' tts='admission tickets'>admission; ticket</annotation> + <annotation cp='[๐ซ]' tts='ticket'>admission</annotation> + <annotation cp='[๐ท]' tts='label'>label</annotation> + <annotation cp='[โฝ]' tts='soccer ball'>ball; soccer</annotation> + <annotation cp='[โพ]' tts='baseball'>ball</annotation> + <annotation cp='[๐]' tts='basketball'>ball; hoop</annotation> + <annotation cp='[๐]' tts='american football'>american; ball; football</annotation> + <annotation cp='[๐]' tts='rugby football'>ball; football; rugby</annotation> + <annotation cp='[๐พ]' tts='tennis'>ball; racquet</annotation> + <annotation cp='[๐ฑ]' tts='billiards'>8; 8 ball; ball; billiard; eight; game</annotation> + <annotation cp='[๐ณ]' tts='bowling'>ball; game</annotation> + <annotation cp='[โณ]' tts='flag in hole'>golf; hole</annotation> + <annotation cp='[๐]' tts='golfer'>ball; golf</annotation> + <annotation cp='[โธ]' tts='ice skate'>ice; skate</annotation> + <annotation cp='[๐ฃ]' tts='fishing pole'>fish; pole</annotation> + <annotation cp='[๐ฝ]' tts='running shirt'>running; sash; shirt</annotation> + <annotation cp='[๐ฟ]' tts='skis'>ski; snow</annotation> + <annotation cp='[โท]' tts='skier'>ski; snow</annotation> + <annotation cp='[๐]' tts='snowboarder'>ski; snow; snowboard</annotation> + <annotation cp='[๐]' tts='surfer'>surfing</annotation> + <annotation cp='[๐]' tts='horse racing'>horse; jockey; racehorse; racing</annotation> + <annotation cp='[๐]' tts='swimmer'>swim</annotation> + <annotation cp='[โน]' tts='person with ball'>ball</annotation> + <annotation cp='[๐]' tts='weight lifter'>lifter; weight</annotation> + <annotation cp='[๐ด]' tts='bicyclist'>bicycle; bike; cyclist</annotation> + <annotation cp='[๐ต]' tts='mountain biker'>bicycle; bicyclist; bike; cyclist; mountain</annotation> + <annotation cp='[๐]' tts='racing car'>car; racing</annotation> + <annotation cp='[๐]' tts='motorcycle'>racing</annotation> + <annotation cp='[๐
]' tts='sports medal'>medal</annotation> + <annotation cp='[๐]' tts='trophy'>prize</annotation> + <annotation cp='[๐]' tts='cricket'>ball; bat; game</annotation> + <annotation cp='[๐]' tts='volleyball'>ball; game</annotation> + <annotation cp='[๐]' tts='field hockey'>ball; field; game; hockey; stick</annotation> + <annotation cp='[๐]' tts='ice hockey stick and puck'>game; hockey; ice; puck; stick</annotation> + <annotation cp='[๐]' tts='ping pong'>ball; bat; game; paddle; table tennis</annotation> + <annotation cp='[๐ธ]' tts='badminton'>birdie; game; racquet; shuttlecock</annotation> + <annotation cp='[๐ฏ]' tts='direct hit'>bull; bullseye; dart; eye; game; hit; target</annotation> + <annotation cp='[๐ฎ]' tts='video game'>controller; game</annotation> + <annotation cp='[๐น]' tts='joystick'>game; video game</annotation> + <annotation cp='[๐ฒ]' tts='game die'>dice; die; game</annotation> + <annotation cp='[โ ]' tts='spade suit'>card; game; spade; suit</annotation> + <annotation cp='[โฅ]' tts='heart suit'>card; game; heart; hearts; suit</annotation> + <annotation cp='[โฆ]' tts='diamond suit'>card; diamond; diamonds; game; suit</annotation> + <annotation cp='[โฃ]' tts='club suit'>card; club; clubs; game; suit</annotation> + <annotation cp='[๐]' tts='joker'>card; game; playing</annotation> + <annotation cp='[๐]' tts='mahjong red dragon'>game; mahjong; red</annotation> + <annotation cp='[๐ด]' tts='flower playing cards'>card; flower; game; japanese; playing</annotation> + <annotation cp='[๐]' tts='speaker off'>mute; quiet; silent; speaker; volume</annotation> + <annotation cp='[๐]' tts='speaker'>volume</annotation> + <annotation cp='[๐]' tts='speaker on'>low; speaker; volume; wave</annotation> + <annotation cp='[๐]' tts='speaker loud'>3; high; loud; speaker; three; volume</annotation> + <annotation cp='[๐ข]' tts='loudspeaker'>loud; public address</annotation> + <annotation cp='[๐ฃ]' tts='megaphone'>cheering</annotation> + <annotation cp='[๐ฏ]' tts='postal horn'>horn; post; postal</annotation> + <annotation cp='[๐]' tts='bell'>bell</annotation> + <annotation cp='[๐]' tts='bell with slash'>bell; forbidden; mute; no; not; prohibited; quiet; silent</annotation> + <annotation cp='[๐ผ]' tts='musical score'>music; score</annotation> + <annotation cp='[๐ต]' tts='musical note'>music; note</annotation> + <annotation cp='[๐ถ]' tts='musical notes'>music; note; notes</annotation> + <annotation cp='[๐]' tts='studio microphone'>mic; microphone; music; studio</annotation> + <annotation cp='[๐]' tts='level slider'>level; music; slider</annotation> + <annotation cp='[๐]' tts='control knobs'>control; knobs; music</annotation> + <annotation cp='[๐ค]' tts='microphone'>karaoke; mic</annotation> + <annotation cp='[๐ง]' tts='headphone'>earbud</annotation> + <annotation cp='[๐ท]' tts='saxophone'>instrument; music; sax</annotation> + <annotation cp='[๐ธ]' tts='guitar'>instrument; music</annotation> + <annotation cp='[๐น]' tts='musical keyboard'>instrument; keyboard; music; piano</annotation> + <annotation cp='[๐บ]' tts='trumpet'>instrument; music</annotation> + <annotation cp='[๐ป]' tts='violin'>instrument; music</annotation> + <annotation cp='[๐ป]' tts='radio'>video</annotation> + <annotation cp='[๐ฑ]' tts='mobile phone'>cell; mobile; phone; telephone</annotation> + <annotation cp='[๐ฒ]' tts='mobile phone with arrow'>arrow; call; cell; mobile; phone; receive; telephone</annotation> + <annotation cp='[โ]' tts='telephone'>phone</annotation> + <annotation cp='[๐]' tts='telephone receiver'>phone; receiver; telephone</annotation> + <annotation cp='[๐]' tts='pager'>pager</annotation> + <annotation cp='[๐ ]' tts='fax machine'>fax</annotation> + <annotation cp='[๐]' tts='battery'>battery</annotation> + <annotation cp='[๐]' tts='electric plug'>electric; electricity; plug</annotation> + <annotation cp='[๐ป]' tts='laptop computer'>computer; pc; personal</annotation> + <annotation cp='[๐ฅ]' tts='desktop computer'>computer; desktop</annotation> + <annotation cp='[๐จ]' tts='printer'>computer</annotation> + <annotation cp='[โจ]' tts='keyboard'>computer</annotation> + <annotation cp='[๐ฑ]' tts='computer mouse'>3; button; computer; mouse; three</annotation> + <annotation cp='[๐ฒ]' tts='trackball'>computer</annotation> + <annotation cp='[๐ฝ]' tts='minidisc'>computer; disk; minidisk; optical</annotation> + <annotation cp='[๐พ]' tts='floppy disk'>computer; disk; floppy</annotation> + <annotation cp='[๐ฟ]' tts='optical disc'>dvd; blu-ray; cd; computer; disk; optical</annotation> + <annotation cp='[๐]' tts='dvd'>blu-ray; cd; computer; disk; optical</annotation> + <annotation cp='[๐ฅ]' tts='movie camera'>camera; cinema; movie</annotation> + <annotation cp='[๐ฌ]' tts='clapper board'>clapper; movie</annotation> + <annotation cp='[๐ฝ]' tts='film projector'>cinema; film; movie; projector; video</annotation> + <annotation cp='[๐บ]' tts='television'>tv; video</annotation> + <annotation cp='[๐ท]' tts='camera'>video</annotation> + <annotation cp='[๐ธ]' tts='camera with flash'>camera; flash; video</annotation> + <annotation cp='[๐น]' tts='video camera'>camera; video</annotation> + <annotation cp='[๐ผ]' tts='videocassette'>tape; vhs; video</annotation> + <annotation cp='[๐]' tts='left-pointing magnifying glass'>glass; magnifying; search; tool</annotation> + <annotation cp='[๐]' tts='right-pointing magnifying glass'>glass; magnifying; search; tool</annotation> + <annotation cp='[๐ฌ]' tts='microscope'>tool</annotation> + <annotation cp='[๐ญ]' tts='telescope'>tool</annotation> + <annotation cp='[๐ก]' tts='satellite antenna'>antenna; dish; satellite</annotation> + <annotation cp='[๐ฏ]' tts='candle'>light</annotation> + <annotation cp='[๐ก]' tts='light bulb'>bulb; comic; electric; idea; light</annotation> + <annotation cp='[๐ฆ]' tts='flashlight'>electric; light; tool; torch</annotation> + <annotation cp='[๐ฎ]' tts='red paper lantern'>bar; japanese; lantern; light; red</annotation> + <annotation cp='[๐]' tts='notebook with decorative cover'>book; cover; decorated; notebook</annotation> + <annotation cp='[๐]' tts='closed book'>book; closed</annotation> + <annotation cp='[๐]' tts='open book'>book; open</annotation> + <annotation cp='[๐]' tts='green book'>book; green</annotation> + <annotation cp='[๐]' tts='blue book'>blue; book</annotation> + <annotation cp='[๐]' tts='orange book'>book; orange</annotation> + <annotation cp='[๐]' tts='books'>book</annotation> + <annotation cp='[๐]' tts='notebook'>notebook</annotation> + <annotation cp='[๐]' tts='ledger'>notebook</annotation> + <annotation cp='[๐]' tts='page with curl'>curl; document; page</annotation> + <annotation cp='[๐]' tts='scroll'>paper</annotation> + <annotation cp='[๐]' tts='page facing up'>document; page</annotation> + <annotation cp='[๐ฐ]' tts='newspaper'>news; paper</annotation> + <annotation cp='[๐]' tts='rolled-up newspaper'>news; newspaper; paper; rolled</annotation> + <annotation cp='[๐]' tts='bookmark tabs'>bookmark; mark; marker; tabs</annotation> + <annotation cp='[๐]' tts='bookmark'>mark</annotation> + <annotation cp='[๐ฐ]' tts='money bag'>bag; dollar; money; moneybag</annotation> + <annotation cp='[๐ด]' tts='yen banknote'>bank; banknote; bill; currency; money; note; yen</annotation> + <annotation cp='[๐ต]' tts='dollar banknote'>bank; banknote; bill; currency; dollar; money; note</annotation> + <annotation cp='[๐ถ]' tts='euro banknote'>bank; banknote; bill; currency; euro; money; note</annotation> + <annotation cp='[๐ท]' tts='pound banknote'>bank; banknote; bill; currency; money; note; pound</annotation> + <annotation cp='[๐ธ]' tts='money with wings'>bank; banknote; bill; dollar; fly; money; note; wings</annotation> + <annotation cp='[๐ณ]' tts='credit card'>bank; card; credit; money</annotation> + <annotation cp='[๐น]' tts='chart increasing with yen'>bank; chart; currency; graph; growth; market; money; rise; trend; upward; yen</annotation> + <annotation cp='[โ]' tts='envelope'>e-mail; email</annotation> + <annotation cp='[๐ง]' tts='e-mail'>email; letter; mail</annotation> + <annotation cp='[๐จ]' tts='incoming envelope'>e-mail; email; envelope; incoming; letter; mail; receive</annotation> + <annotation cp='[๐ฉ]' tts='envelope with arrow'>arrow; down; e-mail; email; envelope; letter; mail; outgoing; sent</annotation> + <annotation cp='[๐ค]' tts='outbox tray'>box; letter; mail; outbox; sent; tray</annotation> + <annotation cp='[๐ฅ]' tts='inbox tray'>box; inbox; letter; mail; receive; tray</annotation> + <annotation cp='[๐ฆ]' tts='package'>box; parcel</annotation> + <annotation cp='[๐ซ]' tts='closed mailbox with raised flag'>closed; mail; mailbox; postbox</annotation> + <annotation cp='[๐ช]' tts='closed mailbox with lowered flag'>closed; lowered; mail; mailbox; postbox</annotation> + <annotation cp='[๐ฌ]' tts='open mailbox with raised flag'>mail; mailbox; open; postbox</annotation> + <annotation cp='[๐ญ]' tts='open mailbox with lowered flag'>lowered; mail; mailbox; open; postbox</annotation> + <annotation cp='[๐ฎ]' tts='postbox'>mail; mailbox</annotation> + <annotation cp='[๐ณ]' tts='ballot box with ballot'>ballot; box</annotation> + <annotation cp='[โ]' tts='pencil'>pencil</annotation> + <annotation cp='[โ]' tts='black nib'>nib; pen</annotation> + <annotation cp='[๐]' tts='fountain pen'>fountain; pen</annotation> + <annotation cp='[๐]' tts='pen'>ballpoint</annotation> + <annotation cp='[๐]' tts='paintbrush'>painting</annotation> + <annotation cp='[๐]' tts='crayon'>crayon</annotation> + <annotation cp='[๐]' tts='memo'>pencil</annotation> + <annotation cp='[๐ผ]' tts='briefcase'>briefcase</annotation> + <annotation cp='[๐]' tts='file folder'>file; folder</annotation> + <annotation cp='[๐]' tts='open file folder'>file; folder; open</annotation> + <annotation cp='[๐]' tts='card index dividers'>card; dividers; index</annotation> + <annotation cp='[๐
]' tts='calendar'>date</annotation> + <annotation cp='[๐]' tts='tear-off calendar'>calendar</annotation> + <annotation cp='[๐]' tts='spiral notepad'>note; pad; spiral</annotation> + <annotation cp='[๐]' tts='spiral calendar'>calendar; pad; spiral</annotation> + <annotation cp='[๐]' tts='card index'>card; index; rolodex</annotation> + <annotation cp='[๐]' tts='chart increasing'>chart; graph; growth; trend; upward</annotation> + <annotation cp='[๐]' tts='chart decreasing'>chart; down; graph; trend</annotation> + <annotation cp='[๐]' tts='bar chart'>bar; chart; graph</annotation> + <annotation cp='[๐]' tts='clipboard'>clipboard</annotation> + <annotation cp='[๐]' tts='pushpin'>pin</annotation> + <annotation cp='[๐]' tts='round pushpin'>pin; pushpin</annotation> + <annotation cp='[๐]' tts='paperclip'>paperclip</annotation> + <annotation cp='[๐]' tts='linked paperclips'>link; paperclip</annotation> + <annotation cp='[๐]' tts='straight ruler'>ruler; straight edge</annotation> + <annotation cp='[๐]' tts='triangular ruler'>ruler; set; triangle</annotation> + <annotation cp='[โ]' tts='scissors'>tool</annotation> + <annotation cp='[๐]' tts='card file box'>box; card; file</annotation> + <annotation cp='[๐]' tts='file cabinet'>cabinet; file</annotation> + <annotation cp='[๐]' tts='wastebasket'>wastebasket</annotation> + <annotation cp='[๐]' tts='lock'>closed</annotation> + <annotation cp='[๐]' tts='open lock'>lock; open; unlock</annotation> + <annotation cp='[๐]' tts='lock with pen'>ink; lock; nib; pen; privacy</annotation> + <annotation cp='[๐]' tts='closed lock with key'>closed; key; lock; secure</annotation> + <annotation cp='[๐]' tts='key'>lock; password</annotation> + <annotation cp='[๐]' tts='old key'>clue; key; lock; old</annotation> + <annotation cp='[๐จ]' tts='hammer'>tool</annotation> + <annotation cp='[โ]' tts='pick'>mining; tool</annotation> + <annotation cp='[โ]' tts='hammer and pick'>hammer; pick; tool</annotation> + <annotation cp='[๐ ]' tts='hammer and wrench'>hammer; tool; wrench</annotation> + <annotation cp='[๐ง]' tts='wrench'>tool</annotation> + <annotation cp='[๐ฉ]' tts='nut and bolt'>bolt; nut; tool</annotation> + <annotation cp='[โ]' tts='gear'>tool</annotation> + <annotation cp='[๐]' tts='compression'>tool; vice</annotation> + <annotation cp='[โ]' tts='alembic'>chemistry; tool</annotation> + <annotation cp='[โ]' tts='balance scale'>balance; justice; libra; scales; tool; weight; zodiac</annotation> + <annotation cp='[๐]' tts='link'>link</annotation> + <annotation cp='[โ]' tts='chains'>chain</annotation> + <annotation cp='[๐]' tts='syringe'>doctor; medicine; needle; shot; sick; tool</annotation> + <annotation cp='[๐]' tts='pill'>doctor; medicine; sick</annotation> + <annotation cp='[๐ก]' tts='dagger'>knife; weapon</annotation> + <annotation cp='[๐ช]' tts='kitchen knife'>cooking; hocho; knife; tool; weapon</annotation> + <annotation cp='[โ]' tts='crossed swords'>crossed; swords; weapon</annotation> + <annotation cp='[๐ซ]' tts='pistol'>gun; handgun; revolver; tool; weapon</annotation> + <annotation cp='[๐ก]' tts='shield'>weapon</annotation> + <annotation cp='[๐น]' tts='bow and arrow'>archer; arrow; bow; sagittarius; tool; weapon; zodiac</annotation> + <annotation cp='[๐]' tts='chequered flag'>checkered; chequered; racing</annotation> + <annotation cp='[๐ณ]' tts='waving white flag'>waving</annotation> + <annotation cp='[๐ด]' tts='waving black flag'>waving</annotation> + <annotation cp='[๐ฉ]' tts='triangular flag'>post</annotation> + <annotation cp='[๐ฌ]' tts='smoking'>smoking</annotation> + <annotation cp='[โฐ]' tts='coffin'>death</annotation> + <annotation cp='[โฑ]' tts='funeral urn'>death; funeral; urn</annotation> + <annotation cp='[๐ฟ]' tts='moai'>face; moyai; statue</annotation> + <annotation cp='[๐ข]' tts='oil drum'>drum; oil</annotation> + <annotation cp='[๐ฎ]' tts='crystal ball'>ball; crystal; fairy tale; fantasy; fortune; tool</annotation> + <annotation cp='[๐ง]' tts='ATM sign'>atm; automated; bank; teller</annotation> + <annotation cp='[๐ฎ]' tts='litter in bin sign'>litter; litterbox</annotation> + <annotation cp='[๐ฐ]' tts='potable water'>drink; potable; water</annotation> + <annotation cp='[โฟ]' tts='wheelchair'>access</annotation> + <annotation cp='[๐น]' tts='menโs room'>lavatory; man; restroom; wc</annotation> + <annotation cp='[๐บ]' tts='womenโs room'>lavatory; restroom; wc; woman</annotation> + <annotation cp='[๐ป]' tts='restroom'>lavatory; wc</annotation> + <annotation cp='[๐ผ]' tts='baby symbol'>baby; changing</annotation> + <annotation cp='[๐พ]' tts='water closet'>closet; lavatory; restroom; water; wc</annotation> + <annotation cp='[๐]' tts='passport control'>control; passport</annotation> + <annotation cp='[๐]' tts='customs'>customs</annotation> + <annotation cp='[๐]' tts='baggage claim'>baggage; claim</annotation> + <annotation cp='[๐
]' tts='left luggage'>baggage; locker; luggage</annotation> + <annotation cp='[โ ]' tts='warning'>warning</annotation> + <annotation cp='[๐ธ]' tts='children crossing'>child; crossing; pedestrian; traffic</annotation> + <annotation cp='[โ]' tts='no entry'>entry; forbidden; no; not; prohibited; traffic</annotation> + <annotation cp='[๐ซ]' tts='prohibited'>entry; forbidden; no; not</annotation> + <annotation cp='[๐ณ]' tts='no bicycles'>bicycle; bike; forbidden; no; not; prohibited; vehicle</annotation> + <annotation cp='[๐ญ]' tts='no smoking'>forbidden; no; not; prohibited; smoking</annotation> + <annotation cp='[๐ฏ]' tts='no littering'>forbidden; litter; no; not; prohibited</annotation> + <annotation cp='[๐ฑ]' tts='non-potable water'>drink; forbidden; no; not; potable; prohibited; water</annotation> + <annotation cp='[๐ท]' tts='no pedestrians'>forbidden; no; not; pedestrian; prohibited</annotation> + <annotation cp='[โข]' tts='radioactive'>radioactive</annotation> + <annotation cp='[โฃ]' tts='biohazard'>biohazard</annotation> + <annotation cp='[โฌ]' tts='up arrow'>arrow; cardinal; direction; north</annotation> + <annotation cp='[โ]' tts='up-right arrow'>arrow; direction; intercardinal; northeast</annotation> + <annotation cp='[โก]' tts='right arrow'>arrow; cardinal; direction; east</annotation> + <annotation cp='[โ]' tts='down-right arrow'>arrow; direction; intercardinal; southeast</annotation> + <annotation cp='[โฌ]' tts='down arrow'>arrow; cardinal; direction; down; south</annotation> + <annotation cp='[โ]' tts='down-left arrow'>arrow; direction; intercardinal; southwest</annotation> + <annotation cp='[โฌ
]' tts='left arrow'>arrow; cardinal; direction; west</annotation> + <annotation cp='[โ]' tts='up-left arrow'>arrow; direction; intercardinal; northwest</annotation> + <annotation cp='[โ]' tts='up-down arrow'>arrow</annotation> + <annotation cp='[โ]' tts='left-right arrow'>arrow</annotation> + <annotation cp='[โฉ]' tts='right arrow curving left'>arrow</annotation> + <annotation cp='[โช]' tts='left arrow curving right'>arrow</annotation> + <annotation cp='[โคด]' tts='right arrow curving up'>arrow</annotation> + <annotation cp='[โคต]' tts='right arrow curving down'>arrow; down</annotation> + <annotation cp='[๐]' tts='clockwise vertical arrows'>arrow; clockwise; reload</annotation> + <annotation cp='[๐]' tts='anticlockwise arrows button'>anticlockwise; arrow; counterclockwise; withershins</annotation> + <annotation cp='[๐]' tts='back arrow'>arrow; back</annotation> + <annotation cp='[๐]' tts='end arrow'>arrow; end</annotation> + <annotation cp='[๐]' tts='on! arrow'>arrow; mark; on</annotation> + <annotation cp='[๐]' tts='soon arrow'>arrow; soon</annotation> + <annotation cp='[๐]' tts='top arrow'>arrow; top; up</annotation> + <annotation cp='[๐]' tts='place of worship'>religion; worship</annotation> + <annotation cp='[โ]' tts='atom symbol'>atheist; atom</annotation> + <annotation cp='[๐]' tts='om'>hindu; religion</annotation> + <annotation cp='[โก]' tts='star of david'>david; jew; jewish; religion; star</annotation> + <annotation cp='[โธ]' tts='wheel of dharma'>buddhist; dharma; religion; wheel</annotation> + <annotation cp='[โฏ]' tts='yin yang'>religion; tao; taoist; yang; yin</annotation> + <annotation cp='[โ]' tts='latin cross'>christian; cross; religion</annotation> + <annotation cp='[โฆ]' tts='orthodox cross'>christian; cross; religion</annotation> + <annotation cp='[โช]' tts='star and crescent'>islam; muslim; religion</annotation> + <annotation cp='[โฎ]' tts='peace symbol'>peace</annotation> + <annotation cp='[๐]' tts='menorah'>candelabrum; candlestick; religion</annotation> + <annotation cp='[๐ฏ]' tts='dotted six-pointed star'>fortune; star</annotation> + <annotation cp='[โป]' tts='recycling symbol'>recycle</annotation> + <annotation cp='[๐]' tts='name badge'>badge; name</annotation> + <annotation cp='[โ]' tts='fleur-de-lis'>fleur-de-lis</annotation> + <annotation cp='[๐ฐ]' tts='japanese symbol for beginner'>beginner; chevron; green; japanese; leaf; tool; yellow</annotation> + <annotation cp='[๐ฑ]' tts='trident emblem'>anchor; emblem; ship; tool; trident</annotation> + <annotation cp='[โญ]' tts='heavy large circle'>circle; o</annotation> + <annotation cp='[โ
]' tts='white heavy check mark'>check; mark</annotation> + <annotation cp='[โ]' tts='ballot box with check'>ballot; box; check</annotation> + <annotation cp='[โ]' tts='heavy check mark'>check; mark</annotation> + <annotation cp='[โ]' tts='heavy multiplication x'>cancel; multiplication; multiply; x</annotation> + <annotation cp='[โ]' tts='cross mark'>cancel; mark; multiplication; multiply; x</annotation> + <annotation cp='[โ]' tts='cross mark button'>mark; square</annotation> + <annotation cp='[โ]' tts='heavy plus sign'>math; plus</annotation> + <annotation cp='[โ]' tts='heavy minus sign'>math; minus</annotation> + <annotation cp='[โ]' tts='heavy division sign'>division; math</annotation> + <annotation cp='[โฐ]' tts='curly loop'>curl; loop</annotation> + <annotation cp='[โฟ]' tts='double curly loop'>curl; double; loop</annotation> + <annotation cp='[ใฝ]' tts='part alternation mark'>mark; part</annotation> + <annotation cp='[โณ]' tts='eight-spoked asterisk'>asterisk</annotation> + <annotation cp='[โด]' tts='eight-pointed star'>star</annotation> + <annotation cp='[โ]' tts='sparkle'>sparkle</annotation> + <annotation cp='[๐ฑ]' tts='currency exchange'>bank; currency; exchange; money</annotation> + <annotation cp='[๐ฒ]' tts='heavy dollar sign'>currency; dollar; money</annotation> + <annotation cp='[โผ]' tts='double exclamation mark'>bangbang; exclamation; mark; punctuation</annotation> + <annotation cp='[โ]' tts='exclamation question mark'>exclamation; interrobang; mark; punctuation; question</annotation> + <annotation cp='[โ]' tts='question mark'>mark; punctuation; question</annotation> + <annotation cp='[โ]' tts='white question mark'>mark; outlined; punctuation; question</annotation> + <annotation cp='[โ]' tts='white exclamation mark'>exclamation; mark; outlined; punctuation</annotation> + <annotation cp='[โ]' tts='exclamation mark'>exclamation; mark; punctuation</annotation> + <annotation cp='[ใฐ]' tts='wavy dash'>dash; punctuation; wavy</annotation> + <annotation cp='[ยฉ]' tts='copyright'>copyright</annotation> + <annotation cp='[ยฎ]' tts='registered'>registered</annotation> + <annotation cp='[โข]' tts='trade mark'>mark; tm; trademark</annotation> + <annotation cp='[โ]' tts='aries'>ram; zodiac</annotation> + <annotation cp='[โ]' tts='taurus'>bull; ox; zodiac</annotation> + <annotation cp='[โ]' tts='gemini'>twins; zodiac</annotation> + <annotation cp='[โ]' tts='cancer'>crab; zodiac</annotation> + <annotation cp='[โ]' tts='leo'>lion; zodiac</annotation> + <annotation cp='[โ]' tts='virgo'>maiden; virgin; zodiac</annotation> + <annotation cp='[โ]' tts='libra'>balance; justice; scales; zodiac</annotation> + <annotation cp='[โ]' tts='scorpius'>scorpio; scorpion; zodiac</annotation> + <annotation cp='[โ]' tts='sagittarius'>archer; zodiac</annotation> + <annotation cp='[โ]' tts='capricorn'>goat; zodiac</annotation> + <annotation cp='[โ]' tts='aquarius'>bearer; water; zodiac</annotation> + <annotation cp='[โ]' tts='pisces'>fish; zodiac</annotation> + <annotation cp='[โ]' tts='ophiuchus'>bearer; serpent; snake; zodiac</annotation> + <annotation cp='[๐]' tts='shuffle tracks button'>arrow; crossed</annotation> + <annotation cp='[๐]' tts='repeat button'>arrow; clockwise; repeat</annotation> + <annotation cp='[๐]' tts='repeat single button'>arrow; clockwise; once</annotation> + <annotation cp='[โถ]' tts='play button'>arrow; play; right; triangle</annotation> + <annotation cp='[โฉ]' tts='fast-forword button'>arrow; double; fast; forward</annotation> + <annotation cp='[โญ]' tts='next track button'>arrow; next scene; next track; triangle</annotation> + <annotation cp='[โฏ]' tts='play or pause button'>arrow; pause; play; right; triangle</annotation> + <annotation cp='[โ]' tts='reverse button'>arrow; left; reverse; triangle</annotation> + <annotation cp='[โช]' tts='fast reverse button'>arrow; double; rewind</annotation> + <annotation cp='[โฎ]' tts='last track button'>arrow; previous scene; previous track; triangle</annotation> + <annotation cp='[๐ผ]' tts='up button'>arrow; button; red</annotation> + <annotation cp='[โซ]' tts='fast up button'>arrow; double</annotation> + <annotation cp='[๐ฝ]' tts='down button'>arrow; button; down; red</annotation> + <annotation cp='[โฌ]' tts='fast down button'>arrow; double; down</annotation> + <annotation cp='[โธ]' tts='pause button'>bar; double; pause; vertical</annotation> + <annotation cp='[โน]' tts='stop button'>square; stop</annotation> + <annotation cp='[โบ]' tts='record button'>circle; record</annotation> + <annotation cp='[โ]' tts='eject button'>eject</annotation> + <annotation cp='[๐ฆ]' tts='cinema'>camera; film; movie</annotation> + <annotation cp='[๐
]' tts='dim button'>brightness; dim; low</annotation> + <annotation cp='[๐]' tts='bright button'>bright; brightness</annotation> + <annotation cp='[๐ถ]' tts='antenna bars'>antenna; bar; cell; mobile; phone; signal; telephone</annotation> + <annotation cp='[๐ต]' tts='no mobile phones'>cell; forbidden; mobile; no; not; phone; prohibited; telephone</annotation> + <annotation cp='[๐ณ]' tts='vibration mode'>cell; mobile; mode; phone; telephone; vibration</annotation> + <annotation cp='[๐ด]' tts='mobile phone off'>cell; mobile; off; phone; telephone</annotation> + <annotation cp='[{#โฃ}]' tts='keycap number'>hash; keycap; pound</annotation> + <annotation cp='[{*โฃ}]' tts='keycap asterisk'>asterisk; keycap; star</annotation> + <annotation cp='[{0โฃ}]' tts='keycap digit zero'>0; keycap; zero</annotation> + <annotation cp='[{1โฃ}]' tts='keycap digit one'>1; keycap; one</annotation> + <annotation cp='[{2โฃ}]' tts='keycap digit two'>2; keycap; two</annotation> + <annotation cp='[{3โฃ}]' tts='keycap digit three'>3; keycap; three</annotation> + <annotation cp='[{4โฃ}]' tts='keycap digit four'>4; four; keycap</annotation> + <annotation cp='[{5โฃ}]' tts='keycap digit five'>5; five; keycap</annotation> + <annotation cp='[{6โฃ}]' tts='keycap digit six'>6; keycap; six</annotation> + <annotation cp='[{7โฃ}]' tts='keycap digit seven'>7; keycap; seven</annotation> + <annotation cp='[{8โฃ}]' tts='keycap digit eight'>8; eight; keycap</annotation> + <annotation cp='[{9โฃ}]' tts='keycap digit nine'>9; keycap; nine</annotation> + <annotation cp='[๐]' tts='keycap ten'>10; keycap; ten</annotation> + <annotation cp='[๐ฏ]' tts='hundred points'>100; full; hundred; score</annotation> + <annotation cp='[๐]' tts='no one under eighteen'>18; age restriction; eighteen; forbidden; no; not; prohibited; underage</annotation> + <annotation cp='[๐ ]' tts='input latin uppercase'>input; latin; letters; uppercase</annotation> + <annotation cp='[๐ก]' tts='input latin lowercase'>abcd; input; latin; letters; lowercase</annotation> + <annotation cp='[๐ข]' tts='input numbers'>1234; input; numbers</annotation> + <annotation cp='[๐ฃ]' tts='input symbols'>input</annotation> + <annotation cp='[๐ค]' tts='input latin letters'>abc; alphabet; input; latin; letters</annotation> + <annotation cp='[๐
ฐ]' tts='a button'>a; blood</annotation> + <annotation cp='[๐]' tts='ab button'>ab; blood</annotation> + <annotation cp='[๐
ฑ]' tts='b button'>b; blood</annotation> + <annotation cp='[๐]' tts='squared cl'>cl</annotation> + <annotation cp='[๐]' tts='squared cool'>cool</annotation> + <annotation cp='[๐]' tts='squared free'>free</annotation> + <annotation cp='[โน]' tts='information source'>i; information</annotation> + <annotation cp='[๐]' tts='squared id'>id; identity</annotation> + <annotation cp='[โ]' tts='circled letter m'>circle; m</annotation> + <annotation cp='[๐]' tts='squared new'>new</annotation> + <annotation cp='[๐]' tts='squared ng'>ng</annotation> + <annotation cp='[๐
พ]' tts='o button'>blood; o</annotation> + <annotation cp='[๐]' tts='squared ok'>ok</annotation> + <annotation cp='[๐
ฟ]' tts='p button'>parking</annotation> + <annotation cp='[๐]' tts='squared sos'>help; sos</annotation> + <annotation cp='[๐]' tts='up! button'>mark; up</annotation> + <annotation cp='[๐]' tts='squared vs'>versus; vs</annotation> + <annotation cp='[๐]' tts='squared katakana koko'>japanese</annotation> + <annotation cp='[๐]' tts='squared katakana sa'>japanese</annotation> + <annotation cp='[๐ท]' tts='squared moon ideograph'>japanese</annotation> + <annotation cp='[๐ถ]' tts='squared exist ideograph'>japanese</annotation> + <annotation cp='[๐ฏ]' tts='squared finger ideograph'>japanese</annotation> + <annotation cp='[๐]' tts='circled advantage ideograph'>japanese</annotation> + <annotation cp='[๐น]' tts='squared divide ideograph'>japanese</annotation> + <annotation cp='[๐]' tts='squared negation ideograph'>japanese</annotation> + <annotation cp='[๐ฒ]' tts='squared prohibit ideograph'>japanese</annotation> + <annotation cp='[๐]' tts='circled accept ideograph'>chinese</annotation> + <annotation cp='[๐ธ]' tts='squared apply ideograph'>chinese</annotation> + <annotation cp='[๐ด]' tts='squared together ideograph'>chinese</annotation> + <annotation cp='[๐ณ]' tts='squared empty ideograph'>chinese</annotation> + <annotation cp='[ใ]' tts='circled congratulate ideograph'>chinese; congratulation; congratulations; ideograph</annotation> + <annotation cp='[ใ]' tts='circled secret ideograph'>chinese; ideograph; secret</annotation> + <annotation cp='[๐บ]' tts='squared operating ideograph'>chinese</annotation> + <annotation cp='[๐ต]' tts='squared fullness ideograph'>chinese</annotation> + <annotation cp='[โช]' tts='black small square'>geometric; square</annotation> + <annotation cp='[โซ]' tts='white small square'>geometric; square</annotation> + <annotation cp='[โป]' tts='white medium square'>geometric; square</annotation> + <annotation cp='[โผ]' tts='black medium square'>geometric; square</annotation> + <annotation cp='[โฝ]' tts='white medium-small square'>geometric; square</annotation> + <annotation cp='[โพ]' tts='black medium-small square'>geometric; square</annotation> + <annotation cp='[โฌ]' tts='black large square'>geometric; square</annotation> + <annotation cp='[โฌ]' tts='white large square'>geometric; square</annotation> + <annotation cp='[๐ถ]' tts='large orange diamond'>diamond; geometric; orange</annotation> + <annotation cp='[๐ท]' tts='large blue diamond'>blue; diamond; geometric</annotation> + <annotation cp='[๐ธ]' tts='small orange diamond'>diamond; geometric; orange</annotation> + <annotation cp='[๐น]' tts='small blue diamond'>blue; diamond; geometric</annotation> + <annotation cp='[๐บ]' tts='red triangle pointed up'>geometric; red</annotation> + <annotation cp='[๐ป]' tts='red triangle pointed down'>down; geometric; red</annotation> + <annotation cp='[๐ ]' tts='diamond with a dot'>comic; diamond; geometric; inside</annotation> + <annotation cp='[๐]' tts='radio button'>button; geometric; radio</annotation> + <annotation cp='[๐ฒ]' tts='black square button'>button; geometric; square</annotation> + <annotation cp='[๐ณ]' tts='white square button'>button; geometric; outlined; square</annotation> + <annotation cp='[โช]' tts='white circle'>circle; geometric</annotation> + <annotation cp='[โซ]' tts='black circle'>circle; geometric</annotation> + <annotation cp='[๐ด]' tts='red circle'>circle; geometric; red</annotation> + <annotation cp='[๐ต]' tts='blue circle'>blue; circle; geometric</annotation> + </annotations> +</ldml>
\ No newline at end of file diff --git a/ibus.spec.in b/ibus.spec.in index 7fdaccb2..40aead16 100644 --- a/ibus.spec.in +++ b/ibus.spec.in @@ -5,6 +5,7 @@ # Build flags %define build_python_library 0 +%define build_emoji_dictionary 1 %define glib_ver %([ -a %{_libdir}/pkgconfig/glib-2.0.pc ] && pkg-config --modversion glib-2.0 | cut -d. -f 1,2 || echo -n "999") %define gconf2_version 2.12.0 @@ -40,6 +41,10 @@ BuildRequires: dconf-devel BuildRequires: pygobject2-devel BuildRequires: intltool BuildRequires: iso-codes-devel +%if %build_emoji_dictionary +BuildRequires: nodejs-emojione +BuildRequires: json-glib +%endif Requires: %{name}-libs = %{version}-%{release} Requires: %{name}-gtk2 = %{version}-%{release} @@ -151,6 +156,12 @@ OPTIONS="$OPTIONS --enable-python-library" %else OPTIONS="$OPTIONS --disable-python-library" %endif +%if %build_emoji_dictionary +OPTIONS="$OPTIONS --enable-emoji-dict" +%else +OPTIONS="$OPTIONS --disable-emoji-dict" +%endif + %configure $OPTIONS @@ -258,6 +269,9 @@ dconf update &> /dev/null || : %{_bindir}/ibus-setup %{_datadir}/ibus/component/gtkpanel.xml %{_datadir}/ibus/component/simple.xml +%if %build_emoji_dictionary +%{_datadir}/ibus/dicts +%endif %{_datadir}/ibus/keymaps/* %{_datadir}/ibus/setup/* diff --git a/src/Makefile.am b/src/Makefile.am index 22e031fb..b58ab951 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -29,15 +29,6 @@ endif SUBDIRS = . $(TESTS_DIR) -IBUS_V_wget = $(ibus__v_wget_@AM_V@) -ibus__v_wget_ = $(ibus__v_wget_@AM_DEFAULT_V@) -ibus__v_wget_0 = -nv -ibus__v_wget_1 = -IBUS_V_diff = $(ibus__v_diff_@AM_V@) -ibus__v_diff_ = $(ibus__v_diff_@AM_DEFAULT_V@) -ibus__v_diff_0 = -q -ibus__v_diff_1 = - # libibus = libibus-@IBUS_API_VERSION@.la libibus = libibus-1.0.la @@ -248,37 +239,25 @@ dict_DATA = emoji.dict noinst_PROGRAMS = emoji-parser -emoji-list.html: - $(AM_V_at)wget $(IBUS_V_wget) \ - http://ibus.github.io/files/ibus/emoji-list.html - $(AM_V_at)wget $(IBUS_V_wget) \ - http://unicode.org/emoji/charts/emoji-list.html \ - -O latest-emoji-list.html - $(AM_V_at)diff $(IBUS_V_diff) emoji-list.html latest-emoji-list.html; \ - if test $$? -ne 0; then \ - echo "#### WARNING: emoji-list.html is old." >&2; \ - fi; \ - rm latest-emoji-list.html; - -emoji.dict: emoji-parser emoji-list.html - $(builddir)/emoji-parser emoji-list.html $@ +emoji.dict: emoji-parser + $(builddir)/emoji-parser --xml $(srcdir)/../data/annotations/en.xml \ + --json $(EMOJI_JSON_FILE) --out $@ emoji_parser_SOURCES = \ emoji-parser.c \ $(NULL) emoji_parser_CFLAGS = \ $(GLIB2_CFLAGS) \ - $(LIBXML2_CFLAGS) \ + $(JSON_GLIB1_CFLAGS) \ $(NULL) emoji_parser_LDADD = \ $(GLIB2_LIBS) \ - $(LIBXML2_LIBS) \ + $(JSON_GLIB1_LIBS) \ $(libibus) \ $(NULL) CLEANFILES += \ $(dict_DATA) \ - emoji-list.html \ $(NULL) endif diff --git a/src/emoji-parser.c b/src/emoji-parser.c index cf92feea..e97f2660 100644 --- a/src/emoji-parser.c +++ b/src/emoji-parser.c @@ -20,47 +20,59 @@ * USA */ -/* Convert http://www.unicode.org/emoji/charts/emoji-list.html +/* Convert ../data/annotations/en.xml and + * /usr/lib/node_modules/emojione/emoji.json * to the dictionary file which look up the Emoji from the annotation. + * Get emoji.json with 'npm install -g emojione'. + * en.xml is used for the Unicode annotations and emoji.json is used + * for the aliases_ascii, e.g. ":)", and category, e.g. "people". */ #include <glib.h> -#include <libxml/HTMLparser.h> -#include <libgen.h> +#include <json-glib/json-glib.h> + +#include <string.h> #include "ibusutil.h" typedef struct _EmojiData EmojiData; struct _EmojiData { - gchar *class; gchar *emoji; - GSList *annotates; - GSList *prev_annotates; + GSList *annotations; + gboolean is_annotation; GHashTable *dict; }; -const gchar *progname; - -static gboolean parse_node (xmlNode *node, - gboolean is_child, - const gchar *prop_name, - EmojiData *data); - static void -usage (void) +reset_emoji_element (EmojiData *data) { - g_print ("%s emoji-list.html emoji.dict\n", progname); + g_assert (data != NULL); + + g_clear_pointer (&data->emoji, g_free); + g_slist_free_full (data->annotations, g_free); + data->annotations = NULL; } static void -reset_emoji_element (EmojiData *data) +update_emoji_dict (EmojiData *data) { - g_clear_pointer (&data->class, g_free); - g_clear_pointer (&data->emoji, g_free); - if (data->annotates) { - g_slist_free_full (data->prev_annotates, g_free); - data->prev_annotates = data->annotates; - data->annotates = NULL; + GSList *annotations = data->annotations; + while (annotations) { + const gchar *annotation = (const gchar *) annotations->data; + GSList *emojis = g_hash_table_lookup (data->dict, annotation); + if (emojis) { + GSList *duplicated = g_slist_find_custom (emojis, + data->emoji, + (GCompareFunc) g_strcmp0); + if (duplicated != NULL) + continue; + emojis = g_slist_copy_deep (emojis, (GCopyFunc) g_strdup, NULL); + } + emojis = g_slist_append (emojis, g_strdup (data->emoji)); + g_hash_table_replace (data->dict, + g_strdup (annotation), + emojis); + annotations = annotations->next; } } @@ -70,147 +82,486 @@ free_dict_words (gpointer list) g_slist_free_full (list, g_free); } -static gboolean -parse_attr (xmlAttr *attr, - EmojiData *data) -{ - if (g_strcmp0 ((const gchar *) attr->name, "class") == 0 && attr->children) - parse_node (attr->children, TRUE, (const gchar *) attr->name, data); - if (g_strcmp0 ((const gchar *) attr->name, "target") == 0 && attr->children) - parse_node (attr->children, TRUE, (const gchar *) attr->name, data); - if (attr->next) - parse_attr (attr->next, data); - return TRUE; -} +static void +unicode_annotations_start_element_cb (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + EmojiData *data = (EmojiData *) user_data; + int i; + const gchar *attribute; + const gchar *value; -static gboolean -parse_node (xmlNode *node, - gboolean is_child, - const gchar *prop_name, - EmojiData *data) -{ - if (g_strcmp0 ((const gchar *) node->name, "tr") == 0) { - GSList *annotates = data->annotates; - while (annotates) { - GSList *emojis = g_hash_table_lookup (data->dict, annotates->data); - if (emojis) { - emojis = g_slist_copy_deep (emojis, (GCopyFunc) g_strdup, NULL); + g_assert (data != NULL); + + if (g_strcmp0 (element_name, "annotation") != 0) + return; + + reset_emoji_element (data); + + for (i = 0; (attribute = attribute_names[i]) != NULL; i++) { + value = attribute_values[i]; + + if (g_strcmp0 (attribute, "cp") == 0) { + if (value == NULL || *value == '\0') { + g_warning ("cp='' in unicode.org annotations file"); + return; + } else if (value[0] != '[' || value[strlen(value) - 1] != ']') { + g_warning ("cp!='[emoji]' in unicode.org annotations file"); + return; } - emojis = g_slist_append (emojis, g_strdup (data->emoji)); - g_hash_table_replace (data->dict, - g_strdup (annotates->data), - emojis); - annotates = annotates->next; + data->emoji = g_strndup (value + 1, strlen(value) - 2); } - reset_emoji_element (data); - } - /* if node->name is "text" and is_child is FALSE, - * it's '\n' or Space between <td> and <td>. - */ - if (g_strcmp0 ((const gchar *) node->name, "text") == 0 && is_child) { - /* Get "chars" in <td class="chars"> */ - if (g_strcmp0 (prop_name, "class") == 0) { - if (g_strcmp0 (data->class, (const gchar *) node->content) != 0) { - g_clear_pointer (&data->class, g_free); - data->class = g_strdup ((const gchar *) node->content); + else if (g_strcmp0 (attribute, "tts") == 0) { + GSList *duplicated = g_slist_find_custom (data->annotations, + value, + (GCompareFunc) g_strcmp0); + if (duplicated == NULL) { + data->annotations = g_slist_prepend (data->annotations, + g_strdup (value)); } } - /* Get "annotate" in <td class="name"><a target="annotate"> */ - if (g_strcmp0 (prop_name, "target") == 0 && - g_strcmp0 (data->class, "name") == 0) { - g_clear_pointer (&data->class, g_free); - data->class = g_strdup ((const gchar *) node->content); - } - /* Get "emoji" in <td class="chars">emoji</td> */ - if (g_strcmp0 (prop_name, "td") == 0 && - g_strcmp0 (data->class, "chars") == 0) { - data->emoji = g_strdup ((const gchar *) node->content); - } - /* We ignore "NAME" for <td class="name">NAME</td> but - * takes "ANNOTATE" for - * <td class="name"><a target="annotate">ANNOTATE</a></td> - */ - if (g_strcmp0 (prop_name, "td") == 0 && - g_strcmp0 (data->class, "name") == 0) { - g_slist_free_full (data->annotates, g_free); - data->annotates = NULL; + } + + data->is_annotation = TRUE; +} + +static void +unicode_annotations_end_element_cb (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error) +{ + EmojiData *data = (EmojiData *) user_data; + + g_assert (data != NULL); + if (!data->is_annotation) + return; + + update_emoji_dict (data); + data->is_annotation = FALSE; +} + +void +unicode_annotations_text_cb (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + EmojiData *data = (EmojiData *) user_data; + gchar **annotations = NULL; + const gchar *annotation; + int i; + + g_assert (data != NULL); + if (!data->is_annotation) + return; + annotations = g_strsplit (text, "; ", -1); + for (i = 0; (annotation = annotations[i]) != NULL; i++) { + GSList *duplicated = g_slist_find_custom (data->annotations, + annotation, + (GCompareFunc) g_strcmp0); + if (duplicated == NULL) { + data->annotations = g_slist_prepend (data->annotations, + g_strdup (annotation)); } - /* Get "ANNOTATE" in - * <td class="name"><a target="annotate">ANNOTATE</a></td> - */ - if (g_strcmp0 (prop_name, "a") == 0 && - g_strcmp0 (data->class, "annotate") == 0) { - data->annotates = - g_slist_append (data->annotates, - g_strdup ((const gchar *) node->content)); + } + g_strfreev (annotations); +} + +static gboolean +unicode_annotations_parse_xml_file (const gchar *filename, + GHashTable *dict) +{ + gchar *content = NULL; + gsize length = 0; + GError *error = NULL; + const static GMarkupParser parser = { + unicode_annotations_start_element_cb, + unicode_annotations_end_element_cb, + unicode_annotations_text_cb, + NULL, + NULL + }; + GMarkupParseContext *context = NULL; + EmojiData data = { 0, }; + + g_return_val_if_fail (filename != NULL, FALSE); + g_return_val_if_fail (dict != NULL, FALSE); + + if (!g_file_get_contents (filename, &content, &length, &error)) { + g_warning ("Failed to load %s: %s", filename, error->message); + goto failed_to_parse_unicode_annotations; + } + + data.dict = dict; + + context = g_markup_parse_context_new (&parser, 0, &data, NULL); + if (!g_markup_parse_context_parse (context, content, length, &error)) { + g_warning ("Failed to parse %s: %s", filename, error->message); + goto failed_to_parse_unicode_annotations; + } + + reset_emoji_element (&data); + g_markup_parse_context_free (context); + g_free (content); + return TRUE; + +failed_to_parse_unicode_annotations: + if (error) + g_error_free (error); + if (data.dict) + g_hash_table_destroy (data.dict); + if (context) + g_markup_parse_context_free (context); + g_free (content); + return FALSE; +} + +static gboolean +parse_emojione_unicode (JsonNode *node, + EmojiData *data) +{ + const gchar *str, *unicode; + gchar *endptr = NULL; + guint32 uch; + static gchar outbuf[8] = { 0, }; + GString *emoji; + + if (json_node_get_node_type (node) != JSON_NODE_VALUE) { + g_warning ("'unicode' element is not string"); + return FALSE; + } + + emoji = g_string_new (NULL); + str = unicode = json_node_get_string (node); + while (str && *str) { + uch = g_ascii_strtoull (str, &endptr, 16); + outbuf[g_unichar_to_utf8 (uch, outbuf)] = '\0'; + g_string_append (emoji, outbuf); + if (*endptr == '\0') { + break; + } else { + switch (*endptr) { + case '-': + endptr++; + break; + default: + g_warning ("Failed to parse unicode %s", unicode); + } } + str = endptr; + endptr = NULL; + } + + data->emoji = g_string_free (emoji, FALSE); + + return TRUE; +} + +static gboolean +parse_emojione_shortname (JsonNode *node, + EmojiData *data) +{ +#if 0 + const gchar *shortname; + gchar *head, *s; + int length; + GSList *duplicated; + + if (json_node_get_node_type (node) != JSON_NODE_VALUE) { + g_warning ("'shortname' element is not string"); + return FALSE; } - /* Get "foo" in <td class="foo"> */ - if (g_strcmp0 ((const gchar *) node->name, "td") == 0 && - node->properties != NULL) { - parse_attr (node->properties, data); + + /* The format is ':short_name:' */ + shortname = json_node_get_string (node); + if (shortname == 0 || *shortname == '\0') + return TRUE; + if (*shortname != ':') { + g_warning ("'shortname' format is different: %s", shortname); + return FALSE; } - /* Get "foo" in <a target="foo"> */ - if (g_strcmp0 ((const gchar *) node->name, "a") == 0 && - node->properties != NULL) { - parse_attr (node->properties, data); + + length = strlen (shortname); + head = g_new0 (gchar, length); + strcpy (head, shortname + 1); + for (s = head; *s; s++) { + if (*s == ':') { + *s = '\0'; + break; + } else if (*s == '_') { + *s = ' '; + } } - if (node->children) { - parse_node (node->children, TRUE, (const gchar *) node->name, data); + + if (head == NULL || *head == '\0') { + g_warning ("'shortname' format is different: %s", shortname); + g_free (head); + return FALSE; + } + + duplicated = g_slist_find_custom (data->annotations, + head, + (GCompareFunc) g_strcmp0); + if (duplicated == NULL) { + data->annotations = g_slist_prepend (data->annotations, + head); } else { - /* If annotate is NULL likes <td class="name"></td>, - * the previous emoji cell has the same annotate. - */ - if (g_strcmp0 ((const gchar *) node->name, "td") == 0 && - g_strcmp0 (data->class, "name") == 0) { - data->annotates = g_slist_copy_deep (data->prev_annotates, - (GCopyFunc) g_strdup, - NULL); + g_free (head); + } + +#endif + return TRUE; +} + +static gboolean +parse_emojione_category (JsonNode *node, + EmojiData *data) +{ + const gchar *category; + GSList *duplicated; + + if (json_node_get_node_type (node) != JSON_NODE_VALUE) { + g_warning ("'category' element is not string"); + return FALSE; + } + + category = json_node_get_string (node); + + if (category == NULL || *category == '\0') + return TRUE; + + duplicated = g_slist_find_custom (data->annotations, + category, + (GCompareFunc) g_strcmp0); + if (duplicated == NULL) { + data->annotations = g_slist_prepend (data->annotations, + g_strdup (category)); + } + + return TRUE; +} + +static gboolean +parse_emojione_aliases_ascii (JsonNode *node, + EmojiData *data) +{ + JsonArray *aliases_ascii; + guint i, length; + + if (json_node_get_node_type (node) != JSON_NODE_ARRAY) { + g_warning ("'aliases_ascii' element is not array"); + return FALSE; + } + + aliases_ascii = json_node_get_array (node); + length = json_array_get_length (aliases_ascii); + for (i = 0; i < length; i++) { + const gchar *alias = json_array_get_string_element (aliases_ascii, i); + GSList *duplicated = g_slist_find_custom (data->annotations, + alias, + (GCompareFunc) g_strcmp0); + if (duplicated == NULL) { + data->annotations = g_slist_prepend (data->annotations, + g_strdup (alias)); } } - if (node->next) - parse_node (node->next, FALSE, (const gchar *) node->name, data); return TRUE; } -static GHashTable * -parse_html (const gchar *filename) +static gboolean +parse_emojione_keywords (JsonNode *node, + EmojiData *data) { - xmlDoc *doc = htmlParseFile (filename, "utf-8"); - EmojiData data = { 0, }; +#if 0 + JsonArray *keywords; + guint i, length; - if (doc == NULL || doc->children == NULL) { - g_warning ("Parse Error in document type: %x", - doc ? doc->type : 0); + if (json_node_get_node_type (node) != JSON_NODE_ARRAY) { + g_warning ("'keywords' element is not array"); return FALSE; } - data.dict = g_hash_table_new_full (g_str_hash, - g_str_equal, - g_free, - free_dict_words); - parse_node (doc->children, TRUE, (const gchar *) doc->name, &data); + keywords = json_node_get_array (node); + length = json_array_get_length (keywords); + for (i = 0; i < length; i++) { + const gchar *keyword = json_array_get_string_element (keywords, i); + GSList *duplicated = g_slist_find_custom (data->annotations, + keyword, + (GCompareFunc) g_strcmp0); + if (duplicated == NULL) { + data->annotations = g_slist_prepend (data->annotations, + g_strdup (keyword)); + } + } +#endif + return TRUE; +} + +static gboolean +parse_emojione_emoji_data (JsonNode *node, + const gchar *member, + EmojiData *data) +{ + if (g_strcmp0 (member, "unicode") == 0) + return parse_emojione_unicode (node, data); + else if (g_strcmp0 (member, "shortname") == 0) + return parse_emojione_shortname (node, data); + else if (g_strcmp0 (member, "category") == 0) + return parse_emojione_category (node, data); + else if (g_strcmp0 (member, "aliases_ascii") == 0) + return parse_emojione_aliases_ascii (node, data); + else if (g_strcmp0 (member, "keywords") == 0) + return parse_emojione_keywords (node, data); + return TRUE; +} + +static gboolean +parse_emojione_element (JsonNode *node, + EmojiData *data) +{ + JsonObject *object; + GList *members, *m; + + if (json_node_get_node_type (node) != JSON_NODE_OBJECT) { + return FALSE; + } + + reset_emoji_element (data); + + object = json_node_get_object (node); + m = members = json_object_get_members (object); + while (m) { + const gchar *member = (const gchar *) m->data; + if (!parse_emojione_emoji_data (json_object_get_member (object, member), + member, + data)) { + g_list_free (members); + return FALSE; + } + m = m->next; + } + g_list_free (members); + + update_emoji_dict (data); + + return TRUE; +} + +static gboolean +emojione_parse_json_file (const gchar *filename, + GHashTable *dict) +{ + JsonParser *parser = json_parser_new (); + JsonNode *node; + JsonObject *object; + GList *members, *m; + GError *error = NULL; + EmojiData data = { 0, }; + + g_return_val_if_fail (filename != NULL, FALSE); + g_return_val_if_fail (dict != NULL, FALSE); + + if (!json_parser_load_from_file (parser, filename, &error)) { + g_error ("%s", error->message); + g_error_free (error); + goto fail_to_json_file; + } + + node = json_parser_get_root (parser); + if (json_node_get_node_type (node) != JSON_NODE_OBJECT) { + g_warning ("Json file does not have Json object %s", filename); + goto fail_to_json_file; + } + + object = json_node_get_object (node); + members = json_object_get_members (object); + data.dict = dict; + + m = members; + while (m) { + const gchar *member = (const gchar *) m->data; + if (!parse_emojione_element (json_object_get_member (object, member), + &data)) { + g_warning ("Failed to parse member '%s' in %s", member, filename); + } + m = m->next; + } + + g_list_free (members); reset_emoji_element (&data); - g_slist_free_full (data.prev_annotates, g_free); + g_object_unref (parser); + + return TRUE; - return data.dict; +fail_to_json_file: + g_object_unref (parser); + return FALSE; } int main (int argc, char *argv[]) { + gchar *prgname; + gchar *json_file = NULL; + gchar *xml_file = NULL; + gchar *output = NULL; + GOptionEntry entries[] = { + { "json", 'j', 0, G_OPTION_ARG_STRING, &json_file, + "Parse Emoji One JSON file", + "JSON" + }, + { "out", 'o', 0, G_OPTION_ARG_STRING, &output, + "Save the emoji dictionary as FILE", + "FILE" + }, + { "xml", 'x', 0, G_OPTION_ARG_STRING, &xml_file, + "Parse Unocode.org ANNOTATIONS file", + "ANNOTATIONS" + }, + { NULL } + }; + GOptionContext *context; + GError *error = NULL; GHashTable *dict; - progname = basename (argv[0]); + + prgname = g_path_get_basename (argv[0]); + g_set_prgname (prgname); + g_free (prgname); + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); if (argc < 3) { - usage (); + g_print ("%s", g_option_context_get_help (context, TRUE, NULL)); + g_option_context_free (context); + return -1; + } + + if (!g_option_context_parse (context, &argc, &argv, &error)) { + g_warning ("Failed options: %s", error->message); + g_error_free (error); return -1; } + g_option_context_free (context); - dict = parse_html (argv[1]); - ibus_emoji_dict_save (argv[2], dict); + dict = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + free_dict_words); + if (xml_file) + unicode_annotations_parse_xml_file (xml_file, dict); + if (json_file) + emojione_parse_json_file (json_file, dict); + if (g_hash_table_size (dict) > 0 && output) + ibus_emoji_dict_save (output, dict); g_hash_table_destroy (dict); return 0; |