/**
* Extracts the available formats from the provided DOM element. If it does not contain any
* nationalPrefixFormattingRule, the one passed-in is retained.
* @param PhoneMetadata $metadata
* @param string $regionCode
* @param \DOMElement $element
* @param string $nationalPrefix
* @param string $nationalPrefixFormattingRule
*/
private static function loadAvailableFormats(PhoneMetadata $metadata, $regionCode, \DOMElement $element, $nationalPrefix, $nationalPrefixFormattingRule)
{
$carrierCodeFormattingRule = "";
if ($element->hasAttribute(self::CARRIER_CODE_FORMATTING_RULE)) {
$carrierCodeFormattingRule = self::getDomesticCarrierCodeFormattingRuleFromElement($element, $nationalPrefix);
}
$numberFormatElements = $element->getElementsByTagName(self::NUMBER_FORMAT);
$hasExplicitIntlFormatDefined = false;
$numOfFormatElements = $numberFormatElements->length;
if ($numOfFormatElements > 0) {
for ($i = 0; $i < $numOfFormatElements; $i++) {
$numberFormatElement = $numberFormatElements->item($i);
$format = new NumberFormat();
if ($numberFormatElement->hasAttribute(self::NATIONAL_PREFIX_FORMATTING_RULE)) {
$format->setNationalPrefixFormattingRule(self::getNationalPrefixFormattingRuleFromElement($numberFormatElement, $nationalPrefix));
} else {
$format->setNationalPrefixFormattingRule($nationalPrefixFormattingRule);
}
if ($numberFormatElement->hasAttribute(self::CARRIER_CODE_FORMATTING_RULE)) {
$format->setDomesticCarrierCodeFormattingRule(self::getDomesticCarrierCodeFormattingRuleFromElement($numberFormatElement, $nationalPrefix));
} else {
$format->setDomesticCarrierCodeFormattingRule($carrierCodeFormattingRule);
}
self::loadNationalFormat($metadata, $numberFormatElement, $format);
$metadata->addNumberFormat($format);
if (self::loadInternationalFormat($metadata, $numberFormatElement, $format)) {
$hasExplicitIntlFormatDefined = true;
}
}
// Only a small number of regions need to specify the intlFormats in the xml. For the majority
// of countries the intlNumberFormat metadata is an exact copy of the national NumberFormat
// metadata. To minimize the size of the metadata file, we only keep intlNumberFormats that
// actually differ in some way to the national formats.
if (!$hasExplicitIntlFormatDefined) {
$metadata->clearIntlNumberFormat();
}
}
}