'use strict';
const irregulars = require('../../data/irregular_nouns');
'use strict';
const irregulars = require('../../data/irregular_nouns');
similar to plural/singularize rules, but not the same
const plural_indicators = [
/(^v)ies$/i,
/ises$/i,
/ives$/i,
/(antenn|formul|nebul|vertebr|vit)ae$/i,
/(octop|vir|radi|nucle|fung|cact|stimul)i$/i,
/(buffal|tomat|tornad)oes$/i,
/(analy|ba|diagno|parenthe|progno|synop|the)ses$/i,
/(vert|ind|cort)ices$/i,
/(matr|append)ices$/i,
/(x|ch|ss|sh|s|z|o)es$/i,
/men$/i,
/news$/i,
/.tia$/i,
/(^f)ves$/i,
/(lr)ves$/i,
/(^aeiouy|qu)ies$/i,
/(m|l)ice$/i,
/(cris|ax|test)es$/i,
/(alias|status)es$/i,
/ics$/i
];
similar to plural/singularize rules, but not the same
const singular_indicators = [
/(ax|test)is$/i,
/(octop|vir|radi|nucle|fung|cact|stimul)us$/i,
/(octop|vir)i$/i,
/(rl)f$/i,
/(alias|status)$/i,
/(bu)s$/i,
/(al|ad|at|er|et|ed|ad)o$/i,
/(ti)um$/i,
/(ti)a$/i,
/sis$/i,
/(?:(^f)fe|(lr)f)$/i,
/hive$/i,
/(^aeiouy|qu)y$/i,
/(x|ch|ss|sh|z)$/i,
/(matr|vert|ind|cort)(ix|ex)$/i,
/(m|l)ouse$/i,
/(m|l)ice$/i,
/(antenn|formul|nebul|vertebr|vit)a$/i,
/.sis$/i,
/^(?!talis|.*hu)(.*)man$/i
];
const is_plural = function(str) {
str = (str || '').toLowerCase();
handle ‘mayors of chicago’
const preposition = str.match(/([a-z]*) (of|in|by|for) [a-z]/);
if (preposition && preposition[1]) {
str = preposition[1];
}
if it’s a known irregular case
for (let i = 0; i < irregulars.length; i++) {
if (irregulars[i][1] === str) {
return true;
}
if (irregulars[i][0] === str) {
return false;
}
}
for (let i = 0; i < plural_indicators.length; i++) {
if (str.match(plural_indicators[i])) {
return true;
}
}
for (let i = 0; i < singular_indicators.length; i++) {
if (str.match(singular_indicators[i])) {
return false;
}
}
some ‘looks pretty plural’ rules
if (str.match(/s$/) && !str.match(/ss$/) && str.length > 3) { //needs some lovin'
return true;
}
return false;
};
console.log(is_plural(‘octopus’) === false) console.log(is_plural(‘octopi’) === true) console.log(is_plural(‘eyebrow’) === false) console.log(is_plural(‘eyebrows’) === true) console.log(is_plural(‘child’) === false) console.log(is_plural(‘children’) === true)
module.exports = is_plural;