Skip to content

Commit

Permalink
moving normalization logic into separate module
Browse files Browse the repository at this point in the history
  • Loading branch information
mikehenrty committed Aug 13, 2013
1 parent f3dbc59 commit 752872e
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 62 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ all: PhoneNumberMetaData.js
python xml2meta.py $< > $@

PhoneNumberMetaData.xml:
curl http://libphonenumber.googlecode.com/svn/trunk/resources/PhoneNumberMetaData.xml > $@
curl http://libphonenumber.googlecode.com/svn/trunk/resources/PhoneNumberMetadata.xml > $@

clean:
rm -f PhoneNumberMetaData.xml *~
57 changes: 1 addition & 56 deletions PhoneNumber.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,11 @@ var PhoneNumber = (function (dataBase) {
'use strict';

const MAX_PHONE_NUMBER_LENGTH = 50;
const UNICODE_DIGITS = /[\uFF10-\uFF19\u0660-\u0669\u06F0-\u06F9]/g;
const NON_ALPHA_CHARS = /[^a-zA-Z]/g;
const NON_DIALABLE_CHARS = /[^,#+\*\d]/g;
const NON_DIALABLE_CHARS_ONCE = new RegExp(NON_DIALABLE_CHARS.source);
const BACKSLASH = /\\/g;
const SPLIT_FIRST_GROUP = /^(\d+)(.*)$/;
const VALID_ALPHA_PATTERN = /[a-zA-Z]/g;
const LEADING_PLUS_CHARS_PATTERN = /^[+\uFF0B]+/g;

// Format of the string encoded meta data. If the name contains "^" or "$"
Expand Down Expand Up @@ -216,58 +214,6 @@ var PhoneNumber = (function (dataBase) {
}
};

// Map letters to numbers according to the ITU E.161 standard
var E161 = {
'a': 2,
'b': 2,
'c': 2,
'd': 3,
'e': 3,
'f': 3,
'g': 4,
'h': 4,
'i': 4,
'j': 5,
'k': 5,
'l': 5,
'm': 6,
'n': 6,
'o': 6,
'p': 7,
'q': 7,
'r': 7,
's': 7,
't': 8,
'u': 8,
'v': 8,
'w': 9,
'x': 9,
'y': 9,
'z': 9
};

// Normalize a number by converting unicode numbers and symbols to their
// ASCII equivalents and removing all non-dialable characters.
function NormalizeNumber(number, numbersOnly) {
if (typeof number !== 'string') {
return '';
}

number = number.replace(UNICODE_DIGITS,
function (ch) {
return String.fromCharCode(48 + (ch.charCodeAt(0) & 0xf));
});
if (!numbersOnly) {
number = number.replace(VALID_ALPHA_PATTERN,
function (ch) {
return String(E161[ch.toLowerCase()] || 0);
});
}
number = number.replace(LEADING_PLUS_CHARS_PATTERN, "+");
number = number.replace(NON_DIALABLE_CHARS, "");
return number;
}

// Check whether the number is valid for the given region.
function IsValidNumber(number, md) {
return md.possiblePattern.test(number);
Expand Down Expand Up @@ -338,7 +284,7 @@ var PhoneNumber = (function (dataBase) {
var ret;

// Remove formating characters and whitespace.
number = NormalizeNumber(number);
number = PhoneNumberNormalizer.Normalize(number);

// If there is no defaultRegion, we can't parse international access codes.
if (!defaultRegion && number[0] !== '+')
Expand Down Expand Up @@ -413,6 +359,5 @@ var PhoneNumber = (function (dataBase) {
return {
IsPlain: IsPlainPhoneNumber,
Parse: ParseNumber,
Normalize: NormalizeNumber
};
})(PHONE_NUMBER_META_DATA);
48 changes: 48 additions & 0 deletions PhoneNumberNormalizer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */

var PhoneNumberNormalizer = (function() {
const UNICODE_DIGITS = /[\uFF10-\uFF19\u0660-\u0669\u06F0-\u06F9]/g;
const VALID_ALPHA_PATTERN = /[a-zA-Z]/g;
const LEADING_PLUS_CHARS_PATTERN = /^[+\uFF0B]+/g;
const NON_DIALABLE_CHARS = /[^,#+\*\d]/g;

// Map letters to numbers according to the ITU E.161 standard
var E161 = {
'a': 2, 'b': 2, 'c': 2,
'd': 3, 'e': 3, 'f': 3,
'g': 4, 'h': 4, 'i': 4,
'j': 5, 'k': 5, 'l': 5,
'm': 6, 'n': 6, 'o': 6,
'p': 7, 'q': 7, 'r': 7, 's': 7,
't': 8, 'u': 8, 'v': 8,
'w': 9, 'x': 9, 'y': 9, 'z': 9
};

// Normalize a number by converting unicode numbers and symbols to their
// ASCII equivalents and removing all non-dialable characters.
function NormalizeNumber(number, numbersOnly) {
if (typeof number !== 'string') {
return '';
}

number = number.replace(UNICODE_DIGITS,
function (ch) {
return String.fromCharCode(48 + (ch.charCodeAt(0) & 0xf));
});
if (!numbersOnly) {
number = number.replace(VALID_ALPHA_PATTERN,
function (ch) {
return String(E161[ch.toLowerCase()] || 0);
});
}
number = number.replace(LEADING_PLUS_CHARS_PATTERN, "+");
number = number.replace(NON_DIALABLE_CHARS, "");
return number;
};


return {
Normalize: NormalizeNumber
};
})();
3 changes: 2 additions & 1 deletion fuzz.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */

load("PhoneNumberMetaData.js");
load("PhoneNumberNormalizer.js");
load("PhoneNumber.js");

let gCountryList;
Expand Down Expand Up @@ -70,4 +71,4 @@ for (var i = 0; i < 100000; i++) {
}

TestProperties(dial, getRandomCC());
}
}
9 changes: 5 additions & 4 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */

load("PhoneNumberMetaData.js");
load("PhoneNumberNormalizer.js")
load("PhoneNumber.js");

function IsPlain(dial, expected) {
Expand All @@ -13,7 +14,7 @@ function IsPlain(dial, expected) {
}

function Normalize(dial, expected) {
var result = PhoneNumber.Normalize(dial);
var result = PhoneNumberNormalizer.Normalize(dial);
if (result != expected) {
print("expected: " + expected);
print("got: " + result);
Expand Down Expand Up @@ -260,6 +261,6 @@ Normalize("abcdefghijklmnopqrstuvwxyz", "22233344455566677778889999");
AllEqual(["01187654321","0411187654321","551187654321","90411187654321","+551187654321"],"BR");
AllEqual(["011987654321","04111987654321","5511987654321","904111987654321","+5511987654321"],"BR")

IsEqual(PhoneNumber.Normalize("123abc", true), "123");
IsEqual(PhoneNumber.Normalize("12345", true), "12345");
IsEqual(PhoneNumber.Normalize("1abcd", false), "12223");
IsEqual(PhoneNumberNormalizer.Normalize("123abc", true), "123");
IsEqual(PhoneNumberNormalizer.Normalize("12345", true), "12345");
IsEqual(PhoneNumberNormalizer.Normalize("1abcd", false), "12223");

0 comments on commit 752872e

Please sign in to comment.