Packages
igniter
0.6.10
0.8.2
0.8.1
0.8.0
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.30
0.6.29
0.6.28
0.6.27
0.6.26
0.6.25
0.6.24
0.6.23
0.6.22
0.6.21
0.6.20
0.6.19
0.6.18
0.6.17
0.6.16
0.6.15
0.6.14
0.6.13
0.6.12
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.52
0.5.51
0.5.50
0.5.49
0.5.48
0.5.47
0.5.46
0.5.45
0.5.44
0.5.43
0.5.42
0.5.41
0.5.40
0.5.39
0.5.38
0.5.37
0.5.36
0.5.35
0.5.34
0.5.33
0.5.32
0.5.31
0.5.30
0.5.29
0.5.28
0.5.27
0.5.26
0.5.25
0.5.24
0.5.23
0.5.22
0.5.21
0.5.20
0.5.19
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.78
0.3.77
0.3.76
0.3.75
0.3.74
0.3.73
0.3.72
0.3.71
0.3.70
0.3.69
0.3.68
0.3.67
0.3.66
0.3.65
0.3.64
0.3.63
0.3.62
0.3.61
0.3.60
0.3.59
0.3.58
0.3.57
0.3.56
0.3.55
0.3.54
0.3.53
0.3.52
0.3.51
0.3.50
0.3.49
0.3.48
0.3.47
0.3.46
0.3.45
0.3.44
0.3.43
0.3.42
0.3.41
0.3.40
0.3.39
0.3.38
0.3.37
0.3.36
0.3.35
0.3.34
0.3.33
0.3.32
0.3.31
0.3.30
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
A code generation and project patching framework
Current section
Files
Jump to
Current section
Files
lib/igniter/inflex.ex
defmodule Igniter.Inflex do
# Copy of Inflex.Pluralize, with fixes for OTP/28 from @warmwaffles
# From https://github.com/warmwaffles/inflex/commit/cc8b7d32d2e9563d3c8ff92c4a85c8eb7c94b9d4
@moduledoc false
@default true
@uncountable [
"aircraft",
"bellows",
"bison",
"deer",
"equipment",
"fish",
"hovercraft",
"information",
"jeans",
"means",
"measles",
"money",
"moose",
"news",
"pants",
"police",
"rice",
"series",
"sheep",
"spacecraft",
"species",
"swine",
"tights",
"tongs",
"trousers"
]
def singularize(word) when is_atom(word) do
find_match(singular_regexes(), to_string(word))
end
def singularize(word), do: find_match(singular_regexes(), word)
def pluralize(word) when is_atom(word) do
find_match(plural_regexes(), to_string(word))
end
def pluralize(word), do: find_match(plural_regexes(), word)
def inflect(word, n) when n == 1, do: singularize(word)
def inflect(word, n) when is_number(n), do: pluralize(word)
defp find_match(set, word) do
cond do
uncountable?(word) -> word
@default -> replace_match(set, word)
end
end
defp replace_match(set, word) do
find_in_set(set, word) |> replace(word)
end
defp find_in_set(set, word) do
Enum.find(set, fn {reg, _} -> Regex.match?(reg, word) end)
end
defp replace({regex, replacement}, word) do
Regex.replace(regex, word, replacement)
end
defp replace(_, word), do: word
defp uncountable?(word), do: Enum.member?(@uncountable, word)
defp singular_regexes do
[
{~r/(alumn|cact|fung|radi|stimul|syllab)i/i, "\\1us"},
{~r/(alg|antenn|amoeb|larv|vertebr)ae/i, "\\1a"},
{~r/^(gen)era$/i, "\\1us"},
{~r/(pe)ople/i, "\\1rson"},
{~r/^(zombie)s$/i, "\\1"},
{~r/^(movie)s$/i, "\\1"},
{~r/^(drive)s$/i, "\\1"},
{~r/(g)eese/i, "\\1oose"},
{~r/(criteri)a/i, "\\1on"},
{~r/^(m)en$/i, "\\1an"},
{~r/^(echo)es/i, "\\1"},
{~r/^(hero)es/i, "\\1"},
{~r/^(potato)es/i, "\\1"},
{~r/^(tomato)es/i, "\\1"},
{~r/^(t)eeth/i, "\\1ooth"},
{~r/^(l)ice$/i, "\\1ouse"},
{~r/^(addend|bacteri|curricul|dat|memorand|quant)a$/i, "\\1um"},
{~r/^(di)ce/i, "\\1e"},
{~r/^(f)eet/i, "\\1oot"},
{~r/^(phenomen)a/i, "\\1on"},
{~r/(child)ren/i, "\\1"},
{~r/(wo|sea)men$/i, "\\1man"},
{~r/^(m|l)ice$/i, "\\1ouse"},
{~r/(bus|canvas|status|alias)(es)?$/i, "\\1"},
{~r/(ss)$/i, "\\1"},
{~r/(database)s$/i, "\\1"},
{~r/([ti])a$/i, "\\1um"},
{~r/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i, "\\1sis"},
{~r/(analy)(sis|ses)$/i, "\\1sis"},
{~r/(octop|vir)i$/i, "\\1us"},
{~r/(hive)s$/i, "\\1"},
{~r/(tive)s$/i, "\\1"},
{~r/(er)ves$/i, "\\1ve"},
{~r/([lora])ves$/i, "\\1f"},
{~r/([^f])ves$/i, "\\1fe"},
{~r/([^aeiouy]|qu)ies$/i, "\\1y"},
{~r/(m)ovies$/i, "\\1ovie"},
{~r/(x|ch|ss|sh)es$/i, "\\1"},
{~r/(shoe)s$/i, "\\1"},
{~r/(o)es$/i, "\\1"},
{~r/s$/i, ""}
]
end
defp plural_regexes do
[
{~r/(alumn|cact|fung|radi|stimul|syllab)us/i, "\\1i"},
{~r/(alg|antenn|amoeb|larv|vertebr)a/i, "\\1ae"},
{~r/^(gen)us$/i, "\\1era"},
{~r/(pe)rson$/i, "\\1ople"},
{~r/^(zombie)s$/i, "\\1"},
{~r/^(movie)s$/i, "\\1"},
{~r/(g)oose$/i, "\\1eese"},
{~r/(criteri)on/i, "\\1a"},
{~r/^(men)$/i, "\\1"},
{~r/^(women)/i, "\\1"},
{~r/^(echo)$/i, "\\1es"},
{~r/^(hero)$/i, "\\1es"},
{~r/^(potato)/i, "\\1es"},
{~r/^(tomato)/i, "\\1es"},
{~r/^(t)ooth$/i, "\\1eeth"},
{~r/^(l)ouse$/i, "\\1ice"},
{~r/^(addend|bacteri|curricul|dat|memorand|quant)um$/i, "\\1a"},
{~r/^(di)e$/i, "\\1ce"},
{~r/^(f)oot$/i, "\\1eet"},
{~r/^(phenomen)on/i, "\\1a"},
{~r/(child)$/i, "\\1ren"},
{~r/(m)an$/i, "\\1en"},
{~r/(m|l)ouse/i, "\\1ice"},
{~r/(database)s$/i, "\\1"},
{~r/(quiz)$/i, "\\1zes"},
{~r/^(ox)$/i, "\\1en"},
{~r/(matr|vert|ind)ix|ex$/i, "\\1ices"},
{~r/(x|ch|ss|sh)$/i, "\\1es"},
{~r/([^aeiouy]|qu)y$/i, "\\1ies"},
{~r/(hive)$/i, "\\1s"},
{~r/(sc[au]rf)$/i, "\\1s"},
{~r/(?:([^f])fe|((hoo)|([lra]))f)$/i, "\\2\\1ves"},
{~r/sis$/i, "ses"},
{~r/([ti])um$/i, "\\1a"},
{~r/(buffal|tomat)o$/i, "\\1oes"},
{~r/(octop|vir)us$/i, "\\1i"},
{~r/(bus|alias|status|canvas)$/i, "\\1es"},
{~r/(ax|test)is$/i, "\\1es"},
{~r/s$/i, "s"},
{~r/data$/i, "data"},
{~r/$/i, "s"}
]
end
end