Skip to content

Instantly share code, notes, and snippets.

@viniceosm
Last active July 21, 2019 20:45
Show Gist options
  • Select an option

  • Save viniceosm/56fb22938a753aa072d6aa2ca4de1a99 to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown

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