2021-03-05 10:55:40 +00:00
|
|
|
<?php
|
|
|
|
|
2021-05-09 20:15:43 +00:00
|
|
|
declare (strict_types=1);
|
2021-03-05 10:55:40 +00:00
|
|
|
namespace Rector\Naming\ExpectedNameResolver;
|
|
|
|
|
2021-05-27 20:54:56 +00:00
|
|
|
use RectorPrefix20210527\Doctrine\Inflector\Inflector;
|
|
|
|
use RectorPrefix20210527\Nette\Utils\Strings;
|
2021-03-05 10:55:40 +00:00
|
|
|
final class InflectorSingularResolver
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* @var array<string, string>
|
|
|
|
*/
|
2021-05-09 20:15:43 +00:00
|
|
|
private const SINGULAR_VERB = ['news' => 'new'];
|
2021-03-05 10:55:40 +00:00
|
|
|
/**
|
|
|
|
* @var string
|
|
|
|
* @see https://regex101.com/r/lbQaGC/1
|
|
|
|
*/
|
|
|
|
private const CAMELCASE_REGEX = '#(?<camelcase>([a-z]+|[A-Z]{1,}[a-z]+))#';
|
|
|
|
/**
|
|
|
|
* @var string
|
|
|
|
* @see https://regex101.com/r/2aGdkZ/2
|
|
|
|
*/
|
|
|
|
private const BY_MIDDLE_REGEX = '#(?<by>By[A-Z][a-zA-Z]+)#';
|
|
|
|
/**
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
private const SINGLE = 'single';
|
|
|
|
/**
|
|
|
|
* @var Inflector
|
|
|
|
*/
|
|
|
|
private $inflector;
|
2021-05-27 20:54:56 +00:00
|
|
|
public function __construct(\RectorPrefix20210527\Doctrine\Inflector\Inflector $inflector)
|
2021-03-05 10:55:40 +00:00
|
|
|
{
|
|
|
|
$this->inflector = $inflector;
|
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
public function resolve(string $currentName) : string
|
2021-03-05 10:55:40 +00:00
|
|
|
{
|
2021-05-27 20:54:56 +00:00
|
|
|
$matchBy = \RectorPrefix20210527\Nette\Utils\Strings::match($currentName, self::BY_MIDDLE_REGEX);
|
2021-03-05 10:55:40 +00:00
|
|
|
if ($matchBy) {
|
2021-05-27 20:54:56 +00:00
|
|
|
return \RectorPrefix20210527\Nette\Utils\Strings::substring($currentName, 0, -\strlen($matchBy['by']));
|
2021-03-05 10:55:40 +00:00
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
if (\array_key_exists($currentName, self::SINGULAR_VERB)) {
|
2021-03-05 10:55:40 +00:00
|
|
|
return self::SINGULAR_VERB[$currentName];
|
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
if (\strpos($currentName, self::SINGLE) === 0) {
|
2021-03-05 10:55:40 +00:00
|
|
|
return $currentName;
|
|
|
|
}
|
2021-05-27 20:54:56 +00:00
|
|
|
$camelCases = \RectorPrefix20210527\Nette\Utils\Strings::matchAll($currentName, self::CAMELCASE_REGEX);
|
2021-03-05 10:55:40 +00:00
|
|
|
$singularValueVarName = '';
|
|
|
|
foreach ($camelCases as $camelCase) {
|
|
|
|
$singularValueVarName .= $this->inflector->singularize($camelCase['camelcase']);
|
|
|
|
}
|
2021-03-24 22:36:11 +00:00
|
|
|
if ($singularValueVarName === '') {
|
|
|
|
return $currentName;
|
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
$singularValueVarName = $singularValueVarName === $currentName ? self::SINGLE . \ucfirst($singularValueVarName) : $singularValueVarName;
|
|
|
|
if (\strpos($singularValueVarName, self::SINGLE) !== 0) {
|
2021-03-05 10:55:40 +00:00
|
|
|
return $singularValueVarName;
|
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
$length = \strlen($singularValueVarName);
|
2021-03-05 10:55:40 +00:00
|
|
|
if ($length < 40) {
|
|
|
|
return $singularValueVarName;
|
|
|
|
}
|
|
|
|
return $currentName;
|
|
|
|
}
|
|
|
|
}
|