@fpw/en-wiktionary-la-modules 0.0.11 → 0.0.12

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 (36) hide show
  1. package/dist/LaEngine.js +6 -6
  2. package/dist/LaEngine.js.map +1 -1
  3. package/dist/index.js +5 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/modules/conjugation/LaVerb.js +375 -374
  6. package/dist/modules/conjugation/LaVerb.js.map +1 -1
  7. package/dist/modules/conjugation/VerbForm.js +2 -2
  8. package/dist/modules/conjugation/VerbForm.js.map +1 -1
  9. package/dist/modules/conjugation/VerbType.d.ts +1 -0
  10. package/dist/modules/conjugation/VerbType.js +3 -2
  11. package/dist/modules/conjugation/VerbType.js.map +1 -1
  12. package/dist/modules/declination/LaAdjData.js +424 -424
  13. package/dist/modules/declination/LaAdjData.js.map +1 -1
  14. package/dist/modules/declination/LaNominal.js +70 -70
  15. package/dist/modules/declination/LaNominal.js.map +1 -1
  16. package/dist/modules/declination/LaNounData.js +420 -420
  17. package/dist/modules/declination/LaNounData.js.map +1 -1
  18. package/dist/modules/declination/NominalForm.js +2 -2
  19. package/dist/modules/declination/NominalForm.js.map +1 -1
  20. package/dist/modules/headword/HeadwordParser.js +17 -17
  21. package/dist/modules/headword/HeadwordParser.js.map +1 -1
  22. package/package.json +6 -5
  23. package/src/LaEngine.ts +82 -0
  24. package/src/index.ts +16 -0
  25. package/src/modules/common.ts +164 -0
  26. package/src/modules/conjugation/LaVerb.ts +2490 -0
  27. package/src/modules/conjugation/VerbAffix.ts +18 -0
  28. package/src/modules/conjugation/VerbForm.ts +223 -0
  29. package/src/modules/conjugation/VerbType.ts +51 -0
  30. package/src/modules/declination/LaAdjData.ts +845 -0
  31. package/src/modules/declination/LaNominal.ts +1975 -0
  32. package/src/modules/declination/LaNounData.ts +859 -0
  33. package/src/modules/declination/LaPersonalPronoun.ts +77 -0
  34. package/src/modules/declination/NominalForm.ts +89 -0
  35. package/src/modules/headword/HeadWord.ts +132 -0
  36. package/src/modules/headword/HeadwordParser.ts +514 -0
@@ -0,0 +1,845 @@
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-adj/data
6
+ * Based on version: https://en.wiktionary.org/w/index.php?title=Module:la-adj/data&oldid=63799019
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, SegmentData } from "./LaNominal";
16
+ import { setNominalForm } from "./NominalForm";
17
+
18
+ export const m_adj_decl: Map<string, ((data: SegmentData, args: string[]) => void)> = new Map([
19
+ ["0", (data, args) => {
20
+ data.title = "indeclinable " + singularize(data.pos);
21
+ const stem = args[0];
22
+
23
+ setNominalForm(data.forms, "nom_sg_m", [stem]);
24
+ setNominalForm(data.forms, "nom_pl_m", [stem]);
25
+
26
+ setNominalForm(data.forms, "gen_sg_m", [stem]);
27
+ setNominalForm(data.forms, "gen_pl_m", [stem]);
28
+
29
+ setNominalForm(data.forms, "dat_sg_m", [stem]);
30
+ setNominalForm(data.forms, "dat_pl_m", [stem]);
31
+
32
+ setNominalForm(data.forms, "acc_sg_m", [stem]);
33
+ setNominalForm(data.forms, "acc_pl_m", [stem]);
34
+
35
+ setNominalForm(data.forms, "abl_sg_m", [stem]);
36
+ setNominalForm(data.forms, "abl_pl_m", [stem]);
37
+
38
+ setNominalForm(data.forms, "loc_sg_m", [stem]);
39
+ setNominalForm(data.forms, "loc_pl_m", [stem]);
40
+
41
+ setNominalForm(data.forms, "voc_sg_m", [stem]);
42
+ setNominalForm(data.forms, "voc_pl_m", [stem]);
43
+
44
+ data.categories.push("Latin indeclinable " + data.pos);
45
+ }],
46
+ ["1&2", (data, args) => {
47
+ const singpos = singularize(data.pos);
48
+ if (data.gender == "F") {
49
+ data.title = "first-declension " + singpos;
50
+ } else if (data.gender) {
51
+ data.title = "second-declension " + singpos;
52
+ } else {
53
+ data.title = "first/second-declension " + singpos;
54
+ }
55
+
56
+ let stem = args[0];
57
+ let original: string | undefined;
58
+
59
+ if (data.types.has("er")) {
60
+ if (stem.match(/er$/)) {
61
+ data.subtitles.push("nominative masculine singular in '-er'");
62
+ data.categories.push("Latin first and second declension " + data.pos + " with nominative masculine singular in -er");
63
+ } else if (stem.match(/ur$/)) {
64
+ data.subtitles.push("nominative masculine singular in '-ur'");
65
+ data.categories.push("Latin first and second declension " + data.pos + " with nominative masculine singular in -ur");
66
+ } else {
67
+ throw Error(`Unrecognized '-r' stem (doesn't and in '-er' or '-ur'): ${stem}`);
68
+ }
69
+ original = stem;
70
+ stem = args[1];
71
+ }
72
+
73
+ let us = "us";
74
+ let a_sf = "a";
75
+ let um = "um";
76
+ let ae_gsf = "ae";
77
+ let am = "am";
78
+ let a_macron = "ā";
79
+
80
+ if (data.types.has("greekA") || data.types.has("greekE")) {
81
+ data.subtitles.push("Greek-type");
82
+ data.categories.push("Latin first and second declension " + data.pos + " with Greek declension");
83
+ if (data.types.has("greekA")) {
84
+ us = "os";
85
+ um = "on";
86
+ am = "ān";
87
+ } else {
88
+ us = "os",
89
+ a_sf = "ē";
90
+ um = "on";
91
+ ae_gsf = "ēs";
92
+ am = "ēn";
93
+ a_macron = "ē";
94
+ }
95
+ }
96
+ setNominalForm(data.forms, "nom_sg_m", [original || (stem + us)]);
97
+ setNominalForm(data.forms, "nom_sg_f", [stem + a_sf]);
98
+ setNominalForm(data.forms, "nom_sg_n", [stem + um]);
99
+ setNominalForm(data.forms, "nom_pl_m", [stem + "ī"]);
100
+ setNominalForm(data.forms, "nom_pl_f", [stem + "ae"]);
101
+ setNominalForm(data.forms, "nom_pl_n", [stem + "a"]);
102
+
103
+ setNominalForm(data.forms, "gen_sg_m", [stem + "ī"]);
104
+ setNominalForm(data.forms, "gen_sg_f", [stem + ae_gsf]);
105
+ setNominalForm(data.forms, "gen_sg_n", [stem + "ī"]);
106
+ setNominalForm(data.forms, "gen_pl_m", [stem + "ōrum"]);
107
+ setNominalForm(data.forms, "gen_pl_f", [stem + "ārum"]);
108
+ setNominalForm(data.forms, "gen_pl_n", [stem + "ōrum"]);
109
+
110
+ setNominalForm(data.forms, "dat_sg_m", [stem + "ō"]);
111
+ setNominalForm(data.forms, "dat_sg_f", [stem + "ae"]);
112
+ setNominalForm(data.forms, "dat_sg_n", [stem + "ō"]);
113
+ setNominalForm(data.forms, "dat_pl_m", [stem + "īs"]);
114
+ setNominalForm(data.forms, "dat_pl_f", [stem + "īs"]);
115
+ setNominalForm(data.forms, "dat_pl_n", [stem + "īs"]);
116
+
117
+ setNominalForm(data.forms, "acc_sg_m", [stem + um]);
118
+ setNominalForm(data.forms, "acc_sg_f", [stem + am]);
119
+ setNominalForm(data.forms, "acc_sg_n", [stem + um]);
120
+ setNominalForm(data.forms, "acc_pl_m", [stem + "ōs"]);
121
+ setNominalForm(data.forms, "acc_pl_f", [stem + "ās"]);
122
+ setNominalForm(data.forms, "acc_pl_n", [stem + "a"]);
123
+
124
+ setNominalForm(data.forms, "abl_sg_m", [stem + "ō"]);
125
+ setNominalForm(data.forms, "abl_sg_f", [stem + a_macron]);
126
+ setNominalForm(data.forms, "abl_sg_n", [stem + "ō"]);
127
+ setNominalForm(data.forms, "abl_pl_m", [stem + "īs"]);
128
+ setNominalForm(data.forms, "abl_pl_f", [stem + "īs"]);
129
+ setNominalForm(data.forms, "abl_pl_n", [stem + "īs"]);
130
+
131
+ setNominalForm(data.forms, "voc_sg_m", [original || (stem + "e")]);
132
+ setNominalForm(data.forms, "voc_sg_f", [stem + a_sf]);
133
+ setNominalForm(data.forms, "voc_sg_n", [stem + um]);
134
+ setNominalForm(data.forms, "voc_pl_m", [stem + "ī"]);
135
+ setNominalForm(data.forms, "voc_pl_f", [stem + "ae"]);
136
+ setNominalForm(data.forms, "voc_pl_n", [stem + "a"]);
137
+
138
+ setNominalForm(data.forms, "loc_sg_m", [stem + "ī"]);
139
+ setNominalForm(data.forms, "loc_sg_f", [stem + "ae"]);
140
+ setNominalForm(data.forms, "loc_sg_n", [stem + "ī"]);
141
+ setNominalForm(data.forms, "loc_pl_m", [stem + "īs"]);
142
+ setNominalForm(data.forms, "loc_pl_f", [stem + "īs"]);
143
+ setNominalForm(data.forms, "loc_pl_n", [stem + "īs"]);
144
+
145
+ if (data.types.has("ius")) {
146
+ data.subtitles.push("pronominal");
147
+ data.categories.push("Latin first and second declension " + data.pos + " with genitive singular in -ī̆us");
148
+ setNominalForm(data.forms, "gen_sg_m", [stem + "ī̆us"]);
149
+ setNominalForm(data.forms, "gen_sg_f", [stem + "ī̆us"]);
150
+ setNominalForm(data.forms, "gen_sg_n", [stem + "ī̆us"]);
151
+ setNominalForm(data.forms, "dat_sg_m", [stem + "ī"]);
152
+ setNominalForm(data.forms, "dat_sg_f", [stem + "ī"]);
153
+ setNominalForm(data.forms, "dat_sg_n", [stem + "ī"]);
154
+ } else if (data.types.has("not_ius")) {
155
+ data.subtitles.push("non-pronominal");
156
+ }
157
+
158
+ if (stem == "me") {
159
+ setNominalForm(data.forms, "voc_sg_m", ["mī"]);
160
+ }
161
+
162
+ if (data.types.has("ic")) {
163
+ data.subtitles.push("'hic'-type");
164
+ let oc = "oc";
165
+ let oc_macron = "ōc";
166
+ if (stem == "ill") {
167
+ oc = "uc";
168
+ oc_macron = "ūc";
169
+ }
170
+
171
+ setNominalForm(data.forms, "nom_sg_m", [stem + "ic"]);
172
+ setNominalForm(data.forms, "nom_sg_f", [stem + "aec"]);
173
+ setNominalForm(data.forms, "nom_sg_n", [stem + oc]);
174
+ setNominalForm(data.forms, "nom_pl_n", [stem + "aec"]);
175
+
176
+ setNominalForm(data.forms, "gen_sg_m", [stem + "uius"]);
177
+ setNominalForm(data.forms, "gen_sg_f", [stem + "uius"]);
178
+ setNominalForm(data.forms, "gen_sg_n", [stem + "uius"]);
179
+
180
+ setNominalForm(data.forms, "dat_sg_m", [stem + "uic"]);
181
+ setNominalForm(data.forms, "dat_sg_f", [stem + "uic"]);
182
+ setNominalForm(data.forms, "dat_sg_n", [stem + "uic"]);
183
+
184
+ setNominalForm(data.forms, "acc_sg_m", [stem + "unc"]);
185
+ setNominalForm(data.forms, "acc_sg_f", [stem + "anc"]);
186
+ setNominalForm(data.forms, "acc_sg_n", [stem + oc]);
187
+ setNominalForm(data.forms, "acc_pl_n", [stem + "aec"]);
188
+
189
+ setNominalForm(data.forms, "abl_sg_m", [stem + "ōc"]);
190
+ setNominalForm(data.forms, "abl_sg_f", [stem + "āc"]);
191
+ setNominalForm(data.forms, "abl_sg_n", [stem + oc_macron]);
192
+
193
+ data.voc = false;
194
+ }
195
+
196
+ data.categories.push("Latin first and second declension " + data.pos);
197
+ }],
198
+ ["1-1", (data, args) => {
199
+ data.title = "first-declension " + singularize(data.pos);
200
+ data.subtitles.push("masculine and neuter forms identical to feminine forms");
201
+ const stem = args[0];
202
+ setNominalForm(data.forms, "nom_sg_m", [stem + "a"]);
203
+ setNominalForm(data.forms, "nom_pl_m", [stem + "ae"]);
204
+
205
+ setNominalForm(data.forms, "gen_sg_m", [stem + "ae"]);
206
+ setNominalForm(data.forms, "gen_pl_m", [stem + "ārum"]);
207
+
208
+ setNominalForm(data.forms, "dat_sg_m", [stem + "ae"]);
209
+ setNominalForm(data.forms, "dat_pl_m", [stem + "īs"]);
210
+
211
+ setNominalForm(data.forms, "acc_sg_m", [stem + "am"]);
212
+ setNominalForm(data.forms, "acc_sg_n", [stem + "a"]);
213
+ setNominalForm(data.forms, "acc_pl_m", [stem + "ās"]);
214
+ setNominalForm(data.forms, "acc_pl_n", [stem + "ae"]);
215
+
216
+ setNominalForm(data.forms, "abl_sg_m", [stem + "ā"]);
217
+ setNominalForm(data.forms, "abl_pl_m", [stem + "īs"]);
218
+
219
+ setNominalForm(data.forms, "loc_sg_m", [stem + "ae"]);
220
+ setNominalForm(data.forms, "loc_pl_m", [stem + "īs"]);
221
+
222
+ setNominalForm(data.forms, "voc_sg_m", [stem + "a"]);
223
+ setNominalForm(data.forms, "voc_pl_m", [stem + "ae"]);
224
+
225
+ data.categories.push("Latin first declension " + data.pos);
226
+ }],
227
+ ["2-2", (data, args) => {
228
+ data.title = "second-declension " + singularize(data.pos);
229
+ data.subtitles.push("feminine forms identical to masculine forms");
230
+
231
+ const stem = args[0];
232
+
233
+ let us = "us";
234
+ let um = "um";
235
+ let i_pl = "ī";
236
+
237
+ if (data.types.has("greek")) {
238
+ data.subtitles.push("Greek-type");
239
+ data.categories.push("Latin second declension " + data.pos + " with Greek declension");
240
+ us = "os";
241
+ um = "on";
242
+ i_pl = "oe";
243
+ }
244
+
245
+ setNominalForm(data.forms, "nom_sg_m", [stem + us]);
246
+ setNominalForm(data.forms, "nom_sg_n", [stem + um]);
247
+ setNominalForm(data.forms, "nom_pl_m", [stem + i_pl]);
248
+ setNominalForm(data.forms, "nom_pl_n", [stem + "a"]);
249
+
250
+ setNominalForm(data.forms, "gen_sg_m", [stem + "ī"]);
251
+ setNominalForm(data.forms, "gen_sg_n", [stem + "ī"]);
252
+ setNominalForm(data.forms, "gen_pl_m", [stem + "ōrum"]);
253
+ setNominalForm(data.forms, "gen_pl_n", [stem + "ōrum"]);
254
+
255
+ setNominalForm(data.forms, "dat_sg_m", [stem + "ō"]);
256
+ setNominalForm(data.forms, "dat_sg_n", [stem + "ō"]);
257
+ setNominalForm(data.forms, "dat_pl_m", [stem + "īs"]);
258
+ setNominalForm(data.forms, "dat_pl_n", [stem + "īs"]);
259
+
260
+ setNominalForm(data.forms, "acc_sg_m", [stem + um]);
261
+ setNominalForm(data.forms, "acc_sg_n", [stem + um]);
262
+ setNominalForm(data.forms, "acc_pl_m", [stem + "ōs"]);
263
+ setNominalForm(data.forms, "acc_pl_n", [stem + "a"]);
264
+
265
+ setNominalForm(data.forms, "abl_sg_m", [stem + "ō"]);
266
+ setNominalForm(data.forms, "abl_sg_n", [stem + "ō"]);
267
+ setNominalForm(data.forms, "abl_pl_m", [stem + "īs"]);
268
+ setNominalForm(data.forms, "abl_pl_n", [stem + "īs"]);
269
+
270
+ setNominalForm(data.forms, "loc_sg_m", [stem + "ī"]);
271
+ setNominalForm(data.forms, "loc_sg_n", [stem + "ī"]);
272
+ setNominalForm(data.forms, "loc_pl_m", [stem + "īs"]);
273
+ setNominalForm(data.forms, "loc_pl_n", [stem + "īs"]);
274
+
275
+ setNominalForm(data.forms, "voc_sg_m", [stem + "e"]);
276
+ setNominalForm(data.forms, "voc_sg_n", [stem + um]);
277
+ setNominalForm(data.forms, "voc_pl_m", [stem + i_pl]);
278
+ setNominalForm(data.forms, "voc_pl_n", [stem + "a"]);
279
+
280
+ data.categories.push("Latin second declension " + data.pos);
281
+ }],
282
+ ["3-1", (data, args) => {
283
+ const singpos = singularize(data.pos);
284
+ if (data.gender) {
285
+ data.title = "third-declension " + singpos;
286
+ } else {
287
+ data.title = "third-declension one-termination " + singpos;
288
+ }
289
+
290
+ const stem1 = args[0];
291
+ const stem2 = args[1];
292
+
293
+ setNominalForm(data.forms, "nom_sg_m", [stem1]);
294
+ setNominalForm(data.forms, "nom_sg_n", [stem1]);
295
+ setNominalForm(data.forms, "nom_pl_m", [stem2 + "ēs"]);
296
+ setNominalForm(data.forms, "nom_pl_n", [stem2 + "ia"]);
297
+
298
+ setNominalForm(data.forms, "gen_sg_m", [stem2 + "is"]);
299
+ setNominalForm(data.forms, "gen_sg_n", [stem2 + "is"]);
300
+ setNominalForm(data.forms, "gen_pl_m", [stem2 + "ium"]);
301
+ setNominalForm(data.forms, "gen_pl_n", [stem2 + "ium"]);
302
+
303
+ setNominalForm(data.forms, "dat_sg_m", [stem2 + "ī"]);
304
+ setNominalForm(data.forms, "dat_sg_n", [stem2 + "ī"]);
305
+ setNominalForm(data.forms, "dat_pl_m", [stem2 + "ibus"]);
306
+ setNominalForm(data.forms, "dat_pl_n", [stem2 + "ibus"]);
307
+
308
+ setNominalForm(data.forms, "acc_sg_m", [stem2 + "em"]);
309
+ setNominalForm(data.forms, "acc_sg_n", [stem1]);
310
+ setNominalForm(data.forms, "acc_pl_m", [stem2 + "ēs"]);
311
+ setNominalForm(data.forms, "acc_pl_n", [stem2 + "ia"]);
312
+
313
+ setNominalForm(data.forms, "abl_sg_m", [stem2 + "ī"]);
314
+ setNominalForm(data.forms, "abl_sg_n", [stem2 + "ī"]);
315
+ setNominalForm(data.forms, "abl_pl_m", [stem2 + "ibus"]);
316
+ setNominalForm(data.forms, "abl_pl_n", [stem2 + "ibus"]);
317
+
318
+ setNominalForm(data.forms, "loc_sg_m", [stem2 + "ī"]);
319
+ setNominalForm(data.forms, "loc_sg_n", [stem2 + "ī"]);
320
+ setNominalForm(data.forms, "loc_pl_m", [stem2 + "ibus"]);
321
+ setNominalForm(data.forms, "loc_pl_n", [stem2 + "ibus"]);
322
+
323
+ setNominalForm(data.forms, "voc_sg_m", [stem1]);
324
+ setNominalForm(data.forms, "voc_sg_n", [stem1]);
325
+ setNominalForm(data.forms, "voc_pl_m", [stem2 + "ēs"]);
326
+ setNominalForm(data.forms, "voc_pl_n", [stem2 + "ia"]);
327
+
328
+ if (data.types.has("par")) {
329
+ data.subtitles.push("non-i-stem");
330
+
331
+ setNominalForm(data.forms, "nom_pl_n", [stem2 + "a"]);
332
+ setNominalForm(data.forms, "gen_pl_m", [stem2 + "um"]);
333
+ setNominalForm(data.forms, "gen_pl_n", [stem2 + "um"]);
334
+ setNominalForm(data.forms, "abl_sg_m", [stem2 + "e"]);
335
+ setNominalForm(data.forms, "abl_sg_n", [stem2 + "e"]);
336
+ setNominalForm(data.forms, "loc_sg_m", [stem2 + "ī", stem2 + "e"]);
337
+ setNominalForm(data.forms, "loc_sg_n", [stem2 + "ī", stem2 + "e"]);
338
+ setNominalForm(data.forms, "acc_pl_n", [stem2 + "a"]);
339
+ setNominalForm(data.forms, "voc_pl_n", [stem2 + "a"]);
340
+ } else if (data.types.has("not_par")) {
341
+ data.subtitles.push("i-stem");
342
+ }
343
+
344
+ const es_base = stem1.match(/^(.*)ēs$/);
345
+ if (es_base && es_base[1] == stem2) {
346
+ if (data.types.has("greek")) {
347
+ const note = "It is unknown if Classical Latin preserved (or would have preserved) the shortness of the original Greek short ending.";
348
+ setNominalForm(data.forms, "nom_sg_n", [stem2 + "es", stem2 + "ēs"]);
349
+ data.notes.set("nom_sg_n1", note);
350
+ setNominalForm(data.forms, "acc_sg_n", [stem2 + "es", stem2 + "ēs"]);
351
+ data.notes.set("acc_sg_n1", note);
352
+ setNominalForm(data.forms, "voc_sg_m", [stem2 + "es", stem2 + "ēs"]);
353
+ data.notes.set("voc_sg_m1", note);
354
+ setNominalForm(data.forms, "voc_sg_n", [stem2 + "es", stem2 + "ēs"]);
355
+ data.notes.set("voc_sg_n1", note);
356
+ data.subtitles.push("Greek-type");
357
+ } else if (data.types.has("not_greek")) {
358
+ data.subtitles.push("non-Greek-type");
359
+ }
360
+ }
361
+
362
+ data.categories.push("Latin third declension " + data.pos);
363
+ data.categories.push("Latin third declension " + data.pos + " of one termination");
364
+ }],
365
+ ["3-C", (data, args) => {
366
+ const stem = args[0];
367
+ data.types.add("par");
368
+ const d = m_adj_decl.get("3-1");
369
+ if (!d) {
370
+ throw Error("Decl 3-1 not ready");
371
+ }
372
+ d(data, [stem + "or", stem + "ōr"]);
373
+ data.title = "third-declension comparative " + singularize(data.pos);
374
+ data.subtitles = [];
375
+ setNominalForm(data.forms, "nom_sg_n", [stem + "us"]);
376
+ setNominalForm(data.forms, "acc_sg_n", [stem + "us"]);
377
+ setNominalForm(data.forms, "voc_sg_n", [stem + "us"]);
378
+
379
+ }],
380
+ ["3-P", (data, args) => {
381
+ const stem1 = args[0];
382
+ const stem2 = args[1];
383
+
384
+ const d = m_adj_decl.get("3-1");
385
+ if (!d) {
386
+ throw Error("Decl 3-1 not ready");
387
+ }
388
+ d(data, args);
389
+ data.title = "third-declension participle";
390
+ setNominalForm(data.forms, "abl_sg_m", [stem2 + "e", stem2 + "ī"]);
391
+ data.notes.set("abl_sg_m2", "When used purely as an adjective.");
392
+ setNominalForm(data.forms, "abl_sg_n", [stem2 + "e", stem2 + "ī"]);
393
+ data.notes.set("abl_sg_n2", "When used purely as an adjective.");
394
+ setNominalForm(data.forms, "acc_pl_m", [stem2 + "ēs", stem2 + "īs"]);
395
+ }],
396
+ ["3-2", (data, args) => {
397
+ const singpos = singularize(data.pos);
398
+ if (data.gender) {
399
+ data.title = "third-declension " + singpos;
400
+ } else {
401
+ data.title = "third-declension two-termination " + singpos;
402
+ }
403
+
404
+ const stem = args[0];
405
+ const stem2 = args[1];
406
+
407
+ setNominalForm(data.forms, "nom_sg_m", [stem + "is"]);
408
+ setNominalForm(data.forms, "nom_sg_n", [stem + "e"]);
409
+ setNominalForm(data.forms, "nom_pl_m", [stem + "ēs"]);
410
+ setNominalForm(data.forms, "nom_pl_n", [stem + "ia"]);
411
+
412
+ setNominalForm(data.forms, "gen_sg_m", [stem + "is"]);
413
+ setNominalForm(data.forms, "gen_sg_n", [stem + "is"]);
414
+ setNominalForm(data.forms, "gen_pl_m", [stem + "ium"]);
415
+ setNominalForm(data.forms, "gen_pl_n", [stem + "ium"]);
416
+
417
+ setNominalForm(data.forms, "dat_sg_m", [stem + "ī"]);
418
+ setNominalForm(data.forms, "dat_sg_n", [stem + "ī"]);
419
+ setNominalForm(data.forms, "dat_pl_m", [stem + "ibus"]);
420
+ setNominalForm(data.forms, "dat_pl_n", [stem + "ibus"]);
421
+
422
+ setNominalForm(data.forms, "acc_sg_m", [stem + "em"]);
423
+ setNominalForm(data.forms, "acc_sg_n", [stem + "e"]);
424
+ setNominalForm(data.forms, "acc_pl_m", [stem + "ēs", stem + "īs"]);
425
+ setNominalForm(data.forms, "acc_pl_n", [stem + "ia"]);
426
+
427
+ setNominalForm(data.forms, "abl_sg_m", [stem + "ī"]);
428
+ setNominalForm(data.forms, "abl_sg_n", [stem + "ī"]);
429
+ setNominalForm(data.forms, "abl_pl_m", [stem + "ibus"]);
430
+ setNominalForm(data.forms, "abl_pl_n", [stem + "ibus"]);
431
+
432
+ setNominalForm(data.forms, "loc_sg_m", [stem + "ī"]);
433
+ setNominalForm(data.forms, "loc_sg_n", [stem + "ī"]);
434
+ setNominalForm(data.forms, "loc_pl_m", [stem + "ibus"]);
435
+ setNominalForm(data.forms, "loc_pl_n", [stem + "ibus"]);
436
+
437
+ setNominalForm(data.forms, "voc_sg_m", [stem + "is"]);
438
+ setNominalForm(data.forms, "voc_sg_n", [stem + "e"]);
439
+ setNominalForm(data.forms, "voc_pl_m", [stem + "ēs"]);
440
+ setNominalForm(data.forms, "voc_pl_n", [stem + "ia"]);
441
+
442
+ data.categories.push("Latin third declension " + data.pos);
443
+ data.categories.push("Latin third declension " + data.pos + " of two terminations");
444
+ }],
445
+ ["3-3", (data, args) => {
446
+ const singpos = singularize(data.pos);
447
+ if (data.gender) {
448
+ data.title = "third-declension " + singpos;
449
+ } else {
450
+ data.title = "third-declension three-termination " + singpos;
451
+ }
452
+
453
+ const stem1 = args[0];
454
+ const stem2 = args[1];
455
+
456
+ setNominalForm(data.forms, "nom_sg_m", [stem1]);
457
+ setNominalForm(data.forms, "nom_sg_f", [stem2 + "is"]);
458
+ setNominalForm(data.forms, "nom_sg_n", [stem2 + "e"]);
459
+ setNominalForm(data.forms, "nom_pl_m", [stem2 + "ēs"]);
460
+ setNominalForm(data.forms, "nom_pl_f", [stem2 + "ēs"]);
461
+ setNominalForm(data.forms, "nom_pl_n", [stem2 + "ia"]);
462
+
463
+ setNominalForm(data.forms, "gen_sg_m", [stem2 + "is"]);
464
+ setNominalForm(data.forms, "gen_sg_f", [stem2 + "is"]);
465
+ setNominalForm(data.forms, "gen_sg_n", [stem2 + "is"]);
466
+ setNominalForm(data.forms, "gen_pl_m", [stem2 + "ium"]);
467
+ setNominalForm(data.forms, "gen_pl_f", [stem2 + "ium"]);
468
+ setNominalForm(data.forms, "gen_pl_n", [stem2 + "ium"]);
469
+
470
+ setNominalForm(data.forms, "dat_sg_m", [stem2 + "ī"]);
471
+ setNominalForm(data.forms, "dat_sg_f", [stem2 + "ī"]);
472
+ setNominalForm(data.forms, "dat_sg_n", [stem2 + "ī"]);
473
+ setNominalForm(data.forms, "dat_pl_m", [stem2 + "ibus"]);
474
+ setNominalForm(data.forms, "dat_pl_f", [stem2 + "ibus"]);
475
+ setNominalForm(data.forms, "dat_pl_n", [stem2 + "ibus"]);
476
+
477
+ setNominalForm(data.forms, "acc_sg_m", [stem2 + "em"]);
478
+ setNominalForm(data.forms, "acc_sg_f", [stem2 + "em"]);
479
+ setNominalForm(data.forms, "acc_sg_n", [stem2 + "e"]);
480
+ setNominalForm(data.forms, "acc_pl_m", [stem2 + "ēs"]);
481
+ setNominalForm(data.forms, "acc_pl_f", [stem2 + "ēs"]);
482
+ setNominalForm(data.forms, "acc_pl_n", [stem2 + "ia"]);
483
+
484
+ setNominalForm(data.forms, "abl_sg_m", [stem2 + "ī"]);
485
+ setNominalForm(data.forms, "abl_sg_f", [stem2 + "ī"]);
486
+ setNominalForm(data.forms, "abl_sg_n", [stem2 + "ī"]);
487
+ setNominalForm(data.forms, "abl_pl_m", [stem2 + "ibus"]);
488
+ setNominalForm(data.forms, "abl_pl_f", [stem2 + "ibus"]);
489
+ setNominalForm(data.forms, "abl_pl_n", [stem2 + "ibus"]);
490
+
491
+ setNominalForm(data.forms, "loc_sg_m", [stem2 + "ī"]);
492
+ setNominalForm(data.forms, "loc_sg_f", [stem2 + "ī"]);
493
+ setNominalForm(data.forms, "loc_sg_n", [stem2 + "ī"]);
494
+ setNominalForm(data.forms, "loc_pl_m", [stem2 + "ibus"]);
495
+ setNominalForm(data.forms, "loc_pl_f", [stem2 + "ibus"]);
496
+ setNominalForm(data.forms, "loc_pl_n", [stem2 + "ibus"]);
497
+
498
+ setNominalForm(data.forms, "voc_sg_m", [stem1]);
499
+ setNominalForm(data.forms, "voc_sg_f", [stem2 + "is"]);
500
+ setNominalForm(data.forms, "voc_sg_n", [stem2 + "e"]);
501
+ setNominalForm(data.forms, "voc_pl_m", [stem2 + "ēs"]);
502
+ setNominalForm(data.forms, "voc_pl_f", [stem2 + "ēs"]);
503
+ setNominalForm(data.forms, "voc_pl_n", [stem2 + "ia"]);
504
+
505
+ data.categories.push("Latin third declension " + data.pos);
506
+ data.categories.push("Latin third declension " + data.pos + " of three terminations");
507
+ }],
508
+ ["irreg", (data, args) => {
509
+ if (args[0] == "duo" || args[0] == "ambō") {
510
+ const stem = args[0] == "duo" ? "du" : "amb";
511
+ data.title = (stem == "amb") ? "irregular adjective" : "numeral";
512
+ data.num = NumberTantum.Plural;
513
+
514
+ const stem_with_o = stem + (stem == "amb" ? "ō" : "o");
515
+ setNominalForm(data.forms, "nom_pl_m", [stem_with_o]);
516
+ setNominalForm(data.forms, "nom_pl_f", [stem + "ae"]);
517
+ setNominalForm(data.forms, "nom_pl_n", [stem_with_o]);
518
+
519
+ setNominalForm(data.forms, "gen_pl_m", [stem + "ōrum"]);
520
+ setNominalForm(data.forms, "gen_pl_f", [stem + "ārum"]);
521
+ setNominalForm(data.forms, "gen_pl_n", [stem + "ōrum"]);
522
+
523
+ setNominalForm(data.forms, "dat_pl_m", [stem + "ōbus"]);
524
+ setNominalForm(data.forms, "dat_pl_f", [stem + "ābus"]);
525
+ setNominalForm(data.forms, "dat_pl_n", [stem + "ōbus"]);
526
+
527
+ setNominalForm(data.forms, "acc_pl_m", [stem + "ōs", stem_with_o]);
528
+ setNominalForm(data.forms, "acc_pl_f", [stem + "ās"]);
529
+ setNominalForm(data.forms, "acc_pl_n", [stem_with_o]);
530
+
531
+ setNominalForm(data.forms, "abl_pl_m", [stem + "ōbus"]);
532
+ setNominalForm(data.forms, "abl_pl_f", [stem + "ābus"]);
533
+ setNominalForm(data.forms, "abl_pl_n", [stem + "ōbus"]);
534
+
535
+ setNominalForm(data.forms, "voc_pl_m", [stem_with_o]);
536
+ setNominalForm(data.forms, "voc_pl_f", [stem + "ae"]);
537
+ setNominalForm(data.forms, "voc_pl_n", [stem_with_o]);
538
+
539
+ if (stem == "du") {
540
+ data.footnote = "Note: The genitive masculine and neuter can also be found in the contracted form 'duum' (also spelt 'duûm').";
541
+ }
542
+ } else if (args[0] == "mīlle") {
543
+ data.title = "semi-indeclinable numeral";
544
+ setNominalForm(data.forms, "nom_sg_m", ["mīlle"]);
545
+ setNominalForm(data.forms, "nom_pl_m", ["mīlia", "mīllia"]);
546
+
547
+ setNominalForm(data.forms, "gen_sg_m", ["mīlle"]);
548
+ setNominalForm(data.forms, "gen_pl_m", ["mīlium", "mīllium"]);
549
+
550
+ setNominalForm(data.forms, "dat_sg_m", ["mīlle"]);
551
+ setNominalForm(data.forms, "dat_pl_m", ["mīlibus", "mīllibus"]);
552
+
553
+ setNominalForm(data.forms, "acc_sg_m", ["mīlle"]);
554
+ setNominalForm(data.forms, "acc_pl_m", ["mīlia", "mīllia"]);
555
+
556
+ setNominalForm(data.forms, "abl_sg_m", ["mīlle"]);
557
+ setNominalForm(data.forms, "abl_pl_m", ["mīlibus", "mīllibus"]);
558
+
559
+ setNominalForm(data.forms, "voc_sg_m", ["mīlle"]);
560
+ setNominalForm(data.forms, "voc_pl_m", ["mīlia", "mīllia"]);
561
+ } else if (args[0] == "illic") {
562
+ data.title = "demonstrative pronoun";
563
+ setNominalForm(data.forms, "nom_sg_m", ["illic"]);
564
+ setNominalForm(data.forms, "nom_sg_f", ["illaec"]);
565
+ setNominalForm(data.forms, "nom_sg_n", ["illuc", "illoc"]);
566
+ setNominalForm(data.forms, "nom_pl_n", ["illaec"]);
567
+
568
+ setNominalForm(data.forms, "nom_sg_m", ["illunc"]);
569
+ setNominalForm(data.forms, "nom_sg_f", ["illanc"]);
570
+ setNominalForm(data.forms, "nom_sg_n", ["illuc", "illoc"]);
571
+ setNominalForm(data.forms, "nom_pl_n", ["illaec"]);
572
+
573
+ setNominalForm(data.forms, "abl_sg_m", ["illōc"]);
574
+ setNominalForm(data.forms, "abl_sg_f", ["illāc"]);
575
+ setNominalForm(data.forms, "abl_sg_n", ["illōc"]);
576
+
577
+ data.voc = false;
578
+
579
+ } else if (args[0] == "plūs") {
580
+ data.title = "irregular third-declension comparative adjective";
581
+
582
+ setNominalForm(data.forms, "nom_sg_m", [""]);
583
+ setNominalForm(data.forms, "nom_sg_n", ["plūs"]);
584
+ setNominalForm(data.forms, "nom_pl_m", ["plūrēs"]);
585
+ setNominalForm(data.forms, "nom_pl_n", ["plūra"]);
586
+
587
+ setNominalForm(data.forms, "gen_sg_m", [""]);
588
+ setNominalForm(data.forms, "gen_sg_n", ["plūris"]);
589
+ setNominalForm(data.forms, "gen_pl_m", ["plūrium"]);
590
+ setNominalForm(data.forms, "gen_pl_n", ["plūrium"]);
591
+
592
+ setNominalForm(data.forms, "dat_sg_m", [""]);
593
+ setNominalForm(data.forms, "dat_sg_n", [""]);
594
+ setNominalForm(data.forms, "dat_pl_m", ["plūribus"]);
595
+ setNominalForm(data.forms, "dat_pl_n", ["plūribus"]);
596
+
597
+ setNominalForm(data.forms, "acc_sg_m", [""]);
598
+ setNominalForm(data.forms, "acc_sg_n", ["plūs"]);
599
+ setNominalForm(data.forms, "acc_pl_m", ["plūrēs"]);
600
+ setNominalForm(data.forms, "acc_pl_n", ["plūra"]);
601
+
602
+ setNominalForm(data.forms, "abl_sg_m", [""]);
603
+ setNominalForm(data.forms, "abl_sg_n", ["plūre"]);
604
+ setNominalForm(data.forms, "abl_pl_m", ["plūribus"]);
605
+ setNominalForm(data.forms, "abl_pl_n", ["plūribus"]);
606
+
607
+ setNominalForm(data.forms, "voc_sg_m", [""]);
608
+ setNominalForm(data.forms, "voc_sg_n", ["plūs"]);
609
+ setNominalForm(data.forms, "voc_pl_m", ["plūrēs"]);
610
+ setNominalForm(data.forms, "voc_pl_n", ["plūra"]);
611
+
612
+ data.footnote = "Note: Singular forms take the genitive of the whole and do not function as adjectives.";
613
+ data.categories.push("Latin third declension " + data.pos);
614
+ data.categories.push("Latin third declension " + data.pos + " of one termination");
615
+ } else if (args[0] == "is" || args[0] == "īdem") {
616
+ data.title = "demonstrative pronoun";
617
+ const note1 = "The dat. singular is found spelled EIEI (here represented as 'ēī') and scanned as two longs in Plautus, but also as a monosyllable. The latter is its normal scansion in Classical. Other spellings include EEI, IEI.";
618
+ const note2 = "The nom./dat./abl. plural forms regularly developed into a monosyllable /iː(s)/, with later remodelling - compare the etymology of deus. This /iː/ was normally spelled as EI during and as II after the Republic; a disyllabic 'iī', spelled II, Iꟾ, apears in Silver Age poetry, while disyllabic 'eīs' is only post-Classical. Other spellings include EEI(S), EIEI(S), IEI(S).";
619
+
620
+ setNominalForm(data.forms, "nom_sg_m", ["is"]);
621
+ setNominalForm(data.forms, "nom_sg_f", ["ea"]);
622
+ setNominalForm(data.forms, "nom_sg_n", ["id"]);
623
+ setNominalForm(data.forms, "nom_pl_m", ["ī", "iī", "eī"]);
624
+ data.notes.set("nom_pl_m1", note2);
625
+ setNominalForm(data.forms, "nom_pl_f", ["eae"]);
626
+ setNominalForm(data.forms, "nom_pl_n", ["ea"]);
627
+
628
+ setNominalForm(data.forms, "gen_sg_m", ["eius"]);
629
+ setNominalForm(data.forms, "gen_sg_f", ["eius"]);
630
+ setNominalForm(data.forms, "gen_sg_n", ["eius"]);
631
+ setNominalForm(data.forms, "gen_pl_m", ["eōrum"]);
632
+ setNominalForm(data.forms, "gen_pl_f", ["eārum"]);
633
+ setNominalForm(data.forms, "gen_pl_n", ["eōrum"]);
634
+
635
+ setNominalForm(data.forms, "dat_sg_m", ["ei", "ēī"]);
636
+ data.notes.set("dat_sg_m1", note1);
637
+ setNominalForm(data.forms, "dat_sg_f", ["ei", "ēī"]);
638
+ data.notes.set("dat_sg_f1", note1);
639
+ setNominalForm(data.forms, "dat_sg_n", ["ei", "ēī"]);
640
+ data.notes.set("dat_sg_n1", note1);
641
+ setNominalForm(data.forms, "dat_pl_m", ["īs", "iīs", "eīs"]);
642
+ data.notes.set("dat_pl_m1", note2);
643
+ setNominalForm(data.forms, "dat_pl_f", ["īs", "iīs", "eīs"]);
644
+ data.notes.set("dat_pl_f1", note2);
645
+ setNominalForm(data.forms, "dat_pl_n", ["īs", "iīs", "eīs"]);
646
+ data.notes.set("dat_pl_n1", note2);
647
+
648
+ setNominalForm(data.forms, "acc_sg_m", ["eum"]);
649
+ setNominalForm(data.forms, "acc_sg_f", ["eam"]);
650
+ setNominalForm(data.forms, "acc_sg_n", ["id"]);
651
+ setNominalForm(data.forms, "acc_pl_m", ["eōs"]);
652
+ setNominalForm(data.forms, "acc_pl_f", ["eās"]);
653
+ setNominalForm(data.forms, "acc_pl_n", ["ea"]);
654
+
655
+ setNominalForm(data.forms, "abl_sg_m", ["eō"]);
656
+ setNominalForm(data.forms, "abl_sg_f", ["eā"]);
657
+ setNominalForm(data.forms, "abl_sg_n", ["eō"]);
658
+ setNominalForm(data.forms, "abl_pl_m", ["īs", "iīs", "eīs"]);
659
+ data.notes.set("abl_pl_m1", note2);
660
+ setNominalForm(data.forms, "abl_pl_f", ["īs", "iīs", "eīs"]);
661
+ data.notes.set("abl_pl_f1", note2);
662
+ setNominalForm(data.forms, "abl_pl_n", ["īs", "iīs", "eīs"]);
663
+ data.notes.set("abl_pl_n1", note2);
664
+
665
+ data.voc = false;
666
+
667
+ if (args[0] == "īdem") {
668
+ setNominalForm(data.forms, "nom_sg_m", ["ī"]);
669
+ setNominalForm(data.forms, "nom_sg_n", ["i"]);
670
+ setNominalForm(data.forms, "nom_pl_m", ["ī"]);
671
+
672
+ setNominalForm(data.forms, "gen_pl_m", ["eōrun", "eōrum"]);
673
+ setNominalForm(data.forms, "gen_pl_f", ["eārun", "eārum"]);
674
+ setNominalForm(data.forms, "gen_pl_n", ["eōrun", "eōrum"]);
675
+
676
+ setNominalForm(data.forms, "acc_sg_m", ["eun", "eum"]);
677
+ setNominalForm(data.forms, "acc_sg_f", ["ean", "eam"]);
678
+ setNominalForm(data.forms, "acc_sg_n", ["i"]);
679
+ }
680
+ } else if (args[0] == "ille") {
681
+ data.types.add("ius");
682
+ const d = m_adj_decl.get("1&2");
683
+ if (!d) {
684
+ throw Error("Decl 1&2 not ready");
685
+ }
686
+
687
+ d(data, ["ill"]);
688
+
689
+ data.title = "demonstrative pronoun";
690
+
691
+ setNominalForm(data.forms, "nom_sg_m", ["ille"]);
692
+ setNominalForm(data.forms, "nom_sg_n", ["illud"]);
693
+
694
+ setNominalForm(data.forms, "acc_sg_n", ["illud"]);
695
+
696
+ data.voc = false;
697
+ data.categories = [];
698
+ } else if (args[0] == "iste") {
699
+ data.types.add("ius");
700
+ const d = m_adj_decl.get("1&2");
701
+ if (!d) {
702
+ throw Error("Decl 1&2 not ready");
703
+ }
704
+
705
+ d(data, ["ist"]);
706
+
707
+ data.title = "demonstrative pronoun";
708
+
709
+ setNominalForm(data.forms, "nom_sg_m", ["iste"]);
710
+ setNominalForm(data.forms, "nom_sg_n", ["istud"]);
711
+
712
+ setNominalForm(data.forms, "acc_sg_n", ["istud"]);
713
+
714
+ data.voc = false;
715
+
716
+ data.categories = [];
717
+ } else if (args[0] == "ipse") {
718
+ data.types.add("ius");
719
+ const d = m_adj_decl.get("1&2");
720
+ if (!d) {
721
+ throw Error("Decl 1&2 not ready");
722
+ }
723
+
724
+ d(data, ["ips"]);
725
+
726
+ data.title = "demonstrative pronoun";
727
+
728
+ setNominalForm(data.forms, "nom_sg_m", ["ipse"]);
729
+ setNominalForm(data.forms, "nom_sg_n", ["ipsum"]);
730
+
731
+ setNominalForm(data.forms, "acc_sg_n", ["ipsum"]);
732
+
733
+ data.voc = false;
734
+
735
+ data.categories = [];
736
+ } else if (args[0] == "quis" || args[0] == "quī") {
737
+ let id = "id";
738
+
739
+ if (args[0] == "quī") {
740
+ id = "od";
741
+ setNominalForm(data.forms, "acc_sg_f", ["quam"]);
742
+ setNominalForm(data.forms, "abl_sg_f", ["quā"]);
743
+ } else {
744
+ setNominalForm(data.forms, "acc_sg_f", ["quem"]);
745
+ setNominalForm(data.forms, "abl_sg_f", ["quō"]);
746
+ }
747
+ data.title = "relative/interrogative pronoun";
748
+
749
+ setNominalForm(data.forms, "nom_sg_m", ["quis"]);
750
+ setNominalForm(data.forms, "nom_sg_f", ["quis", "quae"]);
751
+ setNominalForm(data.forms, "nom_sg_n", ["qu" + id]);
752
+ setNominalForm(data.forms, "nom_pl_m", ["quī"]);
753
+ setNominalForm(data.forms, "nom_pl_f", ["quae"]);
754
+ setNominalForm(data.forms, "nom_pl_n", ["quae"]);
755
+
756
+ setNominalForm(data.forms, "gen_sg_m", ["cuius"]);
757
+ setNominalForm(data.forms, "gen_sg_f", ["cuius"]);
758
+ setNominalForm(data.forms, "gen_sg_n", ["cuius"]);
759
+ setNominalForm(data.forms, "gen_pl_m", ["quōrum"]);
760
+ setNominalForm(data.forms, "gen_pl_f", ["quārum"]);
761
+ setNominalForm(data.forms, "gen_pl_n", ["quōrum"]);
762
+
763
+ setNominalForm(data.forms, "dat_sg_m", ["cui"]);
764
+ setNominalForm(data.forms, "dat_sg_f", ["cui"]);
765
+ setNominalForm(data.forms, "dat_sg_n", ["cui"]);
766
+ setNominalForm(data.forms, "dat_pl_m", ["quibus", "quīs"]);
767
+ setNominalForm(data.forms, "dat_pl_f", ["quibus", "quīs"]);
768
+ setNominalForm(data.forms, "dat_pl_n", ["quibus", "quīs"]);
769
+
770
+ setNominalForm(data.forms, "acc_sg_m", ["quem"]);
771
+ setNominalForm(data.forms, "acc_sg_n", ["qu" + id]);
772
+ setNominalForm(data.forms, "acc_pl_m", ["quōs"]);
773
+ setNominalForm(data.forms, "acc_pl_f", ["quās"]);
774
+ setNominalForm(data.forms, "acc_pl_n", ["quae"]);
775
+
776
+ setNominalForm(data.forms, "abl_sg_m", ["quō"]);
777
+ setNominalForm(data.forms, "abl_sg_n", ["quō"]);
778
+ setNominalForm(data.forms, "abl_pl_m", ["quibus", "quīs"]);
779
+ setNominalForm(data.forms, "abl_pl_f", ["quibus", "quīs"]);
780
+ setNominalForm(data.forms, "abl_pl_n", ["quibus", "quīs"]);
781
+
782
+ data.voc = false;
783
+
784
+ if (args[0] == "quī") {
785
+ setNominalForm(data.forms, "nom_sg_m", ["quī"]);
786
+ setNominalForm(data.forms, "nom_sg_f", ["quae"]);
787
+ }
788
+ } else if (args[0] == "quisquis") {
789
+ data.title = "relative/interrogative pronoun";
790
+ setNominalForm(data.forms, "nom_sg_m", ["quisquis"]);
791
+ setNominalForm(data.forms, "nom_sg_f", ["quisquis"]);
792
+ setNominalForm(data.forms, "nom_sg_n", ["quidquid", "quicquid"]);
793
+ setNominalForm(data.forms, "nom_pl_m", ["quīquī"]);
794
+ setNominalForm(data.forms, "nom_pl_f", ["quaequae"]);
795
+ setNominalForm(data.forms, "nom_pl_n", ["quaequae"]);
796
+
797
+ setNominalForm(data.forms, "gen_sg_m", ["cuiuscuius"]);
798
+ setNominalForm(data.forms, "gen_sg_f", ["cuiuscuius"]);
799
+ setNominalForm(data.forms, "gen_sg_n", ["cuiuscuius"]);
800
+ setNominalForm(data.forms, "gen_pl_m", ["quōrumquōrum"]);
801
+ setNominalForm(data.forms, "gen_pl_f", ["quārumquārum"]);
802
+ setNominalForm(data.forms, "gen_pl_n", ["quōrumquōrum"]);
803
+
804
+ setNominalForm(data.forms, "dat_sg_m", ["cuicui"]);
805
+ setNominalForm(data.forms, "dat_sg_f", ["cuicui"]);
806
+ setNominalForm(data.forms, "dat_sg_n", ["cuicui"]);
807
+ setNominalForm(data.forms, "dat_pl_m", ["quibusquibus", "quīsquīs"]);
808
+ setNominalForm(data.forms, "dat_pl_f", ["quibusquibus", "quīsquīs"]);
809
+ setNominalForm(data.forms, "dat_pl_n", ["quibusquibus", "quīsquīs"]);
810
+
811
+ setNominalForm(data.forms, "acc_sg_m", ["quemquem"]);
812
+ setNominalForm(data.forms, "acc_sg_f", ["quamquam"]);
813
+ setNominalForm(data.forms, "acc_sg_n", ["quidquid", "quicquid"]);
814
+ setNominalForm(data.forms, "acc_pl_m", ["quōsquōs"]);
815
+ setNominalForm(data.forms, "acc_pl_f", ["quāsquās"]);
816
+ setNominalForm(data.forms, "acc_pl_n", ["quaequae"]);
817
+
818
+ setNominalForm(data.forms, "abl_sg_m", ["quōquō"]);
819
+ setNominalForm(data.forms, "abl_sg_f", ["quāquā"]);
820
+ setNominalForm(data.forms, "abl_sg_n", ["quōquō"]);
821
+ setNominalForm(data.forms, "abl_pl_m", ["quibusquibus", "quīsquīs"]);
822
+ setNominalForm(data.forms, "abl_pl_f", ["quibusquibus", "quīsquīs"]);
823
+ setNominalForm(data.forms, "abl_pl_n", ["quibusquibus", "quīsquīs"]);
824
+
825
+ setNominalForm(data.forms, "voc_sg_m", ["quisquis"]);
826
+ setNominalForm(data.forms, "voc_sg_f", ["quisquis"]);
827
+ setNominalForm(data.forms, "voc_sg_n", ["quidquid", "quicquid"]);
828
+ setNominalForm(data.forms, "voc_pl_m", ["quīquī"]);
829
+ setNominalForm(data.forms, "voc_pl_f", ["quaequae"]);
830
+ setNominalForm(data.forms, "voc_pl_n", ["quaequae"]);
831
+
832
+ data.voc = true;
833
+ } else {
834
+ throw Error(`Adjective '${args[0]}' not recognized`);
835
+ }
836
+ }],
837
+ ]);
838
+
839
+ function singularize(plural: string): string {
840
+ if (plural.match(/xes$/) || plural.match(/[cs]hes$/)) {
841
+ return plural.replace(/es$/, "");
842
+ } else {
843
+ return plural.replace(/s$/, "");
844
+ }
845
+ }