Changeset View
Changeset View
Standalone View
Standalone View
src/applications/macro/typeahead/PhabricatorEmojiDatasource.php
Show All 20 Lines | final class PhabricatorEmojiDatasource extends PhabricatorTypeaheadDatasource { | ||||
protected function renderSpecialTokens(array $values) { | protected function renderSpecialTokens(array $values) { | ||||
return $this->renderTokensFromResults($this->buildResults(), $values); | return $this->renderTokensFromResults($this->buildResults(), $values); | ||||
} | } | ||||
private function buildResults() { | private function buildResults() { | ||||
$raw_query = $this->getRawQuery(); | $raw_query = $this->getRawQuery(); | ||||
$data = id(new PhabricatorEmojiRemarkupRule())->markupEmojiJSON(); | $manifest = id(new PhabricatorEmojiRemarkupRule()) | ||||
$emojis = phutil_json_decode($data); | ->getEmojiManifest(); | ||||
$aliases = array(); | |||||
foreach ($manifest as $key => $spec) { | |||||
$aliases[$key] = $key; | |||||
foreach (idx($spec, 'aliases', array()) as $alias) { | |||||
$aliases[$alias] = $key; | |||||
} | |||||
} | |||||
$viewer = $this->getViewer(); | |||||
$setting = $viewer->getUserSetting(PhabricatorSkinToneSetting::SETTINGKEY); | |||||
switch ($setting) { | |||||
case PhabricatorSkinToneSetting::TONE_NONE: | |||||
$tone_modifier = ''; | |||||
$tones = array($tone_modifier); | |||||
break; | |||||
case PhabricatorSkinToneSetting::TONE_1: | |||||
$tone_modifier = "\xF0\x9F\x8F\xBB"; | |||||
$tones = array($tone_modifier); | |||||
break; | |||||
case PhabricatorSkinToneSetting::TONE_2: | |||||
$tone_modifier = "\xF0\x9F\x8F\xBC"; | |||||
$tones = array($tone_modifier); | |||||
break; | |||||
case PhabricatorSkinToneSetting::TONE_3: | |||||
$tone_modifier = "\xF0\x9F\x8F\xBD"; | |||||
$tones = array($tone_modifier); | |||||
break; | |||||
case PhabricatorSkinToneSetting::TONE_4: | |||||
$tone_modifier = "\xF0\x9F\x8F\xBE"; | |||||
$tones = array($tone_modifier); | |||||
break; | |||||
case PhabricatorSkinToneSetting::TONE_5: | |||||
$tone_modifier = "\xF0\x9F\x8F\xBF"; | |||||
$tones = array($tone_modifier); | |||||
break; | |||||
default: | |||||
// By default, select a random human skin tone. | |||||
$tone_modifier = ''; | |||||
$tones = array( | |||||
"\xF0\x9F\x8F\xBB", | |||||
"\xF0\x9F\x8F\xBC", | |||||
"\xF0\x9F\x8F\xBD", | |||||
"\xF0\x9F\x8F\xBE", | |||||
"\xF0\x9F\x8F\xBF", | |||||
amckinley: Can we DRY this up? And is this rule about tone modifiers part of the spec, or just a fortunate… | |||||
); | |||||
break; | |||||
} | |||||
$results = array(); | $results = array(); | ||||
foreach ($emojis as $shortname => $emoji) { | foreach ($aliases as $alias => $key) { | ||||
$display_name = $emoji.' '.$shortname; | $spec = $manifest[$key]; | ||||
$name = str_replace('_', ' ', $shortname); | $emoji = $spec['emoji']; | ||||
if (!empty($spec['name'])) { | |||||
$readable_name = $spec['name']; | |||||
} else { | |||||
$readable_name = $alias; | |||||
} | |||||
if (!empty($spec['tones'])) { | |||||
$autocomplete = array(); | |||||
foreach ($tones as $suffix) { | |||||
$autocomplete[] = $emoji.$suffix; | |||||
} | |||||
$autocomplete = implode(' ', $autocomplete); | |||||
$display_emoji = $emoji.$tone_modifier; | |||||
amckinleyUnsubmitted Not Done Inline ActionsThis is how we avoid breaking the rendering of existing more-specific emoji, right? amckinley: This is how we avoid breaking the rendering of existing more-specific emoji, right? | |||||
} else { | |||||
$autocomplete = $emoji; | |||||
$display_emoji = $emoji; | |||||
} | |||||
$display_name = $display_emoji.' '.$readable_name; | |||||
$name = str_replace('_', ' ', $alias); | |||||
if (!empty($spec['order'])) { | |||||
$name = $spec['order'].' '.$name; | |||||
} | |||||
$result = id(new PhabricatorTypeaheadResult()) | $result = id(new PhabricatorTypeaheadResult()) | ||||
->setPHID($shortname) | ->setPHID($alias) | ||||
->setName($name) | ->setName($name) | ||||
->setDisplayname($display_name) | ->setDisplayName($display_name) | ||||
->setAutocomplete($emoji); | ->setAutocomplete($autocomplete); | ||||
$results[$shortname] = $result; | $results[$alias] = $result; | ||||
} | } | ||||
return $results; | return $results; | ||||
} | } | ||||
} | } |
Can we DRY this up? And is this rule about tone modifiers part of the spec, or just a fortunate implementation detail?