fune/browser/extensions/formautofill/phonenumberutils/PhoneNumberNormalizer.jsm

56 lines
1.9 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.
"use strict";
var EXPORTED_SYMBOLS = ["PhoneNumberNormalizer"];
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,
};
})();