Language = Application::getLanguage(); } #=========================================================================== # Get emoticons with their explanations #=========================================================================== public function getEmoticons(): array { $Language = $this->Language; return [ html_entity_decode('😊') => $Language->text('emoticon_1F60A'), html_entity_decode('😞') => $Language->text('emoticon_1F61E'), html_entity_decode('😃') => $Language->text('emoticon_1F603'), html_entity_decode('😛') => $Language->text('emoticon_1F61B'), html_entity_decode('😲') => $Language->text('emoticon_1F632'), html_entity_decode('😉') => $Language->text('emoticon_1F609'), html_entity_decode('😢') => $Language->text('emoticon_1F622'), html_entity_decode('😐') => $Language->text('emoticon_1F610'), html_entity_decode('😵') => $Language->text('emoticon_1F635'), html_entity_decode('😒') => $Language->text('emoticon_1F612'), html_entity_decode('😎') => $Language->text('emoticon_1F60E'), html_entity_decode('😟') => $Language->text('emoticon_1F61F'), html_entity_decode('😂') => $Language->text('emoticon_1F602'), html_entity_decode('😄') => $Language->text('emoticon_1F604'), ]; } #=========================================================================== # Parse occurring emoticons (*without* duplicates) #=========================================================================== public function parse(string $text): array { $emoticon_data = $this->getEmoticons(); $emoticon_list = array_keys($emoticon_data); $emoticon_list = implode('|', $emoticon_list); preg_match_all("#($emoticon_list)#", $text, $matches); foreach($matches[1] as $emoticon) { $emoticons[$emoticon] = $emoticon_data[$emoticon]; } return $emoticons ?? []; } #=========================================================================== # Wrap emoticons inside a titled span element #=========================================================================== public function transform(string $text): string { $emoticon_data = $this->getEmoticons(); $emoticon_list = array_keys($emoticon_data); $emoticon_list = implode('|', $emoticon_list); # TODO: Do not wrap emoticons if they occur inside a code block return preg_replace_callback("#($emoticon_list)#", function($matches) use($emoticon_data) { $emoticon = $matches[1]; $explanation = $emoticon_data[$emoticon]; return sprintf('%s', $explanation, $emoticon); }, $text); } }