Skip to content

Commit eb4d093

Browse files
committed
feat: skin tone selection
- Filter emoji result with a skin tone parameter - Update notificator
1 parent 670f040 commit eb4d093

File tree

6 files changed

+117
-27
lines changed

6 files changed

+117
-27
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,9 @@ If you wish to use another language, open a GitHub issue [here](https://github.c
8787

8888
3. `📖 Emoji Dictionary` : Select your online emoji dictionary.
8989

90-
4. `🎷 Notification sound` : personalize the sound of the workflow notification.
90+
4. `🌈 Skin Tone` : Select your preferred skin tone.
91+
92+
5. `🎷 Notification sound` : Personalize the sound of the workflow notification.
9193

9294
### Search an emoji
9395

src/api.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,33 @@ def convert_emoji_to_png(emoji, name):
5858
draw.text(draw_position, emoji, font=font, embedded_color=True)
5959
image.save(f"{icons_folder_path}/{name.replace(':', '')}.png", "PNG")
6060

61+
def remove_skin_tones(emoji):
62+
skin_tone_range = range(0x1F3FB, 0x1F3FF + 1)
63+
clean_emoji = ''.join([char for char in emoji if ord(char) not in skin_tone_range])
64+
return clean_emoji
65+
66+
def get_skin_tones(emoji):
67+
skin_tones = []
68+
if emoji in cleaned_emojis:
69+
skin_tones.append('none')
70+
else:
71+
skin_tone_dict = {
72+
0x1F3FB: "light skin tone",
73+
0x1F3FC: "medium-light skin tone",
74+
0x1F3FD: "medium skin tone",
75+
0x1F3FE: "medium-dark skin tone",
76+
0x1F3FF: "dark skin tone"
77+
}
78+
for char in emoji:
79+
value_skin_tone = skin_tone_dict.get(ord(char))
80+
if value_skin_tone:
81+
skin_tones.append(value_skin_tone)
82+
if not skin_tones:
83+
skin_tones.append('base')
84+
return list(set(skin_tones))
85+
86+
skin_tones = ["light skin tone", "medium-light skin tone", "medium skin tone", "medium-dark skin tone", "dark skin tone"]
87+
6188
try:
6289
api_url = 'https://unicode.org/Public/emoji/latest/emoji-test.txt'
6390
api_response = request.urlopen(api_url).read().decode('utf-8')
@@ -72,9 +99,19 @@ def convert_emoji_to_png(emoji, name):
7299
root.extend(ET.fromstring(lang_response_2))
73100

74101
items = []
102+
cleaned_emojis = []
103+
full_emojis = []
104+
75105
for line in lines:
76106
array = re.split(r'\bfully-qualified\b|\bcomponent\b', line)[1].strip().split(' ', 3)
77107
emoji, name = array[1], array[-1]
108+
full_emojis.append({"emoji": emoji, "name": name})
109+
clean_emoji = remove_skin_tones(emoji)
110+
if emoji != clean_emoji:
111+
cleaned_emojis.append(clean_emoji)
112+
113+
for obj in full_emojis:
114+
emoji, name = obj['emoji'], obj['name']
78115
trim_emoji = re.sub('\uFE0F', '', emoji)
79116
for elem in root:
80117
tags_list = elem.find(f"./annotation[@cp='{trim_emoji}']")
@@ -101,7 +138,8 @@ def convert_emoji_to_png(emoji, name):
101138
'emoji': emoji,
102139
'title': title,
103140
'tags': tags,
104-
'image': image
141+
'image': image,
142+
'skin_tones': get_skin_tones(emoji)
105143
})
106144

107145
for item in langs:

src/info.plist

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1156,6 +1156,52 @@ note: not all emojis are available in all languages.</string>
11561156
<key>variable</key>
11571157
<string>emoji_dictionary</string>
11581158
</dict>
1159+
<dict>
1160+
<key>config</key>
1161+
<dict>
1162+
<key>default</key>
1163+
<string>all</string>
1164+
<key>pairs</key>
1165+
<array>
1166+
<array>
1167+
<string>🎨 All</string>
1168+
<string>all</string>
1169+
</array>
1170+
<array>
1171+
<string>👋 None</string>
1172+
<string>none</string>
1173+
</array>
1174+
<array>
1175+
<string>👋🏻 Light</string>
1176+
<string>light skin tone</string>
1177+
</array>
1178+
<array>
1179+
<string>👋🏼 Medium-Light</string>
1180+
<string>medium-light skin tone</string>
1181+
</array>
1182+
<array>
1183+
<string>👋🏽 Medium</string>
1184+
<string>medium skin tone</string>
1185+
</array>
1186+
<array>
1187+
<string>👋🏾 Medium-Dark</string>
1188+
<string>medium-dark skin tone</string>
1189+
</array>
1190+
<array>
1191+
<string>👋🏿 Dark</string>
1192+
<string>dark skin tone</string>
1193+
</array>
1194+
</array>
1195+
</dict>
1196+
<key>description</key>
1197+
<string>preferred skin tone.</string>
1198+
<key>label</key>
1199+
<string>🌈 Skin Tone</string>
1200+
<key>type</key>
1201+
<string>popupbutton</string>
1202+
<key>variable</key>
1203+
<string>skin_tone</string>
1204+
</dict>
11591205
<dict>
11601206
<key>config</key>
11611207
<dict>
@@ -1239,8 +1285,10 @@ note: not all emojis are available in all languages.</string>
12391285
<string>sound</string>
12401286
</dict>
12411287
</array>
1288+
<key>variablesdontexport</key>
1289+
<array/>
12421290
<key>version</key>
1243-
<string>1.4.0</string>
1291+
<string>1.5.0</string>
12441292
<key>webaddress</key>
12451293
<string>https://github.com/BenjaminOddou/alfred-emoji-wine</string>
12461294
</dict>

src/notificator

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ function make_icns {
2222
/bin/mkdir "${iconset}"
2323

2424
# Create iconset
25-
for size in {16,32,64,128,256,512}; do
25+
for size in {16,32,64,128,256,512}
26+
do
2627
/usr/bin/sips --resampleHeightWidth "${size}" "${size}" "${file}" --out "${iconset}/icon_${size}x${size}.png" &> /dev/null
2728
/usr/bin/sips --resampleHeightWidth "$((size * 2))" "$((size * 2))" "${file}" --out "${iconset}/icon_${size}x${size}@2x.png" &> /dev/null
2829
done
@@ -53,7 +54,8 @@ function usage {
5354

5455
# Options
5556
args=()
56-
while [[ "${1}" ]]; do
57+
while [[ "${1}" ]]
58+
do
5759
case "${1}" in
5860
-h | --help)
5961
usage
@@ -93,49 +95,47 @@ done
9395
set -- "${args[@]}"
9496

9597
# Check for required arguments
96-
if [[ -z "${notificator_message}" ]]; then
98+
if [[ -z "${notificator_message}" ]]
99+
then
97100
echo 'A message is mandatory! Aborting…' >&2
98101
exit 1
99102
fi
100103

101-
readonly bundle_id="$(tr -cd '[:alnum:]._-' <<< "${alfred_workflow_bundleid}")"
102-
readonly name="$(tr -cd '[:alnum:]._- ' <<< "${alfred_workflow_name}")"
104+
readonly bundle_id="$(/usr/bin/tr -cd '[:alnum:]._-' <<< "${alfred_workflow_bundleid}")"
105+
readonly name="$(/usr/bin/tr -cd '[:alnum:]._- ' <<< "${alfred_workflow_name}")"
103106
readonly icon="${alfred_preferences}/workflows/${alfred_workflow_uid}/icon.png"
104107
readonly app="${alfred_workflow_cache}/Notificator for ${name}.app"
105108
readonly plist="${app}/Contents/Info.plist"
106109

107110
# Exit early if Notificator exists and was modified fewer than 30 days ago
108-
if [[ -e "${app}" && -n "$(find "${app}" -depth 0 -mtime -30)" ]]; then
111+
if [[ -d "${app}" && "$(/bin/date -r "${app}" +%s)" -gt "$(/bin/date -v -30d +%s)" ]]
112+
then
109113
show_notification
110114
exit 0
111115
fi
112116

113117
# Pre-build checks
114-
if [[ -z "${bundle_id}" ]]; then
118+
if [[ -z "${bundle_id}" ]]
119+
then
115120
echo "Workflow is missing the bundle identifier! Aborting…" >&2
116121
exit 1
117122
fi
118123

119-
if [[ -z "${name}" ]]; then
124+
if [[ -z "${name}" ]]
125+
then
120126
echo "Workflow is missing the name! Aborting…" >&2
121127
exit 1
122128
fi
123129

124-
if [[ ! -f "${icon}" ]]; then
130+
if [[ ! -f "${icon}" ]]
131+
then
125132
echo "Workflow is missing the icon! Aborting…" >&2
126133
exit 1
127134
fi
128135

129136
# Build Notificator
130137
readonly jxa_script='
131-
// Build argv/argc in a way that can be used from the applet inside the app bundle
132-
ObjC.import("Foundation")
133-
const args = $.NSProcessInfo.processInfo.arguments
134-
const argv = []
135-
const argc = args.count
136-
for (let i = 0; i < argc; i++) { argv.push(ObjC.unwrap(args.objectAtIndex(i))) }
137-
138-
// Notification script
138+
const argv = $.NSProcessInfo.processInfo.arguments.js.map(arg => arg.js)
139139
const app = Application.currentApplication()
140140
app.includeStandardAdditions = true
141141
@@ -160,17 +160,17 @@ readonly jxa_script='
160160
app.displayNotification(message, options)
161161
'
162162

163-
[[ -d "${app}" ]] && rm -r "${app}"
163+
[[ -d "${app}" ]] && /bin/rm -r "${app}"
164164
/bin/mkdir -p "${alfred_workflow_cache}"
165165
/usr/bin/osacompile -l JavaScript -o "${app}" -e "${jxa_script}" 2> /dev/null
166166

167167
# Modify Notificator
168168
/usr/libexec/PlistBuddy -c "add :CFBundleIdentifier string ${bundle_id}.notificator" "${plist}"
169169
/usr/libexec/PlistBuddy -c 'add :LSUIElement string 1' "${plist}"
170-
mv "$(make_icns "${icon}")" "${app}/Contents/Resources/applet.icns"
170+
/bin/mv "$(make_icns "${icon}")" "${app}/Contents/Resources/applet.icns"
171171

172172
# Redo signature
173-
codesign --remove-signature "${app}"
174-
codesign --sign - "${app}"
173+
/usr/bin/codesign --remove-signature "${app}"
174+
/usr/bin/codesign --sign - "${app}"
175175

176176
show_notification

src/utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def langs_dict(xml_file):
1919

2020
sound = os.environ['sound']
2121
language = os.environ['language']
22+
skin_tone = os.environ['skin_tone']
2223
try:
2324
padding = int(os.environ['padding'])
2425
except:

src/wine.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import re
22
import json
3-
from utils import config, api_file_path, tags_file_path, icons_folder_path, language, emoji_dictionary, langs, workflow_version
3+
from utils import config, api_file_path, tags_file_path, icons_folder_path, language, emoji_dictionary, langs, workflow_version, skin_tone
44

55
api_data = config(api_file_path)
66
tags_data = config(tags_file_path)
@@ -23,7 +23,7 @@
2323
})
2424
else:
2525
for item in api_data['items']:
26-
name, emoji, title, tags, image = item['name'], item['emoji'], item['title'], item['tags'], item['image']
26+
name, emoji, title, tags, image, skin_tones = item['name'], item['emoji'], item['title'], item['tags'], item['image'], item['skin_tones']
2727
match = " ".join(tags) if tags is not None else name
2828
if tags_data is not None:
2929
for tag in tags_data:
@@ -67,7 +67,8 @@
6767
},
6868
}
6969
})
70-
items.append(elem)
70+
if skin_tone in skin_tones or 'base' in skin_tones or skin_tone == 'all':
71+
items.append(elem)
7172
else:
7273
items.append({
7374
'title': 'No API detected',

0 commit comments

Comments
 (0)