diff --git a/src/MMName.php b/src/MMName.php index 66d4008..da4a0eb 100755 --- a/src/MMName.php +++ b/src/MMName.php @@ -4,13 +4,14 @@ use AgeekDev\MMName\Traits\EnglishSarHelpers; use AgeekDev\MMName\Traits\MyanmarSarHelpers; -use AgeekDev\MMName\Utilities\Normalizer; use Illuminate\Support\Facades\Config; use Illuminate\Support\Traits\Macroable; -class MMName extends Normalizer +class MMName { - use EnglishSarHelpers, Macroable, MyanmarSarHelpers; + use EnglishSarHelpers, + MyanmarSarHelpers, + Macroable; protected array $dataSource; @@ -24,22 +25,25 @@ public function __construct() public function convertToEn(string $nameString, bool $isUcWords = true): string { - if (! $this->isMmName(clean_text($nameString))) { + $nameString = clean_text($nameString); + + if (! $this->isMmName($nameString)) { return $this->normalizeMmText($nameString); } - $enName = ''; - $nameSegments = $this->myanmarSarSegment($this->normalizeMmText(clean_text($nameString))); + $nameSegments = $this->splitMyanmarSarSegments( + $this->normalizeMmText($nameString) + ); - foreach (explode(' ', $nameSegments) as $name) { - $enName .= ($this->dataSource['mm'][$name] ?? '').' '; - } + $enName = $this->transform($nameSegments, 'mm'); - if (! $isUcWords) { - return trim($this->exceptionalNamesReplace(strtolower($enName))); - } + $result = trim( + $this->replaceEnExceptionalWords( + strtolower($enName) + ) + ); - return ucwords(trim($this->exceptionalNamesReplace(strtolower($enName)))); + return $isUcWords ? ucwords($result) : $result; } public function convertToMm(string $nameString): string @@ -48,35 +52,38 @@ public function convertToMm(string $nameString): string return $nameString; } - $mmName = ''; - $enName = $this->exceptionalNamesReplace(strtolower($nameString)); + $nameSegments = $this->replaceEnExceptionalWords( + strtolower($nameString) + ); - foreach (explode(' ', $enName) as $name) { - $mmName .= ($this->dataSource['en'][$name] ?? '').' '; - } + $mmName = $this->transform($nameSegments, 'en'); return clean_text($mmName); } - public function isMmName(string $name): bool - { - return preg_match('/^[\x{1000}-\x{103F}\x{104A}-\x{109F}|\x{0020}]+$/u', $name); - } - - public function isEnName(string $name): bool + public function compare(string $firstName, string $secondName): bool { - return preg_match('/^[A-Za-z|\x{0020}]+$/', $name); + $normalize = function ($name) { + return trim_whitespaces( + $this->isMmName($name) + ? $this->convertToMm($this->convertToEn($name)) + : $this->convertToMm($name) + ); + }; + + return $normalize($firstName) === $normalize($secondName); } - public function compare(string $firstName, string $secondName): bool + protected function transform(string $nameSegment, string $source = 'en'): string { - $firstName = $this->isMmName($firstName) ? $this->convertToMm($this->convertToEn($firstName)) : $this->convertToMm($firstName); - $secondName = $this->isMmName($secondName) ? $this->convertToMm($this->convertToEn($secondName)) : $this->convertToMm($secondName); - - if (trim_whitespaces($firstName) === trim_whitespaces($secondName)) { - return true; + if (! in_array($source, ['en', 'mm'])) { + throw new \LogicException('Invalid source name provided'); } - return false; + return collect(explode(' ', $nameSegment)) + ->map(function ($name) use ($source) { + return $this->dataSource[$source][$name] ?? ''; + }) + ->implode(' '); } } diff --git a/src/Traits/EnglishSarHelpers.php b/src/Traits/EnglishSarHelpers.php index f9d2882..b90d3ba 100644 --- a/src/Traits/EnglishSarHelpers.php +++ b/src/Traits/EnglishSarHelpers.php @@ -9,7 +9,7 @@ trait EnglishSarHelpers { private array $prefixNames = ['oo' => 'u', 'maung' => 'mg']; - public function exceptionalNamesReplace(string $name): string + public function replaceEnExceptionalWords(string $name): string { foreach (Config::get('en-exceptional-names') as $key => $value) { $name = str_replace($key, $value, $name); @@ -31,4 +31,9 @@ public function replacePrefix(string $name): string return $name; } + + public function isEnName(string $name): bool + { + return preg_match('/^[A-Za-z|\x{0020}]+$/', $name); + } } diff --git a/src/Traits/MyanmarSarHelpers.php b/src/Traits/MyanmarSarHelpers.php index 8604856..f9f6388 100644 --- a/src/Traits/MyanmarSarHelpers.php +++ b/src/Traits/MyanmarSarHelpers.php @@ -6,27 +6,45 @@ trait MyanmarSarHelpers { private string $wordBreakExpression = '/(?!\x{1039})[\x{1000}-\x{1021}](?![\x{103a}\x{1037}\x{1039}])|[a-zA-Z0-9\x{1023}\x{1024}\x{1026}-\x{1029}\x{102a}\x{103f}\x{104c}\x{104d}\x{104f}\x{1040}-\x{1049}\x{104a}\x{104b}]+/u'; - public function myanmarSarSegment(string $text, string $separator = ' '): string - { - $seperatedWithSpace = preg_replace($this->wordBreakExpression, $separator.'$0', $text); + private array $mmWordsNormalizePattern = [ + '/\x{1037}\x{103A}/u' => '့်', + ]; - $restructuredTextArray = []; - $toBeUnset = []; - $characters = explode(' ', $seperatedWithSpace); + public function splitMyanmarSarSegments(string $text, string $separator = ' '): string + { + $separatedWithSpace = preg_replace($this->wordBreakExpression, $separator.'$0', $text); - foreach ($characters as $key => $character) { - if (preg_match('/\x{1039}/u', $character)) { - $restructuredTextArray[] = isset($characters[$key + 1]) ? $character.$characters[$key + 1] : $character; - $toBeUnset[] = $key + 1; - } else { - $restructuredTextArray[] = $character; - } - } + $characters = collect(explode(' ', $separatedWithSpace)); - foreach ($toBeUnset as $index) { - unset($restructuredTextArray[$index]); - } + $restructuredTextArray = $characters + ->map(function ($character, $key) use ($characters) { + if (preg_match('/\x{1039}/u', $character)) { + // If character matches the pattern, concatenate with the next character if it exists + return isset($characters[$key + 1]) ? $character.$characters[$key + 1] : $character; + } + // If not, just return the character + return $character; + }) + ->reject(function ($character, $key) use ($characters) { + // Reject any character that is meant to be unset + return preg_match('/\x{1039}/u', $characters->get($key - 1)); + }) + ->values() + ->all(); return implode(' ', $restructuredTextArray); } + + public function isMmName(string $name): bool + { + return preg_match('/^[\x{1000}-\x{103F}\x{104A}-\x{109F}|\x{0020}]+$/u', $name); + } + + public function normalizeMmText(string $text): string + { + return collect($this->mmWordsNormalizePattern) + ->reduce(function ($text, $replace, $pattern) { + return preg_replace($pattern, $replace, $text); + }, $text); + } } diff --git a/src/Utilities/Normalizer.php b/src/Utilities/Normalizer.php deleted file mode 100644 index 8333391..0000000 --- a/src/Utilities/Normalizer.php +++ /dev/null @@ -1,22 +0,0 @@ - '့်', - ]; - - public function normalizeMmText(string $text): string - { - foreach ($this->normalizations as $pattern => $replace) { - $text = preg_replace($pattern, $replace, $text); - } - - return $text; - } -}