busca-br
Version:
Modulo para usar o algoritmo buscaBR em javascript/node.js
150 lines (128 loc) • 3.6 kB
JavaScript
(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, '');
}
}());