Skip to content

Commit 4dc7c63

Browse files
Update Humanizer
1 parent e3b1eb8 commit 4dc7c63

File tree

4 files changed

+333
-262
lines changed

4 files changed

+333
-262
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
namespace Humanizer.Inflections;
2+
3+
using CharSpan = System.ReadOnlySpan<System.Char>;
4+
5+
/// <summary>
6+
/// Contains extension methods for humanizing string values.
7+
/// </summary>
8+
internal static class StringHumanizeExtensions
9+
{
10+
internal static unsafe string Concat(CharSpan left, CharSpan right)
11+
{
12+
var result = new string('\0', left.Length + right.Length);
13+
fixed (char* pResult = result)
14+
{
15+
left.CopyTo(new(pResult, left.Length));
16+
right.CopyTo(new(pResult + left.Length, right.Length));
17+
}
18+
return result;
19+
}
20+
21+
internal static unsafe string Concat(char left, CharSpan right) =>
22+
Concat(new CharSpan(&left, 1), right);
23+
}
Lines changed: 139 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -1,149 +1,154 @@
11
using System;
22
using System.Threading;
33

4-
namespace Humanizer.Inflections
4+
namespace Humanizer.Inflections;
5+
6+
/// <summary>
7+
/// Container for registered Vocabularies. At present, only a single vocabulary is supported: Default.
8+
/// </summary>
9+
internal static class Vocabularies
510
{
11+
static readonly Lazy<Vocabulary> Instance = new(BuildDefault, LazyThreadSafetyMode.PublicationOnly);
12+
613
/// <summary>
7-
/// Container for registered Vocabularies. At present, only a single vocabulary is supported: Default.
14+
/// The default vocabulary used for singular/plural irregularities.
15+
/// Rules can be added to this vocabulary and will be picked up by called to Singularize() and Pluralize().
16+
/// At this time, multiple vocabularies and removing existing rules are not supported.
817
/// </summary>
9-
internal static class Vocabularies
10-
{
11-
private static readonly Lazy<Vocabulary> Instance;
12-
13-
static Vocabularies()
14-
{
15-
Instance = new Lazy<Vocabulary>(BuildDefault, LazyThreadSafetyMode.PublicationOnly);
16-
}
18+
public static Vocabulary Default => Instance.Value;
1719

18-
/// <summary>
19-
/// The default vocabulary used for singular/plural irregularities.
20-
/// Rules can be added to this vocabulary and will be picked up by called to Singularize() and Pluralize().
21-
/// At this time, multiple vocabularies and removing existing rules are not supported.
22-
/// </summary>
23-
public static Vocabulary Default => Instance.Value;
24-
25-
private static Vocabulary BuildDefault()
26-
{
27-
var _default = new Vocabulary();
28-
29-
_default.AddPlural("$", "s");
30-
_default.AddPlural("s$", "s");
31-
_default.AddPlural("(ax|test)is$", "$1es");
32-
_default.AddPlural("(octop|vir|alumn|fung|cact|foc|hippopotam|radi|stimul|syllab|nucle)us$", "$1i");
33-
_default.AddPlural("(alias|bias|iris|status|campus|apparatus|virus|walrus|trellis)$", "$1es");
34-
_default.AddPlural("(buffal|tomat|volcan|ech|embarg|her|mosquit|potat|torped|vet)o$", "$1oes");
35-
_default.AddPlural("([dti])um$", "$1a");
36-
_default.AddPlural("sis$", "ses");
37-
_default.AddPlural("(?:([^f])fe|([lr])f)$", "$1$2ves");
38-
_default.AddPlural("(hive)$", "$1s");
39-
_default.AddPlural("([^aeiouy]|qu)y$", "$1ies");
40-
_default.AddPlural("(x|ch|ss|sh)$", "$1es");
41-
_default.AddPlural("(matr|vert|ind|d)ix|ex$", "$1ices");
42-
_default.AddPlural("(^[m|l])ouse$", "$1ice");
43-
_default.AddPlural("^(ox)$", "$1en");
44-
_default.AddPlural("(quiz)$", "$1zes");
45-
_default.AddPlural("(buz|blit|walt)z$", "$1zes");
46-
_default.AddPlural("(hoo|lea|loa|thie)f$", "$1ves");
47-
_default.AddPlural("(alumn|alg|larv|vertebr)a$", "$1ae");
48-
_default.AddPlural("(criteri|phenomen)on$", "$1a");
20+
static Vocabulary BuildDefault()
21+
{
22+
var _default = new Vocabulary();
4923

50-
_default.AddSingular("s$", "");
51-
_default.AddSingular("(n)ews$", "$1ews");
52-
_default.AddSingular("([dti])a$", "$1um");
53-
_default.AddSingular("(analy|ba|diagno|parenthe|progno|synop|the|ellip|empha|neuro|oa|paraly)ses$", "$1sis");
54-
_default.AddSingular("([^f])ves$", "$1fe");
55-
_default.AddSingular("(hive)s$", "$1");
56-
_default.AddSingular("(tive)s$", "$1");
57-
_default.AddSingular("([lr]|hoo|lea|loa|thie)ves$", "$1f");
58-
_default.AddSingular("(^zomb)?([^aeiouy]|qu)ies$", "$2y");
59-
_default.AddSingular("(s)eries$", "$1eries");
60-
_default.AddSingular("(m)ovies$", "$1ovie");
61-
_default.AddSingular("(x|ch|ss|sh)es$", "$1");
62-
_default.AddSingular("(^[m|l])ice$", "$1ouse");
63-
_default.AddSingular("(o)es$", "$1");
64-
_default.AddSingular("(shoe)s$", "$1");
65-
_default.AddSingular("(cris|ax|test)es$", "$1is");
66-
_default.AddSingular("(octop|vir|alumn|fung|cact|foc|hippopotam|radi|stimul|syllab|nucle)i$", "$1us");
67-
_default.AddSingular("(alias|bias|iris|status|campus|apparatus|virus|walrus|trellis)es$", "$1");
68-
_default.AddSingular("^(ox)en", "$1");
69-
_default.AddSingular("(matr|d)ices$", "$1ix");
70-
_default.AddSingular("(vert|ind)ices$", "$1ex");
71-
_default.AddSingular("(quiz)zes$", "$1");
72-
_default.AddSingular("(buz|blit|walt)zes$", "$1z");
73-
_default.AddSingular("(alumn|alg|larv|vertebr)ae$", "$1a");
74-
_default.AddSingular("(criteri|phenomen)a$", "$1on");
75-
_default.AddSingular("([b|r|c]ook|room|smooth)ies$", "$1ie");
24+
_default.AddPlural("$", "s");
25+
_default.AddPlural("s$", "s");
26+
_default.AddPlural("(ax|test)is$", "$1es");
27+
_default.AddPlural("(octop|vir|alumn|fung|cact|foc|hippopotam|radi|stimul|syllab|nucle)us$", "$1i");
28+
_default.AddPlural("(alias|bias|iris|status|campus|apparatus|virus|walrus|trellis)$", "$1es");
29+
_default.AddPlural("(buffal|tomat|volcan|ech|embarg|her|mosquit|potat|torped|vet)o$", "$1oes");
30+
_default.AddPlural("([dti])um$", "$1a");
31+
_default.AddPlural("sis$", "ses");
32+
_default.AddPlural("(?:([^f])fe|([lr])f)$", "$1$2ves");
33+
_default.AddPlural("(hive)$", "$1s");
34+
_default.AddPlural("([^aeiouy]|qu)y$", "$1ies");
35+
_default.AddPlural("(x|ch|ss|sh)$", "$1es");
36+
_default.AddPlural("(matr|vert|ind|d)(ix|ex)$", "$1ices");
37+
_default.AddPlural("(^[m|l])ouse$", "$1ice");
38+
_default.AddPlural("^(ox)$", "$1en");
39+
_default.AddPlural("(quiz)$", "$1zes");
40+
_default.AddPlural("(buz|blit|walt)z$", "$1zes");
41+
_default.AddPlural("(hoo|lea|loa|thie)f$", "$1ves");
42+
_default.AddPlural("(alumn|alg|larv|vertebr)a$", "$1ae");
43+
_default.AddPlural("(criteri|phenomen)on$", "$1a");
7644

77-
_default.AddIrregular("person", "people");
78-
_default.AddIrregular("man", "men");
79-
_default.AddIrregular("human", "humans");
80-
_default.AddIrregular("child", "children");
81-
_default.AddIrregular("sex", "sexes");
82-
_default.AddIrregular("glove", "gloves");
83-
_default.AddIrregular("move", "moves");
84-
_default.AddIrregular("goose", "geese");
85-
_default.AddIrregular("wave", "waves");
86-
_default.AddIrregular("die", "dice");
87-
_default.AddIrregular("foot", "feet");
88-
_default.AddIrregular("tooth", "teeth");
89-
_default.AddIrregular("curriculum", "curricula");
90-
_default.AddIrregular("database", "databases");
91-
_default.AddIrregular("zombie", "zombies");
92-
_default.AddIrregular("personnel", "personnel");
93-
//Fix #789
94-
_default.AddIrregular("cache", "caches");
45+
_default.AddSingular("s$", "");
46+
_default.AddSingular("(n)ews$", "$1ews");
47+
_default.AddSingular("([dti])a$", "$1um");
48+
_default.AddSingular("(analy|ba|diagno|parenthe|progno|synop|the|ellip|empha|neuro|oa|paraly)ses$", "$1sis");
49+
_default.AddSingular("([^f])ves$", "$1fe");
50+
_default.AddSingular("(hive)s$", "$1");
51+
_default.AddSingular("(tive)s$", "$1");
52+
_default.AddSingular("([lr]|hoo|lea|loa|thie)ves$", "$1f");
53+
_default.AddSingular("(^zomb)?([^aeiouy]|qu)ies$", "$2y");
54+
_default.AddSingular("(s)eries$", "$1eries");
55+
_default.AddSingular("(m)ovies$", "$1ovie");
56+
_default.AddSingular("(x|ch|ss|sh)es$", "$1");
57+
_default.AddSingular("(^[m|l])ice$", "$1ouse");
58+
_default.AddSingular("(?<!^[a-z])(o)es$", "$1");
59+
_default.AddSingular("(shoe)s$", "$1");
60+
_default.AddSingular("(cris|ax|test)es$", "$1is");
61+
_default.AddSingular("(octop|vir|alumn|fung|cact|foc|hippopotam|radi|stimul|syllab|nucle)i$", "$1us");
62+
_default.AddSingular("(alias|bias|iris|status|campus|apparatus|virus|walrus|trellis)es$", "$1");
63+
_default.AddSingular("^(ox)en", "$1");
64+
_default.AddSingular("(matr|d)ices$", "$1ix");
65+
_default.AddSingular("(vert|ind)ices$", "$1ex");
66+
_default.AddSingular("(quiz)zes$", "$1");
67+
_default.AddSingular("(buz|blit|walt)zes$", "$1z");
68+
_default.AddSingular("(alumn|alg|larv|vertebr)ae$", "$1a");
69+
_default.AddSingular("(criteri|phenomen)a$", "$1on");
70+
_default.AddSingular("([b|r|c]ook|room|smooth)ies$", "$1ie");
9571

96-
//Fix 975
97-
_default.AddIrregular("ex", "exes", matchEnding: false);
72+
_default.AddIrregular("person", "people");
73+
_default.AddIrregular("man", "men");
74+
_default.AddIrregular("human", "humans");
75+
_default.AddIrregular("child", "children");
76+
_default.AddIrregular("sex", "sexes");
77+
_default.AddIrregular("glove", "gloves");
78+
_default.AddIrregular("move", "moves");
79+
_default.AddIrregular("goose", "geese");
80+
_default.AddIrregular("wave", "waves");
81+
_default.AddIrregular("foot", "feet");
82+
_default.AddIrregular("tooth", "teeth");
83+
_default.AddIrregular("curriculum", "curricula");
84+
_default.AddIrregular("database", "databases");
85+
_default.AddIrregular("zombie", "zombies");
86+
_default.AddIrregular("personnel", "personnel");
87+
_default.AddIrregular("cache", "caches");
88+
_default.AddIrregular("ex", "exes", matchEnding: false);
89+
_default.AddIrregular("is", "are", matchEnding: false);
90+
_default.AddIrregular("was", "were", matchEnding: false);
91+
_default.AddIrregular("that", "those", matchEnding: false);
92+
_default.AddIrregular("this", "these", matchEnding: false);
93+
_default.AddIrregular("bus", "buses", matchEnding: false);
94+
_default.AddIrregular("die", "dice", matchEnding: false);
95+
_default.AddIrregular("tie", "ties", matchEnding: false);
96+
_default.AddIrregular("lens", "lenses");
97+
_default.AddIrregular("clove", "cloves");
98+
_default.AddIrregular("valve", "valves");
99+
_default.AddIrregular("explosive", "explosives");
98100

99-
_default.AddIrregular("is", "are", matchEnding: false);
100-
_default.AddIrregular("that", "those", matchEnding: false);
101-
_default.AddIrregular("this", "these", matchEnding: false);
102-
_default.AddIrregular("bus", "buses", matchEnding: false);
103-
_default.AddIrregular("staff", "staff", matchEnding: false);
104-
_default.AddIrregular("training", "training", matchEnding: false);
101+
_default.AddUncountable("staff");
102+
_default.AddUncountable("training");
103+
_default.AddUncountable("equipment");
104+
_default.AddUncountable("information");
105+
_default.AddUncountable("corn");
106+
_default.AddUncountable("milk");
107+
_default.AddUncountable("rice");
108+
_default.AddUncountable("money");
109+
_default.AddUncountable("species");
110+
_default.AddUncountable("series");
111+
_default.AddUncountable("fish");
112+
_default.AddUncountable("sheep");
113+
_default.AddUncountable("deer");
114+
_default.AddUncountable("aircraft");
115+
_default.AddUncountable("oz");
116+
_default.AddUncountable("tsp");
117+
_default.AddUncountable("tbsp");
118+
_default.AddUncountable("ml");
119+
_default.AddUncountable("l");
120+
_default.AddUncountable("water");
121+
_default.AddUncountable("waters");
122+
_default.AddUncountable("semen");
123+
_default.AddUncountable("sperm");
124+
_default.AddUncountable("bison");
125+
_default.AddUncountable("grass");
126+
_default.AddUncountable("hair");
127+
_default.AddUncountable("mud");
128+
_default.AddUncountable("elk");
129+
_default.AddUncountable("luggage");
130+
_default.AddUncountable("moose");
131+
_default.AddUncountable("offspring");
132+
_default.AddUncountable("salmon");
133+
_default.AddUncountable("shrimp");
134+
_default.AddUncountable("someone");
135+
_default.AddUncountable("swine");
136+
_default.AddUncountable("trout");
137+
_default.AddUncountable("tuna");
138+
_default.AddUncountable("corps");
139+
_default.AddUncountable("scissors");
140+
_default.AddUncountable("means");
141+
_default.AddUncountable("mail");
142+
_default.AddUncountable("pliers");
143+
_default.AddUncountable("sheers");
144+
_default.AddUncountable("clothes");
145+
_default.AddUncountable("apparatus");
146+
_default.AddUncountable("chassis");
147+
_default.AddUncountable("debris");
105148

106-
_default.AddUncountable("equipment");
107-
_default.AddUncountable("information");
108-
_default.AddUncountable("corn");
109-
_default.AddUncountable("milk");
110-
_default.AddUncountable("rice");
111-
_default.AddUncountable("money");
112-
_default.AddUncountable("species");
113-
_default.AddUncountable("series");
114-
_default.AddUncountable("fish");
115-
_default.AddUncountable("sheep");
116-
_default.AddUncountable("deer");
117-
_default.AddUncountable("aircraft");
118-
_default.AddUncountable("oz");
119-
_default.AddUncountable("tsp");
120-
_default.AddUncountable("tbsp");
121-
_default.AddUncountable("ml");
122-
_default.AddUncountable("l");
123-
_default.AddUncountable("water");
124-
_default.AddUncountable("waters");
125-
_default.AddUncountable("semen");
126-
_default.AddUncountable("sperm");
127-
_default.AddUncountable("bison");
128-
_default.AddUncountable("grass");
129-
_default.AddUncountable("hair");
130-
_default.AddUncountable("mud");
131-
_default.AddUncountable("elk");
132-
_default.AddUncountable("luggage");
133-
_default.AddUncountable("moose");
134-
_default.AddUncountable("offspring");
135-
_default.AddUncountable("salmon");
136-
_default.AddUncountable("shrimp");
137-
_default.AddUncountable("someone");
138-
_default.AddUncountable("swine");
139-
_default.AddUncountable("trout");
140-
_default.AddUncountable("tuna");
141-
_default.AddUncountable("corps");
142-
_default.AddUncountable("scissors");
143-
_default.AddUncountable("means");
144-
_default.AddUncountable("mail");
149+
//Fix 1132
150+
_default.AddUncountable("metadata");
145151

146-
return _default;
147-
}
152+
return _default;
148153
}
149154
}

0 commit comments

Comments
 (0)