friendica-addons/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/SemverRangeUtil.php

147 lines
3.7 KiB
PHP

<?php
/*
* This file is part of the Fxp Composer Asset Plugin package.
*
* (c) François Pluchino <francois.pluchino@gmail.com>
*
* 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 <francois.pluchino@gmail.com>
*/
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;
}
}