Server IP : 213.176.29.180 / Your IP : 3.144.91.176 Web Server : Apache System : Linux 213.176.29.180.hostiran.name 4.18.0-553.22.1.el8_10.x86_64 #1 SMP Tue Sep 24 05:16:59 EDT 2024 x86_64 User : webtaragh ( 1001) PHP Version : 7.4.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON Directory (0755) : /home/webtaragh/public_html/whmcs/attachments/../vendor/punic/punic/src/ |
[ Home ] | [ C0mmand ] | [ Upload File ] |
---|
<?php namespace Punic; /** * Units helper stuff. */ class Unit { /** * Get the list of all the available units. * * @param string $locale The locale to use. If empty we'll use the default locale set in \Punic\Data */ public static function getAvailableUnits($locale = '') { $data = Data::get('units', $locale); $categories = array(); foreach ($data as $width => $units) { if ($width[0] !== '_') { foreach ($units as $category => $units) { if ($category[0] !== '_') { $unitIDs = array_keys($units); if (isset($categories[$category])) { $categories[$category] = array_unique(array_merge($categories[$category], $unitIDs)); } else { $categories[$category] = array_keys($units); } } } } } ksort($categories); foreach (array_keys($categories) as $category) { sort($categories[$category]); } return $categories; } /** * Get the localized name of a unit. * * @param string $unit The unit identifier (eg 'duration/millisecond' or 'millisecond') * @param string $width The format name; it can be 'long' ('milliseconds'), 'short' (eg 'millisecs') or 'narrow' (eg 'msec') * @param string $locale The locale to use. If empty we'll use the default locale set in \Punic\Data * * @throws Exception\ValueNotInList * * @return string */ public static function getName($unit, $width = 'short', $locale = '') { $data = self::getDataForWidth($width, $locale); $unitData = self::getDataForUnit($data, $unit); return $unitData['_name']; } /** * Get the "per" localized format string of a unit. * * @param string $unit The unit identifier (eg 'duration/minute' or 'minute') * @param string $width The format name; it can be 'long' ('%1$s per minute'), 'short' (eg '%1$s/min') or 'narrow' (eg '%1$s/min') * @param string $locale The locale to use. If empty we'll use the default locale set in \Punic\Data * * @throws Exception\ValueNotInList * * @return string */ public static function getPerFormat($unit, $width = 'short', $locale = '') { $data = self::getDataForWidth($width, $locale); $unitData = self::getDataForUnit($data, $unit); if (isset($unitData['_per'])) { return $unitData['_per']; } $pluralRule = Plural::getRuleOfType(1, Plural::RULETYPE_CARDINAL, $locale); $name = trim(sprintf($unitData[$pluralRule], '')); return sprintf($data['_compoundPattern'], '%1$s', $name); } /** * Format a unit string. * * @param int|float|string $number The unit amount * @param string $unit The unit identifier (eg 'duration/millisecond' or 'millisecond') * @param string $width The format name; it can be 'long' (eg '3 milliseconds'), 'short' (eg '3 ms') or 'narrow' (eg '3ms'). You can also add a precision specifier ('long,2' or just '2') * @param string $locale The locale to use. If empty we'll use the default locale set in \Punic\Data * * @throws Exception\ValueNotInList * * @return string */ public static function format($number, $unit, $width = 'short', $locale = '') { $precision = null; if (is_int($width)) { $precision = $width; $width = 'short'; } elseif (is_string($width) && preg_match('/^(?:(.*),)?([+\\-]?\\d+)$/', $width, $m)) { $precision = (int) $m[2]; $width = (string) $m[1]; if ($width === '') { $width = 'short'; } } $data = self::getDataForWidth($width, $locale); $rules = self::getDataForUnit($data, $unit); $pluralRule = Plural::getRuleOfType($number, Plural::RULETYPE_CARDINAL, $locale); //@codeCoverageIgnoreStart // These checks aren't necessary since $pluralRule should always be in $rules, but they don't hurt ;) if (!isset($rules[$pluralRule])) { if (isset($rules['other'])) { $pluralRule = 'other'; } else { $availableRules = array_keys($rules); $pluralRule = $availableRules[0]; } } //@codeCoverageIgnoreEnd return sprintf($rules[$pluralRule], Number::format($number, $precision, $locale)); } /** * Retrieve the measurement systems and their localized names. * * @param string $locale The locale to use. If empty we'll use the default locale set in \Punic\Data * * @return array The array keys are the measurement system codes (eg 'metric', 'US', 'UK'), the values are the localized measurement system names (eg 'Metric', 'US', 'UK' for English) */ public static function getMeasurementSystems($locale = '') { return Data::get('measurementSystemNames', $locale); } /** * Retrieve the measurement system for a specific territory. * * @param string $territoryCode The territory code (eg. 'US' for 'United States of America'). * * @return string Return the measurement system code (eg: 'metric') for the specified territory. If $territoryCode is not valid we'll return an empty string. */ public static function getMeasurementSystemFor($territoryCode) { $result = ''; if (is_string($territoryCode) && preg_match('/^[a-z0-9]{2,3}$/i', $territoryCode)) { $territoryCode = strtoupper($territoryCode); $data = Data::getGeneric('measurementData'); while ($territoryCode !== '') { if (isset($data['measurementSystem'][$territoryCode])) { $result = $data['measurementSystem'][$territoryCode]; break; } $territoryCode = Territory::getParentTerritoryCode($territoryCode); } } return $result; } /** * Returns the list of countries that use a specific measurement system. * * @param string $measurementSystem The measurement system identifier ('metric', 'US' or 'UK') * * @return array The list of country IDs that use the specified measurement system (if $measurementSystem is invalid you'll get an empty array) */ public static function getCountriesWithMeasurementSystem($measurementSystem) { $result = array(); if (is_string($measurementSystem) && $measurementSystem !== '') { $someGroup = false; $data = Data::getGeneric('measurementData'); foreach ($data['measurementSystem'] as $territory => $ms) { if (strcasecmp($measurementSystem, $ms) === 0) { $children = Territory::getChildTerritoryCodes($territory, true); if (empty($children)) { $result[] = $territory; } else { $someGroup = true; $result = array_merge($result, $children); } } } if ($someGroup) { $otherCountries = array(); foreach ($data['measurementSystem'] as $territory => $ms) { if (($territory !== '001') && (strcasecmp($measurementSystem, $ms) !== 0)) { $children = Territory::getChildTerritoryCodes($territory, true); if (empty($children)) { $otherCountries[] = $territory; } else { $otherCountries = array_merge($otherCountries, $children); } } } $result = array_values(array_diff($result, $otherCountries)); } } return $result; } /** * Retrieve the standard paper size for a specific territory. * * @param string $territoryCode The territory code (eg. 'US' for 'United States of America'). * * @return string Return the standard paper size (eg: 'A4' or 'US-Letter') for the specified territory. If $territoryCode is not valid we'll return an empty string. */ public static function getPaperSizeFor($territoryCode) { $result = ''; if (is_string($territoryCode) && preg_match('/^[a-z0-9]{2,3}$/i', $territoryCode)) { $territoryCode = strtoupper($territoryCode); $data = Data::getGeneric('measurementData'); while ($territoryCode !== '') { if (isset($data['paperSize'][$territoryCode])) { $result = $data['paperSize'][$territoryCode]; break; } $territoryCode = Territory::getParentTerritoryCode($territoryCode); } } return $result; } /** * Returns the list of countries that use a specific paper size by default. * * @param string $paperSize The paper size identifier ('A4' or 'US-Letter') * * @return array The list of country IDs that use the specified paper size (if $paperSize is invalid you'll get an empty array) */ public static function getCountriesWithPaperSize($paperSize) { $result = array(); if (is_string($paperSize) && $paperSize !== '') { $someGroup = false; $data = Data::getGeneric('measurementData'); foreach ($data['paperSize'] as $territory => $ms) { if (strcasecmp($paperSize, $ms) === 0) { $children = Territory::getChildTerritoryCodes($territory, true); if (empty($children)) { $result[] = $territory; } else { $someGroup = true; $result = array_merge($result, $children); } } } if ($someGroup) { $otherCountries = array(); foreach ($data['paperSize'] as $territory => $ms) { if (($territory !== '001') && (strcasecmp($paperSize, $ms) !== 0)) { $children = Territory::getChildTerritoryCodes($territory, true); if (empty($children)) { $otherCountries[] = $territory; } else { $otherCountries = array_merge($otherCountries, $children); } } } $result = array_values(array_diff($result, $otherCountries)); } } return $result; } /** * Get the width-specific unit data. * * @param string $width the data width * @param string $locale The locale to use. If empty we'll use the default locale set in \Punic\Data * * @throws Exception\ValueNotInList * * @return array */ private static function getDataForWidth($width, $locale = '') { $data = Data::get('units', $locale); if ($width[0] === '_' || !isset($data[$width])) { $widths = array(); foreach (array_keys($data) as $w) { if (strpos($w, '_') !== 0) { $widths[] = $w; } } throw new Exception\ValueNotInList($width, $widths); } return $data[$width]; } /** * Get a unit-specific data. * * @param array $data the width-specific data * @param string $unit The unit identifier (eg 'duration/millisecond' or 'millisecond') * * @throws Exception\ValueNotInList * * @return array */ private static function getDataForUnit(array $data, $unit) { $chunks = explode('/', $unit, 2); if (isset($chunks[1])) { list($unitCategory, $unitID) = $chunks; } else { $unitCategory = null; $unitID = null; foreach (array_keys($data) as $c) { if ($c[0] !== '_') { if (isset($data[$c][$unit])) { if ($unitCategory === null) { $unitCategory = $c; $unitID = $unit; } else { $unitCategory = null; break; } } } } } if ( $unitCategory === null || $unitCategory[0] === '_' || !isset($data[$unitCategory]) || $unitID === null || $unitID[0] === '_' || !isset($data[$unitCategory][$unitID]) ) { $units = array(); foreach ($data as $c => $us) { if (strpos($c, '_') === false) { foreach (array_keys($us) as $u) { if (strpos($c, '_') === false) { $units[] = "$c/$u"; } } } } throw new \Punic\Exception\ValueNotInList($unit, $units); } return $data[$unitCategory][$unitID]; } }