UNPKG

busca-br

Version:

Modulo para usar o algoritmo buscaBR em javascript/node.js

150 lines (128 loc) 3.6 kB
(function() { "use strict"; var buscaBR = {}; // Exporta o objeto do buscaBR para o **Node.js** // com a compatibilidade para o browser definindo // buscaBR como um objeto global if (typeof exports !== 'undefined') { if (typeof module !== 'undefined' && module.exports) { exports = module.exports = buscaBR; } exports.buscaBR = buscaBR; } else { window.buscaBR = buscaBR; } var CODES = [ [/BL|BR/, 'B'], ['PH', 'F'], [/GL|GR|MG|NG|RG/, 'G'], ['Y', 'I'], [/GE|GI|RJ|MJ/, 'J'], [/CA|CO|CU|CK|Q/, 'K'], ['N', 'M'], [/AO|AUM|GM|MD|OM|ON/, 'M'], ['PR', 'P'], ['L', 'R'], [/CE|CI|CH|CS|RS|TS|X|Z/, 'S'], [/TR|TL/, 'T'], [/CT|RT|ST|PT/, 'T'], [/\b[UW]/, 'V'], ['RM', 'SM'], [/[MRS]+\b/, ''], [/[AEIOUH]/, ''] ]; /** * Busca sincrona da palavrá * * @param {String} str - String fonética * @param {Array} array - Dicionário de palavras * @return {Array|Object} */ buscaBR.searchSync = function (str, array) { var i; var results = []; for (i = 0; i < array.length; i++) { if (this.encode(str) == this.encode(array[i])) { results.push({ termo: array[i], index: i }); } } return results.length ? results : new Error('Não há registros'); }; /** * Buscar pela palavra foneticamente * * @param {String} str - String fonética * @param {Array} array - Dicionário de palavras * @param {Function} callback - Função para executar após a busca */ buscaBR.search = function (str, array, callback) { tratar_erro(this.searchSync(str, array), callback); }; /** * Codifica uma string * * @param {String} str - String para codificar * @return {String} */ buscaBR.encode = function (str) { str = removeAcento(str.toUpperCase()); for(var i = 0; i < CODES.length; i++){ // str = str.replace(this.CODES[i][0],this.CODES[i][1]); str = str.split(CODES[i][0]).join(CODES[i][1]) } str = squeeze(str); return str; }; /** * Remove os caracteres repetidos sequencialmente em uma string * * @param {String} str - String para tratar * @return {String} */ function squeeze (str) { str = str || ''; return str.replace(/(.)(?=\1)/g, ''); } /** * Passa o erro como parametro caso seja experado pelo callback * * @param {Object} result * @param {Function} done * @return {Function} */ function tratar_erro(result, done) { if (done.length > 1) { if (result instanceof Error) { result = [result, null]; } else { result = [null, result]; } } else { result = [result]; } done.apply(this, result); } /** * Remove os acentos existentes em uma string * * @param {String} strToReplace - Texo para remover os acentos * @return {String} */ function removeAcento(str) { var i, x; var ACENTOS = 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž'; var SEM_ACENTOS = 'AAAAAAaaaaaaOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz'; str = str.split(''); for (i = 0; i < str.length; i++) { x = ACENTOS.indexOf(str[i]) if (x != -1) { str[i] = SEM_ACENTOS[x]; } } str = str.join(''); return str.replace(/[^a-z0-9\s]/gi, ''); } }());