@fpw/en-wiktionary-la-modules 0.2.2 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE +75 -75
  2. package/README.md +19 -15
  3. package/dist/LaEngine.d.ts +23 -23
  4. package/dist/LaEngine.js +64 -66
  5. package/dist/index.d.ts +12 -11
  6. package/dist/index.js +12 -28
  7. package/dist/modules/common.d.ts +67 -66
  8. package/dist/modules/common.js +145 -157
  9. package/dist/modules/conjugation/LaVerb.d.ts +118 -109
  10. package/dist/modules/conjugation/LaVerb.js +2861 -2295
  11. package/dist/modules/conjugation/VerbAffix.d.ts +18 -18
  12. package/dist/modules/conjugation/VerbAffix.js +19 -23
  13. package/dist/modules/conjugation/VerbForm.d.ts +204 -182
  14. package/dist/modules/conjugation/VerbForm.js +215 -199
  15. package/dist/modules/conjugation/VerbType.d.ts +54 -40
  16. package/dist/modules/conjugation/VerbType.js +66 -58
  17. package/dist/modules/declination/LaAdjData.d.ts +16 -16
  18. package/dist/modules/declination/LaAdjData.js +1474 -908
  19. package/dist/modules/declination/LaNominal.d.ts +136 -130
  20. package/dist/modules/declination/LaNominal.js +1884 -1804
  21. package/dist/modules/declination/LaNounData.d.ts +16 -2
  22. package/dist/modules/declination/LaNounData.js +935 -855
  23. package/dist/modules/declination/LaPersonalPronoun.d.ts +12 -12
  24. package/dist/modules/declination/LaPersonalPronoun.js +80 -85
  25. package/dist/modules/declination/NominalForm.d.ts +85 -69
  26. package/dist/modules/declination/NominalForm.js +101 -91
  27. package/dist/modules/declination/NominalType.d.ts +191 -120
  28. package/dist/modules/declination/NominalType.js +211 -146
  29. package/dist/modules/headword/HeadWord.d.ts +107 -107
  30. package/dist/modules/headword/HeadWord.js +28 -32
  31. package/dist/modules/headword/HeadwordParser.d.ts +29 -29
  32. package/dist/modules/headword/HeadwordParser.js +456 -452
  33. package/package.json +23 -15
  34. package/dist/LaEngine.js.map +0 -1
  35. package/dist/index.js.map +0 -1
  36. package/dist/modules/common.js.map +0 -1
  37. package/dist/modules/conjugation/LaVerb.js.map +0 -1
  38. package/dist/modules/conjugation/VerbAffix.js.map +0 -1
  39. package/dist/modules/conjugation/VerbForm.js.map +0 -1
  40. package/dist/modules/conjugation/VerbType.js.map +0 -1
  41. package/dist/modules/declination/LaAdjData.js.map +0 -1
  42. package/dist/modules/declination/LaNominal.js.map +0 -1
  43. package/dist/modules/declination/LaNounData.js.map +0 -1
  44. package/dist/modules/declination/LaPersonalPronoun.js.map +0 -1
  45. package/dist/modules/declination/NominalForm.js.map +0 -1
  46. package/dist/modules/declination/NominalType.js.map +0 -1
  47. package/dist/modules/headword/HeadWord.js.map +0 -1
  48. package/dist/modules/headword/HeadwordParser.js.map +0 -1
  49. package/src/LaEngine.ts +0 -86
  50. package/src/index.ts +0 -16
  51. package/src/modules/common.ts +0 -164
  52. package/src/modules/conjugation/LaVerb.ts +0 -2669
  53. package/src/modules/conjugation/VerbAffix.ts +0 -18
  54. package/src/modules/conjugation/VerbForm.ts +0 -223
  55. package/src/modules/conjugation/VerbType.ts +0 -55
  56. package/src/modules/declination/LaAdjData.ts +0 -1036
  57. package/src/modules/declination/LaNominal.ts +0 -2025
  58. package/src/modules/declination/LaNounData.ts +0 -897
  59. package/src/modules/declination/LaPersonalPronoun.ts +0 -92
  60. package/src/modules/declination/NominalForm.ts +0 -89
  61. package/src/modules/declination/NominalType.ts +0 -157
  62. package/src/modules/headword/HeadWord.ts +0 -132
  63. package/src/modules/headword/HeadwordParser.ts +0 -515
@@ -1,855 +1,935 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.m_noun_decl = void 0;
4
- /**
5
- * This is a complete re-implementation of Wiktionary's Module:la-adj/data, developed by Benwing2.
6
- * It was converted from Lua to TypeScript by Folke Will <folko@solhost.org>.
7
- *
8
- * Original source: https://en.wiktionary.org/wiki/Module:la-noun/data
9
- * Based on version: https://en.wiktionary.org/w/index.php?title=Module:la-noun/data&oldid=67964055
10
- *
11
- * Lua idioms, function and variable names kept as in the original in order to easily
12
- * backport later changes to this implementation.
13
- *
14
- * For that reason, it's suggested to add a type-aware wrapper around this class and leave
15
- * this code unchanged instead of improving the types and use of idioms in this class.
16
- *
17
- */
18
- const common_1 = require("../common");
19
- const LaNominal_1 = require("./LaNominal");
20
- const NominalForm_1 = require("./NominalForm");
21
- const NominalType_1 = require("./NominalType");
22
- exports.m_noun_decl = new Map([
23
- ["1", (data, args) => {
24
- const stem = args[0];
25
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem + "a"]);
26
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem + "ae"]);
27
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem + "ae"]);
28
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem + "am"]);
29
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem + "ā"]);
30
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem + "a"]);
31
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem + "ae"]);
32
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem + "ārum"]);
33
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [stem + "īs"]);
34
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem + "ās"]);
35
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [stem + "īs"]);
36
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem + "ae"]);
37
- if (data.types.has(NominalType_1.NominalType.Abus)) {
38
- data.subtitles.push(["dative/ablative plural in ", "'-ābus'"]);
39
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [stem + "ābus"]);
40
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [stem + "ābus"]);
41
- }
42
- else if (data.types.has(NominalType_1.NominalType.NotAbus)) {
43
- data.subtitles.push(["dative/ablative plural in ", "'-īs'"]);
44
- }
45
- if (data.types.has(NominalType_1.NominalType.Am)) {
46
- data.subtitles.push(["nominative/vocative singular in ", "'-ām'"]);
47
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem + "ām"]);
48
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem + "ām"]);
49
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem + "ām"]);
50
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem + "ām", stem + "ā"]);
51
- }
52
- else if (data.types.has(NominalType_1.NominalType.Greek)) {
53
- if (data.types.has(NominalType_1.NominalType.Ma)) {
54
- data.subtitles.push("masculine Greek-type with nominative singular in '-ās'");
55
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem + "ās"]);
56
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem + "ān"]);
57
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem + "ā"]);
58
- }
59
- else if (data.types.has(NominalType_1.NominalType.Me)) {
60
- data.subtitles.push("masculine Greek-type with nominative singular in '-ēs'");
61
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem + "ēs"]);
62
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem + "ēn"]);
63
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem + "ē"]);
64
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem + "ē"]);
65
- }
66
- else {
67
- data.subtitles.push("Greek-type");
68
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem + "ē"]);
69
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem + "ēs"]);
70
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem + "ēn"]);
71
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem + "ē"]);
72
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem + "ē"]);
73
- }
74
- }
75
- else if (data.types.has(NominalType_1.NominalType.NotGreek)) {
76
- data.subtitles.push("non-Greek-type");
77
- }
78
- else if (data.types.has(NominalType_1.NominalType.NotAm)) {
79
- data.subtitles.push(["nominative/vocative singular in ", "'-a'"]);
80
- }
81
- if (data.loc) {
82
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_sg", [stem + "ae"]);
83
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_pl", [stem + "īs"]);
84
- }
85
- }],
86
- ["2", (data, args) => {
87
- const stem1 = args[0];
88
- const stem2 = args[1];
89
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1 + "us"]);
90
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem1 + "ī"]);
91
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem1 + "ō"]);
92
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem1 + "um"]);
93
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem1 + "ō"]);
94
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1 + "e"]);
95
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem1 + "ī"]);
96
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem1 + "ōrum"]);
97
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [stem1 + "īs"]);
98
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem1 + "ōs"]);
99
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [stem1 + "īs"]);
100
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem1 + "ī"]);
101
- if (data.types.has(NominalType_1.NominalType.Neuter)) {
102
- data.subtitles.push("neuter");
103
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1 + "um"]);
104
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1 + "um"]);
105
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem1 + "a"]);
106
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem1 + "a"]);
107
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem1 + "a"]);
108
- if (data.types.has(NominalType_1.NominalType.Ium)) {
109
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1 + "ium"]);
110
- if (!data.declOpts.suppressOldGenitive) {
111
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem1 + "iī", stem1 + "ī"]);
112
- }
113
- else {
114
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem1 + ""]);
115
- }
116
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem1 + ""]);
117
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem1 + "ium"]);
118
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem1 + ""]);
119
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1 + "ium"]);
120
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem1 + "ia"]);
121
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem1 + "iōrum"]);
122
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [stem1 + "iīs"]);
123
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem1 + "ia"]);
124
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [stem1 + "iīs"]);
125
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem1 + "ia"]);
126
- if (!data.declOpts.suppressOldGenitive) {
127
- data.notes.set("gen_sg2", "Found in older Latin (until the Augustan Age).");
128
- }
129
- }
130
- else if (data.types.has(NominalType_1.NominalType.a)) {
131
- data.subtitles.push("nominative/accusative/vocative plural in '-a'");
132
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1 + "us"]);
133
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem1 + "us"]);
134
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1 + "us"]);
135
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem1 + "a"]);
136
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem1 + "a"]);
137
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem1 + "a"]);
138
- }
139
- else if (data.types.has(NominalType_1.NominalType.Vom)) {
140
- data.subtitles.push("nominative singular in '-om' after 'v'");
141
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1 + "om"]);
142
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem1 + "om"]);
143
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1 + "om"]);
144
- }
145
- else if (data.types.has(NominalType_1.NominalType.Greek) && data.types.has(NominalType_1.NominalType.Us)) {
146
- data.subtitles.push("Greek-type");
147
- data.subtitles.push("nominative/accusative/vocative in '-os'");
148
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1 + "os"]);
149
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem1 + "os"]);
150
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1 + "os"]);
151
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem1 + "ē"]);
152
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem1 + "ōn"]);
153
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem1 + "ē"]);
154
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem1 + "ē"]);
155
- }
156
- else if (data.types.has(NominalType_1.NominalType.Greek)) {
157
- data.subtitles.push("Greek-type");
158
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1 + "on"]);
159
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem1 + "on"]);
160
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1 + "on"]);
161
- }
162
- else if (data.types.has(NominalType_1.NominalType.Us)) {
163
- data.subtitles.push("nominative/accusative/vocative in '-us'");
164
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1 + "us"]);
165
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem1 + "us"]);
166
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1 + "us"]);
167
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem1 + "ī"]);
168
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem1 + "ōs"]);
169
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem1 + "ī"]);
170
- }
171
- else if (data.types.has(NominalType_1.NominalType.NotGreek) || data.types.has(NominalType_1.NominalType.NotUs)) {
172
- data.subtitles.push("nominative/accusative/vocative in '-um'");
173
- }
174
- }
175
- else if (data.types.has(NominalType_1.NominalType.Er)) {
176
- if (stem1.match(/[aiouy]r$/)) {
177
- data.subtitles.push("nominative singular in '-r'");
178
- }
179
- else {
180
- data.subtitles.push("nominative singular in '-er'");
181
- }
182
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1]);
183
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem2 + "ī"]);
184
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem2 + "ō"]);
185
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem2 + "um"]);
186
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem2 + "ō"]);
187
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1]);
188
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem2 + "ī"]);
189
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem2 + "ōrum"]);
190
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [stem2 + "īs"]);
191
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem2 + "ōs"]);
192
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [stem2 + "īs"]);
193
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem2 + "ī"]);
194
- }
195
- else if (data.types.has(NominalType_1.NominalType.Ius)) {
196
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1 + "ius"]);
197
- if (!data.declOpts.suppressOldGenitive) {
198
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem1 + "iī", stem1 + "ī"]);
199
- }
200
- else {
201
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem1 + ""]);
202
- }
203
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem1 + "iō"]);
204
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem1 + "ium"]);
205
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem1 + ""]);
206
- if (data.types.has(NominalType_1.NominalType.VocI)) {
207
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1 + "ī"]);
208
- }
209
- else {
210
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1 + "ie"]);
211
- }
212
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem1 + ""]);
213
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem1 + "iōrum"]);
214
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [stem1 + "iīs"]);
215
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem1 + "iōs"]);
216
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [stem1 + "iīs"]);
217
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem1 + "iī"]);
218
- if (!data.declOpts.suppressOldGenitive) {
219
- data.notes.set("gen_sg2", "Found in older Latin (until the Augustan Age).");
220
- }
221
- }
222
- else if (data.types.has(NominalType_1.NominalType.Vos)) {
223
- data.subtitles.push("nominative singular in '-os' after 'v'");
224
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1 + "os"]);
225
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem1 + "om"]);
226
- }
227
- else if (data.types.has(NominalType_1.NominalType.Greek)) {
228
- data.subtitles.push("Greek-type");
229
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1 + "os"]);
230
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem1 + "on"]);
231
- }
232
- else if (data.types.has(NominalType_1.NominalType.NotGreek)) {
233
- data.subtitles.push("non-Greek-type");
234
- }
235
- if (data.types.has(NominalType_1.NominalType.GenPluM)) {
236
- data.subtitles.push(["contracted", " genitive plural"]);
237
- data.notes.set("gen_pl2", "Contraction found in poetry.");
238
- if (data.types.has(NominalType_1.NominalType.Ius) || data.types.has(NominalType_1.NominalType.Ium)) {
239
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem2 + "iōrum", stem2 + "ium"]);
240
- }
241
- else {
242
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem2 + "ōrum", stem2 + "um"]);
243
- }
244
- }
245
- else if (data.types.has(NominalType_1.NominalType.NotGenPluM)) {
246
- data.subtitles.push(["normal", " genitive plural"]);
247
- }
248
- if (data.loc) {
249
- if (data.types.has(NominalType_1.NominalType.Ius) || data.types.has(NominalType_1.NominalType.Ium)) {
250
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_sg", [stem2 + "iī"]);
251
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_pl", [stem2 + "iīs"]);
252
- }
253
- else {
254
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_sg", [stem2 + "ī"]);
255
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_pl", [stem2 + "īs"]);
256
- }
257
- }
258
- }],
259
- ["3", (data, args) => {
260
- let stem1 = args[0];
261
- const stem2 = args[1];
262
- function parisyllabic_type() {
263
- const stem1_vowels = (0, common_1.strip_macrons)(stem1).replace(/[^AEIOUYaeiouy]/g, "");
264
- const stem2_vowels = (0, common_1.strip_macrons)(stem2).replace(/[^AEIOUYaeiouy]/g, "");
265
- return stem1_vowels.length > stem2_vowels.length ? "parisyllabic" : "imparisyllabic";
266
- }
267
- function non_i_stem_type() {
268
- return parisyllabic_type() + " non-i-stem";
269
- }
270
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1]);
271
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem2 + "is"]);
272
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem2 + "ī"]);
273
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem2 + "em"]);
274
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem2 + "e"]);
275
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1]);
276
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem2 + "ēs"]);
277
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem2 + "um"]);
278
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [stem2 + "ibus"]);
279
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem2 + "ēs"]);
280
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [stem2 + "ibus"]);
281
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem2 + "ēs"]);
282
- let acc_sg_i_stem_subtype = false;
283
- let not_acc_sg_i_stem_subtype = false;
284
- for (const subtype of data.types.keys()) {
285
- if (acc_sg_i_stem_subtypes.has(subtype)) {
286
- acc_sg_i_stem_subtype = true;
287
- break;
288
- }
289
- }
290
- for (const [acc_sg_subtype, [endings, title]] of acc_sg_i_stem_subtypes) {
291
- if ((0, NominalType_1.hasNominalType)(data.types, "not_" + acc_sg_subtype)) {
292
- not_acc_sg_i_stem_subtype = true;
293
- break;
294
- }
295
- }
296
- let abl_sg_i_stem_subtype = false;
297
- let not_abl_sg_i_stem_subtype = false;
298
- for (const subtype of data.types.keys()) {
299
- if (abl_sg_i_stem_subtypes.has(subtype)) {
300
- abl_sg_i_stem_subtype = true;
301
- break;
302
- }
303
- }
304
- for (const [abl_sg_subtype, [endings, title]] of abl_sg_i_stem_subtypes) {
305
- if ((0, NominalType_1.hasNominalType)(data.types, "not_" + abl_sg_subtype)) {
306
- not_abl_sg_i_stem_subtype = true;
307
- break;
308
- }
309
- }
310
- if (data.types.has(NominalType_1.NominalType.Greek)) {
311
- data.subtitles.push("Greek-type");
312
- if (data.types.has(NominalType_1.NominalType.Er)) {
313
- data.subtitles.push("variant with nominative singular in '-ēr'");
314
- stem1 = extract_stem(stem1, "ēr");
315
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1 + "ēr"]);
316
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem1 + "eris"]);
317
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem1 + "erī"]);
318
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem1 + "era", stem1 + "erem"]);
319
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem1 + "ere"]);
320
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1 + "ēr"]);
321
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem1 + "erēs"]);
322
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem1 + "erum"]);
323
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [stem1 + "eribus"]);
324
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem1 + "erēs"]);
325
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [stem1 + "eribus"]);
326
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem1 + "erēs"]);
327
- }
328
- else if (data.types.has(NominalType_1.NominalType.On)) {
329
- data.subtitles.push("variant with nominative singular in '-ōn'");
330
- stem1 = extract_stem(stem1, "ōn");
331
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1 + "ōn"]);
332
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem1 + "ontis", stem1 + "ontos"]);
333
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem1 + "ontī"]);
334
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem1 + "onta"]);
335
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem1 + "onte"]);
336
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1 + "ōn"]);
337
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem1 + "ontēs"]);
338
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem1 + "ontum", stem1 + "ontium"]);
339
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [stem1 + "ontibus"]);
340
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem1 + "ontēs", stem1 + "ontās"]);
341
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [stem1 + "ontibus"]);
342
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem1 + "ontēs"]);
343
- }
344
- else if (data.types.has(NominalType_1.NominalType.I)) {
345
- data.subtitles.push("i-stem");
346
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem2 + "is", stem2 + "eōs", stem2 + "ios"]);
347
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem2 + "im", stem2 + "in", stem2 + "em"]);
348
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem2 + "ī", stem2 + "e"]);
349
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem2 + "is", stem2 + "i"]);
350
- data.notes.set("acc_sg3", "Found sometimes in Medieval and New Latin.");
351
- data.notes.set("abl_sg2", "Found sometimes in Medieval and New Latin.");
352
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem2 + "ēs", stem2 + "eis"]);
353
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem2 + "ium", stem2 + "eōn"]);
354
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem2 + "ēs", stem2 + "eis"]);
355
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem2 + "ēs", stem2 + "eis"]);
356
- if (data.types.has(NominalType_1.NominalType.poetic_esi)) {
357
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [stem2 + "ibus", stem2 + "esi"]);
358
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [stem2 + "ibus", stem2 + "esi"]);
359
- data.notes.set("dat_pl2", "Primarily in poetry.");
360
- data.notes.set("abl_pl2", "Primarily in poetry.");
361
- }
362
- }
363
- else {
364
- data.subtitles.push("normal variant");
365
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem2 + "os"]);
366
- if (stem2.match(/y$/)) {
367
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem2 + "n"]);
368
- }
369
- else {
370
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem2 + "a"]);
371
- }
372
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem2 + "es"]);
373
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem2 + "as"]);
374
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem2 + "es"]);
375
- if (stem1.match(/[iyï]s$/)) {
376
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1, stem1.replace(/s/g, "")]);
377
- data.notes.set("voc_sg2", "In poetry.");
378
- }
379
- }
380
- }
381
- else if (data.types.has(NominalType_1.NominalType.NotGreek)) {
382
- data.subtitles.push("non-Greek-type");
383
- }
384
- if (data.types.has(NominalType_1.NominalType.Polis)) {
385
- stem1 = extract_stem(stem1, "polis");
386
- data.subtitles.push("i-stem, partially Greek-type");
387
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem1 + "polis"]);
388
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem1 + "polis"]);
389
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem1 + "polī"]);
390
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem1 + "polim", stem1 + "polin"]);
391
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem1 + "polī"]);
392
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem1 + "polis", stem1 + "polī"]);
393
- }
394
- else if (data.types.has(NominalType_1.NominalType.NotPolis)) {
395
- data.subtitles.push(non_i_stem_type());
396
- }
397
- if (data.types.has(NominalType_1.NominalType.Neuter)) {
398
- data.subtitles.push("neuter");
399
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem1]);
400
- if (data.types.has(NominalType_1.NominalType.I)) {
401
- if (data.types.has(NominalType_1.NominalType.Pure)) {
402
- data.subtitles.push("“pure” i-stem");
403
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem2 + "ī"]);
404
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem2 + "ia"]);
405
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem2 + "ium"]);
406
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem2 + "ia"]);
407
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem2 + "ia"]);
408
- }
409
- else {
410
- data.subtitles.push("i-stem");
411
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem2 + "a"]);
412
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem2 + "ium", stem2 + "um"]);
413
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem2 + "a"]);
414
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem2 + "a"]);
415
- }
416
- }
417
- else {
418
- data.subtitles.push(non_i_stem_type());
419
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem2 + "a"]);
420
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem2 + "a"]);
421
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem2 + "a"]);
422
- }
423
- }
424
- else if (data.types.has(NominalType_1.NominalType.I) || acc_sg_i_stem_subtype || abl_sg_i_stem_subtype) {
425
- if (data.types.has(NominalType_1.NominalType.NotNeuter)) {
426
- data.subtitles.push("non-neuter i-stem");
427
- }
428
- else {
429
- data.subtitles.push("i-stem");
430
- }
431
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem2 + "ium"]);
432
- if (!data.declOpts.suppressNonNeuterIStemAccIs) {
433
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem2 + "ēs", stem2 + "īs"]);
434
- }
435
- else {
436
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem2 + "ēs"]);
437
- }
438
- for (const subtype of data.types) {
439
- const acc_sg_i_stem_props = acc_sg_i_stem_subtypes.get(subtype);
440
- if (acc_sg_i_stem_props) {
441
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", []);
442
- for (const ending of acc_sg_i_stem_props[0]) {
443
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", ((0, NominalForm_1.getNominalForm)(data.forms, "acc_sg") || []).concat([stem2 + ending]));
444
- }
445
- if (data.num != "pl") {
446
- data.subtitles.push(acc_sg_i_stem_props[1]);
447
- }
448
- break;
449
- }
450
- }
451
- for (const subtype of data.types) {
452
- const abl_sg_i_stem_props = abl_sg_i_stem_subtypes.get(subtype);
453
- if (abl_sg_i_stem_props) {
454
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", []);
455
- for (const ending of abl_sg_i_stem_props[0]) {
456
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", ((0, NominalForm_1.getNominalForm)(data.forms, "abl_sg") || []).concat([stem2 + ending]));
457
- }
458
- if (data.num != "pl") {
459
- data.subtitles.push(abl_sg_i_stem_props[1]);
460
- }
461
- break;
462
- }
463
- }
464
- }
465
- else if (data.types.has(NominalType_1.NominalType.Neuter) && data.types.has(NominalType_1.NominalType.NotI)) {
466
- data.subtitles.push("non-neuter " + non_i_stem_type());
467
- }
468
- else if (data.types.has(NominalType_1.NominalType.NotNeuter)) {
469
- data.subtitles.push("non-neuter");
470
- }
471
- else if (data.types.has(NominalType_1.NominalType.NotI)) {
472
- data.subtitles.push(non_i_stem_type());
473
- }
474
- if (data.loc) {
475
- const loc_sg = Array.from((0, NominalForm_1.getNominalForm)(data.forms, "dat_sg") || []);
476
- const abl_sg = (0, NominalForm_1.getNominalForm)(data.forms, "abl_sg") || [];
477
- for (const form of abl_sg) {
478
- insert_if_not(loc_sg, form);
479
- }
480
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_sg", loc_sg);
481
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_pl", (0, NominalForm_1.getNominalForm)(data.forms, "abl_pl") || []);
482
- }
483
- }],
484
- ["4", (data, args) => {
485
- const stem = args[0];
486
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem + "us"]);
487
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem + "ūs"]);
488
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem + "uī"]);
489
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem + "um"]);
490
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem + "ū"]);
491
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem + "us"]);
492
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem + "ūs"]);
493
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem + "uum"]);
494
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [stem + "ibus"]);
495
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem + "ūs"]);
496
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [stem + "ibus"]);
497
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem + "ūs"]);
498
- if (data.types.has(NominalType_1.NominalType.Echo)) {
499
- data.subtitles.push("nominative/vocative singular in '-ō'");
500
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem + "ō"]);
501
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem + "ō"]);
502
- }
503
- else if (data.types.has(NominalType_1.NominalType.argo)) {
504
- data.subtitles.push("nominative/accusative/vocative singular in '-ō', ablative singular in '-uī'");
505
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem + "ō"]);
506
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem + "ō"]);
507
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem + "uī"]);
508
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem + "ō"]);
509
- }
510
- else if (data.types.has(NominalType_1.NominalType.Callisto)) {
511
- data.subtitles.push("all cases except the genitive singular in '-ō'");
512
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem + "ō"]);
513
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem + "ō"]);
514
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem + "ō"]);
515
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem + "ō"]);
516
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem + "ō"]);
517
- }
518
- if (data.types.has(NominalType_1.NominalType.Neuter)) {
519
- data.subtitles.push("neuter");
520
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem + "ū"]);
521
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem + "ū"]);
522
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem + "ū"]);
523
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem + "ū"]);
524
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem + "ua"]);
525
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem + "ua"]);
526
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem + "ua"]);
527
- }
528
- if (data.types.has(NominalType_1.NominalType.Ubus)) {
529
- data.subtitles.push("dative/ablative plural in '-ubus'");
530
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [stem + "ubus"]);
531
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [stem + "ubus"]);
532
- }
533
- else if (data.types.has(NominalType_1.NominalType.NotUbus)) {
534
- data.subtitles.push("'-ibus'");
535
- }
536
- if (data.loc) {
537
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_sg", (0, NominalForm_1.getNominalForm)(data.forms, "abl_sg") || []);
538
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_pl", (0, NominalForm_1.getNominalForm)(data.forms, "abl_pl") || []);
539
- }
540
- }],
541
- ["5", (data, args) => {
542
- let stem = args[0];
543
- if (data.types.has(NominalType_1.NominalType.i)) {
544
- stem = stem + "i";
545
- }
546
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem + "ēs"]);
547
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem + "eī"]);
548
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem + "eī"]);
549
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem + "em"]);
550
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem + "ē"]);
551
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem + "ēs"]);
552
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem + "ēs"]);
553
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem + "ērum"]);
554
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [stem + "ēbus"]);
555
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem + "ēs"]);
556
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [stem + "ēbus"]);
557
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem + "ēs"]);
558
- if (data.types.has(NominalType_1.NominalType.i)) {
559
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem + "ēī"]);
560
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem + "ēī"]);
561
- }
562
- if (data.loc) {
563
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_sg", [stem + "ē"]);
564
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_pl", [stem + "ēbus"]);
565
- }
566
- }],
567
- ["0", (data, args) => {
568
- const stem = args[0];
569
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem]);
570
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [stem]);
571
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [stem]);
572
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem]);
573
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [stem]);
574
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [stem]);
575
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [stem]);
576
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [stem]);
577
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [stem]);
578
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [stem]);
579
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [stem]);
580
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [stem]);
581
- if (data.loc) {
582
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_sg", [stem]);
583
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_pl", [stem]);
584
- }
585
- }],
586
- ["indecl", (data, args) => {
587
- data.title = "Not declined; used only in the nominative and accusative singular";
588
- const stem = args[0];
589
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", ["-"]);
590
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", ["-"]);
591
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", ["-"]);
592
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", ["-"]);
593
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", ["-"]);
594
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", ["-"]);
595
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", ["-"]);
596
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", ["-"]);
597
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", ["-"]);
598
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", ["-"]);
599
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", ["-"]);
600
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", ["-"]);
601
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem]);
602
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [stem]);
603
- data.num = LaNominal_1.NumberTantum.Singular;
604
- }],
605
- ["irreg", (data, args) => {
606
- const stem = args[0];
607
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", ["-"]);
608
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", ["-"]);
609
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", ["-"]);
610
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", ["-"]);
611
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", ["-"]);
612
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", ["-"]);
613
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", ["-"]);
614
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", ["-"]);
615
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", ["-"]);
616
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", ["-"]);
617
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", ["-"]);
618
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", ["-"]);
619
- if (stem == "bōs") {
620
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", ["bōs"]);
621
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", ["bovis"]);
622
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", ["bovī"]);
623
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", ["bovem"]);
624
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", ["bove"]);
625
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", ["bōs"]);
626
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", ["bovēs"]);
627
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", ["boum"]);
628
- if (!data.declOpts.suppressRareIrregForms) {
629
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", ["bōbus", "būbus"]);
630
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", ["bōbus", "būbus"]);
631
- }
632
- else {
633
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", ["bōbus"]);
634
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", ["bōbus"]);
635
- }
636
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", ["bovēs"]);
637
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", ["bovēs"]);
638
- }
639
- else if (stem == "cherub") {
640
- data.title = "mostly indeclinable";
641
- data.subtitles.push("with a distinct plural");
642
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", ["cherub"]);
643
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", ["cherub"]);
644
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", ["cherub"]);
645
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", ["cherub"]);
646
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", ["cherub"]);
647
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", ["cherub"]);
648
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", ["cherubim", "cherubin"]);
649
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", ["cherubim", "cherubin"]);
650
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", ["cherubim", "cherubin"]);
651
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", ["cherubim", "cherubin"]);
652
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", ["cherubim", "cherubin"]);
653
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", ["cherubim", "cherubin"]);
654
- }
655
- else if (stem == "deus") {
656
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", ["deus"]);
657
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", ["deī"]);
658
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", ["deō"]);
659
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", ["deum"]);
660
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", ["deō"]);
661
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", ["deus"]);
662
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", ["", "diī", "deī"]);
663
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", ["deōrum", "deûm", "divom"]);
664
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", ["dīs", "diīs", "deīs"]);
665
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", ["deōs"]);
666
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", ["dīs", "diīs", "deīs"]);
667
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", ["", "diī", "deī"]);
668
- }
669
- else if (stem == "Deus") {
670
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", ["Deus"]);
671
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", ["Deī"]);
672
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", ["Deō"]);
673
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", ["Deum"]);
674
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", ["Deō"]);
675
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", ["Deus"]);
676
- data.num = LaNominal_1.NumberTantum.Singular;
677
- }
678
- else if (stem == "domus") {
679
- data.title = "fourth/second-declension noun";
680
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", ["domus"]);
681
- if (!data.declOpts.suppressRareIrregForms) {
682
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", ["domūs", "domī"]);
683
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", ["domuī", "domō", "domū"]);
684
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", ["domū", "domō"]);
685
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", ["domuum", "domōrum"]);
686
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", ["domūs", "domōs"]);
687
- }
688
- else {
689
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", ["domūs"]);
690
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", ["domuī"]);
691
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", ["domō"]);
692
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", ["domuum", "domōrum"]);
693
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", ["domōs"]);
694
- }
695
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", ["domum"]);
696
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", ["domus"]);
697
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_sg", ["domī"]);
698
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", ["domūs"]);
699
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", ["domibus"]);
700
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", ["domibus"]);
701
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", ["domūs"]);
702
- (0, NominalForm_1.setNominalForm)(data.forms, "loc_pl", ["domibus"]);
703
- data.loc = true;
704
- }
705
- else if (stem == "Iēsus" || stem == "Iēsūs") {
706
- data.subtitles.push("highly irregular");
707
- const ij = stem[0];
708
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem]);
709
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [ij + "ēsū"]);
710
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [ij + "ēsū"]);
711
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [ij + "ēsum"]);
712
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [ij + "ēsū"]);
713
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [ij + "ēsū"]);
714
- data.num = LaNominal_1.NumberTantum.Singular;
715
- }
716
- else if (stem == "Jesus") {
717
- data.subtitles.push("highly irregular");
718
- const ij = stem[0];
719
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [stem]);
720
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [ij + "esu"]);
721
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [ij + "esu"]);
722
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [ij + "esum"]);
723
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [ij + "esu"]);
724
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [ij + "esu"]);
725
- data.num = LaNominal_1.NumberTantum.Singular;
726
- }
727
- else if (stem == "iūgerum" || stem == "jūgerum") {
728
- const ij = stem[0];
729
- data.title = "second–third-declension hybrid noun";
730
- data.subtitles.push("neuter");
731
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", [ij + "ūgerum"]);
732
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", [ij + "ūgerī"]);
733
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", [ij + "ūgerō"]);
734
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", [ij + "ūgerum"]);
735
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [ij + "ūgerō"]);
736
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", [ij + "ūgerum"]);
737
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", [ij + "ūgera"]);
738
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", [ij + "ūgerum"]);
739
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", [ij + "ūgeribus"]);
740
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", [ij + "ūgera"]);
741
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", [ij + "ūgeribus", ij + "ūgerīs"]);
742
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", [ij + "ūgera"]);
743
- data.notes.set("abl_pl2", "Once only, in:<br/>M. Terentius Varro, 'Res Rusticae', bk I, ch. x");
744
- }
745
- else if (stem == "sūs") {
746
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", ["sūs"]);
747
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", ["suis"]);
748
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", ["suī"]);
749
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", ["suem"]);
750
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", ["sue"]);
751
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", ["sūs"]);
752
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", ["suēs"]);
753
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", ["suum"]);
754
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", ["suibus", "sūbus", "subus"]);
755
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", ["suēs"]);
756
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", ["suibus", "sūbus", "subus"]);
757
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", ["suēs"]);
758
- }
759
- else if (stem == "ēthos") {
760
- data.subtitles.push("irregular");
761
- data.subtitles.push("Greek-type");
762
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", ["ēthos"]);
763
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", ["ētheos"]);
764
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", ["ēthos"]);
765
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", ["ēthos"]);
766
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", ["ēthea", "ēthē"]);
767
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", ["ēthesi", "ēthesin"]);
768
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", ["ēthea", "ēthē"]);
769
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", ["ēthesi", "ēthesin"]);
770
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", ["ēthea", "ēthē"]);
771
- }
772
- else if (stem == "lexis") {
773
- data.subtitles.push("irregular");
774
- data.subtitles.push("Greek-type");
775
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", ["lexis"]);
776
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", ["lexeōs"]);
777
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", ["lexeis"]);
778
- }
779
- else if (stem == "Athōs") {
780
- data.subtitles.push("highly irregular");
781
- data.subtitles.push("Greek-type");
782
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", ["Athōs"]);
783
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", ["Athō"]);
784
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", ["Athō"]);
785
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", ["Athō", "Athōn"]);
786
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", ["Athō"]);
787
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", ["Athōs"]);
788
- data.num = LaNominal_1.NumberTantum.Singular;
789
- }
790
- else if (stem == "vēnum") {
791
- data.title = "fourth/second-declension noun";
792
- data.subtitles.push("defective");
793
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", ["vēnuī", "vēnō"]);
794
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", ["vēnum"]);
795
- data.num = LaNominal_1.NumberTantum.Singular;
796
- }
797
- else if (stem == "vīs") {
798
- data.subtitles.push("irregular");
799
- data.subtitles.push("defective");
800
- if (!data.declOpts.suppressRareIrregForms) {
801
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_sg", ["*vīs"]);
802
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_sg", ["*vī"]);
803
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", ["vīrēs", "vīrīs"]);
804
- }
805
- else {
806
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_pl", ["vīrēs"]);
807
- }
808
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_sg", ["vīs"]);
809
- (0, NominalForm_1.setNominalForm)(data.forms, "acc_sg", ["vim"]);
810
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_sg", [""]);
811
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_sg", ["vīs"]);
812
- (0, NominalForm_1.setNominalForm)(data.forms, "nom_pl", ["vīrēs"]);
813
- (0, NominalForm_1.setNominalForm)(data.forms, "gen_pl", ["vīrium"]);
814
- (0, NominalForm_1.setNominalForm)(data.forms, "dat_pl", ["vīribus"]);
815
- (0, NominalForm_1.setNominalForm)(data.forms, "abl_pl", ["vīribus"]);
816
- (0, NominalForm_1.setNominalForm)(data.forms, "voc_pl", ["vīrēs"]);
817
- }
818
- else {
819
- throw Error(`Stem ${stem} not recognized.`);
820
- }
821
- }],
822
- ]);
823
- const acc_sg_i_stem_subtypes = new Map([
824
- [NominalType_1.NominalType.AccIm, [["im"], "accusative singular in '-im'"]],
825
- [NominalType_1.NominalType.AccImIn, [["im", "in"], "accusative singular in '-im' or '-in'"]],
826
- [NominalType_1.NominalType.AccImInEm, [["im", "in", "em"], "accusative singular in '-im', '-in' or '-em'"]],
827
- [NominalType_1.NominalType.AccImEm, [["im", "em"], "accusative singular in '-im' or '-em'"]],
828
- [NominalType_1.NominalType.AccImOccEm, [["im", "em"], "accusative singular in '-im' or occasionally '-em'"]],
829
- [NominalType_1.NominalType.AccEmIm, [["em", "im"], "accusative singular in '-em' or '-im'"]],
830
- ]);
831
- const abl_sg_i_stem_subtypes = new Map([
832
- [NominalType_1.NominalType.AblI, [["ī"], "ablative singular in '-ī'"]],
833
- [NominalType_1.NominalType.AblIE, [["ī", "e"], "ablative singular in '-ī' or '-e'"]],
834
- [NominalType_1.NominalType.AblEI, [["e", "ī"], "ablative singular in '-e' or '-ī'"]],
835
- [NominalType_1.NominalType.AblEOccI, [["e", "ī"], "ablative singular in '-e' or occasionally '-ī'"]],
836
- ]);
837
- function extract_stem(form, ending) {
838
- const base = form.match(new RegExp(`^(.*)${ending}$`));
839
- if (!base) {
840
- throw Error(`Form ${form} should end in -${ending}`);
841
- }
842
- return base[1];
843
- }
844
- function insert_if_not(data, entry, pos = 0) {
845
- if (data.includes(entry)) {
846
- return;
847
- }
848
- if (pos == 0) {
849
- data.push(entry);
850
- }
851
- else {
852
- data.splice(pos - 1, 0, entry);
853
- }
854
- }
855
- //# sourceMappingURL=LaNounData.js.map
1
+ /**
2
+ * This is a complete re-implementation of Wiktionary's Module:la-adj/data, developed by Benwing2.
3
+ * It was converted from Lua to TypeScript by Folke Will <folko@solhost.org>.
4
+ *
5
+ * Original source: https://en.wiktionary.org/wiki/Module:la-noun/data
6
+ * Based on version 2026-03-03
7
+ *
8
+ * Lua idioms, function and variable names kept as in the original in order to easily
9
+ * backport later changes to this implementation.
10
+ *
11
+ * For that reason, it's suggested to add a type-aware wrapper around this class and leave
12
+ * this code unchanged instead of improving the types and use of idioms in this class.
13
+ *
14
+ */
15
+ import { NumberTantum } from "./LaNominal.js";
16
+ import { getNominalForm, setNominalForm } from "./NominalForm.js";
17
+ import { hasNominalType, NominalType } from "./NominalType.js";
18
+ export const m_noun_decl = new Map([
19
+ ["1", (data, args) => {
20
+ const stem = args[0];
21
+ let locSg = stem + "ae";
22
+ setNominalForm(data.forms, "nom_sg", [stem + "a"]);
23
+ setNominalForm(data.forms, "gen_sg", [stem + "ae"]);
24
+ setNominalForm(data.forms, "dat_sg", [stem + "ae"]);
25
+ setNominalForm(data.forms, "acc_sg", [stem + "am"]);
26
+ setNominalForm(data.forms, "abl_sg", [stem + "ā"]);
27
+ setNominalForm(data.forms, "voc_sg", [stem + "a"]);
28
+ setNominalForm(data.forms, "nom_pl", [stem + "ae"]);
29
+ setNominalForm(data.forms, "gen_pl", [stem + "ārum"]);
30
+ setNominalForm(data.forms, "dat_pl", [stem + "īs"]);
31
+ setNominalForm(data.forms, "acc_pl", [stem + "ās"]);
32
+ setNominalForm(data.forms, "abl_pl", [stem + "īs"]);
33
+ setNominalForm(data.forms, "voc_pl", [stem + "ae"]);
34
+ if (data.types.has(NominalType.Abus)) {
35
+ data.subtitles.push("dative/ablative plural in ''-ābus''");
36
+ setNominalForm(data.forms, "dat_pl", [stem + "ābus"]);
37
+ setNominalForm(data.forms, "abl_pl", [stem + "ābus"]);
38
+ }
39
+ else if (data.types.has(NominalType.NotAbus)) {
40
+ data.subtitles.push("dative/ablative plural in ''-īs''");
41
+ }
42
+ if (data.types.has(NominalType.Neuter)) {
43
+ data.subtitles.push("neuter");
44
+ setNominalForm(data.forms, "acc_sg", [stem + "a"]);
45
+ setNominalForm(data.forms, "nom_pl", [stem + "a"]);
46
+ setNominalForm(data.forms, "acc_pl", [stem + "a"]);
47
+ setNominalForm(data.forms, "voc_pl", [stem + "a"]);
48
+ }
49
+ else if (data.types.has(NominalType.Am)) {
50
+ data.subtitles.push("nominative/vocative singular in ''-ām''");
51
+ setNominalForm(data.forms, "nom_sg", [stem + "ām"]);
52
+ setNominalForm(data.forms, "acc_sg", [stem + "ām"]);
53
+ setNominalForm(data.forms, "voc_sg", [stem + "ām"]);
54
+ setNominalForm(data.forms, "abl_sg", [stem + "ām", stem + "ā"]);
55
+ }
56
+ else if (data.types.has(NominalType.Greek)) {
57
+ if (data.types.has(NominalType.Masculine)) {
58
+ data.subtitles.push("masculine");
59
+ }
60
+ else if (data.types.has(NominalType.Feminine)) {
61
+ data.subtitles.push("feminine");
62
+ }
63
+ data.subtitles.push("Greek-type");
64
+ if (data.types.has(NominalType.Ma)) {
65
+ data.subtitles.push("nominative singular in {{m|la||-ās}}");
66
+ setNominalForm(data.forms, "nom_sg", [stem + "ās"]);
67
+ setNominalForm(data.forms, "acc_sg", [stem + "ān"]);
68
+ setNominalForm(data.forms, "voc_sg", [stem + "ā"]);
69
+ }
70
+ else if (data.types.has(NominalType.Fa)) {
71
+ data.subtitles.push("nominative singular in {{m|la||-ā}}");
72
+ setNominalForm(data.forms, "nom_sg", [stem + "ā"]);
73
+ setNominalForm(data.forms, "gen_sg", [stem + "ās"]);
74
+ setNominalForm(data.forms, "acc_sg", [stem + "ān"]);
75
+ setNominalForm(data.forms, "voc_sg", [stem + "ā"]);
76
+ locSg = stem + "ās";
77
+ }
78
+ else if (data.types.has(NominalType.Me)) {
79
+ data.subtitles.push("nominative singular in {{m|la||-ēs}}");
80
+ setNominalForm(data.forms, "nom_sg", [stem + "ēs"]);
81
+ setNominalForm(data.forms, "acc_sg", [stem + "ēn"]);
82
+ setNominalForm(data.forms, "abl_sg", [stem + "ē"]);
83
+ setNominalForm(data.forms, "voc_sg", [stem + "ē"]);
84
+ }
85
+ else {
86
+ data.subtitles.push("nominative singular in {{m|la||-ē}}");
87
+ setNominalForm(data.forms, "nom_sg", [stem + "ē"]);
88
+ setNominalForm(data.forms, "gen_sg", [stem + "ēs"]);
89
+ setNominalForm(data.forms, "acc_sg", [stem + "ēn"]);
90
+ setNominalForm(data.forms, "abl_sg", [stem + "ē"]);
91
+ setNominalForm(data.forms, "voc_sg", [stem + "ē"]);
92
+ locSg = stem + "ēs";
93
+ }
94
+ }
95
+ if (data.loc) {
96
+ setNominalForm(data.forms, "loc_sg", [locSg]);
97
+ setNominalForm(data.forms, "loc_pl", [stem + "īs"]);
98
+ }
99
+ if (data.types.has(NominalType.GenPluM)) {
100
+ data.subtitles.push("alternative genitive plural in {{m|la|-um|id=genitive plural}}");
101
+ const forms = [
102
+ ...(getNominalForm(data.forms, "gen_pl") || []),
103
+ stem + "um",
104
+ ];
105
+ setNominalForm(data.forms, "gen_pl", forms);
106
+ }
107
+ else if (data.types.has(NominalType.NotGenPluM)) {
108
+ data.subtitles.push("uncontracted genitive plural");
109
+ }
110
+ }],
111
+ ["2", (data, args) => {
112
+ const stem1 = args[0];
113
+ const stem2 = args[1];
114
+ setNominalForm(data.forms, "nom_sg", [stem1 + "us"]);
115
+ setNominalForm(data.forms, "gen_sg", [stem1 + "ī"]);
116
+ setNominalForm(data.forms, "dat_sg", [stem1 + "ō"]);
117
+ setNominalForm(data.forms, "acc_sg", [stem1 + "um"]);
118
+ setNominalForm(data.forms, "abl_sg", [stem1 + "ō"]);
119
+ setNominalForm(data.forms, "voc_sg", [stem1 + "e"]);
120
+ setNominalForm(data.forms, "nom_pl", [stem1 + "ī"]);
121
+ setNominalForm(data.forms, "gen_pl", [stem1 + "ōrum"]);
122
+ setNominalForm(data.forms, "dat_pl", [stem1 + "īs"]);
123
+ setNominalForm(data.forms, "acc_pl", [stem1 + "ōs"]);
124
+ setNominalForm(data.forms, "abl_pl", [stem1 + "īs"]);
125
+ setNominalForm(data.forms, "voc_pl", [stem1 + "ī"]);
126
+ if (data.types.has(NominalType.Neuter)) {
127
+ data.subtitles.push("neuter");
128
+ setNominalForm(data.forms, "nom_sg", [stem1 + "um"]);
129
+ setNominalForm(data.forms, "voc_sg", [stem1 + "um"]);
130
+ setNominalForm(data.forms, "nom_pl", [stem1 + "a"]);
131
+ setNominalForm(data.forms, "acc_pl", [stem1 + "a"]);
132
+ setNominalForm(data.forms, "voc_pl", [stem1 + "a"]);
133
+ if (data.types.has(NominalType.Ium)) {
134
+ setNominalForm(data.forms, "nom_sg", [stem1 + "ium"]);
135
+ if (!data.declOpts.suppressOldGenitive) {
136
+ setNominalForm(data.forms, "gen_sg", [stem1 + "", stem1 + "ī"]);
137
+ }
138
+ else {
139
+ setNominalForm(data.forms, "gen_sg", [stem1 + "iī"]);
140
+ }
141
+ setNominalForm(data.forms, "dat_sg", [stem1 + ""]);
142
+ setNominalForm(data.forms, "acc_sg", [stem1 + "ium"]);
143
+ setNominalForm(data.forms, "abl_sg", [stem1 + ""]);
144
+ setNominalForm(data.forms, "voc_sg", [stem1 + "ium"]);
145
+ setNominalForm(data.forms, "nom_pl", [stem1 + "ia"]);
146
+ setNominalForm(data.forms, "gen_pl", [stem1 + "iōrum"]);
147
+ setNominalForm(data.forms, "dat_pl", [stem1 + "iīs"]);
148
+ setNominalForm(data.forms, "acc_pl", [stem1 + "ia"]);
149
+ setNominalForm(data.forms, "abl_pl", [stem1 + "iīs"]);
150
+ setNominalForm(data.forms, "voc_pl", [stem1 + "ia"]);
151
+ if (!data.declOpts.suppressOldGenitive) {
152
+ data.notes.set("gen_sg2", "Found in older Latin (until the Augustan Age).");
153
+ }
154
+ }
155
+ else if (data.types.has(NominalType.Vom)) {
156
+ data.subtitles.push("nominative singular in '-om' after 'v'");
157
+ setNominalForm(data.forms, "nom_sg", [stem1 + "om"]);
158
+ setNominalForm(data.forms, "acc_sg", [stem1 + "om"]);
159
+ setNominalForm(data.forms, "voc_sg", [stem1 + "om"]);
160
+ }
161
+ else if (data.types.has(NominalType.Greek) && data.types.has(NominalType.Us)) {
162
+ data.subtitles.push("Greek-type");
163
+ data.subtitles.push("nominative/accusative/vocative in '-os'");
164
+ setNominalForm(data.forms, "nom_sg", [stem1 + "os"]);
165
+ setNominalForm(data.forms, "acc_sg", [stem1 + "os"]);
166
+ setNominalForm(data.forms, "voc_sg", [stem1 + "os"]);
167
+ setNominalForm(data.forms, "nom_pl", [stem1 + "ē"]);
168
+ setNominalForm(data.forms, "gen_pl", [stem1 + "ōn"]);
169
+ setNominalForm(data.forms, "acc_pl", [stem1 + "ē"]);
170
+ setNominalForm(data.forms, "voc_pl", [stem1 + "ē"]);
171
+ }
172
+ else if (data.types.has(NominalType.Greek)) {
173
+ data.subtitles.push("Greek-type");
174
+ setNominalForm(data.forms, "nom_sg", [stem1 + "on"]);
175
+ setNominalForm(data.forms, "acc_sg", [stem1 + "on"]);
176
+ setNominalForm(data.forms, "voc_sg", [stem1 + "on"]);
177
+ }
178
+ else if (data.types.has(NominalType.Us)) {
179
+ data.subtitles.push("nominative/accusative/vocative in '-us'");
180
+ setNominalForm(data.forms, "nom_sg", [stem1 + "us"]);
181
+ setNominalForm(data.forms, "acc_sg", [stem1 + "us"]);
182
+ setNominalForm(data.forms, "voc_sg", [stem1 + "us"]);
183
+ setNominalForm(data.forms, "nom_pl", [stem1 + "a"]);
184
+ setNominalForm(data.forms, "acc_pl", [stem1 + "a"]);
185
+ setNominalForm(data.forms, "voc_pl", [stem1 + "a"]);
186
+ }
187
+ else if (data.types.has(NominalType.NotGreek) || data.types.has(NominalType.NotUs)) {
188
+ data.subtitles.push("nominative/accusative/vocative in '-um'");
189
+ }
190
+ }
191
+ else if (data.types.has(NominalType.Er)) {
192
+ if (stem1.match(/[aiouy]r$/)) {
193
+ data.subtitles.push("nominative singular in '-r'");
194
+ }
195
+ else {
196
+ data.subtitles.push("nominative singular in '-er'");
197
+ }
198
+ setNominalForm(data.forms, "nom_sg", [stem1]);
199
+ setNominalForm(data.forms, "gen_sg", [stem2 + "ī"]);
200
+ setNominalForm(data.forms, "dat_sg", [stem2 + "ō"]);
201
+ setNominalForm(data.forms, "acc_sg", [stem2 + "um"]);
202
+ setNominalForm(data.forms, "abl_sg", [stem2 + "ō"]);
203
+ setNominalForm(data.forms, "voc_sg", [stem1]);
204
+ setNominalForm(data.forms, "nom_pl", [stem2 + "ī"]);
205
+ setNominalForm(data.forms, "gen_pl", [stem2 + "ōrum"]);
206
+ setNominalForm(data.forms, "dat_pl", [stem2 + "īs"]);
207
+ setNominalForm(data.forms, "acc_pl", [stem2 + "ōs"]);
208
+ setNominalForm(data.forms, "abl_pl", [stem2 + "īs"]);
209
+ setNominalForm(data.forms, "voc_pl", [stem2 + "ī"]);
210
+ }
211
+ else if (data.types.has(NominalType.Ius)) {
212
+ setNominalForm(data.forms, "nom_sg", [stem1 + "ius"]);
213
+ if (!data.declOpts.suppressOldGenitive) {
214
+ setNominalForm(data.forms, "gen_sg", [stem1 + "", stem1 + "ī"]);
215
+ }
216
+ else {
217
+ setNominalForm(data.forms, "gen_sg", [stem1 + "iī"]);
218
+ }
219
+ setNominalForm(data.forms, "dat_sg", [stem1 + "iō"]);
220
+ setNominalForm(data.forms, "acc_sg", [stem1 + "ium"]);
221
+ setNominalForm(data.forms, "abl_sg", [stem1 + "iō"]);
222
+ if (data.types.has(NominalType.VocI)) {
223
+ setNominalForm(data.forms, "voc_sg", [stem1 + "ī"]);
224
+ }
225
+ else {
226
+ setNominalForm(data.forms, "voc_sg", [stem1 + "ie"]);
227
+ }
228
+ setNominalForm(data.forms, "nom_pl", [stem1 + "iī"]);
229
+ setNominalForm(data.forms, "gen_pl", [stem1 + "iōrum"]);
230
+ setNominalForm(data.forms, "dat_pl", [stem1 + "iīs"]);
231
+ setNominalForm(data.forms, "acc_pl", [stem1 + "iōs"]);
232
+ setNominalForm(data.forms, "abl_pl", [stem1 + "iīs"]);
233
+ setNominalForm(data.forms, "voc_pl", [stem1 + "iī"]);
234
+ if (!data.declOpts.suppressOldGenitive) {
235
+ data.notes.set("gen_sg2", "Found in older Latin (until the Augustan Age).");
236
+ }
237
+ }
238
+ else if (data.types.has(NominalType.Vos)) {
239
+ data.subtitles.push("nominative singular in '-os' after 'v'");
240
+ setNominalForm(data.forms, "nom_sg", [stem1 + "os"]);
241
+ setNominalForm(data.forms, "acc_sg", [stem1 + "om"]);
242
+ }
243
+ else if (data.types.has(NominalType.Greek)) {
244
+ data.subtitles.push("Greek-type");
245
+ setNominalForm(data.forms, "nom_sg", [stem1 + "os"]);
246
+ setNominalForm(data.forms, "acc_sg", [stem1 + "on"]);
247
+ if (data.num === NumberTantum.Plural) {
248
+ setNominalForm(data.forms, "nom_pl", [stem1 + "oe"]);
249
+ setNominalForm(data.forms, "voc_pl", [stem1 + "oe"]);
250
+ }
251
+ else {
252
+ setNominalForm(data.forms, "nom_pl", [stem1 + "ī", stem1 + "oe"]);
253
+ setNominalForm(data.forms, "voc_pl", [stem1 + "ī", stem1 + "oe"]);
254
+ }
255
+ }
256
+ else if (data.types.has(NominalType.NotGreek)) {
257
+ data.subtitles.push("non-Greek-type");
258
+ }
259
+ if (data.types.has(NominalType.GenPluM)) {
260
+ data.subtitles.push("alternative genitive plural in {{m|la|-um|id=genitive plural}}");
261
+ if (data.types.has(NominalType.Ius) || data.types.has(NominalType.Ium)) {
262
+ setNominalForm(data.forms, "gen_pl", [stem2 + "iōrum", stem2 + "ium"]);
263
+ }
264
+ else {
265
+ setNominalForm(data.forms, "gen_pl", [stem2 + "ōrum", stem2 + "um"]);
266
+ }
267
+ }
268
+ else if (data.types.has(NominalType.NotGenPluM)) {
269
+ data.subtitles.push("uncontracted genitive plural");
270
+ }
271
+ if (data.loc) {
272
+ if (data.types.has(NominalType.Ius) || data.types.has(NominalType.Ium)) {
273
+ setNominalForm(data.forms, "loc_sg", [stem2 + ""]);
274
+ setNominalForm(data.forms, "loc_pl", [stem2 + "iīs"]);
275
+ }
276
+ else {
277
+ setNominalForm(data.forms, "loc_sg", [stem2 + "ī"]);
278
+ setNominalForm(data.forms, "loc_pl", [stem2 + "īs"]);
279
+ }
280
+ }
281
+ }],
282
+ ["3", (data, args) => {
283
+ let stem1 = args[0];
284
+ const stem2 = args[1];
285
+ function parisyllabic_type() {
286
+ const count_vowels = (stem) => {
287
+ const matches = stem.normalize("NFD").match(/[AEIOUYaeiouy]/g);
288
+ return matches ? matches.length : 0;
289
+ };
290
+ return count_vowels(stem1) > count_vowels(stem2) ? "parisyllabic" : "imparisyllabic";
291
+ }
292
+ function non_i_stem_type() {
293
+ return parisyllabic_type() + " non-i-stem";
294
+ }
295
+ setNominalForm(data.forms, "nom_sg", [stem1]);
296
+ setNominalForm(data.forms, "gen_sg", [stem2 + "is"]);
297
+ setNominalForm(data.forms, "dat_sg", [stem2 + "ī"]);
298
+ setNominalForm(data.forms, "acc_sg", [stem2 + "em"]);
299
+ setNominalForm(data.forms, "abl_sg", [stem2 + "e"]);
300
+ setNominalForm(data.forms, "voc_sg", [stem1]);
301
+ setNominalForm(data.forms, "nom_pl", [stem2 + "ēs"]);
302
+ setNominalForm(data.forms, "gen_pl", [stem2 + "um"]);
303
+ setNominalForm(data.forms, "dat_pl", [stem2 + "ibus"]);
304
+ setNominalForm(data.forms, "acc_pl", [stem2 + "ēs"]);
305
+ setNominalForm(data.forms, "abl_pl", [stem2 + "ibus"]);
306
+ setNominalForm(data.forms, "voc_pl", [stem2 + "ēs"]);
307
+ let acc_sg_i_stem_subtype = false;
308
+ let not_acc_sg_i_stem_subtype = false;
309
+ for (const subtype of data.types.keys()) {
310
+ if (acc_sg_i_stem_subtypes.has(subtype)) {
311
+ acc_sg_i_stem_subtype = true;
312
+ break;
313
+ }
314
+ }
315
+ for (const [acc_sg_subtype, [endings, title]] of acc_sg_i_stem_subtypes) {
316
+ if (hasNominalType(data.types, "not_" + acc_sg_subtype)) {
317
+ not_acc_sg_i_stem_subtype = true;
318
+ break;
319
+ }
320
+ }
321
+ let abl_sg_i_stem_subtype = false;
322
+ let not_abl_sg_i_stem_subtype = false;
323
+ for (const subtype of data.types.keys()) {
324
+ if (abl_sg_i_stem_subtypes.has(subtype)) {
325
+ abl_sg_i_stem_subtype = true;
326
+ break;
327
+ }
328
+ }
329
+ for (const [abl_sg_subtype, [endings, title]] of abl_sg_i_stem_subtypes) {
330
+ if (hasNominalType(data.types, "not_" + abl_sg_subtype)) {
331
+ not_abl_sg_i_stem_subtype = true;
332
+ break;
333
+ }
334
+ }
335
+ if (data.types.has(NominalType.Greek)) {
336
+ data.subtitles.push("Greek-type");
337
+ if (data.types.has(NominalType.Er)) {
338
+ data.subtitles.push("variant with nominative singular in '-ēr'");
339
+ stem1 = extract_stem(stem1, "ēr");
340
+ setNominalForm(data.forms, "nom_sg", [stem1 + "ēr"]);
341
+ setNominalForm(data.forms, "gen_sg", [stem1 + "eris"]);
342
+ setNominalForm(data.forms, "dat_sg", [stem1 + "erī"]);
343
+ setNominalForm(data.forms, "acc_sg", [stem1 + "era", stem1 + "erem"]);
344
+ setNominalForm(data.forms, "abl_sg", [stem1 + "ere"]);
345
+ setNominalForm(data.forms, "voc_sg", [stem1 + "ēr"]);
346
+ setNominalForm(data.forms, "nom_pl", [stem1 + "erēs"]);
347
+ setNominalForm(data.forms, "gen_pl", [stem1 + "erum"]);
348
+ setNominalForm(data.forms, "dat_pl", [stem1 + "eribus"]);
349
+ setNominalForm(data.forms, "acc_pl", [stem1 + "erēs"]);
350
+ setNominalForm(data.forms, "abl_pl", [stem1 + "eribus"]);
351
+ setNominalForm(data.forms, "voc_pl", [stem1 + "erēs"]);
352
+ }
353
+ else if (data.types.has(NominalType.On)) {
354
+ data.subtitles.push("variant with nominative singular in '-ōn'");
355
+ stem1 = extract_stem(stem1, "ōn");
356
+ setNominalForm(data.forms, "nom_sg", [stem1 + "ōn"]);
357
+ setNominalForm(data.forms, "gen_sg", [stem1 + "ontis", stem1 + "ontos"]);
358
+ setNominalForm(data.forms, "dat_sg", [stem1 + "ontī"]);
359
+ setNominalForm(data.forms, "acc_sg", [stem1 + "onta"]);
360
+ setNominalForm(data.forms, "abl_sg", [stem1 + "onte"]);
361
+ setNominalForm(data.forms, "voc_sg", [stem1 + "ōn"]);
362
+ setNominalForm(data.forms, "nom_pl", [stem1 + "ontēs"]);
363
+ setNominalForm(data.forms, "gen_pl", [stem1 + "ontum", stem1 + "ontium"]);
364
+ setNominalForm(data.forms, "dat_pl", [stem1 + "ontibus"]);
365
+ setNominalForm(data.forms, "acc_pl", [stem1 + "ontēs", stem1 + "ontās"]);
366
+ setNominalForm(data.forms, "abl_pl", [stem1 + "ontibus"]);
367
+ setNominalForm(data.forms, "voc_pl", [stem1 + "ontēs"]);
368
+ }
369
+ else if (data.types.has(NominalType.I)) {
370
+ data.subtitles.push("i-stem");
371
+ setNominalForm(data.forms, "gen_sg", [stem2 + "is", stem2 + "eōs", stem2 + "ios"]);
372
+ setNominalForm(data.forms, "acc_sg", [stem2 + "im", stem2 + "in", stem2 + "em"]);
373
+ setNominalForm(data.forms, "abl_sg", [stem2 + "ī", stem2 + "e"]);
374
+ setNominalForm(data.forms, "voc_sg", [stem2 + "is", stem2 + "i"]);
375
+ data.notes.set("acc_sg3", "Found sometimes in Medieval and New Latin.");
376
+ data.notes.set("abl_sg2", "Found sometimes in Medieval and New Latin.");
377
+ setNominalForm(data.forms, "nom_pl", [stem2 + "ēs", stem2 + "eis"]);
378
+ setNominalForm(data.forms, "gen_pl", [stem2 + "ium", stem2 + "eōn"]);
379
+ setNominalForm(data.forms, "acc_pl", [stem2 + "ēs", stem2 + "eis"]);
380
+ setNominalForm(data.forms, "voc_pl", [stem2 + "ēs", stem2 + "eis"]);
381
+ if (data.types.has(NominalType.poetic_esi)) {
382
+ setNominalForm(data.forms, "dat_pl", [stem2 + "ibus", stem2 + "esi"]);
383
+ setNominalForm(data.forms, "abl_pl", [stem2 + "ibus", stem2 + "esi"]);
384
+ data.notes.set("dat_pl2", "Primarily in poetry.");
385
+ data.notes.set("abl_pl2", "Primarily in poetry.");
386
+ }
387
+ }
388
+ else {
389
+ data.subtitles.push("normal variant");
390
+ setNominalForm(data.forms, "gen_sg", [stem2 + "os"]);
391
+ if (stem2.match(/y$/)) {
392
+ setNominalForm(data.forms, "acc_sg", [stem2 + "n"]);
393
+ }
394
+ else {
395
+ setNominalForm(data.forms, "acc_sg", [stem2 + "a"]);
396
+ }
397
+ setNominalForm(data.forms, "nom_pl", [stem2 + "es"]);
398
+ setNominalForm(data.forms, "acc_pl", [stem2 + "as"]);
399
+ setNominalForm(data.forms, "voc_pl", [stem2 + "es"]);
400
+ if (stem1.normalize("NFD").match(/[iyIY][\u0304\u0306\u0308]*s$/)) {
401
+ setNominalForm(data.forms, "voc_sg", [stem1, stem1.replace(/s$/, "")]);
402
+ data.notes.set("voc_sg2", "In poetry.");
403
+ }
404
+ }
405
+ }
406
+ else if (data.types.has(NominalType.NotGreek)) {
407
+ data.subtitles.push("non-Greek-type");
408
+ }
409
+ if (data.types.has(NominalType.Polis)) {
410
+ stem1 = extract_stem(stem1, "polis");
411
+ data.subtitles.push("i-stem, partially Greek-type");
412
+ setNominalForm(data.forms, "nom_sg", [stem1 + "polis"]);
413
+ setNominalForm(data.forms, "gen_sg", [stem1 + "polis"]);
414
+ setNominalForm(data.forms, "dat_sg", [stem1 + "polī"]);
415
+ setNominalForm(data.forms, "acc_sg", [stem1 + "polim", stem1 + "polin"]);
416
+ setNominalForm(data.forms, "abl_sg", [stem1 + "polī"]);
417
+ setNominalForm(data.forms, "voc_sg", [stem1 + "polis", stem1 + "polī"]);
418
+ }
419
+ else if (data.types.has(NominalType.NotPolis)) {
420
+ data.subtitles.push(non_i_stem_type());
421
+ }
422
+ if (data.types.has(NominalType.Neuter)) {
423
+ data.subtitles.push("neuter");
424
+ setNominalForm(data.forms, "acc_sg", [stem1]);
425
+ if (data.types.has(NominalType.I)) {
426
+ if (data.types.has(NominalType.Pure)) {
427
+ data.subtitles.push("pure i-stem");
428
+ setNominalForm(data.forms, "abl_sg", [stem2 + "ī"]);
429
+ setNominalForm(data.forms, "nom_pl", [stem2 + "ia"]);
430
+ setNominalForm(data.forms, "gen_pl", [stem2 + "ium"]);
431
+ setNominalForm(data.forms, "acc_pl", [stem2 + "ia"]);
432
+ setNominalForm(data.forms, "voc_pl", [stem2 + "ia"]);
433
+ }
434
+ else {
435
+ data.subtitles.push("i-stem");
436
+ setNominalForm(data.forms, "nom_pl", [stem2 + "a"]);
437
+ setNominalForm(data.forms, "gen_pl", [stem2 + "ium", stem2 + "um"]);
438
+ setNominalForm(data.forms, "acc_pl", [stem2 + "a"]);
439
+ setNominalForm(data.forms, "voc_pl", [stem2 + "a"]);
440
+ }
441
+ }
442
+ else {
443
+ data.subtitles.push(non_i_stem_type());
444
+ setNominalForm(data.forms, "nom_pl", [stem2 + "a"]);
445
+ setNominalForm(data.forms, "acc_pl", [stem2 + "a"]);
446
+ setNominalForm(data.forms, "voc_pl", [stem2 + "a"]);
447
+ }
448
+ }
449
+ else if (data.types.has(NominalType.I) || acc_sg_i_stem_subtype || abl_sg_i_stem_subtype) {
450
+ {
451
+ const subtitle = (data.types.has(NominalType.NotNeuter) ? "non-neuter " : "") +
452
+ (data.types.has(NominalType.Pure) ? "pure " : "") + "i-stem";
453
+ if (!data.subtitles.includes(subtitle)) {
454
+ data.subtitles.push(subtitle);
455
+ }
456
+ }
457
+ setNominalForm(data.forms, "gen_pl", [stem2 + "ium"]);
458
+ if (!data.declOpts.suppressNonNeuterIStemAccIs) {
459
+ setNominalForm(data.forms, "acc_pl", [stem2 + "ēs", stem2 + "īs"]);
460
+ }
461
+ else {
462
+ setNominalForm(data.forms, "acc_pl", [stem2 + "ēs"]);
463
+ }
464
+ if (data.types.has(NominalType.Pure)) {
465
+ setNominalForm(data.forms, "acc_sg", [stem2 + "im"]);
466
+ setNominalForm(data.forms, "abl_sg", [stem2 + "ī"]);
467
+ setNominalForm(data.forms, "nom_pl", [stem2 + "īs"]);
468
+ setNominalForm(data.forms, "acc_pl", [stem2 + "īs"]);
469
+ setNominalForm(data.forms, "voc_pl", [stem2 + "īs"]);
470
+ }
471
+ for (const subtype of data.types) {
472
+ const acc_sg_i_stem_props = acc_sg_i_stem_subtypes.get(subtype);
473
+ if (acc_sg_i_stem_props) {
474
+ setNominalForm(data.forms, "acc_sg", []);
475
+ for (const ending of acc_sg_i_stem_props[0]) {
476
+ setNominalForm(data.forms, "acc_sg", (getNominalForm(data.forms, "acc_sg") || []).concat([stem2 + ending]));
477
+ }
478
+ if (data.num != "pl") {
479
+ data.subtitles.push(acc_sg_i_stem_props[1]);
480
+ }
481
+ break;
482
+ }
483
+ }
484
+ for (const subtype of data.types) {
485
+ const abl_sg_i_stem_props = abl_sg_i_stem_subtypes.get(subtype);
486
+ if (abl_sg_i_stem_props) {
487
+ setNominalForm(data.forms, "abl_sg", []);
488
+ for (const ending of abl_sg_i_stem_props[0]) {
489
+ setNominalForm(data.forms, "abl_sg", (getNominalForm(data.forms, "abl_sg") || []).concat([stem2 + ending]));
490
+ }
491
+ if (data.num != "pl") {
492
+ data.subtitles.push(abl_sg_i_stem_props[1]);
493
+ }
494
+ break;
495
+ }
496
+ }
497
+ }
498
+ else if (data.types.has(NominalType.Neuter) && data.types.has(NominalType.NotI)) {
499
+ data.subtitles.push("non-neuter " + non_i_stem_type());
500
+ }
501
+ else if (data.types.has(NominalType.NotNeuter)) {
502
+ data.subtitles.push("non-neuter");
503
+ }
504
+ else if (data.types.has(NominalType.NotI)) {
505
+ data.subtitles.push(non_i_stem_type());
506
+ }
507
+ if (data.loc) {
508
+ const loc_sg = Array.from(getNominalForm(data.forms, "dat_sg") || []);
509
+ const abl_sg = getNominalForm(data.forms, "abl_sg") || [];
510
+ for (const form of abl_sg) {
511
+ insert_if_not(loc_sg, form);
512
+ }
513
+ setNominalForm(data.forms, "loc_sg", loc_sg);
514
+ setNominalForm(data.forms, "loc_pl", getNominalForm(data.forms, "abl_pl") || []);
515
+ }
516
+ }],
517
+ ["4", (data, args) => {
518
+ const stem = args[0];
519
+ setNominalForm(data.forms, "nom_sg", [stem + "us"]);
520
+ setNominalForm(data.forms, "gen_sg", [stem + "ūs"]);
521
+ setNominalForm(data.forms, "dat_sg", [stem + ""]);
522
+ setNominalForm(data.forms, "acc_sg", [stem + "um"]);
523
+ setNominalForm(data.forms, "abl_sg", [stem + "ū"]);
524
+ setNominalForm(data.forms, "voc_sg", [stem + "us"]);
525
+ setNominalForm(data.forms, "nom_pl", [stem + "ūs"]);
526
+ setNominalForm(data.forms, "gen_pl", [stem + "uum"]);
527
+ setNominalForm(data.forms, "dat_pl", [stem + "ibus"]);
528
+ setNominalForm(data.forms, "acc_pl", [stem + "ūs"]);
529
+ setNominalForm(data.forms, "abl_pl", [stem + "ibus"]);
530
+ setNominalForm(data.forms, "voc_pl", [stem + "ūs"]);
531
+ if (data.types.has(NominalType.Echo)) {
532
+ data.subtitles.push("all cases except the genitive and accusative singular in '-ō'");
533
+ for (const [slot] of data.forms) {
534
+ if (slot != "gen_sg") {
535
+ setNominalForm(data.forms, slot, [stem + "ō"]);
536
+ }
537
+ }
538
+ setNominalForm(data.forms, "acc_sg", [stem + "ō", stem + "ōn"]);
539
+ }
540
+ else if (data.types.has(NominalType.Callisto)) {
541
+ data.subtitles.push("all cases except the genitive singular in '-ō'");
542
+ for (const [slot] of data.forms) {
543
+ if (slot != "gen_sg") {
544
+ setNominalForm(data.forms, slot, [stem + "ō"]);
545
+ }
546
+ }
547
+ }
548
+ if (data.types.has(NominalType.Neuter)) {
549
+ data.subtitles.push("neuter");
550
+ let nomAccVocSg = stem + "ū";
551
+ if (!data.declOpts.suppress4NeutUBreves) {
552
+ nomAccVocSg += "\u0306";
553
+ }
554
+ setNominalForm(data.forms, "nom_sg", [nomAccVocSg]);
555
+ setNominalForm(data.forms, "gen_sg", data.declOpts.suppressRareIrregForms ? [stem + "ūs"] : [stem + "ūs", stem + "ū"]);
556
+ setNominalForm(data.forms, "dat_sg", data.declOpts.suppressRareIrregForms ? [stem + "ū"] : [stem + "ū", stem + "uī"]);
557
+ setNominalForm(data.forms, "acc_sg", [nomAccVocSg]);
558
+ setNominalForm(data.forms, "voc_sg", [nomAccVocSg]);
559
+ setNominalForm(data.forms, "nom_pl", [stem + "ua"]);
560
+ setNominalForm(data.forms, "acc_pl", [stem + "ua"]);
561
+ setNominalForm(data.forms, "voc_pl", [stem + "ua"]);
562
+ const note1 = "The length of the final vowel is uncertain in the nominative/accusative/vocative singular; [[w:Martianus Capella|Martianus Capella]] considers it to end with '-ū', while [[w:Servius the Grammarian|Servius]] considers it to end with '-ŭ'.";
563
+ const note2 = "According to [[w:Martianus Capella|Martianus Capella]].";
564
+ const note3 = "According to [[w:Servius the Grammarian|Servius]].";
565
+ const note4 = "According to both.";
566
+ data.notes.set("nom_sg1", note1);
567
+ data.notes.set("gen_sg1", note2);
568
+ data.notes.set("gen_sg2", note3);
569
+ data.notes.set("dat_sg1", note4);
570
+ data.notes.set("dat_sg2", note2);
571
+ data.notes.set("acc_sg1", note1);
572
+ data.notes.set("voc_sg1", note1);
573
+ }
574
+ if (data.types.has(NominalType.Ubus)) {
575
+ data.subtitles.push("dative/ablative plural in ''-ubus''");
576
+ setNominalForm(data.forms, "dat_pl", [stem + "ubus"]);
577
+ setNominalForm(data.forms, "abl_pl", [stem + "ubus"]);
578
+ }
579
+ else if (data.types.has(NominalType.NotUbus)) {
580
+ data.subtitles.push("dative/ablative plural in ''-ibus''");
581
+ }
582
+ if (data.loc) {
583
+ setNominalForm(data.forms, "loc_sg", getNominalForm(data.forms, "abl_sg") || []);
584
+ setNominalForm(data.forms, "loc_pl", getNominalForm(data.forms, "abl_pl") || []);
585
+ }
586
+ }],
587
+ ["5", (data, args) => {
588
+ let stem = args[0];
589
+ if (data.types.has(NominalType.i)) {
590
+ stem = stem + "i";
591
+ }
592
+ setNominalForm(data.forms, "nom_sg", [stem + "ēs"]);
593
+ setNominalForm(data.forms, "gen_sg", [stem + ""]);
594
+ setNominalForm(data.forms, "dat_sg", [stem + ""]);
595
+ setNominalForm(data.forms, "acc_sg", [stem + "em"]);
596
+ setNominalForm(data.forms, "abl_sg", [stem + "ē"]);
597
+ setNominalForm(data.forms, "voc_sg", [stem + "ēs"]);
598
+ setNominalForm(data.forms, "nom_pl", [stem + "ēs"]);
599
+ setNominalForm(data.forms, "gen_pl", [stem + "ērum"]);
600
+ setNominalForm(data.forms, "dat_pl", [stem + "ēbus"]);
601
+ setNominalForm(data.forms, "acc_pl", [stem + "ēs"]);
602
+ setNominalForm(data.forms, "abl_pl", [stem + "ēbus"]);
603
+ setNominalForm(data.forms, "voc_pl", [stem + "ēs"]);
604
+ if (data.types.has(NominalType.i)) {
605
+ setNominalForm(data.forms, "gen_sg", [stem + "ēī"]);
606
+ setNominalForm(data.forms, "dat_sg", [stem + "ēī"]);
607
+ }
608
+ if (data.loc) {
609
+ setNominalForm(data.forms, "loc_sg", [stem + "ē"]);
610
+ setNominalForm(data.forms, "loc_pl", [stem + "ēbus"]);
611
+ }
612
+ }],
613
+ ["0", (data, args) => {
614
+ const stem = args[0];
615
+ setNominalForm(data.forms, "nom_sg", [stem]);
616
+ setNominalForm(data.forms, "gen_sg", [stem]);
617
+ setNominalForm(data.forms, "dat_sg", [stem]);
618
+ setNominalForm(data.forms, "acc_sg", [stem]);
619
+ setNominalForm(data.forms, "abl_sg", [stem]);
620
+ setNominalForm(data.forms, "voc_sg", [stem]);
621
+ setNominalForm(data.forms, "nom_pl", [stem]);
622
+ setNominalForm(data.forms, "gen_pl", [stem]);
623
+ setNominalForm(data.forms, "dat_pl", [stem]);
624
+ setNominalForm(data.forms, "acc_pl", [stem]);
625
+ setNominalForm(data.forms, "abl_pl", [stem]);
626
+ setNominalForm(data.forms, "voc_pl", [stem]);
627
+ if (data.loc) {
628
+ setNominalForm(data.forms, "loc_sg", [stem]);
629
+ setNominalForm(data.forms, "loc_pl", [stem]);
630
+ }
631
+ }],
632
+ ["sgpl", (data, args) => {
633
+ const stem1 = args[0];
634
+ const stem2 = args[1];
635
+ data.subtitles.push("with a distinct plural");
636
+ setNominalForm(data.forms, "nom_sg", [stem1]);
637
+ setNominalForm(data.forms, "gen_sg", [stem1]);
638
+ setNominalForm(data.forms, "dat_sg", [stem1]);
639
+ setNominalForm(data.forms, "acc_sg", [stem1]);
640
+ setNominalForm(data.forms, "abl_sg", [stem1]);
641
+ setNominalForm(data.forms, "voc_sg", [stem1]);
642
+ setNominalForm(data.forms, "nom_pl", [stem2]);
643
+ setNominalForm(data.forms, "gen_pl", [stem2]);
644
+ setNominalForm(data.forms, "dat_pl", [stem2]);
645
+ setNominalForm(data.forms, "acc_pl", [stem2]);
646
+ setNominalForm(data.forms, "abl_pl", [stem2]);
647
+ setNominalForm(data.forms, "voc_pl", [stem2]);
648
+ if (data.loc) {
649
+ setNominalForm(data.forms, "loc_sg", [stem1]);
650
+ setNominalForm(data.forms, "loc_pl", [stem2]);
651
+ }
652
+ }],
653
+ ["indecl", (data, args) => {
654
+ data.subtitles.push("used only in the nominative and accusative");
655
+ const stem = args[0];
656
+ setNominalForm(data.forms, "nom_sg", ["-"]);
657
+ setNominalForm(data.forms, "gen_sg", ["-"]);
658
+ setNominalForm(data.forms, "dat_sg", ["-"]);
659
+ setNominalForm(data.forms, "acc_sg", ["-"]);
660
+ setNominalForm(data.forms, "abl_sg", ["-"]);
661
+ setNominalForm(data.forms, "voc_sg", ["-"]);
662
+ setNominalForm(data.forms, "nom_pl", ["-"]);
663
+ setNominalForm(data.forms, "gen_pl", ["-"]);
664
+ setNominalForm(data.forms, "dat_pl", ["-"]);
665
+ setNominalForm(data.forms, "acc_pl", ["-"]);
666
+ setNominalForm(data.forms, "abl_pl", ["-"]);
667
+ setNominalForm(data.forms, "voc_pl", ["-"]);
668
+ if (data.loc) {
669
+ setNominalForm(data.forms, "loc_sg", ["-"]);
670
+ setNominalForm(data.forms, "loc_pl", ["-"]);
671
+ }
672
+ setNominalForm(data.forms, "nom_sg", [stem]);
673
+ setNominalForm(data.forms, "acc_sg", [stem]);
674
+ data.num = NumberTantum.Singular;
675
+ }],
676
+ ["irreg", (data, args) => {
677
+ const stem = args[0];
678
+ setNominalForm(data.forms, "nom_sg", ["-"]);
679
+ setNominalForm(data.forms, "gen_sg", ["-"]);
680
+ setNominalForm(data.forms, "dat_sg", ["-"]);
681
+ setNominalForm(data.forms, "acc_sg", ["-"]);
682
+ setNominalForm(data.forms, "abl_sg", ["-"]);
683
+ setNominalForm(data.forms, "voc_sg", ["-"]);
684
+ setNominalForm(data.forms, "nom_pl", ["-"]);
685
+ setNominalForm(data.forms, "gen_pl", ["-"]);
686
+ setNominalForm(data.forms, "dat_pl", ["-"]);
687
+ setNominalForm(data.forms, "acc_pl", ["-"]);
688
+ setNominalForm(data.forms, "abl_pl", ["-"]);
689
+ setNominalForm(data.forms, "voc_pl", ["-"]);
690
+ if (stem == "bōs") {
691
+ setNominalForm(data.forms, "nom_sg", ["bōs"]);
692
+ setNominalForm(data.forms, "gen_sg", ["bovis"]);
693
+ setNominalForm(data.forms, "dat_sg", ["bovī"]);
694
+ setNominalForm(data.forms, "acc_sg", ["bovem"]);
695
+ setNominalForm(data.forms, "abl_sg", ["bove", "bovīd"]);
696
+ data.notes.set("abl_sg2", "Old Latin.");
697
+ setNominalForm(data.forms, "voc_sg", ["bōs"]);
698
+ setNominalForm(data.forms, "nom_pl", ["bovēs"]);
699
+ setNominalForm(data.forms, "gen_pl", ["boum", "bovum", "boverum"]);
700
+ if (!data.declOpts.suppressRareIrregForms) {
701
+ setNominalForm(data.forms, "dat_pl", ["bōbus", "būbus", "bovibus"]);
702
+ setNominalForm(data.forms, "abl_pl", ["bōbus", "būbus", "bovibus"]);
703
+ }
704
+ else {
705
+ setNominalForm(data.forms, "dat_pl", ["bōbus", "bovibus"]);
706
+ setNominalForm(data.forms, "abl_pl", ["bōbus", "bovibus"]);
707
+ }
708
+ setNominalForm(data.forms, "acc_pl", ["bovēs"]);
709
+ setNominalForm(data.forms, "voc_pl", ["bovēs"]);
710
+ }
711
+ else if (stem == "deus") {
712
+ setNominalForm(data.forms, "nom_sg", ["deus"]);
713
+ setNominalForm(data.forms, "gen_sg", ["deī"]);
714
+ setNominalForm(data.forms, "dat_sg", ["deō"]);
715
+ setNominalForm(data.forms, "acc_sg", ["deum"]);
716
+ setNominalForm(data.forms, "abl_sg", ["deō"]);
717
+ setNominalForm(data.forms, "voc_sg", ["deus", "dee"]);
718
+ data.notes.set("voc_sg1", "Rare during the Classical period.");
719
+ data.notes.set("voc_sg2", "From Late Latin onwards.");
720
+ setNominalForm(data.forms, "nom_pl", ["dī", "diī", "deī"]);
721
+ setNominalForm(data.forms, "gen_pl", ["deōrum", "deum"]);
722
+ setNominalForm(data.forms, "dat_pl", ["dīs", "diīs", "deīs"]);
723
+ setNominalForm(data.forms, "acc_pl", ["deōs"]);
724
+ setNominalForm(data.forms, "abl_pl", ["dīs", "diīs", "deīs"]);
725
+ setNominalForm(data.forms, "voc_pl", ["dī", "diī", "deī"]);
726
+ }
727
+ else if (stem == "Deus") {
728
+ setNominalForm(data.forms, "nom_sg", ["Deus"]);
729
+ setNominalForm(data.forms, "gen_sg", ["Deī"]);
730
+ setNominalForm(data.forms, "dat_sg", ["Deō"]);
731
+ setNominalForm(data.forms, "acc_sg", ["Deum"]);
732
+ setNominalForm(data.forms, "abl_sg", ["Deō"]);
733
+ setNominalForm(data.forms, "voc_sg", ["Deus", "Dee"]);
734
+ data.notes.set("voc_sg1", "Rare during the Classical period.");
735
+ data.notes.set("voc_sg2", "From Late Latin onwards.");
736
+ data.num = NumberTantum.Singular;
737
+ }
738
+ else if (stem == "domus") {
739
+ data.title = "fourth/second-declension noun";
740
+ setNominalForm(data.forms, "nom_sg", ["domus"]);
741
+ if (!data.declOpts.suppressRareIrregForms) {
742
+ setNominalForm(data.forms, "gen_sg", ["domūs", "domī"]);
743
+ setNominalForm(data.forms, "dat_sg", ["domuī", "domō", "domū"]);
744
+ setNominalForm(data.forms, "abl_sg", ["domū", "domō"]);
745
+ setNominalForm(data.forms, "gen_pl", ["domuum", "domōrum"]);
746
+ setNominalForm(data.forms, "acc_pl", ["domūs", "domōs"]);
747
+ }
748
+ else {
749
+ setNominalForm(data.forms, "gen_sg", ["domūs"]);
750
+ setNominalForm(data.forms, "dat_sg", ["domuī"]);
751
+ setNominalForm(data.forms, "abl_sg", ["domō"]);
752
+ setNominalForm(data.forms, "gen_pl", ["domuum", "domōrum"]);
753
+ setNominalForm(data.forms, "acc_pl", ["domōs"]);
754
+ }
755
+ setNominalForm(data.forms, "acc_sg", ["domum"]);
756
+ setNominalForm(data.forms, "voc_sg", ["domus"]);
757
+ setNominalForm(data.forms, "loc_sg", ["domī"]);
758
+ setNominalForm(data.forms, "nom_pl", ["domūs"]);
759
+ setNominalForm(data.forms, "dat_pl", ["domibus"]);
760
+ setNominalForm(data.forms, "abl_pl", ["domibus"]);
761
+ setNominalForm(data.forms, "voc_pl", ["domūs"]);
762
+ setNominalForm(data.forms, "loc_pl", ["-"]);
763
+ data.loc = true;
764
+ }
765
+ else if (stem == "Iēsus" || stem == "Iēsūs") {
766
+ const ij = stem[0];
767
+ setNominalForm(data.forms, "nom_sg", [stem]);
768
+ setNominalForm(data.forms, "gen_sg", [ij + "ēsū"]);
769
+ setNominalForm(data.forms, "dat_sg", [ij + "ēsū"]);
770
+ setNominalForm(data.forms, "acc_sg", [ij + "ēsūm"]);
771
+ setNominalForm(data.forms, "abl_sg", [ij + "ēsū"]);
772
+ setNominalForm(data.forms, "voc_sg", [ij + "ēsū"]);
773
+ data.num = NumberTantum.Singular;
774
+ }
775
+ else if (stem == "Jesus") {
776
+ const ij = stem[0];
777
+ setNominalForm(data.forms, "nom_sg", [stem]);
778
+ setNominalForm(data.forms, "gen_sg", [ij + "esu"]);
779
+ setNominalForm(data.forms, "dat_sg", [ij + "esu"]);
780
+ setNominalForm(data.forms, "acc_sg", [ij + "esum"]);
781
+ setNominalForm(data.forms, "abl_sg", [ij + "esu"]);
782
+ setNominalForm(data.forms, "voc_sg", [ij + "esu"]);
783
+ data.num = NumberTantum.Singular;
784
+ }
785
+ else if (stem == "iūgerum" || stem == "jūgerum") {
786
+ const ij = stem[0];
787
+ data.title = "second–third-declension hybrid noun";
788
+ data.subtitles.push("neuter");
789
+ setNominalForm(data.forms, "nom_sg", [ij + "ūgerum"]);
790
+ setNominalForm(data.forms, "gen_sg", [ij + "ūgerī"]);
791
+ setNominalForm(data.forms, "dat_sg", [ij + "ūgerō"]);
792
+ setNominalForm(data.forms, "acc_sg", [ij + "ūgerum"]);
793
+ setNominalForm(data.forms, "abl_sg", [ij + "ūgerō"]);
794
+ setNominalForm(data.forms, "voc_sg", [ij + "ūgerum"]);
795
+ setNominalForm(data.forms, "nom_pl", [ij + "ūgera"]);
796
+ setNominalForm(data.forms, "gen_pl", [ij + "ūgerum"]);
797
+ setNominalForm(data.forms, "dat_pl", [ij + "ūgeribus"]);
798
+ setNominalForm(data.forms, "acc_pl", [ij + "ūgera"]);
799
+ setNominalForm(data.forms, "abl_pl", [ij + "ūgeribus", ij + "ūgerīs"]);
800
+ setNominalForm(data.forms, "voc_pl", [ij + "ūgera"]);
801
+ data.notes.set("abl_pl2", "Once only, in:<br/>M. Terentius Varro, 'Res Rusticae', bk I, ch. x");
802
+ }
803
+ else if (stem == "sūs") {
804
+ setNominalForm(data.forms, "nom_sg", ["sūs"]);
805
+ setNominalForm(data.forms, "gen_sg", ["suis"]);
806
+ setNominalForm(data.forms, "dat_sg", ["suī"]);
807
+ setNominalForm(data.forms, "acc_sg", ["suem"]);
808
+ setNominalForm(data.forms, "abl_sg", ["sue"]);
809
+ setNominalForm(data.forms, "voc_sg", ["sūs"]);
810
+ setNominalForm(data.forms, "nom_pl", ["suēs"]);
811
+ setNominalForm(data.forms, "gen_pl", ["suum"]);
812
+ setNominalForm(data.forms, "dat_pl", ["suibus", "sūbus", "subus"]);
813
+ setNominalForm(data.forms, "acc_pl", ["suēs"]);
814
+ setNominalForm(data.forms, "abl_pl", ["suibus", "sūbus", "subus"]);
815
+ setNominalForm(data.forms, "voc_pl", ["suēs"]);
816
+ }
817
+ else if (stem == "ēthos") {
818
+ data.subtitles.push("irregular");
819
+ data.subtitles.push("Greek-type");
820
+ setNominalForm(data.forms, "nom_sg", ["ēthos"]);
821
+ setNominalForm(data.forms, "gen_sg", ["ētheos"]);
822
+ setNominalForm(data.forms, "acc_sg", ["ēthos"]);
823
+ setNominalForm(data.forms, "voc_sg", ["ēthos"]);
824
+ setNominalForm(data.forms, "nom_pl", ["ēthea", "ēthē"]);
825
+ setNominalForm(data.forms, "dat_pl", ["ēthesi", "ēthesin"]);
826
+ setNominalForm(data.forms, "acc_pl", ["ēthea", "ēthē"]);
827
+ setNominalForm(data.forms, "abl_pl", ["ēthesi", "ēthesin"]);
828
+ setNominalForm(data.forms, "voc_pl", ["ēthea", "ēthē"]);
829
+ }
830
+ else if (stem == "lexis") {
831
+ data.subtitles.push("irregular");
832
+ data.subtitles.push("Greek-type");
833
+ setNominalForm(data.forms, "nom_sg", ["lexis"]);
834
+ setNominalForm(data.forms, "gen_sg", ["lexeōs"]);
835
+ setNominalForm(data.forms, "acc_pl", ["lexeis"]);
836
+ }
837
+ else if (stem == "Athōs") {
838
+ data.subtitles.push("highly irregular");
839
+ data.subtitles.push("Greek-type");
840
+ setNominalForm(data.forms, "nom_sg", ["Athōs"]);
841
+ setNominalForm(data.forms, "gen_sg", ["Athō"]);
842
+ setNominalForm(data.forms, "dat_sg", ["Athō"]);
843
+ setNominalForm(data.forms, "acc_sg", ["Athō", "Athōn"]);
844
+ setNominalForm(data.forms, "abl_sg", ["Athō"]);
845
+ setNominalForm(data.forms, "voc_sg", ["Athōs"]);
846
+ data.num = NumberTantum.Singular;
847
+ }
848
+ else if (stem == "vēnum") {
849
+ data.title = "fourth/second-declension noun";
850
+ data.subtitles.push("defective");
851
+ setNominalForm(data.forms, "dat_sg", ["vēnuī", "vēnō"]);
852
+ setNominalForm(data.forms, "acc_sg", ["vēnum"]);
853
+ data.num = NumberTantum.Singular;
854
+ }
855
+ else if (stem == "vīs") {
856
+ data.subtitles.push("irregular");
857
+ data.subtitles.push("defective");
858
+ if (!data.declOpts.suppressRareIrregForms) {
859
+ setNominalForm(data.forms, "gen_sg", ["vīs"]);
860
+ setNominalForm(data.forms, "dat_sg", ["vī"]);
861
+ setNominalForm(data.forms, "acc_pl", ["vīrēs", "vīrīs"]);
862
+ }
863
+ else {
864
+ setNominalForm(data.forms, "acc_pl", ["vīrēs"]);
865
+ }
866
+ setNominalForm(data.forms, "nom_sg", ["vīs"]);
867
+ setNominalForm(data.forms, "acc_sg", ["vim"]);
868
+ setNominalForm(data.forms, "abl_sg", ["vī"]);
869
+ setNominalForm(data.forms, "voc_sg", ["vīs"]);
870
+ setNominalForm(data.forms, "nom_pl", ["vīrēs"]);
871
+ setNominalForm(data.forms, "gen_pl", ["vīrium"]);
872
+ setNominalForm(data.forms, "dat_pl", ["vīribus"]);
873
+ setNominalForm(data.forms, "abl_pl", ["vīribus"]);
874
+ setNominalForm(data.forms, "voc_pl", ["vīrēs"]);
875
+ }
876
+ else if (/^[IÏJ]ēs[uū]\u0306?s$/u.test(stem)) {
877
+ const ij = stem[0];
878
+ const uuMatch = stem.match(/[uū]\u0306?/u);
879
+ const uu = uuMatch ? uuMatch[0] : "ū";
880
+ setNominalForm(data.forms, "nom_sg", [stem]);
881
+ setNominalForm(data.forms, "gen_sg", [ij + "ēsū"]);
882
+ setNominalForm(data.forms, "dat_sg", [ij + "ēsū"]);
883
+ setNominalForm(data.forms, "acc_sg", [ij + "ēs" + uu + "m"]);
884
+ setNominalForm(data.forms, "abl_sg", [ij + "ēsū"]);
885
+ setNominalForm(data.forms, "voc_sg", [ij + "ēsū"]);
886
+ data.num = NumberTantum.Singular;
887
+ }
888
+ else if (stem === "Mōsēs" || stem === "Moesēs" || /^M[oō]\u0306?[īȳ]sēs$/.test(stem)) {
889
+ const mos = stem.split("").slice(0, -2).join("");
890
+ setNominalForm(data.forms, "nom_sg", [stem]);
891
+ setNominalForm(data.forms, "gen_sg", [mos + "ī", mos + "ēī", mos + "is", mos + "ēn", mos + "eōs"]);
892
+ setNominalForm(data.forms, "dat_sg", [mos + "ī"]);
893
+ setNominalForm(data.forms, "acc_sg", [mos + "ēn", mos + "em"]);
894
+ setNominalForm(data.forms, "abl_sg", [mos + "e", mos + "ēn", mos + "ī"]);
895
+ setNominalForm(data.forms, "voc_sg", [mos + "ēs", mos + "ē"]);
896
+ data.num = NumberTantum.Singular;
897
+ }
898
+ else {
899
+ throw Error(`Stem ${stem} not recognized.`);
900
+ }
901
+ }],
902
+ ]);
903
+ const acc_sg_i_stem_subtypes = new Map([
904
+ [NominalType.AccIm, [["im"], "accusative singular in '-im'"]],
905
+ [NominalType.AccImIn, [["im", "in"], "accusative singular in '-im' or '-in'"]],
906
+ [NominalType.AccImInEm, [["im", "in", "em"], "accusative singular in '-im', '-in' or '-em'"]],
907
+ [NominalType.AccImEm, [["im", "em"], "accusative singular in '-im' or '-em'"]],
908
+ [NominalType.AccImOccEm, [["im", "em"], "accusative singular in '-im' or occasionally '-em'"]],
909
+ [NominalType.AccEmIm, [["em", "im"], "accusative singular in '-em' or '-im'"]],
910
+ ]);
911
+ const abl_sg_i_stem_subtypes = new Map([
912
+ [NominalType.AblI, [["ī"], "ablative singular in '-ī'"]],
913
+ [NominalType.AblIE, [["ī", "e"], "ablative singular in '-ī' or '-e'"]],
914
+ [NominalType.AblIOccE, [["ī", "e"], "ablative singular in '-ī' or occasionally '-e'"]],
915
+ [NominalType.AblEI, [["e", "ī"], "ablative singular in '-e' or '-ī'"]],
916
+ [NominalType.AblEOccI, [["e", "ī"], "ablative singular in '-e' or occasionally '-ī'"]],
917
+ ]);
918
+ function extract_stem(form, ending) {
919
+ const base = form.match(new RegExp(`^(.*)${ending}$`));
920
+ if (!base) {
921
+ throw Error(`Form ${form} should end in -${ending}`);
922
+ }
923
+ return base[1];
924
+ }
925
+ function insert_if_not(data, entry, pos = 0) {
926
+ if (data.includes(entry)) {
927
+ return;
928
+ }
929
+ if (pos == 0) {
930
+ data.push(entry);
931
+ }
932
+ else {
933
+ data.splice(pos - 1, 0, entry);
934
+ }
935
+ }