pluralize <- function( s, n ) {
result <- s
if( n != 1 ) {
if( pl.noninflective( s ) ||
pl.suffix( "fish", s ) ||
pl.suffix( "ois", s ) ||
pl.suffix( "sheep", s ) ||
pl.suffix( "deer", s ) ||
pl.suffix( "pox", s ) ||
pl.suffix( "[A-Z].*ese", s ) ||
pl.suffix( "itis", s ) ) {
result <- s
}
else if( pl.is.irregular.pl( s ) ) {
result <- pl.irregular.pl( s )
}
else if( pl.is.irregular.es( s ) ) {
result <- pl.inflect( s, "", "es" )
}
else if( pl.suffix( "man", s ) ) {
result <- pl.inflect( s, "an", "en" )
}
else if( pl.suffix( "[lm]ouse", s ) ) {
result <- pl.inflect( s, "ouse", "ice" )
}
else if( pl.suffix( "tooth", s ) ) {
result <- pl.inflect( s, "ooth", "eeth" )
}
else if( pl.suffix( "goose", s ) ) {
result <- pl.inflect( s, "oose", "eese" )
}
else if( pl.suffix( "foot", s ) ) {
result <- pl.inflect( s, "oot", "eet" )
}
else if( pl.suffix( "zoon", s ) ) {
result <- pl.inflect( s, "on", "a" )
}
else if( pl.suffix( "[csx]is", s ) ) {
result <- pl.inflect( s, "is", "es" )
}
else if( pl.suffix( "([cs]h|ss)", s ) ) {
result <- pl.inflect( s, "", "es" )
}
else if( pl.suffix( "([aeo]lf|[^d]eaf|arf)", s ) ) {
result <- pl.inflect( s, "f", "ves" )
}
else if( pl.suffix( "[nlw]ife", s ) ) {
result <- pl.inflect( s, "fe", "ves" )
}
else if( pl.suffix( "([aeiou]y|[A-Z].*y)", s ) ) {
result <- pl.inflect( s, "", "s" )
}
else if( pl.suffix( "y", s ) ) {
result <- pl.inflect( s, "y", "ies" )
}
else {
result <- pl.inflect( s, "", "s" )
}
}
result
}
pl <- function( s, n ) {
pluralize( s, x( n ) )
}
pl.inflect <- function( s, suffix, r ) {
gsub( paste( suffix, "$", sep="" ), r, s )
}
pl.suffix <- function( ending, s ) {
grepl( paste( ending, "$", sep="" ), s )
}
pl.noninflective <- function( s ) {
v <- c(
"aircraft", "Bhutanese", "bison", "bream", "breeches", "britches",
"Burmese", "carp", "chassis", "Chinese", "clippers", "cod", "contretemps",
"corps", "debris", "diabetes", "djinn", "eland", "elk", "flounder",
"fracas", "gallows", "graffiti", "headquarters", "herpes", "high-jinks",
"homework", "hovercraft", "innings", "jackanapes", "Japanese",
"Lebanese", "mackerel", "means", "measles", "mews", "mumps", "news",
"pincers", "pliers", "Portuguese", "proceedings", "rabies", "salmon",
"scissors", "sea-bass", "Senegalese", "series", "shears", "Siamese",
"Sinhalese", "spacecraft", "species", "swine", "trout", "tuna",
"Vietnamese", "watercraft", "whiting", "wildebeest"
)
is.element( s, v )
}
pl.is.irregular.pl <- function( s ) {
v <- c(
"beef", "brother", "child", "cow", "ephemeris", "genie", "money",
"mongoose", "mythos", "octopus", "ox", "soliloquy", "trilby"
)
is.element( s, v )
}
pl.irregular.pl <- function( s ) {
v <- list(
"beef" = "beefs",
"brother" = "brothers",
"child" = "children",
"cow" = "cows",
"ephemeris" = "ephemerides",
"genie" = "genies",
"money" = "moneys",
"mongoose" = "mongooses",
"mythos" = "mythoi",
"octopus" = "octopuses",
"ox" = "oxen",
"soliloquy" = "soliloquies",
"trilby" = "trilbys"
)
.subset2( v, s )
}
pl.is.irregular.es <- function( s ) {
v <- c(
"acropolis", "aegis", "alias", "asbestos", "bathos", "bias", "bronchitis",
"bursitis", "caddis", "cannabis", "canvas", "chaos", "cosmos", "dais",
"digitalis", "epidermis", "ethos", "eyas", "gas", "glottis", "hubris",
"ibis", "lens", "mantis", "marquis", "metropolis", "pathos", "pelvis",
"polis", "rhinoceros", "sassafrass", "trellis"
)
is.element( s, v )
}