* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Fxp\Composer\AssetPlugin\Converter; /** * Utils for semver range converter. * * @author François Pluchino */ abstract class SemverRangeUtil { /** * Replaces the special range "^". * * @param SemverConverter $converter The semver converter * @param string $match The match version * * @return string the new match version */ public static function replaceSpecialRange(SemverConverter $converter, $match) { $newMatch = $converter->convertVersion($match); $newMatch = '>='.static::standardizeVersion(SemverUtil::replaceAlias($newMatch, '>')).',<'; $exp = static::getSplittedVersion($match); $increase = false; foreach ($exp as $i => $sub) { if (static::analyzeSubVersion($i, $exp, $increase)) { continue; } static::increaseSubVersion($i, $exp, $increase); } $newMatch .= $converter->convertVersion(static::standardizeVersion($exp)); return $newMatch; } /** * Analyze the sub version of splitted version. * * @param int $i The position in splitted version * @param array $exp The splitted version * @param bool $increase Check if the next sub version must be increased * * @return bool */ protected static function analyzeSubVersion($i, array &$exp, &$increase) { $analyzed = false; if ($increase) { $exp[$i] = 0; $analyzed = true; } if (0 === $i && (int) $exp[$i] > 0) { $increase = true; $exp[$i] = (int) $exp[$i] + 1; $analyzed = true; } return $analyzed; } /** * Increase the sub version of splitted version. * * @param int $i The position in splitted version * @param array $exp The splitted version * @param bool $increase Check if the next sub version must be increased */ protected static function increaseSubVersion($i, array &$exp, &$increase) { $iNext = min(min($i + 1, 3), count($exp) - 1); if (($iNext !== $i && ($exp[$i] > 0 || (int) $exp[$iNext] > 9999998)) || $iNext === $i) { $exp[$i] = (int) $exp[$i] + 1; $increase = true; } } /** * Standardize the version. * * @param string|array $version The version or the splitted version * * @return string */ protected static function standardizeVersion($version) { if (is_string($version)) { $version = explode('.', $version); } while (count($version) < 3) { $version[] = '0'; } return implode('.', $version); } /** * Split the version. * * @param string $version * * @return array */ protected static function getSplittedVersion($version) { $version = static::cleanExtraVersion($version); $version = str_replace(array('*', 'x', 'X'), '9999999', $version); $exp = explode('.', $version); return $exp; } /** * Remove the extra informations of the version (info after "-"). * * @param string $version * * @return string */ protected static function cleanExtraVersion($version) { $pos = strpos($version, '-'); if (false !== $pos) { $version = substr($version, 0, $pos); } return $version; } }