Skip to content

Commit

Permalink
Refactor: improve readability
Browse files Browse the repository at this point in the history
  • Loading branch information
thantthuhein-genie committed Aug 30, 2024
1 parent f92b08f commit c2942bb
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 72 deletions.
71 changes: 39 additions & 32 deletions src/MMName.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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
Expand All @@ -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(' ');
}
}
7 changes: 6 additions & 1 deletion src/Traits/EnglishSarHelpers.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
}
}
52 changes: 35 additions & 17 deletions src/Traits/MyanmarSarHelpers.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
22 changes: 0 additions & 22 deletions src/Utilities/Normalizer.php

This file was deleted.

0 comments on commit c2942bb

Please sign in to comment.