Last active
July 21, 2019 20:45
-
-
Save viniceosm/56fb22938a753aa072d6aa2ca4de1a99 to your computer and use it in GitHub Desktop.
pluralizar string sem passar por parâmetros o número e a palavra. Usado código do repositório: https://github.com/theuves/pluralizador.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var pluralize = (function() { | |
'use strict'; | |
// Lista de palavras terminadas | |
// em -ão que têm regras diferentes. | |
var irregulars = { | |
// Quando deve assumir -ães. | |
aes: [ | |
'alemão', | |
'capelão', | |
'capitão', | |
'catalão', | |
'charlatão', | |
'cirurgião', | |
'cão', | |
'escrivão', | |
'guardião', | |
'mamão', | |
'pão', | |
'sacristão', | |
'tabelião' | |
], | |
// Quando deve assumir -ãos. | |
aos: [ | |
'cristão', | |
'cidadão' | |
] | |
}; | |
/** | |
* Há sete exceções de palavras terminadas em -l. | |
* Referência: <https://pt.wikipedia.org/wiki/Plural#Regras_especiais>. | |
*/ | |
var sevenExceptions = ['mal', 'cônsul', 'mel', 'fel', 'cal', 'aval', 'mol']; | |
/** | |
* Pluralizar substantivos da língua portuguesa. | |
* | |
* @param {string} word Uma substantivo qualquer em português. | |
* @param {number} count Uma quantidade desse substantivo. | |
* @returns {string} A mesma palavra no plural. | |
*/ | |
var pluralize = function (word, count) { | |
if (!word || typeof word !== 'string' || count === 1) { | |
return word | |
} | |
// Se a palavra terminar em -r, -s ou -z, será adicionado -es. | |
if (/(r|s|z)$/.test(word)) { | |
// EXCEÇÃO: Se a palavra terminar com -r e for | |
// oxítona (com /ê/, /é/ ou /i/) ela automaticamente | |
// deixará de sê-la e virará uma paroxítona. | |
if (/(ê|é|í)s$/.test(word)) { | |
return word.replace(/(ê|é|í)s$/, function (_, letter) { | |
switch (letter) { | |
case 'ê': | |
case 'é': | |
return 'eses'; | |
case 'í': | |
return 'ises'; | |
} | |
}); | |
} | |
// EXCEÇÃO: Se a palavra termina em -s e não | |
// for oxítona, então ela não mudará. | |
if (/s$/.test(word) && !/(á|ã|â|ê|é|í)s$/.test(word)) { | |
return word; | |
} | |
return word + 'es'; | |
} | |
// Para as palavras terminadas em -l, troca-se-a por -is. | |
if (/l$/.test(word)) { | |
// Para palavras que se encaixem numa das sete exceções. | |
if (sevenExceptions.indexOf(word) !== -1) { | |
return `${word}es`; | |
} | |
var radical = word.substr(0, word.length - 1); | |
// Para checar se a palavra é oxítona será verificado | |
// apenas se o radical da palavra possui alguma acentuação. | |
var isOxita = /(á|â|é|ê|ô|ó|í)/.test(radical) | |
// EXCEÇÃO: Se a palavra terminar em -il | |
// e for oxitona ele será trocado por -is, | |
// caso contrário será por -eis. | |
if (/il$/.test(word)) { | |
if (!isOxita) { | |
return word.replace(/il$/, 'is'); | |
} | |
return word.replace(/il$/, 'eis'); | |
} | |
// EXCEÇÃO: Se a palavra for oxítona então ela terá algumas exceções: | |
// - Recebe acento se for terminada -el ou -ol. | |
// - Termina em -uis se tinha o sufixo -ul. | |
if (!isOxita) { | |
var suffix = word.substr(-2); | |
switch (suffix) { | |
case 'el': | |
return word.replace(/el$/, 'éis'); | |
case 'ol': | |
return word.replace(/ol$/, 'óis'); | |
case 'ul': | |
return word.replace(/ul$/, 'uis'); | |
} | |
} | |
return word.replace(/l$/, 'is'); | |
} | |
// Palavras terminadas em -m mudarão para -ns. | |
if (/m$/.test(word)) { | |
return word.replace(/m$/, 'ns'); | |
} | |
// Palavras terminadas em -x não mudam. | |
if (/x$/.test(word)) { | |
return word; | |
} | |
// Para as palavras terminadas em -ão. | |
if (/ão$/.test(word)) { | |
// Verificar se a palavra deve terminar em -ães. | |
for (var i = 0; i < irregulars.aes.length; i++) { | |
var irregularWord = irregulars.aes[i]; | |
if (word === irregularWord) { | |
return word.replace(/ão$/, 'ães'); | |
} | |
} | |
var radical = word.substr(0, word.length - 3); | |
// Casos em que obrigatoriamente deve terminar em -ãos: | |
// - CASO I: Quando não for oxítona (terá acento obrigatoriamente). | |
// - CASO II: Quando for monossílaba. | |
if ( | |
/((á|â|é|ê|ô|ó|í))/.test(radical) || | |
!/[aeiou]/.test(radical) | |
) { | |
return word + 's'; | |
} | |
// Verificar se a palavra é uma exceção que deve terminar com -ãos. | |
for (var i = 0; i < irregulars.aos.length; i++) { | |
var irregularWord = irregulars.aos[i]; | |
if (word === irregularWord) { | |
return word + 's'; | |
} | |
} | |
return word.replace(/ão$/, 'ões'); | |
} | |
return word + 's'; | |
}; | |
return pluralize; | |
})(); | |
function pluralString (mensagem) { | |
let novaMensagem = mensagem; | |
let encontrados = mensagem.match(/(\d)( )([\wÀ-ú]+)/g); | |
if (encontrados !== null) { | |
for (encontrado of encontrados) { | |
let indexEncontrado = novaMensagem.indexOf(encontrado); | |
if (encontrado !== null) { | |
let encontradoSplit = encontrado.split(' '); | |
let plural = `${encontradoSplit[0]} ${ pluralize(encontradoSplit[1], parseInt(encontradoSplit[0])) }`; | |
novaMensagem = novaMensagem.substring(0, indexEncontrado) + plural + novaMensagem.substring(indexEncontrado + encontrado.length); | |
} | |
} | |
} | |
return novaMensagem; | |
} | |
// Exemplos: | |
console.log(pluralString('Hoje eu comprei 5 camisa')); // Hoje eu comprei 5 camisas | |
console.log(pluralString('Vou comprar 1 jordan 1')); // Vou comprar 1 jordan 1 | |
console.log(pluralString('Vou assistir 3 episódio')); // Vou assistir 3 episódios | |
console.log(pluralString('Limite de pessoas aqui é de ' + 20 + ' pessoa')); // Limite de pessoas aqui é de 20 pessoas |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Caraca! Muito legal!!!