UNPKG

talisman

Version:

Straightforward fuzzy matching, information retrieval and NLP building blocks for JavaScript.

136 lines (117 loc) 3.08 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = rogerRoot; var _deburr = require('lodash/deburr'); var _deburr2 = _interopRequireDefault(_deburr); var _helpers = require('../helpers'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Constants. */ /** * Talisman phonetics/roger-root * ============================== * * The Roger Root name coding procedure. * * [Reference]: * http://naldc.nal.usda.gov/download/27833/PDF */ var FIRST_LETTER_ENCODING = { A: '1', B: '09', C: [['CE', '00'], ['CH', '06'], ['CI', '00'], ['CY', '00'], ['C', '07']], D: [['DG', '07'], ['D', '01']], E: '1', F: '08', G: [['GF', '08'], ['GM', '03'], ['GN', '02'], ['G', '07']], H: '2', I: '1', J: '3', K: [['KN', '02'], ['K', '07']], L: '05', M: '03', N: '02', O: '1', P: [['PF', '08'], ['PH', '08'], ['PN', '02'], ['P', '09']], Q: '07', R: '04', S: [['SCH', '06'], ['SH', '06'], ['S', '00']], T: [['TSCH', '06'], ['TSH', '06'], ['TS', '00'], ['T', '01']], U: '1', V: '08', W: [['WR', '04'], ['W', '4']], X: '07', Y: '5', Z: '00' }; var ENCODING = { B: '9', C: [['CE', '0'], ['CH', '6'], ['CI', '0'], ['CY', '0'], ['C', '7']], D: [['DG', '7'], ['D', '1']], F: '8', G: '7', J: '6', K: '7', L: '5', M: '3', N: '2', P: [['PH', '8'], ['P', '9']], Q: '7', R: '4', S: [['SCH', '6'], ['SH', '6'], ['S', '0']], T: [['TSCH', '6'], ['TSH', '6'], ['TS', '0'], ['T', '1']], V: '8', X: '7', Z: '0' }; /** * Helpers. */ function pad(code) { return (code + '00000').slice(0, 5); } /** * Function taking a single name and computing its roger root code. * * @param {string} name - The name to process. * @return {string} - The roger root code. * * @throws {Error} The function expects the name to be a string. */ function rogerRoot(name) { if (typeof name !== 'string') throw Error('talisman/phonetics/rogerRoot: the given name is not a string.'); name = (0, _deburr2.default)(name).toUpperCase().replace(/[^A-Z]/g, ''); var code = '', encodedFirstLetter = void 0; for (var i = 0, l = name.length; i < l; i++) { var firstIteration = !i, encoding = firstIteration ? FIRST_LETTER_ENCODING : ENCODING, rules = encoding[name[i]]; if (rules) { if (typeof rules === 'string') { code += rules; } else { for (var j = 0, m = rules.length; j < m; j++) { var _rules$j = rules[j], match = _rules$j[0], replacement = _rules$j[1]; if (name.substr(i, match.length) === match) { code += replacement; i += match.length - 1; break; } } } } else { code += '-'; } if (firstIteration) encodedFirstLetter = code; } // Squeezing the code code = encodedFirstLetter + (0, _helpers.squeeze)(code.slice(encodedFirstLetter.length)); return pad(code.replace(/-/g, '')); } module.exports = exports['default'];