Package: demoji
demojiAccurately find or removeemojisfrom a blob of text using
data from the Unicode Consortium'semoji code repository.Major Changes in Version 1.xVersion 1.x ofdemojinow bundles Unicode data in the package at install time rather than requiring
a download of the codes from unicode.org at runtime. Please see theCHANGELOG.mdfor detail and be familiar with the changes before updating from 0.x to 1.x.To report any regressions, pleaseopen a GitHub issue.Basic Usagedemojiexports several text-related functions for find-and-replace functionality with emojis:>>>tweet="""\... #startspreadingthenews yankees win great start by 🎅🏾 going 5strong innings with 5k’s🔥 🐂... solo homerun 🌋🌋 with 2 solo homeruns and👹 3run homerun… 🤡 🚣🏼 👨🏽‍⚖️ with rbi’s … 🔥🔥... 🇲🇽 and 🇳🇮 to close the game🔥🔥!!!….... WHAT A GAME!!..... """>>>demoji.findall(tweet){"🔥":"fire","🌋":"volcano","👨🏽\u200d⚖️":"man judge: medium skin tone","🎅🏾":"Santa Claus: medium-dark skin tone","🇲🇽":"flag: Mexico","👹":"ogre","🤡":"clown face","🇳🇮":"flag: Nicaragua","🚣🏼":"person rowing boat: medium-light skin tone","🐂":"ox",}Seebelowfor function API.Command-line UseYou can usedemojiorpython -m demojito replace emojis
in file(s) or stdin with their:code:equivalents:$catout.txt
Alldone!✨🍰✨
$demojiout.txt
Alldone!:sparkles::shortcake::sparkles:

$echo'All done! ✨ 🍰 ✨'|demoji
Alldone!:sparkles::shortcake::sparkles:

$demoji-
wedidntstartthe🔥
wedidntstartthe:fire:Referencefindall(string:str)->Dict[str,str]Find emojis withinstring.  Return a mapping of{emoji: description}.findall_list(string:str,desc:bool=True)->List[str]Find emojis withinstring.  Return a list (with possible duplicates).Ifdescis True, the list contains description codes.  Ifdescis False, the list contains emojis.replace(string:str,repl:str="")->strReplace emojis instringwithrepl.replace_with_desc(string:str,sep:str=":")->strReplace emojis instringwith their description codes.  The codes are surrounded bysep.last_downloaded_timestamp()->datetime.datetimeShow the timestamp of last download for the emoji data bundled with the package.Footnote: Emoji SequencesNumerous emojis that look like single Unicode characters are actually multi-character sequences.  Examples:The keycap 2️⃣ is actually 3 characters, U+0032 (the ASCII digit 2), U+FE0F (variation selector), and U+20E3 (combining enclosing keycap).The flag of Scotland 7 component characters,b'\\U0001f3f4\\U000e0067\\U000e0062\\U000e0073\\U000e0063\\U000e0074\\U000e007f'in full esaped notation.(You can see any of these throughs.encode("unicode-escape").)demojiis careful to handle this and should find the full sequences rather than their incomplete subcomponents.The way it does this it to sort emoji codes by their length, and then compile a concatenated regular expression that will greedily search for longer emojis first, falling back to shorter ones if not found.  This is not by any means a super-optimized way of searching as it has O(N2) properties, but the focus is on accuracy and completeness.>>>frompprintimportpprint>>>seq="""\... I bet you didn't know that 🙋, 🙋‍♂️, and 🙋‍♀️ are three different emojis.... """>>>pprint(seq.encode('unicode-escape'))# Python 3(b"I bet you didn't know that\\U0001f64b,\\U0001f64b\\u200d\\u2642\\ufe0f,"b' and\\U0001f64b\\u200d\\u2640\\ufe0f are three different emojis.\\n')Changelog1.1.0Add a__main.py__to allow runningpython -m demoji;
add an entry-pointdemojicommand;
permit stdin (-), file name(s), or piped stdin.
Contribution by @jap.1.0.0This is a backwards-incompatible release with several substantial changes.The largest change is thatdemojinow bundles a static copy of Unicode
emoji data with the package at install time, rather than requiring a runtime
download of the codes from unicode.org.Changes below are grouped by their correspondingSemantic Versioningidentifier.SemVer MAJOR:Drop support for Python 2 and Python 3.5Thedemojipackage now bundles emoji data that is distributed with the
package at install time, rather than requiring a download of the codes
from the unicode.org site at runtime (closes #23)As a result of the above change, the following functions areremovedfrom thedemojiAPI:download_codes()parse_unicode_sequence()parse_unicode_range()stream_unicodeorg_emojifile()SemVer MINOR:Thedemoji.DIRECTORYanddemoji.CACHEPATHattributes are deprecated
due to no longer being functionally in used by the package. Accessing them
will warn with aFutureWarning, and these attributes may be removed
completely in a future releasedemojican now be installed with optionalujsonsupport for faster loading
of emoji data from file (versus the standard library'sjson, which is the
default); usepython -m pip install demoji[ujson]The dependenciesrequestsandcoloramahave been removed completelyimportlib_resources(a backport module) is now required for Python < 3.7TheEMOJI_VERSIONattribute, newly added todemoji, is astrdenoting
the Unicode database version in useSemVer PATCH:Fix a typo indemoji.__all__to properly includedemoji.findall_list()Internal change: Functions that callset_emoji_pattern()are now decorated
with a@cache_setterto set the cacheSome unit tests have been removed to update the change in behavior from
downloading codes to bundling codes with installUpdate README to reflect bundling behavior0.4.0Update emoji source list to version 13.1. (See 5090eb5.)Formally support Python 3.9. (See 6e9c34c.)Bugfix: ensure thatdemoji.last_downloaded_timestamp()returns correct UTC time.
(See 6c8ad15.)0.3.0Feature: addfindall_list()andreplace_with_desc()functions. (See 7cea333.)Modernize setup config to usesetup.cfg. (See 8f141e7.)0.2.1Tox: formally add Python 3.8 tests.0.2.0Windows: use thecoloramapackage to support printing ANSI escape sequences on Windows;
this introduces colorama as a dependency.  (See cd343c1.)Setup: Fix a bug insetup.pythat would require dependencies to be installedprior toinstallation ofdemojiin order to find the__version__.
(See d5f429c.)Python 2 + Windows support: useio.open(..., encoding='utf-8')consistently insetup.py.
(See 1efec5d.)Distribution: use a universal wheel in PyPI release. (See 8636a32.)0.1.5Performance improvement: usere.escape()rather than failing to compile a small subset of codes.Remove an unused constant in__init__.py.