67 lines
1.7 KiB
JavaScript
67 lines
1.7 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Apache License, Version
|
|
* 2.0. If a copy of the Apache License was not distributed with this file, You
|
|
* can obtain one at https://www.apache.org/licenses/LICENSE-2.0 */
|
|
|
|
// This library came from https://github.com/andreasgal/PhoneNumber.js but will
|
|
// be further maintained by our own in Form Autofill codebase.
|
|
|
|
export 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
|
|
let 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,
|
|
};
|
|
})();
|