Skip to content

Instantly share code, notes, and snippets.

@viniceosm
Last active July 21, 2019 20:45
Show Gist options
  • Save viniceosm/56fb22938a753aa072d6aa2ca4de1a99 to your computer and use it in GitHub Desktop.
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
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
@theuves
Copy link

theuves commented Jul 21, 2019

Caraca! Muito legal!!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment