123 lines
4.3 KiB
PHP
123 lines
4.3 KiB
PHP
<?php
|
|
namespace libphonenumber\buildtools;
|
|
|
|
use libphonenumber\PhoneMetadata;
|
|
|
|
/**
|
|
* Tool to convert phone number metadata from the XML format to protocol buffer format.
|
|
*
|
|
* @author Davide Mendolia
|
|
*/
|
|
class BuildMetadataPHPFromXml
|
|
{
|
|
const GENERATION_COMMENT = <<<'EOT'
|
|
/**
|
|
* This file is automatically @generated by {@link BuildMetadataPHPFromXml}.
|
|
* Please don't modify it directly.
|
|
*/
|
|
|
|
|
|
EOT;
|
|
const MAP_COMMENT = <<<'EOT'
|
|
// A mapping from a country code to the region codes which denote the
|
|
// country/region represented by that country code. In the case of multiple
|
|
// countries sharing a calling code, such as the NANPA countries, the one
|
|
// indicated with "isMainCountryForCode" in the metadata should be first.
|
|
|
|
EOT;
|
|
const COUNTRY_CODE_SET_COMMENT =
|
|
" // A set of all country codes for which data is available.\n";
|
|
const REGION_CODE_SET_COMMENT =
|
|
" // A set of all region codes for which data is available.\n";
|
|
|
|
public function start($inputFile, $outputDir, $filePrefix, $mappingClass, $mappingClassLocation, $liteBuild)
|
|
{
|
|
$savePath = $outputDir . $filePrefix;
|
|
|
|
$metadataCollection = BuildMetadataFromXml::buildPhoneMetadataCollection($inputFile, $liteBuild);
|
|
|
|
$this->writeMetadataToFile($metadataCollection, $savePath);
|
|
|
|
|
|
$countryCodeToRegionCodeMap = BuildMetadataFromXml::buildCountryCodeToRegionCodeMap($metadataCollection);
|
|
|
|
// Sort $countryCodeToRegionCodeMap just to have the regions in order
|
|
|
|
ksort($countryCodeToRegionCodeMap);
|
|
|
|
$this->writeCountryCallingCodeMappingToFile($countryCodeToRegionCodeMap, $mappingClassLocation, $mappingClass);
|
|
}
|
|
|
|
/**
|
|
* @param $metadataCollection PhoneMetadata[]
|
|
* @param $filePrefix
|
|
*/
|
|
private function writeMetadataToFile($metadataCollection, $filePrefix)
|
|
{
|
|
foreach ($metadataCollection as $metadata) {
|
|
/** @var $phoneMetadata PhoneMetadata */
|
|
$regionCode = $metadata->getId();
|
|
// For non-geographical country calling codes (e.g. +800), use the country calling codes
|
|
// instead of the region code to form the file name.
|
|
if ($regionCode === '001' || $regionCode == '') {
|
|
$regionCode = $metadata->getCountryCode();
|
|
}
|
|
|
|
$data = '<?php' . PHP_EOL . self::GENERATION_COMMENT . PHP_EOL . 'return ' . var_export(
|
|
$metadata->toArray(),
|
|
true
|
|
) . ';' . PHP_EOL;
|
|
|
|
file_put_contents($filePrefix . "_" . $regionCode . '.php', $data);
|
|
}
|
|
}
|
|
|
|
private function writeCountryCallingCodeMappingToFile($countryCodeToRegionCodeMap, $outputDir, $mappingClass)
|
|
{
|
|
// Find out whether the countryCodeToRegionCodeMap has any region codes or country
|
|
// calling codes listed in it.
|
|
$hasRegionCodes = false;
|
|
foreach ($countryCodeToRegionCodeMap as $key => $listWithRegionCode) {
|
|
if (count($listWithRegionCode) > 0) {
|
|
$hasRegionCodes = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
$hasCountryCodes = (count($countryCodeToRegionCodeMap) > 1);
|
|
|
|
$variableName = lcfirst($mappingClass);
|
|
|
|
$data = '<?php' . PHP_EOL .
|
|
self::GENERATION_COMMENT . PHP_EOL .
|
|
"namespace libphonenumber;" . PHP_EOL .
|
|
"class {$mappingClass} {" . PHP_EOL .
|
|
PHP_EOL;
|
|
|
|
if ($hasRegionCodes && $hasCountryCodes) {
|
|
$data .= self::MAP_COMMENT . PHP_EOL;
|
|
$data .= " public static \${$variableName} = " . var_export(
|
|
$countryCodeToRegionCodeMap,
|
|
true
|
|
) . ";" . PHP_EOL;
|
|
} elseif ($hasCountryCodes) {
|
|
$data .= self::COUNTRY_CODE_SET_COMMENT . PHP_EOL;
|
|
$data .= " public static \${$variableName} = " . var_export(
|
|
array_keys($countryCodeToRegionCodeMap),
|
|
true
|
|
) . ";" . PHP_EOL;
|
|
} else {
|
|
$data .= self::REGION_CODE_SET_COMMENT . PHP_EOL;
|
|
$data .= " public static \${$variableName} = " . var_export(
|
|
$countryCodeToRegionCodeMap[0],
|
|
true
|
|
) . ";" . PHP_EOL;
|
|
}
|
|
|
|
$data .= PHP_EOL .
|
|
"}" . PHP_EOL;
|
|
|
|
file_put_contents($outputDir . $mappingClass . '.php', $data);
|
|
}
|
|
}
|