summaryrefslogtreecommitdiff
path: root/node_modules/locutus/php/strings/metaphone.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/locutus/php/strings/metaphone.js')
-rw-r--r--node_modules/locutus/php/strings/metaphone.js227
1 files changed, 227 insertions, 0 deletions
diff --git a/node_modules/locutus/php/strings/metaphone.js b/node_modules/locutus/php/strings/metaphone.js
new file mode 100644
index 0000000..09117ef
--- /dev/null
+++ b/node_modules/locutus/php/strings/metaphone.js
@@ -0,0 +1,227 @@
+'use strict';
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+module.exports = function metaphone(word, maxPhonemes) {
+ // discuss at: http://locutus.io/php/metaphone/
+ // original by: Greg Frazier
+ // improved by: Brett Zamir (http://brett-zamir.me)
+ // improved by: RafaƂ Kukawski (http://blog.kukawski.pl)
+ // example 1: metaphone('Gnu')
+ // returns 1: 'N'
+ // example 2: metaphone('bigger')
+ // returns 2: 'BKR'
+ // example 3: metaphone('accuracy')
+ // returns 3: 'AKKRS'
+ // example 4: metaphone('batch batcher')
+ // returns 4: 'BXBXR'
+
+ var type = typeof word === 'undefined' ? 'undefined' : _typeof(word);
+
+ if (type === 'undefined' || type === 'object' && word !== null) {
+ // weird!
+ return null;
+ }
+
+ // infinity and NaN values are treated as strings
+ if (type === 'number') {
+ if (isNaN(word)) {
+ word = 'NAN';
+ } else if (!isFinite(word)) {
+ word = 'INF';
+ }
+ }
+
+ if (maxPhonemes < 0) {
+ return false;
+ }
+
+ maxPhonemes = Math.floor(+maxPhonemes) || 0;
+
+ // alpha depends on locale, so this var might need an update
+ // or should be turned into a regex
+ // for now assuming pure a-z
+ var alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+ var vowel = 'AEIOU';
+ var soft = 'EIY';
+ var leadingNonAlpha = new RegExp('^[^' + alpha + ']+');
+
+ word = typeof word === 'string' ? word : '';
+ word = word.toUpperCase().replace(leadingNonAlpha, '');
+
+ if (!word) {
+ return '';
+ }
+
+ var is = function is(p, c) {
+ return c !== '' && p.indexOf(c) !== -1;
+ };
+
+ var i = 0;
+ var cc = word.charAt(0); // current char. Short name because it's used all over the function
+ var nc = word.charAt(1); // next char
+ var nnc; // after next char
+ var pc; // previous char
+ var l = word.length;
+ var meta = '';
+ // traditional is an internal param that could be exposed for now let it be a local var
+ var traditional = true;
+
+ switch (cc) {
+ case 'A':
+ meta += nc === 'E' ? nc : cc;
+ i += 1;
+ break;
+ case 'G':
+ case 'K':
+ case 'P':
+ if (nc === 'N') {
+ meta += nc;
+ i += 2;
+ }
+ break;
+ case 'W':
+ if (nc === 'R') {
+ meta += nc;
+ i += 2;
+ } else if (nc === 'H' || is(vowel, nc)) {
+ meta += 'W';
+ i += 2;
+ }
+ break;
+ case 'X':
+ meta += 'S';
+ i += 1;
+ break;
+ case 'E':
+ case 'I':
+ case 'O':
+ case 'U':
+ meta += cc;
+ i++;
+ break;
+ }
+
+ for (; i < l && (maxPhonemes === 0 || meta.length < maxPhonemes); i += 1) {
+ // eslint-disable-line no-unmodified-loop-condition,max-len
+ cc = word.charAt(i);
+ nc = word.charAt(i + 1);
+ pc = word.charAt(i - 1);
+ nnc = word.charAt(i + 2);
+
+ if (cc === pc && cc !== 'C') {
+ continue;
+ }
+
+ switch (cc) {
+ case 'B':
+ if (pc !== 'M') {
+ meta += cc;
+ }
+ break;
+ case 'C':
+ if (is(soft, nc)) {
+ if (nc === 'I' && nnc === 'A') {
+ meta += 'X';
+ } else if (pc !== 'S') {
+ meta += 'S';
+ }
+ } else if (nc === 'H') {
+ meta += !traditional && (nnc === 'R' || pc === 'S') ? 'K' : 'X';
+ i += 1;
+ } else {
+ meta += 'K';
+ }
+ break;
+ case 'D':
+ if (nc === 'G' && is(soft, nnc)) {
+ meta += 'J';
+ i += 1;
+ } else {
+ meta += 'T';
+ }
+ break;
+ case 'G':
+ if (nc === 'H') {
+ if (!(is('BDH', word.charAt(i - 3)) || word.charAt(i - 4) === 'H')) {
+ meta += 'F';
+ i += 1;
+ }
+ } else if (nc === 'N') {
+ if (is(alpha, nnc) && word.substr(i + 1, 3) !== 'NED') {
+ meta += 'K';
+ }
+ } else if (is(soft, nc) && pc !== 'G') {
+ meta += 'J';
+ } else {
+ meta += 'K';
+ }
+ break;
+ case 'H':
+ if (is(vowel, nc) && !is('CGPST', pc)) {
+ meta += cc;
+ }
+ break;
+ case 'K':
+ if (pc !== 'C') {
+ meta += 'K';
+ }
+ break;
+ case 'P':
+ meta += nc === 'H' ? 'F' : cc;
+ break;
+ case 'Q':
+ meta += 'K';
+ break;
+ case 'S':
+ if (nc === 'I' && is('AO', nnc)) {
+ meta += 'X';
+ } else if (nc === 'H') {
+ meta += 'X';
+ i += 1;
+ } else if (!traditional && word.substr(i + 1, 3) === 'CHW') {
+ meta += 'X';
+ i += 2;
+ } else {
+ meta += 'S';
+ }
+ break;
+ case 'T':
+ if (nc === 'I' && is('AO', nnc)) {
+ meta += 'X';
+ } else if (nc === 'H') {
+ meta += '0';
+ i += 1;
+ } else if (word.substr(i + 1, 2) !== 'CH') {
+ meta += 'T';
+ }
+ break;
+ case 'V':
+ meta += 'F';
+ break;
+ case 'W':
+ case 'Y':
+ if (is(vowel, nc)) {
+ meta += cc;
+ }
+ break;
+ case 'X':
+ meta += 'KS';
+ break;
+ case 'Z':
+ meta += 'S';
+ break;
+ case 'F':
+ case 'J':
+ case 'L':
+ case 'M':
+ case 'N':
+ case 'R':
+ meta += cc;
+ break;
+ }
+ }
+
+ return meta;
+};
+//# sourceMappingURL=metaphone.js.map \ No newline at end of file