version.php (3721B)
1 <?php 2 namespace Elementor\Core\Utils; 3 4 if ( ! defined( 'ABSPATH' ) ) { 5 exit; // Exit if accessed directly. 6 } 7 8 class Version { 9 const PART_MAJOR_1 = 'major1'; 10 const PART_MAJOR_2 = 'major2'; 11 const PART_PATCH = 'patch'; 12 const PART_STAGE = 'stage'; 13 14 /** 15 * First number of a version 0.x.x 16 * 17 * @var string 18 */ 19 public $major1; 20 21 /** 22 * Second number of a version x.0.x 23 * 24 * @var string 25 */ 26 public $major2; 27 28 /** 29 * Third number of a version x.x.0 30 * 31 * @var string 32 */ 33 public $patch; 34 35 /** 36 * The stage of a version x.x.x-stage. 37 * e.g: x.x.x-dev1, x.x.x-beta3, x.x.x-rc 38 * 39 * @var string|null 40 */ 41 public $stage; 42 43 /** 44 * Version constructor. 45 * 46 * @param $major1 47 * @param $major2 48 * @param $patch 49 * @param $stage 50 */ 51 public function __construct( $major1, $major2, $patch, $stage = null ) { 52 $this->major1 = $major1; 53 $this->major2 = $major2; 54 $this->patch = $patch; 55 $this->stage = $stage; 56 } 57 58 /** 59 * Create Version instance. 60 * 61 * @param string $major1 62 * @param string $major2 63 * @param string $patch 64 * @param null $stage 65 * 66 * @return static 67 */ 68 public static function create( $major1 = '0', $major2 = '0', $patch = '0', $stage = null ) { 69 return new static( $major1, $major2, $patch, $stage ); 70 } 71 72 /** 73 * Checks if the current version string is valid. 74 * 75 * @param $version 76 * 77 * @return bool 78 */ 79 public static function is_valid_version( $version ) { 80 return ! ! preg_match( '/^(\d+\.)?(\d+\.)?(\*|\d+)(-.+)?$/', $version ); 81 } 82 83 /** 84 * Creates a Version instance from a string. 85 * 86 * @param $version 87 * @param bool $should_validate 88 * 89 * @return static 90 * @throws \Exception 91 */ 92 public static function create_from_string( $version, $should_validate = true ) { 93 if ( $should_validate && ! static::is_valid_version( $version ) ) { 94 throw new \Exception( "{$version} is an invalid version." ); 95 } 96 97 $parts = explode( '.', $version ); 98 $patch_parts = []; 99 100 $major1 = '0'; 101 $major2 = '0'; 102 $patch = '0'; 103 $stage = null; 104 105 if ( isset( $parts[0] ) ) { 106 $major1 = $parts[0]; 107 } 108 109 if ( isset( $parts[1] ) ) { 110 $major2 = $parts[1]; 111 } 112 113 if ( isset( $parts[2] ) ) { 114 $patch_parts = explode( '-', $parts[2] ); 115 116 $patch = $patch_parts[0]; 117 } 118 119 if ( isset( $patch_parts[1] ) ) { 120 $stage = $patch_parts[1]; 121 } 122 123 return static::create( $major1, $major2, $patch, $stage ); 124 } 125 126 /** 127 * Compare the current version instance with another version. 128 * 129 * @param $operator 130 * @param $version 131 * @param string $part 132 * 133 * @return bool 134 * @throws \Exception 135 */ 136 public function compare( $operator, $version, $part = self::PART_STAGE ) { 137 if ( ! ( $version instanceof Version ) ) { 138 if ( ! static::is_valid_version( $version ) ) { 139 $version = '0.0.0'; 140 } 141 142 $version = static::create_from_string( $version, false ); 143 } 144 145 $current_version = clone $this; 146 $compare_version = clone $version; 147 148 if ( in_array( $part, [ self::PART_PATCH, self::PART_MAJOR_2, self::PART_MAJOR_1 ], true ) ) { 149 $current_version->stage = null; 150 $compare_version->stage = null; 151 } 152 153 if ( in_array( $part, [ self::PART_MAJOR_2, self::PART_MAJOR_1 ], true ) ) { 154 $current_version->patch = '0'; 155 $compare_version->patch = '0'; 156 } 157 158 if ( self::PART_MAJOR_1 === $part ) { 159 $current_version->major2 = '0'; 160 $compare_version->major2 = '0'; 161 } 162 163 return version_compare( 164 $current_version, 165 $compare_version, 166 $operator 167 ); 168 } 169 170 /** 171 * Implode the version and return it as string. 172 * 173 * @return string 174 */ 175 public function __toString() { 176 $version = implode( '.', [ $this->major1, $this->major2, $this->patch ] ); 177 178 if ( $this->stage ) { 179 $version .= '-' . $this->stage; 180 } 181 182 return $version; 183 } 184 }