/trunk/plugins/viathinksoft/publicPages/100_whois/whois/json/vendor/aywan/php-json-canonicalization/src/Canonicalizator.php |
---|
0,0 → 1,70 |
<?php |
declare(strict_types=1); |
namespace aywan\JsonCanonicalization; |
class Canonicalizator implements JsonCanonicalizationInterface |
{ |
const JSON_FLAGS = \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES; |
public function canonicalize($data, bool $asHex = false): string |
{ |
ob_start(); |
$this->serialize($data); |
$result = ob_get_clean(); |
return $asHex ? Utils::asHex($result) : $result; |
} |
private function serialize($item)/*: void*/ // ViaThinkSoft: Removed ": void" for PHP 7.0 compatibility |
{ |
if (is_float($item)) { |
echo Utils::es6NumberFormat($item); |
return; |
} |
if (null === $item || is_scalar($item)) { |
echo json_encode($item, self::JSON_FLAGS); |
return; |
} |
if (is_array($item) && ! Utils::isAssoc($item)) { |
echo '['; |
$next = false; |
foreach ($item as $element) { |
if ($next) { |
echo ','; |
} |
$next = true; |
$this->serialize($element); |
} |
echo ']'; |
return; |
} |
if (is_object($item)) { |
$item = (array)$item; |
} |
uksort($item, function (string $a, string $b) { |
$a = mb_convert_encoding($a, 'UTF-16BE'); |
$b = mb_convert_encoding($b, 'UTF-16BE'); |
return strcmp($a, $b); |
}); |
echo '{'; |
$next = false; |
foreach ($item as $key => $value) { |
if ($next) { |
echo ','; |
} |
$next = true; |
$outKey = json_encode((string)$key, self::JSON_FLAGS); |
echo $outKey, ':', $this->serialize($value); |
} |
echo '}'; |
} |
} |
/trunk/plugins/viathinksoft/publicPages/100_whois/whois/json/vendor/aywan/php-json-canonicalization/src/JsonCanonicalizationFactory.php |
---|
0,0 → 1,13 |
<?php |
declare(strict_types=1); |
namespace aywan\JsonCanonicalization; |
class JsonCanonicalizationFactory |
{ |
public static function getInstance(): JsonCanonicalizationInterface |
{ |
return new Canonicalizator(); |
} |
} |
/trunk/plugins/viathinksoft/publicPages/100_whois/whois/json/vendor/aywan/php-json-canonicalization/src/JsonCanonicalizationInterface.php |
---|
0,0 → 1,10 |
<?php |
declare(strict_types=1); |
namespace aywan\JsonCanonicalization; |
interface JsonCanonicalizationInterface |
{ |
public function canonicalize($data, bool $asHex = false): string; |
} |
/trunk/plugins/viathinksoft/publicPages/100_whois/whois/json/vendor/aywan/php-json-canonicalization/src/Utils.php |
---|
0,0 → 1,50 |
<?php |
declare(strict_types=1); |
namespace aywan\JsonCanonicalization; |
/** |
* @internal |
*/ |
class Utils |
{ |
public static function isAssoc(array $a): bool |
{ |
return [] !== $a && array_keys($a) !== range(0, count($a) - 1); |
} |
public static function asHex(string $data): string |
{ |
return rtrim(chunk_split(bin2hex($data), 2, ' ')); |
} |
public static function es6NumberFormat(float $number): string |
{ |
if (is_nan($number) || is_infinite($number)) { |
throw new \RuntimeException("can't use Nan or Infinity in json"); |
} |
if (0.0 === $number) { |
return '0'; |
} |
$sign = ''; |
if ($number < 0) { |
$sign = '-'; |
$number = -$number; |
} |
if ($number < 1e+21 && $number >= 1e-6) { |
$formatted = sprintf('%F', $number); |
$formatted = rtrim($formatted, '.0'); |
} else { |
$formatted = sprintf('%e', $number); |
$parts = explode('e', $formatted); |
$parts[0] = rtrim($parts[0], '.0'); |
$formatted = implode('e', $parts); |
} |
return $sign . $formatted; |
} |
} |