Browse Source

Update JS code to revision 76.

pull/567/head
Nikolaos Trogkanis 15 years ago
committed by Mihaela Rosca
parent
commit
7d0ff33a85
9 changed files with 2112 additions and 716 deletions
  1. +13
    -45
      java/resources/com/google/i18n/phonenumbers/BuildMetadataJsonFromXml.java
  2. +1
    -1
      javascript/README
  3. +706
    -157
      javascript/i18n/phonenumbers/metadata.js
  4. +39
    -5
      javascript/i18n/phonenumbers/metadatafortesting.js
  5. +706
    -157
      javascript/i18n/phonenumbers/metadatalite.js
  6. +366
    -275
      javascript/i18n/phonenumbers/phonemetadata.pb.js
  7. +44
    -46
      javascript/i18n/phonenumbers/phonenumber.pb.js
  8. +160
    -28
      javascript/i18n/phonenumbers/phonenumberutil.js
  9. +77
    -2
      javascript/i18n/phonenumbers/phonenumberutil_test.js

+ 13
- 45
java/resources/com/google/i18n/phonenumbers/BuildMetadataJsonFromXml.java View File

@ -249,53 +249,21 @@ public class BuildMetadataJsonFromXml {
// missing 0
jsArrayBuilder.append(null);
// required PhoneNumberDesc general_desc = 1;
if (metadata.hasGeneralDesc()) {
toJsArray(metadata.getGeneralDesc(), jsArrayBuilder);
} else {
jsArrayBuilder.append(null);
}
toJsArray(metadata.getGeneralDesc(), jsArrayBuilder);
// required PhoneNumberDesc fixed_line = 2;
if (metadata.hasFixedLine()) {
toJsArray(metadata.getFixedLine(), jsArrayBuilder);
} else {
jsArrayBuilder.append(null);
}
toJsArray(metadata.getFixedLine(), jsArrayBuilder);
// required PhoneNumberDesc mobile = 3;
if (metadata.hasMobile()) {
toJsArray(metadata.getMobile(), jsArrayBuilder);
} else {
jsArrayBuilder.append(null);
}
toJsArray(metadata.getMobile(), jsArrayBuilder);
// required PhoneNumberDesc toll_free = 4;
if (metadata.hasTollFree()) {
toJsArray(metadata.getTollFree(), jsArrayBuilder);
} else {
jsArrayBuilder.append(null);
}
toJsArray(metadata.getTollFree(), jsArrayBuilder);
// required PhoneNumberDesc premium_rate = 5;
if (metadata.hasPremiumRate()) {
toJsArray(metadata.getPremiumRate(), jsArrayBuilder);
} else {
jsArrayBuilder.append(null);
}
toJsArray(metadata.getPremiumRate(), jsArrayBuilder);
// required PhoneNumberDesc shared_cost = 6;
if (metadata.hasSharedCost()) {
toJsArray(metadata.getSharedCost(), jsArrayBuilder);
} else {
jsArrayBuilder.append(null);
}
toJsArray(metadata.getSharedCost(), jsArrayBuilder);
// required PhoneNumberDesc personal_number = 7;
if (metadata.hasPersonalNumber()) {
toJsArray(metadata.getPersonalNumber(), jsArrayBuilder);
} else {
jsArrayBuilder.append(null);
}
toJsArray(metadata.getPersonalNumber(), jsArrayBuilder);
// required PhoneNumberDesc voip = 8;
if (metadata.hasVoip()) {
toJsArray(metadata.getVoip(), jsArrayBuilder);
} else {
jsArrayBuilder.append(null);
}
toJsArray(metadata.getVoip(), jsArrayBuilder);
// required string id = 9;
jsArrayBuilder.append(metadata.getId());
// required int32 country_code = 10;
@ -364,11 +332,7 @@ public class BuildMetadataJsonFromXml {
jsArrayBuilder.append(null);
}
// required PhoneNumberDesc pager = 21;
if (metadata.hasPager()) {
toJsArray(metadata.getPager(), jsArrayBuilder);
} else {
jsArrayBuilder.append(null);
}
toJsArray(metadata.getPager(), jsArrayBuilder);
// optional bool main_country_for_code = 22 [default=false];
if (metadata.getMainCountryForCode()) {
jsArrayBuilder.append(1);
@ -381,6 +345,10 @@ public class BuildMetadataJsonFromXml {
} else {
jsArrayBuilder.append(null);
}
// required PhoneNumberDesc no_international_dialling = 24;
toJsArray(metadata.getNoInternationalDialling(), jsArrayBuilder);
// required PhoneNumberDesc uan = 25;
toJsArray(metadata.getUan(), jsArrayBuilder);
jsArrayBuilder.endArray();
}


+ 1
- 1
javascript/README View File

@ -25,7 +25,7 @@ pages with your web browser:
How to update:
==============
The JavaScript library is ported from the Java implementation (revision 67).
The JavaScript library is ported from the Java implementation (revision 76).
When the Java project gets updated follow these steps to update the JavaScript
project:


+ 706
- 157
javascript/i18n/phonenumbers/metadata.js
File diff suppressed because it is too large
View File


+ 39
- 5
javascript/i18n/phonenumbers/metadatafortesting.js View File

@ -62,6 +62,8 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,[,,"NA","NA"]
,[,,"NA","NA"]
,"AD",376,"00",,,,,,,1,,,[,,"NA","NA"]
,,,[,,"NA","NA"]
,[,,"NA","NA"]
]
,"AO":[,[,,"[29]\\d{8}","\\d{9}"]
,[,,"2\\d(?:[26-9]\\d|\\d[26-9])\\d{5}","\\d{9}",,,"222123456"]
@ -74,6 +76,8 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,"AO",244,"00","0~0",,,"0~0",,,,[[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",,"",""]
]
,,[,,"NA","NA"]
,,,[,,"NA","NA"]
,[,,"NA","NA"]
]
,"AR":[,[,,"[1-3689]\\d{9,10}","\\d{6,11}"]
,[,,"[1-3]\\d{9}","\\d{6,10}"]
@ -106,6 +110,8 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,,""]
]
,[,,"NA","NA"]
,,,[,,"NA","NA"]
,[,,"NA","NA"]
]
,"AU":[,[,,"[1-578]\\d{4,14}","\\d{5,15}"]
,[,,"[2378]\\d{8}","\\d{9}"]
@ -121,6 +127,8 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,"0$1",""]
]
,,[,,"NA","NA"]
,,,[,,"NA","NA"]
,[,,"NA","NA"]
]
,"BS":[,[,,"(242|8(00|66|77|88)|900)\\d{7}","\\d{7,10}"]
,[,,"242(?:3(?:02|[236][1-9]|4[0-24-9]|5[0-68]|7[3-57]|9[2-5])|4(?:2[237]|51|64|77)|502|636|702)\\d{4}","\\d{7,10}"]
@ -131,6 +139,8 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,[,,"NA","NA"]
,[,,"NA","NA"]
,"BS",1,"011","1",,,"1",,,,,,[,,"NA","NA"]
,,,[,,"NA","NA"]
,[,,"NA","NA"]
]
,"DE":[,[,,"\\d{4,14}","\\d{2,14}"]
,[,,"(?:[24-6]\\d{2}|3[03-9]\\d|[789](?:[1-9]\\d|0[2-9]))\\d{3,8}","\\d{2,14}",,,"30123456"]
@ -152,6 +162,8 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,"0$1",""]
]
,,[,,"NA","NA"]
,,,[,,"NA","NA"]
,[,,"NA","NA"]
]
,"GB":[,[,,"\\d{10}","\\d{6,10}"]
,[,,"[1-6]\\d{9}","\\d{6,10}"]
@ -171,6 +183,8 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,"(0$1)",""]
]
,,[,,"NA","NA"]
,,,[,,"NA","NA"]
,[,,"NA","NA"]
]
,"IT":[,[,,"[0389]\\d{5,10}","\\d{6,11}"]
,[,,"0\\d{9,10}","\\d{10,11}"]
@ -190,6 +204,8 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,"",""]
]
,,[,,"NA","NA"]
,,,[,,"NA","NA"]
,[,,"NA","NA"]
]
,"JP":[,[]
,[]
@ -209,6 +225,8 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,"0$1",""]
]
,,[,,"NA","NA"]
,,,[,,"NA","NA"]
,[,,"NA","NA"]
]
,"KR":[,[,,"[1-79]\\d{3,9}|8\\d{8}","\\d{4,10}"]
,[,,"(?:2|[34][1-3]|5[1-5]|6[1-4])(?:1\\d{2,3}|[2-9]\\d{6,7})","\\d{4,10}",,,"22123456"]
@ -244,6 +262,8 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,"0$1",""]
]
,,[,,"NA","NA"]
,,,[,,"NA","NA"]
,[,,"NA","NA"]
]
,"MX":[,[,,"[1-9]\\d{9,10}","\\d{7,11}"]
,[,,"[2-9]\\d{9}","\\d{7,10}"]
@ -276,8 +296,10 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,,""]
]
,[,,"NA","NA"]
,,,[,,"NA","NA"]
,[,,"NA","NA"]
]
,"NZ":[,[,,"[2-9]\\d{7,9}","\\d{7,10}"]
,"NZ":[,[,,"[289]\\d{7,9}|[3-7]\\d{7}","\\d{7,10}"]
,[,,"24099\\d{3}|(?:3[2-79]|[479][2-689]|6[235-9])\\d{6}","\\d{7,8}"]
,[,,"2(?:[027]\\d{7}|9\\d{6,7}|1(?:0\\d{5,7}|[12]\\d{5,6}|[3-9]\\d{5})|4[1-9]\\d{6}|8\\d{7,8})","\\d{8,10}"]
,[,,"800\\d{6,7}","\\d{9,10}"]
@ -293,6 +315,8 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,"0$1",""]
]
,,[,,"NA","NA"]
,,,[,,"NA","NA"]
,[,,"NA","NA"]
]
,"PL":[,[,,"[1-9]\\d{8}","\\d{9}"]
,[,,"[1-9]\\d{8}","\\d{9}"]
@ -305,6 +329,8 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,"PL",48,"0~0","0",,,"0",,,,[[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",,"0$1",""]
]
,,[,,"NA","NA"]
,,,[,,"NA","NA"]
,[,,"NA","NA"]
]
,"RE":[,[,,"[268]\\d{8}","\\d{9}"]
,[,,"262\\d{6}","\\d{9}",,,"262161234"]
@ -317,7 +343,9 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,"RE",262,"00","0",,,"0",,,,[[,"([268]\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,"0$1",""]
]
,,[,,"NA","NA"]
,,"262|6(?:9[23]|47)|8"]
,,"262|6(?:9[23]|47)|8",[,,"NA","NA"]
,[,,"NA","NA"]
]
,"SG":[,[,,"[13689]\\d{7,10}","\\d{8,11}"]
,[,,"[36]\\d{7}","\\d{8}"]
,[,,"[89]\\d{7}","\\d{8}"]
@ -334,11 +362,13 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,"",""]
]
,,[,,"NA","NA"]
,,,[,,"NA","NA"]
,[,,"NA","NA"]
]
,"US":[,[,,"[13-9]\\d{9}|2[0-35-9]\\d{8}","\\d{7,10}",,,"1234567890"]
,[,,"[13-9]\\d{9}|2[0-35-9]\\d{8}","\\d{7,10}",,,"1234567890"]
,[,,"[13-9]\\d{9}|2[0-35-9]\\d{8}","\\d{7,10}",,,"1234567890"]
,[,,"8(00|66|77|88)\\d{7}","\\d{10}",,,"1234567890"]
,[,,"8(?:00|66|77|88)\\d{7}","\\d{10}",,,"1234567890"]
,[,,"900\\d{7}","\\d{10}",,,"1234567890"]
,[,,"NA","NA"]
,[,,"NA","NA"]
@ -349,7 +379,9 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,[[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",,,""]
]
,[,,"NA","NA"]
,1]
,1,,[,,"800\\d{7}","\\d{10}",,,"1234567890"]
,[,,"NA","NA"]
]
,"YT":[,[,,"[268]\\d{8}","\\d{9}"]
,[,,"2696[0-4]\\d{4}","\\d{9}",,,"269601234"]
,[,,"639\\d{6}","\\d{9}",,,"639123456"]
@ -359,5 +391,7 @@ i18n.phonenumbers.metadata.countryToMetadata = {
,[,,"NA","NA"]
,[,,"NA","NA"]
,"YT",262,"00","0",,,"0",,,,,,[,,"NA","NA"]
,,"269|639"]
,,"269|639",[,,"NA","NA"]
,[,,"NA","NA"]
]
};

+ 706
- 157
javascript/i18n/phonenumbers/metadatalite.js
File diff suppressed because it is too large
View File


+ 366
- 275
javascript/i18n/phonenumbers/phonemetadata.pb.js
File diff suppressed because it is too large
View File


+ 44
- 46
javascript/i18n/phonenumbers/phonenumber.pb.js View File

@ -1,7 +1,7 @@
/*
* @license
* Protocol Buffer 2 Copyright 2008 Google Inc
* All other code copyright its respective owners(s).
* Protocol Buffer 2 Copyright 2008 Google Inc.
* All other code copyright its respective owners.
* Copyright (C) 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -27,6 +27,8 @@ goog.provide('i18n.phonenumbers.PhoneNumber.CountryCodeSource');
goog.require('goog.proto2.Message');
/**
* Message PhoneNumber.
* @constructor
@ -37,6 +39,15 @@ i18n.phonenumbers.PhoneNumber = function() {
};
goog.inherits(i18n.phonenumbers.PhoneNumber, goog.proto2.Message);
/**
* Overrides {@link goog.proto2.Message#clone} to specify its exact return type.
* @return {!i18n.phonenumbers.PhoneNumber} The cloned message.
* @override
*/
i18n.phonenumbers.PhoneNumber.prototype.clone;
/**
* Gets the value of the country_code field.
* @return {?number} The value.
@ -60,13 +71,12 @@ i18n.phonenumbers.PhoneNumber.prototype.getCountryCodeOrDefault = function() {
* @param {number} value The value.
*/
i18n.phonenumbers.PhoneNumber.prototype.setCountryCode = function(value) {
this.set$Value(1, /** @type {Object} */ (value));
this.set$Value(1, value);
};
/**
* Returns whether the country_code field has a value.
* @return {boolean} true if the field has a value.
* @return {boolean} Whether the country_code field has a value.
*/
i18n.phonenumbers.PhoneNumber.prototype.hasCountryCode = function() {
return this.has$Value(1);
@ -74,8 +84,7 @@ i18n.phonenumbers.PhoneNumber.prototype.hasCountryCode = function() {
/**
* Gets the number of values in the country_code field.
* @return {number}
* @return {number} The number of values in the country_code field.
*/
i18n.phonenumbers.PhoneNumber.prototype.countryCodeCount = function() {
return this.count$Values(1);
@ -113,13 +122,12 @@ i18n.phonenumbers.PhoneNumber.prototype.getNationalNumberOrDefault = function()
* @param {number} value The value.
*/
i18n.phonenumbers.PhoneNumber.prototype.setNationalNumber = function(value) {
this.set$Value(2, /** @type {Object} */ (value));
this.set$Value(2, value);
};
/**
* Returns whether the national_number field has a value.
* @return {boolean} true if the field has a value.
* @return {boolean} Whether the national_number field has a value.
*/
i18n.phonenumbers.PhoneNumber.prototype.hasNationalNumber = function() {
return this.has$Value(2);
@ -127,8 +135,7 @@ i18n.phonenumbers.PhoneNumber.prototype.hasNationalNumber = function() {
/**
* Gets the number of values in the national_number field.
* @return {number}
* @return {number} The number of values in the national_number field.
*/
i18n.phonenumbers.PhoneNumber.prototype.nationalNumberCount = function() {
return this.count$Values(2);
@ -166,13 +173,12 @@ i18n.phonenumbers.PhoneNumber.prototype.getExtensionOrDefault = function() {
* @param {string} value The value.
*/
i18n.phonenumbers.PhoneNumber.prototype.setExtension = function(value) {
this.set$Value(3, /** @type {Object} */ (value));
this.set$Value(3, value);
};
/**
* Returns whether the extension field has a value.
* @return {boolean} true if the field has a value.
* @return {boolean} Whether the extension field has a value.
*/
i18n.phonenumbers.PhoneNumber.prototype.hasExtension = function() {
return this.has$Value(3);
@ -180,8 +186,7 @@ i18n.phonenumbers.PhoneNumber.prototype.hasExtension = function() {
/**
* Gets the number of values in the extension field.
* @return {number}
* @return {number} The number of values in the extension field.
*/
i18n.phonenumbers.PhoneNumber.prototype.extensionCount = function() {
return this.count$Values(3);
@ -219,13 +224,12 @@ i18n.phonenumbers.PhoneNumber.prototype.getItalianLeadingZeroOrDefault = functio
* @param {boolean} value The value.
*/
i18n.phonenumbers.PhoneNumber.prototype.setItalianLeadingZero = function(value) {
this.set$Value(4, /** @type {Object} */ (value));
this.set$Value(4, value);
};
/**
* Returns whether the italian_leading_zero field has a value.
* @return {boolean} true if the field has a value.
* @return {boolean} Whether the italian_leading_zero field has a value.
*/
i18n.phonenumbers.PhoneNumber.prototype.hasItalianLeadingZero = function() {
return this.has$Value(4);
@ -233,8 +237,7 @@ i18n.phonenumbers.PhoneNumber.prototype.hasItalianLeadingZero = function() {
/**
* Gets the number of values in the italian_leading_zero field.
* @return {number}
* @return {number} The number of values in the italian_leading_zero field.
*/
i18n.phonenumbers.PhoneNumber.prototype.italianLeadingZeroCount = function() {
return this.count$Values(4);
@ -272,13 +275,12 @@ i18n.phonenumbers.PhoneNumber.prototype.getRawInputOrDefault = function() {
* @param {string} value The value.
*/
i18n.phonenumbers.PhoneNumber.prototype.setRawInput = function(value) {
this.set$Value(5, /** @type {Object} */ (value));
this.set$Value(5, value);
};
/**
* Returns whether the raw_input field has a value.
* @return {boolean} true if the field has a value.
* @return {boolean} Whether the raw_input field has a value.
*/
i18n.phonenumbers.PhoneNumber.prototype.hasRawInput = function() {
return this.has$Value(5);
@ -286,8 +288,7 @@ i18n.phonenumbers.PhoneNumber.prototype.hasRawInput = function() {
/**
* Gets the number of values in the raw_input field.
* @return {number}
* @return {number} The number of values in the raw_input field.
*/
i18n.phonenumbers.PhoneNumber.prototype.rawInputCount = function() {
return this.count$Values(5);
@ -325,13 +326,12 @@ i18n.phonenumbers.PhoneNumber.prototype.getCountryCodeSourceOrDefault = function
* @param {i18n.phonenumbers.PhoneNumber.CountryCodeSource} value The value.
*/
i18n.phonenumbers.PhoneNumber.prototype.setCountryCodeSource = function(value) {
this.set$Value(6, /** @type {Object} */ (value));
this.set$Value(6, value);
};
/**
* Returns whether the country_code_source field has a value.
* @return {boolean} true if the field has a value.
* @return {boolean} Whether the country_code_source field has a value.
*/
i18n.phonenumbers.PhoneNumber.prototype.hasCountryCodeSource = function() {
return this.has$Value(6);
@ -339,8 +339,7 @@ i18n.phonenumbers.PhoneNumber.prototype.hasCountryCodeSource = function() {
/**
* Gets the number of values in the country_code_source field.
* @return {number}
* @return {number} The number of values in the country_code_source field.
*/
i18n.phonenumbers.PhoneNumber.prototype.countryCodeSourceCount = function() {
return this.count$Values(6);
@ -360,50 +359,49 @@ i18n.phonenumbers.PhoneNumber.prototype.clearCountryCodeSource = function() {
* @enum {number}
*/
i18n.phonenumbers.PhoneNumber.CountryCodeSource = {
FROM_NUMBER_WITH_PLUS_SIGN : 1,
FROM_NUMBER_WITH_IDD : 5,
FROM_NUMBER_WITHOUT_PLUS_SIGN : 10,
FROM_DEFAULT_COUNTRY : 20
FROM_NUMBER_WITH_PLUS_SIGN: 1,
FROM_NUMBER_WITH_IDD: 5,
FROM_NUMBER_WITHOUT_PLUS_SIGN: 10,
FROM_DEFAULT_COUNTRY: 20
};
goog.proto2.Message.set$Metadata(i18n.phonenumbers.PhoneNumber, {
0 : {
0: {
name: 'PhoneNumber',
fullName: 'i18n.phonenumbers.PhoneNumber'
},
'1' : {
1: {
name: 'country_code',
required: true,
fieldType: goog.proto2.Message.FieldType.INT32,
type: Number
},
'2' : {
2: {
name: 'national_number',
required: true,
fieldType: goog.proto2.Message.FieldType.UINT64,
type: Number
},
'3' : {
3: {
name: 'extension',
fieldType: goog.proto2.Message.FieldType.STRING,
type: String
},
'4' : {
4: {
name: 'italian_leading_zero',
fieldType: goog.proto2.Message.FieldType.BOOL,
type: Boolean
},
'5' : {
5: {
name: 'raw_input',
fieldType: goog.proto2.Message.FieldType.STRING,
type: String
},
'6' : {
6: {
name: 'country_code_source',
fieldType: goog.proto2.Message.FieldType.ENUM,
defaultValue: i18n.phonenumbers.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN,
type: i18n.phonenumbers.PhoneNumber.CountryCodeSource
}});
}
});

+ 160
- 28
javascript/i18n/phonenumbers/phonenumberutil.js View File

@ -106,6 +106,26 @@ i18n.phonenumbers.PhoneNumberUtil.MIN_LENGTH_FOR_NSN_ = 3;
i18n.phonenumbers.PhoneNumberUtil.MAX_LENGTH_FOR_NSN_ = 15;
/**
* The maximum length of the country code.
*
* @const
* @type {number}
* @private
*/
i18n.phonenumbers.PhoneNumberUtil.MAX_LENGTH_COUNTRY_CODE_ = 3;
/**
* Region-code for the unknown region.
*
* @const
* @type {string}
* @private
*/
i18n.phonenumbers.PhoneNumberUtil.UNKNOWN_REGION_ = 'ZZ';
/**
* The PLUS_SIGN signifies the international prefix.
*
@ -152,7 +172,17 @@ i18n.phonenumbers.PhoneNumberUtil.DIGIT_MAPPINGS = {
'\u0666': '6', // Arabic-indic digit 6
'\u0667': '7', // Arabic-indic digit 7
'\u0668': '8', // Arabic-indic digit 8
'\u0669': '9' // Arabic-indic digit 9
'\u0669': '9', // Arabic-indic digit 9
'\u06F0': '0', // Eastern-Arabic digit 0
'\u06F1': '1', // Eastern-Arabic digit 1
'\u06F2': '2', // Eastern-Arabic digit 2
'\u06F3': '3', // Eastern-Arabic digit 3
'\u06F4': '4', // Eastern-Arabic digit 4
'\u06F5': '5', // Eastern-Arabic digit 5
'\u06F6': '6', // Eastern-Arabic digit 6
'\u06F7': '7', // Eastern-Arabic digit 7
'\u06F8': '8', // Eastern-Arabic digit 8
'\u06F9': '9' // Eastern-Arabic digit 9
};
@ -229,6 +259,16 @@ i18n.phonenumbers.PhoneNumberUtil.ALL_NORMALIZATION_MAPPINGS_ = {
'\u0667': '7', // Arabic-indic digit 7
'\u0668': '8', // Arabic-indic digit 8
'\u0669': '9', // Arabic-indic digit 9
'\u06F0': '0', // Eastern-Arabic digit 0
'\u06F1': '1', // Eastern-Arabic digit 1
'\u06F2': '2', // Eastern-Arabic digit 2
'\u06F3': '3', // Eastern-Arabic digit 3
'\u06F4': '4', // Eastern-Arabic digit 4
'\u06F5': '5', // Eastern-Arabic digit 5
'\u06F6': '6', // Eastern-Arabic digit 6
'\u06F7': '7', // Eastern-Arabic digit 7
'\u06F8': '8', // Eastern-Arabic digit 8
'\u06F9': '9', // Eastern-Arabic digit 9
'A': '2',
'B': '2',
'C': '2',
@ -274,6 +314,7 @@ i18n.phonenumbers.PhoneNumberUtil.LEADING_ZERO_COUNTRIES_ = {
241: 1, // Gabon
242: 1, // Congo (Rep. of the)
268: 1, // Swaziland
378: 1, // San Marino
379: 1, // Vatican City
501: 1 // Belize
};
@ -313,14 +354,15 @@ i18n.phonenumbers.PhoneNumberUtil.VALID_PUNCTUATION_ =
/**
* Digits accepted in phone numbers (ascii, fullwidth, and arabic-indic digits).
* Digits accepted in phone numbers (ascii, fullwidth, arabic-indic, and eastern
* arabic digits).
*
* @const
* @type {string}
* @private
*/
i18n.phonenumbers.PhoneNumberUtil.VALID_DIGITS_ =
'0-9\uFF10-\uFF19\u0660-\u0669';
'0-9\uFF10-\uFF19\u0660-\u0669\u06F0-\u06F9';
/**
@ -429,6 +471,7 @@ i18n.phonenumbers.PhoneNumberUtil.VALID_ALPHA_PHONE_PATTERN_ =
* numbers. We also allow multiple '+' characters at the start.
* Corresponds to the following:
* plus_sign*([punctuation]*[digits]){3,}([punctuation]|[digits]|[alpha])*
* Note VALID_PUNCTUATION starts with a -, so must be the first in the range.
*
* @const
* @type {string}
@ -438,8 +481,8 @@ i18n.phonenumbers.PhoneNumberUtil.VALID_PHONE_NUMBER_ =
'[' + i18n.phonenumbers.PhoneNumberUtil.PLUS_CHARS_ + ']*(?:[' +
i18n.phonenumbers.PhoneNumberUtil.VALID_PUNCTUATION_ + ']*[' +
i18n.phonenumbers.PhoneNumberUtil.VALID_DIGITS_ + ']){3,}[' +
i18n.phonenumbers.PhoneNumberUtil.VALID_ALPHA_ +
i18n.phonenumbers.PhoneNumberUtil.VALID_PUNCTUATION_ +
i18n.phonenumbers.PhoneNumberUtil.VALID_ALPHA_ +
i18n.phonenumbers.PhoneNumberUtil.VALID_DIGITS_ + ']*';
@ -591,9 +634,13 @@ i18n.phonenumbers.PhoneNumberType = {
// here: http://en.wikipedia.org/wiki/Personal_Numbers
PERSONAL_NUMBER: 7,
PAGER: 8,
// Used for "Universal Access Numbers" or "Company Numbers". They may be
// further routed to specific offices, but allow one number to be used for a
// company.
UAN: 9,
// A phone number is of type UNKNOWN when it does not fit any of the known
// patterns for a specific country.
UNKNOWN: 9
UNKNOWN: 10
};
@ -604,10 +651,11 @@ i18n.phonenumbers.PhoneNumberType = {
* @enum {number}
*/
i18n.phonenumbers.PhoneNumberUtil.MatchType = {
NO_MATCH: 0,
SHORT_NSN_MATCH: 1,
NSN_MATCH: 2,
EXACT_MATCH: 3
NOT_A_NUMBER: 0,
NO_MATCH: 1,
SHORT_NSN_MATCH: 2,
NSN_MATCH: 3,
EXACT_MATCH: 4
};
@ -810,8 +858,8 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.getLengthOfGeographicalAreaCode =
if (number == null) {
return 0;
}
/** @type {string} */
var regionCode = /** @type {string} */ (this.getRegionCodeForNumber(number));
/** @type {?string} */
var regionCode = this.getRegionCodeForNumber(number);
if (!this.isValidRegionCode_(regionCode)) {
return 0;
}
@ -1567,6 +1615,8 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.getNumberDescByType_ =
return metadata.getPersonalNumber();
case i18n.phonenumbers.PhoneNumberType.PAGER:
return metadata.getPager();
case i18n.phonenumbers.PhoneNumberType.UAN:
return metadata.getUan();
default:
return metadata.getGeneralDesc();
}
@ -1583,8 +1633,8 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.getNumberDescByType_ =
i18n.phonenumbers.PhoneNumberUtil.prototype.getNumberType =
function(number) {
/** @type {string} */
var regionCode = /** @type {string} */ (this.getRegionCodeForNumber(number));
/** @type {?string} */
var regionCode = this.getRegionCodeForNumber(number);
if (!this.isValidRegionCode_(regionCode)) {
return i18n.phonenumbers.PhoneNumberType.UNKNOWN;
}
@ -1628,10 +1678,12 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.getNumberTypeHelper_ =
metadata.getPersonalNumber())) {
return i18n.phonenumbers.PhoneNumberType.PERSONAL_NUMBER;
}
if (this.isNumberMatchingDesc_(nationalNumber,
metadata.getPager())) {
if (this.isNumberMatchingDesc_(nationalNumber, metadata.getPager())) {
return i18n.phonenumbers.PhoneNumberType.PAGER;
}
if (this.isNumberMatchingDesc_(nationalNumber, metadata.getUan())) {
return i18n.phonenumbers.PhoneNumberType.UAN;
}
/** @type {boolean} */
var isFixedLine = this.isNumberMatchingDesc_(nationalNumber, metadata
@ -1713,10 +1765,10 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.isNumberMatchingDesc_ =
* pattern.
*/
i18n.phonenumbers.PhoneNumberUtil.prototype.isValidNumber = function(number) {
/** @type {string} */
var regionCode = /** @type {string} */ (this.getRegionCodeForNumber(number));
/** @type {?string} */
var regionCode = this.getRegionCodeForNumber(number);
return this.isValidRegionCode_(regionCode) &&
this.isValidNumberForRegion(number, regionCode);
this.isValidNumberForRegion(number, /** @type {string} */ (regionCode));
};
@ -1846,7 +1898,8 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.getRegionCodeForCountryCode =
/** @type {Array.<string>} */
var regionCodes =
i18n.phonenumbers.metadata.countryCodeToRegionCodeMap[countryCode];
return regionCodes == null ? 'ZZ' : regionCodes[0];
return regionCodes == null ?
i18n.phonenumbers.PhoneNumberUtil.UNKNOWN_REGION_ : regionCodes[0];
};
@ -2129,7 +2182,9 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.extractCountryCode =
var potentialCountryCode;
/** @type {number} */
var numberLength = fullNumberStr.length;
for (var i = 1; i <= 3 && i <= numberLength; ++i) {
for (var i = 1;
i <= i18n.phonenumbers.PhoneNumberUtil.MAX_LENGTH_COUNTRY_CODE_ &&
i <= numberLength; ++i) {
potentialCountryCode = parseInt(fullNumberStr.substring(0, i), 10);
if (potentialCountryCode in
i18n.phonenumbers.metadata.countryCodeToRegionCodeMap) {
@ -2474,6 +2529,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.maybeStripExtension =
*/
i18n.phonenumbers.PhoneNumberUtil.prototype.checkRegionForParsing_ = function(
numberToParse, defaultCountry) {
// If the number is null or empty, we can't guess the country code.
return this.isValidRegionCode_(defaultCountry) ||
(numberToParse != null && numberToParse.length > 0 &&
i18n.phonenumbers.PhoneNumberUtil.PLUS_CHARS_PATTERN_.test(
@ -2681,30 +2737,77 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.parseHelper_ =
* @param {i18n.phonenumbers.PhoneNumber|string} secondNumberIn second number to
* compare. If it is a string it can contain formatting, and can have
* country code specified with + at the start.
* @return {i18n.phonenumbers.PhoneNumberUtil.MatchType} NO_MATCH,
* @return {i18n.phonenumbers.PhoneNumberUtil.MatchType} NOT_A_NUMBER, NO_MATCH,
* SHORT_NSN_MATCH, NSN_MATCH or EXACT_MATCH depending on the level of
* equality of the two numbers, described in the method definition.
* @throws {i18n.phonenumbers.Error} if either number is not considered to be
* a viable phone number.
*/
i18n.phonenumbers.PhoneNumberUtil.prototype.isNumberMatch =
function(firstNumberIn, secondNumberIn) {
// If the input arguements are strings parse them to a proto buffer format.
// Else make copies of the phone numbers so that the numbers passed in are not
// edited.
/** @type {i18n.phonenumbers.PhoneNumber} */
var firstNumber;
/** @type {i18n.phonenumbers.PhoneNumber} */
var secondNumber;
// If the input arguements are strings parse them to a proto buffer format.
// Else make copies of the phone numbers so that the numbers passed in are not
// edited.
if (typeof firstNumberIn == 'string') {
firstNumber = this.parseHelper_(firstNumberIn, null, false, false);
// First see if the first number has an implicit country code, by attempting
// to parse it.
try {
firstNumber = this.parse(
firstNumberIn, i18n.phonenumbers.PhoneNumberUtil.UNKNOWN_REGION_);
} catch (e) {
if (e != i18n.phonenumbers.Error.INVALID_COUNTRY_CODE) {
return i18n.phonenumbers.PhoneNumberUtil.MatchType.NOT_A_NUMBER;
}
// The first number has no country code. EXACT_MATCH is no longer
// possible. We parse it as if the region was the same as that for the
// second number, and if EXACT_MATCH is returned, we replace this with
// NSN_MATCH.
if (typeof secondNumberIn != 'string') {
/** @type {string} */
var secondNumberRegion = this.getRegionCodeForCountryCode(
secondNumberIn.getCountryCodeOrDefault());
if (secondNumberRegion !=
i18n.phonenumbers.PhoneNumberUtil.UNKNOWN_REGION_) {
try {
firstNumber = this.parse(firstNumberIn, secondNumberRegion);
} catch (e2) {
return i18n.phonenumbers.PhoneNumberUtil.MatchType.NOT_A_NUMBER;
}
/** @type {i18n.phonenumbers.PhoneNumberUtil.MatchType} */
var match = this.isNumberMatch(firstNumber, secondNumberIn);
if (match ==
i18n.phonenumbers.PhoneNumberUtil.MatchType.EXACT_MATCH) {
return i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH;
}
return match;
}
}
// If the second number is a string or doesn't have a valid country code,
// we parse the first number without country code.
try {
firstNumber = this.parseHelper_(firstNumberIn, null, false, false);
} catch (e2) {
return i18n.phonenumbers.PhoneNumberUtil.MatchType.NOT_A_NUMBER;
}
}
} else {
firstNumber = new i18n.phonenumbers.PhoneNumber();
firstNumber.mergeFrom(firstNumberIn);
}
if (typeof secondNumberIn == 'string') {
secondNumber = this.parseHelper_(secondNumberIn, null, false, false);
try {
secondNumber = this.parse(
secondNumberIn, i18n.phonenumbers.PhoneNumberUtil.UNKNOWN_REGION_);
return this.isNumberMatch(firstNumberIn, secondNumber);
} catch (e) {
if (e != i18n.phonenumbers.Error.INVALID_COUNTRY_CODE) {
return i18n.phonenumbers.PhoneNumberUtil.MatchType.NOT_A_NUMBER;
}
return this.isNumberMatch(secondNumberIn, firstNumber);
}
} else {
secondNumber = new i18n.phonenumbers.PhoneNumber();
secondNumber.mergeFrom(secondNumberIn);
@ -2788,6 +2891,35 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.isNationalNumberSuffixOfTheOther_ =
};
/**
* Returns true if the number can only be dialled from within the country. If
* unknown, or the number can be dialled from outside the country as well,
* returns false. Does not check the number is a valid number.
* TODO: Make this method public when we have enough metadata to make it
* worthwhile. Currently visible for testing purposes only.
*
* @param {i18n.phonenumbers.PhoneNumber} number the phone-number for which we
* want to know whether it is only diallable from within the country.
* @return {boolean} true if the number can only be dialled from within the
* country.
*/
i18n.phonenumbers.PhoneNumberUtil.prototype.canBeInternationallyDialled =
function(number) {
/** @type {?string} */
var regionCode = this.getRegionCodeForNumber(number);
/** @type {string} */
var nationalSignificantNumber =
i18n.phonenumbers.PhoneNumberUtil.getNationalSignificantNumber(number);
if (!this.isValidRegionCode_(regionCode)) {
return true;
}
/** @type {i18n.phonenumbers.PhoneMetadata} */
var metadata = this.getMetadataForRegion(regionCode);
return !this.isNumberMatchingDesc_(nationalSignificantNumber,
metadata.getNoInternationalDialling());
};
/**
* Check whether the entire input sequence can be matched against the regular
* expression.


+ 77
- 2
javascript/i18n/phonenumbers/phonenumberutil_test.js View File

@ -260,6 +260,12 @@ function testNormaliseOtherDigits() {
assertEquals('Conversion did not correctly replace non-latin digits',
expectedOutput,
i18n.phonenumbers.PhoneNumberUtil.normalize(inputNumber));
// Eastern-Arabic digits.
inputNumber = '\u06F52\u06F0';
expectedOutput = '520';
assertEquals('Conversion did not correctly replace non-latin digits',
expectedOutput,
i18n.phonenumbers.PhoneNumberUtil.normalize(inputNumber));
}
function testNormaliseStripAlphaCharacters() {
@ -545,8 +551,6 @@ function testFormatOutOfCountryCallingNumber() {
phoneUtil.formatOutOfCountryCallingNumber(arNumber, 'AU'));
assertEquals('011 15 8765-4321 ext. 1234',
phoneUtil.formatOutOfCountryCallingNumber(arNumber, 'AR'));
assertEquals('011 15 8765-4321 ext. 1234',
phoneUtil.formatOutOfCountryCallingNumber(arNumber, 'ar'));
}
function testFormatOutOfCountryWithPreferredIntlPrefix() {
@ -2186,6 +2190,16 @@ function testIsNumberMatchNonMatches() {
assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NO_MATCH,
phoneUtil.isNumberMatch('+64 3 331-6005 ext.1235',
'3 331 6005#1234'));
// Invalid numbers that can't be parsed.
assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NOT_A_NUMBER,
phoneUtil.isNumberMatch('43', '3 331 6043'));
assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NOT_A_NUMBER,
phoneUtil.isNumberMatch('+43', '+64 3 331 6005'));
assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NOT_A_NUMBER,
phoneUtil.isNumberMatch('+43', '64 3 331 6005'));
assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NOT_A_NUMBER,
phoneUtil.isNumberMatch('Dog', '64 3 331 6005'));
}
function testIsNumberMatchNsnMatches() {
@ -2201,6 +2215,10 @@ function testIsNumberMatchNsnMatches() {
nzNumber.setExtension('');
assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH,
phoneUtil.isNumberMatch(nzNumber, '03 331 6005'));
// Here the second number possibly starts with the country code for
// New Zealand, although we are unsure.
assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH,
phoneUtil.isNumberMatch(nzNumber, '(64-3) 331 6005'));
/** @type {i18n.phonenumbers.PhoneNumber} */
var unchangedNzNumber = new i18n.phonenumbers.PhoneNumber();
unchangedNzNumber.setCountryCode(64);
@ -2208,6 +2226,34 @@ function testIsNumberMatchNsnMatches() {
unchangedNzNumber.setExtension('');
// Check the phone number proto was not edited during the method call.
assertTrue(unchangedNzNumber.exactlySameAs(nzNumber));
// Here, the 1 might be a national prefix, if we compare it to the US number,
// so the resultant match is an NSN match.
/** @type {i18n.phonenumbers.PhoneNumber} */
var usNumber = new i18n.phonenumbers.PhoneNumber();
usNumber.setCountryCode(1);
usNumber.setNationalNumber(2345678901);
usNumber.setExtension('');
assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH,
phoneUtil.isNumberMatch(usNumber, '1-234-567-8901'));
assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH,
phoneUtil.isNumberMatch(usNumber, '2345678901'));
assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH,
phoneUtil.isNumberMatch('+1 234-567 8901', '1 234 567 8901'));
assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH,
phoneUtil.isNumberMatch('1 234-567 8901', '1 234 567 8901'));
assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH,
phoneUtil.isNumberMatch('1 234-567 8901', '+1 234 567 8901'));
// For this case, the match will be a short NSN match, because we cannot
// assume that the 1 might be a national prefix, so don't remove it when
// parsing.
/** @type {i18n.phonenumbers.PhoneNumber} */
var randomNumber = new i18n.phonenumbers.PhoneNumber();
randomNumber.setCountryCode(41);
randomNumber.setNationalNumber(2345678901);
randomNumber.setExtension('');
assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
phoneUtil.isNumberMatch(randomNumber, '1-234-567-8901'));
}
function testIsNumberMatchShortNsnMatches() {
@ -2249,3 +2295,32 @@ function testIsNumberMatchShortNsnMatches() {
assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
phoneUtil.isNumberMatch(italianNumberOne, italianNumberTwo));
}
function testCanBeInternationallyDialled() {
// We have no-international-dialling rules for the US in our test metadata.
/** @type {i18n.phonenumbers.PhoneNumber} */
var usNumber = new i18n.phonenumbers.PhoneNumber();
usNumber.setCountryCode(1);
usNumber.setNationalNumber(8001231234);
assertFalse(phoneUtil.canBeInternationallyDialled(usNumber));
/** @type {i18n.phonenumbers.PhoneNumber} */
var usInternationalNumber = new i18n.phonenumbers.PhoneNumber();
usInternationalNumber.setCountryCode(1);
usInternationalNumber.setNationalNumber(2311231234);
assertTrue(phoneUtil.canBeInternationallyDialled(usInternationalNumber));
/** @type {i18n.phonenumbers.PhoneNumber} */
var usInvalidNumber = new i18n.phonenumbers.PhoneNumber();
// Invalid number.
usInvalidNumber.setCountryCode(1);
usInvalidNumber.setNationalNumber(13112312);
assertTrue(phoneUtil.canBeInternationallyDialled(usInvalidNumber));
// We have no data for NZ - should return true.
/** @type {i18n.phonenumbers.PhoneNumber} */
var nzNumber = new i18n.phonenumbers.PhoneNumber();
nzNumber.setCountryCode(64);
nzNumber.setNationalNumber(33316005);
assertTrue(phoneUtil.canBeInternationallyDialled(nzNumber));
}

Loading…
Cancel
Save