%PDF- %PDF-
Direktori : /var/www/projetos/suporte.iigd.com.br/vendor/elvanto/litemoji/src/ |
Current File : //var/www/projetos/suporte.iigd.com.br/vendor/elvanto/litemoji/src/LitEmoji.php |
<?php namespace LitEmoji; class LitEmoji { public const MB_REGEX = '/( \x23\xE2\x83\xA3 # Digits [\x30-\x39]\xE2\x83\xA3 | \xE2[\x9C-\x9E][\x80-\xBF] # Dingbats | \xF0\x9F[\x85-\x88][\xA6-\xBF] # Enclosed characters | \xF0\x9F[\x8C-\x97][\x80-\xBF] # Misc | \xF0\x9F\x98[\x80-\xBF] # Smilies | \xF0\x9F\x99[\x80-\x8F] | \xF0\x9F[\x9A-\x9B][\x80-\xBF] # Transport and map symbols | \xF0\x9F[\xA4-\xA7][\x80-\xBF] # Supplementary symbols and pictographs )/x'; private static $shortcodes = []; private static $shortcodeCodepoints = []; private static $shortcodeEntities = []; private static $entityCodepoints = []; private static $excludedShortcodes = []; /** * Converts all unicode emoji and HTML entities to plaintext shortcodes. * * @param string $content * @return string */ public static function encodeShortcode(string $content): string { $content = self::entitiesToUnicode($content); $content = self::unicodeToShortcode($content); return $content; } /** * Converts all plaintext shortcodes and unicode emoji to HTML entities. * * @param string $content * @return string */ public static function encodeHtml(string $content): string { $content = self::unicodeToShortcode($content); $content = self::shortcodeToEntities($content); return $content; } /** * Converts all plaintext shortcodes and HTML entities to unicode codepoints. * * @param string $content * @return string */ public static function encodeUnicode(string $content): string { $content = self::shortcodeToUnicode($content); $content = self::entitiesToUnicode($content); return $content; } /** * Converts plaintext shortcodes to HTML entities. * * @param string $content * @return string */ public static function shortcodeToUnicode(string $content): string { $replacements = self::getShortcodeCodepoints(); return str_replace(array_keys($replacements), $replacements, $content); } /** * Converts HTML entities to unicode codepoints. * * @param string $content * @return string */ public static function entitiesToUnicode(string $content): string { /* Convert HTML entities to uppercase hexadecimal */ $content = preg_replace_callback('/\&\#(x?[a-zA-Z0-9]*?)\;/', static function($matches) { $code = $matches[1]; if ($code[0] == 'x') { return '&#x' . strtoupper(substr($code, 1)) . ';'; } return '&#x' . strtoupper(dechex($code)) . ';'; }, $content); $replacements = self::getEntityCodepoints(); return str_replace(array_keys($replacements), $replacements, $content); } /** * Converts unicode codepoints to plaintext shortcodes. * * @param string $content * @return string */ public static function unicodeToShortcode(string $content): string { $replacement = ''; $encoding = mb_detect_encoding($content); $codepoints = array_flip(self::getShortcodes()); /* Break content along codepoint boundaries */ $parts = preg_split( self::MB_REGEX, $content, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); /* Reconstruct content using shortcodes */ $sequence = []; foreach ($parts as $offset => $part) { if (preg_match(self::MB_REGEX, $part)) { $part = mb_convert_encoding($part, 'UTF-32', $encoding); $words = unpack('N*', $part); $codepoint = sprintf('%X', reset($words)); $sequence[] = $codepoint; if (isset($codepoints[$codepoint])) { $replacement .= ":$codepoints[$codepoint]:"; $sequence = []; } else { /* Check multi-codepoint sequence */ $multi = implode('-', $sequence); if (isset($codepoints[$multi])) { $replacement .= ":$codepoints[$multi]:"; $sequence = []; } } } else { $replacement .= $part; } } return $replacement; } /** * Converts plain text shortcodes to HTML entities. * * @param string $content * @return string */ public static function shortcodeToEntities(string $content): string { $replacements = self::getShortcodeEntities(); return str_replace(array_keys($replacements), $replacements, $content); } /** * Sets a configuration property. * * @param string $property * @param mixed $value */ public static function config(string $property, $value): void { switch ($property) { case 'excludeShortcodes': self::$excludedShortcodes = []; if (!is_array($value)) { $value = [$value]; } foreach ($value as $code) { if (is_string($code)) { self::$excludedShortcodes[] = $code; } } // Invalidate shortcode cache self::$shortcodes = []; break; } } /** * Removes all emoji-sequences from string. * * @param string $source * @return string */ public static function removeEmoji(string $source): string { $content = self::encodeShortcode($source); $content = preg_replace('/\:\w+\:/', '', $content); return $content; } private static function getShortcodes() { if (!empty(self::$shortcodes)) { return self::$shortcodes; } // Skip excluded shortcodes self::$shortcodes = array_filter(require(__DIR__ . '/shortcodes-array.php'), static function($code) { return !in_array($code, self::$excludedShortcodes); }, ARRAY_FILTER_USE_KEY); return self::$shortcodes; } private static function getShortcodeCodepoints() { if (!empty(self::$shortcodeCodepoints)) { return self::$shortcodeCodepoints; } foreach (self::getShortcodes() as $shortcode => $codepoint) { $parts = explode('-', $codepoint); $codepoint = ''; foreach ($parts as $part) { $codepoint .= mb_convert_encoding(pack('N', hexdec($part)), 'UTF-8', 'UTF-32'); } self::$shortcodeCodepoints[':' . $shortcode . ':'] = $codepoint; } return self::$shortcodeCodepoints; } private static function getEntityCodepoints() { if (!empty(self::$entityCodepoints)) { return self::$entityCodepoints; } foreach (self::getShortcodes() as $shortcode => $codepoint) { $parts = explode('-', $codepoint); $entity = ''; $codepoint = ''; foreach ($parts as $part) { $entity .= '&#x' . $part . ';'; $codepoint .= mb_convert_encoding(pack('N', hexdec($part)), 'UTF-8', 'UTF-32'); } self::$entityCodepoints[$entity] = $codepoint; } return self::$entityCodepoints; } private static function getShortcodeEntities() { if (!empty(self::$shortcodeEntities)) { return self::$shortcodeEntities; } foreach (self::getShortcodes() as $shortcode => $codepoint) { $parts = explode('-', $codepoint); self::$shortcodeEntities[':' . $shortcode . ':'] = ''; foreach ($parts as $part) { self::$shortcodeEntities[':' . $shortcode . ':'] .= '&#x' . $part .';'; } } return self::$shortcodeEntities; } }