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

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 (43) 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 +498 -436
  13. package/dist/modules/declination/LaAdjData.js.map +1 -1
  14. package/dist/modules/declination/LaNominal.d.ts +10 -0
  15. package/dist/modules/declination/LaNominal.js +75 -72
  16. package/dist/modules/declination/LaNominal.js.map +1 -1
  17. package/dist/modules/declination/LaNounData.js +460 -421
  18. package/dist/modules/declination/LaNounData.js.map +1 -1
  19. package/dist/modules/declination/NominalForm.js +2 -2
  20. package/dist/modules/declination/NominalForm.js.map +1 -1
  21. package/dist/modules/headword/HeadwordParser.js +17 -17
  22. package/dist/modules/headword/HeadwordParser.js.map +1 -1
  23. package/package.json +8 -6
  24. package/src/LaEngine.ts +82 -0
  25. package/src/index.ts +16 -0
  26. package/src/modules/common.ts +164 -0
  27. package/src/modules/conjugation/LaVerb.ts +2490 -0
  28. package/src/modules/conjugation/VerbAffix.ts +18 -0
  29. package/src/modules/conjugation/VerbForm.ts +223 -0
  30. package/src/modules/conjugation/VerbType.ts +51 -0
  31. package/src/modules/declination/LaAdjData.ts +913 -0
  32. package/src/modules/declination/LaNominal.ts +1992 -0
  33. package/src/modules/declination/LaNounData.ts +896 -0
  34. package/src/modules/declination/LaPersonalPronoun.ts +77 -0
  35. package/src/modules/declination/NominalForm.ts +89 -0
  36. package/src/modules/headword/HeadWord.ts +132 -0
  37. package/src/modules/headword/HeadwordParser.ts +514 -0
  38. package/dist/modules/LaEngine.d.ts +0 -15
  39. package/dist/modules/LaEngine.js +0 -46
  40. package/dist/modules/LaEngine.js.map +0 -1
  41. package/dist/modules/LaWiktionary.d.ts +0 -18
  42. package/dist/modules/LaWiktionary.js +0 -171
  43. package/dist/modules/LaWiktionary.js.map +0 -1
@@ -0,0 +1,913 @@
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
+
391
+ if (!data.declOpts.suppressAdjPtcForms) {
392
+ setNominalForm(data.forms, "abl_sg_m", [stem2 + "e", stem2 + "ī"]);
393
+ data.notes.set("abl_sg_m2", "When used purely as an adjective.");
394
+ setNominalForm(data.forms, "abl_sg_n", [stem2 + "e", stem2 + "ī"]);
395
+ data.notes.set("abl_sg_n2", "When used purely as an adjective.");
396
+ } else {
397
+ setNominalForm(data.forms, "abl_sg_m", [stem2 + "ī"]);
398
+ setNominalForm(data.forms, "abl_sg_n", [stem2 + "ī"]);
399
+ }
400
+
401
+ if (!data.declOpts.suppressNonNeuterIStemAccIs) {
402
+ setNominalForm(data.forms, "acc_pl_m", [stem2 + "ēs", stem2 + "īs"]);
403
+ } else {
404
+ setNominalForm(data.forms, "acc_pl_m", [stem2 + "ēs"]);
405
+ }
406
+ }],
407
+ ["3-2", (data, args) => {
408
+ const singpos = singularize(data.pos);
409
+ if (data.gender) {
410
+ data.title = "third-declension " + singpos;
411
+ } else {
412
+ data.title = "third-declension two-termination " + singpos;
413
+ }
414
+
415
+ const stem = args[0];
416
+ const stem2 = args[1];
417
+
418
+ setNominalForm(data.forms, "nom_sg_m", [stem + "is"]);
419
+ setNominalForm(data.forms, "nom_sg_n", [stem + "e"]);
420
+ setNominalForm(data.forms, "nom_pl_m", [stem + "ēs"]);
421
+ setNominalForm(data.forms, "nom_pl_n", [stem + "ia"]);
422
+
423
+ setNominalForm(data.forms, "gen_sg_m", [stem + "is"]);
424
+ setNominalForm(data.forms, "gen_sg_n", [stem + "is"]);
425
+ setNominalForm(data.forms, "gen_pl_m", [stem + "ium"]);
426
+ setNominalForm(data.forms, "gen_pl_n", [stem + "ium"]);
427
+
428
+ setNominalForm(data.forms, "dat_sg_m", [stem + "ī"]);
429
+ setNominalForm(data.forms, "dat_sg_n", [stem + "ī"]);
430
+ setNominalForm(data.forms, "dat_pl_m", [stem + "ibus"]);
431
+ setNominalForm(data.forms, "dat_pl_n", [stem + "ibus"]);
432
+
433
+ setNominalForm(data.forms, "acc_sg_m", [stem + "em"]);
434
+ setNominalForm(data.forms, "acc_sg_n", [stem + "e"]);
435
+ if (!data.declOpts.suppressNonNeuterIStemAccIs) {
436
+ setNominalForm(data.forms, "acc_pl_m", [stem + "ēs", stem + "īs"]);
437
+ } else {
438
+ setNominalForm(data.forms, "acc_pl_m", [stem + "ēs"]);
439
+ }
440
+ setNominalForm(data.forms, "acc_pl_n", [stem + "ia"]);
441
+
442
+ setNominalForm(data.forms, "abl_sg_m", [stem + "ī"]);
443
+ setNominalForm(data.forms, "abl_sg_n", [stem + "ī"]);
444
+ setNominalForm(data.forms, "abl_pl_m", [stem + "ibus"]);
445
+ setNominalForm(data.forms, "abl_pl_n", [stem + "ibus"]);
446
+
447
+ setNominalForm(data.forms, "loc_sg_m", [stem + "ī"]);
448
+ setNominalForm(data.forms, "loc_sg_n", [stem + "ī"]);
449
+ setNominalForm(data.forms, "loc_pl_m", [stem + "ibus"]);
450
+ setNominalForm(data.forms, "loc_pl_n", [stem + "ibus"]);
451
+
452
+ setNominalForm(data.forms, "voc_sg_m", [stem + "is"]);
453
+ setNominalForm(data.forms, "voc_sg_n", [stem + "e"]);
454
+ setNominalForm(data.forms, "voc_pl_m", [stem + "ēs"]);
455
+ setNominalForm(data.forms, "voc_pl_n", [stem + "ia"]);
456
+
457
+ data.categories.push("Latin third declension " + data.pos);
458
+ data.categories.push("Latin third declension " + data.pos + " of two terminations");
459
+ }],
460
+ ["3-3", (data, args) => {
461
+ const singpos = singularize(data.pos);
462
+ if (data.gender) {
463
+ data.title = "third-declension " + singpos;
464
+ } else {
465
+ data.title = "third-declension three-termination " + singpos;
466
+ }
467
+
468
+ const stem1 = args[0];
469
+ const stem2 = args[1];
470
+
471
+ setNominalForm(data.forms, "nom_sg_m", [stem1]);
472
+ setNominalForm(data.forms, "nom_sg_f", [stem2 + "is"]);
473
+ setNominalForm(data.forms, "nom_sg_n", [stem2 + "e"]);
474
+ setNominalForm(data.forms, "nom_pl_m", [stem2 + "ēs"]);
475
+ setNominalForm(data.forms, "nom_pl_f", [stem2 + "ēs"]);
476
+ setNominalForm(data.forms, "nom_pl_n", [stem2 + "ia"]);
477
+
478
+ setNominalForm(data.forms, "gen_sg_m", [stem2 + "is"]);
479
+ setNominalForm(data.forms, "gen_sg_f", [stem2 + "is"]);
480
+ setNominalForm(data.forms, "gen_sg_n", [stem2 + "is"]);
481
+ setNominalForm(data.forms, "gen_pl_m", [stem2 + "ium"]);
482
+ setNominalForm(data.forms, "gen_pl_f", [stem2 + "ium"]);
483
+ setNominalForm(data.forms, "gen_pl_n", [stem2 + "ium"]);
484
+
485
+ setNominalForm(data.forms, "dat_sg_m", [stem2 + "ī"]);
486
+ setNominalForm(data.forms, "dat_sg_f", [stem2 + "ī"]);
487
+ setNominalForm(data.forms, "dat_sg_n", [stem2 + "ī"]);
488
+ setNominalForm(data.forms, "dat_pl_m", [stem2 + "ibus"]);
489
+ setNominalForm(data.forms, "dat_pl_f", [stem2 + "ibus"]);
490
+ setNominalForm(data.forms, "dat_pl_n", [stem2 + "ibus"]);
491
+
492
+ setNominalForm(data.forms, "acc_sg_m", [stem2 + "em"]);
493
+ setNominalForm(data.forms, "acc_sg_f", [stem2 + "em"]);
494
+ setNominalForm(data.forms, "acc_sg_n", [stem2 + "e"]);
495
+ setNominalForm(data.forms, "acc_pl_m", [stem2 + "ēs"]);
496
+ setNominalForm(data.forms, "acc_pl_f", [stem2 + "ēs"]);
497
+ setNominalForm(data.forms, "acc_pl_n", [stem2 + "ia"]);
498
+
499
+ setNominalForm(data.forms, "abl_sg_m", [stem2 + "ī"]);
500
+ setNominalForm(data.forms, "abl_sg_f", [stem2 + "ī"]);
501
+ setNominalForm(data.forms, "abl_sg_n", [stem2 + "ī"]);
502
+ setNominalForm(data.forms, "abl_pl_m", [stem2 + "ibus"]);
503
+ setNominalForm(data.forms, "abl_pl_f", [stem2 + "ibus"]);
504
+ setNominalForm(data.forms, "abl_pl_n", [stem2 + "ibus"]);
505
+
506
+ setNominalForm(data.forms, "loc_sg_m", [stem2 + "ī"]);
507
+ setNominalForm(data.forms, "loc_sg_f", [stem2 + "ī"]);
508
+ setNominalForm(data.forms, "loc_sg_n", [stem2 + "ī"]);
509
+ setNominalForm(data.forms, "loc_pl_m", [stem2 + "ibus"]);
510
+ setNominalForm(data.forms, "loc_pl_f", [stem2 + "ibus"]);
511
+ setNominalForm(data.forms, "loc_pl_n", [stem2 + "ibus"]);
512
+
513
+ setNominalForm(data.forms, "voc_sg_m", [stem1]);
514
+ setNominalForm(data.forms, "voc_sg_f", [stem2 + "is"]);
515
+ setNominalForm(data.forms, "voc_sg_n", [stem2 + "e"]);
516
+ setNominalForm(data.forms, "voc_pl_m", [stem2 + "ēs"]);
517
+ setNominalForm(data.forms, "voc_pl_f", [stem2 + "ēs"]);
518
+ setNominalForm(data.forms, "voc_pl_n", [stem2 + "ia"]);
519
+
520
+ data.categories.push("Latin third declension " + data.pos);
521
+ data.categories.push("Latin third declension " + data.pos + " of three terminations");
522
+ }],
523
+ ["irreg", (data, args) => {
524
+ if (args[0] == "duo" || args[0] == "ambō") {
525
+ const stem = args[0] == "duo" ? "du" : "amb";
526
+ data.title = (stem == "amb") ? "irregular adjective" : "numeral";
527
+ data.num = NumberTantum.Plural;
528
+
529
+ const stem_with_o = stem + (stem == "amb" ? "ō" : "o");
530
+ setNominalForm(data.forms, "nom_pl_m", [stem_with_o]);
531
+ setNominalForm(data.forms, "nom_pl_f", [stem + "ae"]);
532
+ setNominalForm(data.forms, "nom_pl_n", [stem_with_o]);
533
+
534
+ setNominalForm(data.forms, "gen_pl_m", [stem + "ōrum"]);
535
+ setNominalForm(data.forms, "gen_pl_f", [stem + "ārum"]);
536
+ setNominalForm(data.forms, "gen_pl_n", [stem + "ōrum"]);
537
+
538
+ setNominalForm(data.forms, "dat_pl_m", [stem + "ōbus"]);
539
+ setNominalForm(data.forms, "dat_pl_f", [stem + "ābus"]);
540
+ setNominalForm(data.forms, "dat_pl_n", [stem + "ōbus"]);
541
+
542
+ setNominalForm(data.forms, "acc_pl_m", [stem + "ōs", stem_with_o]);
543
+ setNominalForm(data.forms, "acc_pl_f", [stem + "ās"]);
544
+ setNominalForm(data.forms, "acc_pl_n", [stem_with_o]);
545
+
546
+ setNominalForm(data.forms, "abl_pl_m", [stem + "ōbus"]);
547
+ setNominalForm(data.forms, "abl_pl_f", [stem + "ābus"]);
548
+ setNominalForm(data.forms, "abl_pl_n", [stem + "ōbus"]);
549
+
550
+ setNominalForm(data.forms, "voc_pl_m", [stem_with_o]);
551
+ setNominalForm(data.forms, "voc_pl_f", [stem + "ae"]);
552
+ setNominalForm(data.forms, "voc_pl_n", [stem_with_o]);
553
+
554
+ if (stem == "du") {
555
+ data.footnote = "Note: The genitive masculine and neuter can also be found in the contracted form 'duum' (also spelt 'duûm').";
556
+ }
557
+ } else if (args[0] == "mīlle") {
558
+ data.title = "semi-indeclinable numeral";
559
+ setNominalForm(data.forms, "nom_sg_m", ["mīlle"]);
560
+ setNominalForm(data.forms, "nom_pl_m", ["mīlia", "mīllia"]);
561
+
562
+ setNominalForm(data.forms, "gen_sg_m", ["mīlle"]);
563
+ setNominalForm(data.forms, "gen_pl_m", ["mīlium", "mīllium"]);
564
+
565
+ setNominalForm(data.forms, "dat_sg_m", ["mīlle"]);
566
+ setNominalForm(data.forms, "dat_pl_m", ["mīlibus", "mīllibus"]);
567
+
568
+ setNominalForm(data.forms, "acc_sg_m", ["mīlle"]);
569
+ setNominalForm(data.forms, "acc_pl_m", ["mīlia", "mīllia"]);
570
+
571
+ setNominalForm(data.forms, "abl_sg_m", ["mīlle"]);
572
+ setNominalForm(data.forms, "abl_pl_m", ["mīlibus", "mīllibus"]);
573
+
574
+ setNominalForm(data.forms, "voc_sg_m", ["mīlle"]);
575
+ setNominalForm(data.forms, "voc_pl_m", ["mīlia", "mīllia"]);
576
+ } else if (args[0] == "illic") {
577
+ data.title = "demonstrative pronoun";
578
+ setNominalForm(data.forms, "nom_sg_m", ["illic"]);
579
+ setNominalForm(data.forms, "nom_sg_f", ["illaec"]);
580
+ setNominalForm(data.forms, "nom_sg_n", ["illuc", "illoc"]);
581
+ setNominalForm(data.forms, "nom_pl_n", ["illaec"]);
582
+
583
+ setNominalForm(data.forms, "nom_sg_m", ["illunc"]);
584
+ setNominalForm(data.forms, "nom_sg_f", ["illanc"]);
585
+ setNominalForm(data.forms, "nom_sg_n", ["illuc", "illoc"]);
586
+ setNominalForm(data.forms, "nom_pl_n", ["illaec"]);
587
+
588
+ setNominalForm(data.forms, "abl_sg_m", ["illōc"]);
589
+ setNominalForm(data.forms, "abl_sg_f", ["illāc"]);
590
+ setNominalForm(data.forms, "abl_sg_n", ["illōc"]);
591
+
592
+ data.voc = false;
593
+
594
+ } else if (args[0] == "plūs") {
595
+ data.title = "irregular third-declension comparative adjective";
596
+
597
+ setNominalForm(data.forms, "nom_sg_m", [""]);
598
+ setNominalForm(data.forms, "nom_sg_n", ["plūs"]);
599
+ setNominalForm(data.forms, "nom_pl_m", ["plūrēs"]);
600
+ setNominalForm(data.forms, "nom_pl_n", ["plūra"]);
601
+
602
+ setNominalForm(data.forms, "gen_sg_m", [""]);
603
+ setNominalForm(data.forms, "gen_sg_n", ["plūris"]);
604
+ setNominalForm(data.forms, "gen_pl_m", ["plūrium"]);
605
+ setNominalForm(data.forms, "gen_pl_n", ["plūrium"]);
606
+
607
+ setNominalForm(data.forms, "dat_sg_m", [""]);
608
+ setNominalForm(data.forms, "dat_sg_n", [""]);
609
+ setNominalForm(data.forms, "dat_pl_m", ["plūribus"]);
610
+ setNominalForm(data.forms, "dat_pl_n", ["plūribus"]);
611
+
612
+ setNominalForm(data.forms, "acc_sg_m", [""]);
613
+ setNominalForm(data.forms, "acc_sg_n", ["plūs"]);
614
+ setNominalForm(data.forms, "acc_pl_m", ["plūrēs"]);
615
+ setNominalForm(data.forms, "acc_pl_n", ["plūra"]);
616
+
617
+ setNominalForm(data.forms, "abl_sg_m", [""]);
618
+ setNominalForm(data.forms, "abl_sg_n", ["plūre"]);
619
+ setNominalForm(data.forms, "abl_pl_m", ["plūribus"]);
620
+ setNominalForm(data.forms, "abl_pl_n", ["plūribus"]);
621
+
622
+ setNominalForm(data.forms, "voc_sg_m", [""]);
623
+ setNominalForm(data.forms, "voc_sg_n", ["plūs"]);
624
+ setNominalForm(data.forms, "voc_pl_m", ["plūrēs"]);
625
+ setNominalForm(data.forms, "voc_pl_n", ["plūra"]);
626
+
627
+ data.footnote = "Note: Singular forms take the genitive of the whole and do not function as adjectives.";
628
+ data.categories.push("Latin third declension " + data.pos);
629
+ data.categories.push("Latin third declension " + data.pos + " of one termination");
630
+ } else if (args[0] == "is" || args[0] == "īdem") {
631
+ data.title = "demonstrative pronoun";
632
+ 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.";
633
+ 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).";
634
+
635
+ if (!data.declOpts.suppressRareIrregForms) {
636
+ setNominalForm(data.forms, "nom_pl_m", ["ī", "iī", "eī"]);
637
+ data.notes.set("nom_pl_m1", note2);
638
+
639
+ setNominalForm(data.forms, "dat_sg_m", ["ei", "ēī"]);
640
+ data.notes.set("dat_sg_m1", note1);
641
+ setNominalForm(data.forms, "dat_sg_f", ["ei", "ēī"]);
642
+ data.notes.set("dat_sg_f1", note1);
643
+ setNominalForm(data.forms, "dat_sg_n", ["ei", "ēī"]);
644
+ data.notes.set("dat_sg_n1", note1);
645
+ setNominalForm(data.forms, "dat_pl_m", ["īs", "iīs", "eīs"]);
646
+ data.notes.set("dat_pl_m1", note2);
647
+ setNominalForm(data.forms, "dat_pl_f", ["īs", "iīs", "eīs"]);
648
+ data.notes.set("dat_pl_f1", note2);
649
+ setNominalForm(data.forms, "dat_pl_n", ["īs", "iīs", "eīs"]);
650
+ data.notes.set("dat_pl_n1", note2);
651
+
652
+ setNominalForm(data.forms, "abl_pl_m", ["īs", "iīs", "eīs"]);
653
+ data.notes.set("abl_pl_m1", note2);
654
+ setNominalForm(data.forms, "abl_pl_f", ["īs", "iīs", "eīs"]);
655
+ data.notes.set("abl_pl_f1", note2);
656
+ setNominalForm(data.forms, "abl_pl_n", ["īs", "iīs", "eīs"]);
657
+ data.notes.set("abl_pl_n1", note2);
658
+ } else {
659
+ setNominalForm(data.forms, "nom_pl_m", ["iī"]);
660
+ setNominalForm(data.forms, "dat_sg_m", ["eī"]);
661
+ setNominalForm(data.forms, "dat_sg_f", ["eī"]);
662
+ setNominalForm(data.forms, "dat_sg_n", ["eī"]);
663
+ setNominalForm(data.forms, "dat_pl_m", ["iīs"]);
664
+ setNominalForm(data.forms, "dat_pl_f", ["iīs"]);
665
+ setNominalForm(data.forms, "dat_pl_n", ["iīs"]);
666
+ setNominalForm(data.forms, "abl_pl_m", ["iīs"]);
667
+ setNominalForm(data.forms, "abl_pl_f", ["iīs"]);
668
+ setNominalForm(data.forms, "abl_pl_n", ["iīs"]);
669
+ }
670
+
671
+ setNominalForm(data.forms, "nom_sg_m", ["is"]);
672
+ setNominalForm(data.forms, "nom_sg_f", ["ea"]);
673
+ setNominalForm(data.forms, "nom_sg_n", ["id"]);
674
+ setNominalForm(data.forms, "nom_pl_f", ["eae"]);
675
+ setNominalForm(data.forms, "nom_pl_n", ["ea"]);
676
+
677
+ setNominalForm(data.forms, "gen_sg_m", ["eius"]);
678
+ setNominalForm(data.forms, "gen_sg_f", ["eius"]);
679
+ setNominalForm(data.forms, "gen_sg_n", ["eius"]);
680
+ setNominalForm(data.forms, "gen_pl_m", ["eōrum"]);
681
+ setNominalForm(data.forms, "gen_pl_f", ["eārum"]);
682
+ setNominalForm(data.forms, "gen_pl_n", ["eōrum"]);
683
+
684
+ setNominalForm(data.forms, "acc_sg_m", ["eum"]);
685
+ setNominalForm(data.forms, "acc_sg_f", ["eam"]);
686
+ setNominalForm(data.forms, "acc_sg_n", ["id"]);
687
+ setNominalForm(data.forms, "acc_pl_m", ["eōs"]);
688
+ setNominalForm(data.forms, "acc_pl_f", ["eās"]);
689
+ setNominalForm(data.forms, "acc_pl_n", ["ea"]);
690
+
691
+ setNominalForm(data.forms, "abl_sg_m", ["eō"]);
692
+ setNominalForm(data.forms, "abl_sg_f", ["eā"]);
693
+ setNominalForm(data.forms, "abl_sg_n", ["eō"]);
694
+
695
+ data.voc = false;
696
+
697
+ if (args[0] == "īdem") {
698
+ setNominalForm(data.forms, "nom_sg_m", ["ī"]);
699
+ setNominalForm(data.forms, "nom_sg_n", ["i"]);
700
+ setNominalForm(data.forms, "nom_pl_m", ["ī"]);
701
+
702
+ if (!data.declOpts.suppressRareIrregForms) {
703
+ setNominalForm(data.forms, "gen_pl_m", ["eōrun", "eōrum"]);
704
+ setNominalForm(data.forms, "gen_pl_f", ["eārun", "eārum"]);
705
+ setNominalForm(data.forms, "gen_pl_n", ["eōrun", "eōrum"]);
706
+ setNominalForm(data.forms, "acc_sg_m", ["eun", "eum"]);
707
+ setNominalForm(data.forms, "acc_sg_f", ["ean", "eam"]);
708
+ } else {
709
+ setNominalForm(data.forms, "gen_pl_m", ["eōrun"]);
710
+ setNominalForm(data.forms, "gen_pl_f", ["eārun"]);
711
+ setNominalForm(data.forms, "gen_pl_n", ["eōrun"]);
712
+ setNominalForm(data.forms, "acc_sg_m", ["eun"]);
713
+ setNominalForm(data.forms, "acc_sg_f", ["ean"]);
714
+ }
715
+ setNominalForm(data.forms, "acc_sg_n", ["i"]);
716
+ }
717
+ } else if (args[0] == "ille") {
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, ["ill"]);
725
+
726
+ data.title = "demonstrative pronoun";
727
+
728
+ setNominalForm(data.forms, "nom_sg_m", ["ille"]);
729
+ setNominalForm(data.forms, "nom_sg_n", ["illud"]);
730
+
731
+ setNominalForm(data.forms, "acc_sg_n", ["illud"]);
732
+
733
+ data.voc = false;
734
+ data.categories = [];
735
+ } else if (args[0] == "iste") {
736
+ data.types.add("ius");
737
+ const d = m_adj_decl.get("1&2");
738
+ if (!d) {
739
+ throw Error("Decl 1&2 not ready");
740
+ }
741
+
742
+ d(data, ["ist"]);
743
+
744
+ data.title = "demonstrative pronoun";
745
+
746
+ setNominalForm(data.forms, "nom_sg_m", ["iste"]);
747
+ setNominalForm(data.forms, "nom_sg_n", ["istud"]);
748
+
749
+ setNominalForm(data.forms, "acc_sg_n", ["istud"]);
750
+
751
+ data.voc = false;
752
+
753
+ data.categories = [];
754
+ } else if (args[0] == "ipse") {
755
+ data.types.add("ius");
756
+ const d = m_adj_decl.get("1&2");
757
+ if (!d) {
758
+ throw Error("Decl 1&2 not ready");
759
+ }
760
+
761
+ d(data, ["ips"]);
762
+
763
+ data.title = "demonstrative pronoun";
764
+
765
+ setNominalForm(data.forms, "nom_sg_m", ["ipse"]);
766
+ setNominalForm(data.forms, "nom_sg_n", ["ipsum"]);
767
+
768
+ setNominalForm(data.forms, "acc_sg_n", ["ipsum"]);
769
+
770
+ data.voc = false;
771
+
772
+ data.categories = [];
773
+ } else if (args[0] == "quis" || args[0] == "quī") {
774
+ let id = "id";
775
+
776
+ if (args[0] == "quī") {
777
+ id = "od";
778
+ setNominalForm(data.forms, "acc_sg_f", ["quam"]);
779
+ setNominalForm(data.forms, "abl_sg_f", ["quā"]);
780
+ } else {
781
+ setNominalForm(data.forms, "acc_sg_f", ["quem"]);
782
+ setNominalForm(data.forms, "abl_sg_f", ["quō"]);
783
+ }
784
+ data.title = "relative/interrogative pronoun";
785
+
786
+ setNominalForm(data.forms, "nom_sg_m", ["quis"]);
787
+ setNominalForm(data.forms, "nom_sg_f", ["quis", "quae"]);
788
+ setNominalForm(data.forms, "nom_sg_n", ["qu" + id]);
789
+ setNominalForm(data.forms, "nom_pl_m", ["quī"]);
790
+ setNominalForm(data.forms, "nom_pl_f", ["quae"]);
791
+ setNominalForm(data.forms, "nom_pl_n", ["quae"]);
792
+
793
+ setNominalForm(data.forms, "gen_sg_m", ["cuius"]);
794
+ setNominalForm(data.forms, "gen_sg_f", ["cuius"]);
795
+ setNominalForm(data.forms, "gen_sg_n", ["cuius"]);
796
+ setNominalForm(data.forms, "gen_pl_m", ["quōrum"]);
797
+ setNominalForm(data.forms, "gen_pl_f", ["quārum"]);
798
+ setNominalForm(data.forms, "gen_pl_n", ["quōrum"]);
799
+
800
+ setNominalForm(data.forms, "dat_sg_m", ["cui"]);
801
+ setNominalForm(data.forms, "dat_sg_f", ["cui"]);
802
+ setNominalForm(data.forms, "dat_sg_n", ["cui"]);
803
+ if (!data.declOpts.suppressRareIrregForms) {
804
+ setNominalForm(data.forms, "dat_pl_m", ["quibus", "quīs"]);
805
+ setNominalForm(data.forms, "dat_pl_f", ["quibus", "quīs"]);
806
+ setNominalForm(data.forms, "dat_pl_n", ["quibus", "quīs"]);
807
+
808
+ setNominalForm(data.forms, "abl_pl_m", ["quibus", "quīs"]);
809
+ setNominalForm(data.forms, "abl_pl_f", ["quibus", "quīs"]);
810
+ setNominalForm(data.forms, "abl_pl_n", ["quibus", "quīs"]);
811
+ } else {
812
+ setNominalForm(data.forms, "dat_pl_m", ["quibus"]);
813
+ setNominalForm(data.forms, "dat_pl_f", ["quibus"]);
814
+ setNominalForm(data.forms, "dat_pl_n", ["quibus"]);
815
+
816
+ setNominalForm(data.forms, "abl_pl_m", ["quibus"]);
817
+ setNominalForm(data.forms, "abl_pl_f", ["quibus"]);
818
+ setNominalForm(data.forms, "abl_pl_n", ["quibus"]);
819
+ }
820
+
821
+ setNominalForm(data.forms, "acc_sg_m", ["quem"]);
822
+ setNominalForm(data.forms, "acc_sg_n", ["qu" + id]);
823
+ setNominalForm(data.forms, "acc_pl_m", ["quōs"]);
824
+ setNominalForm(data.forms, "acc_pl_f", ["quās"]);
825
+ setNominalForm(data.forms, "acc_pl_n", ["quae"]);
826
+
827
+ setNominalForm(data.forms, "abl_sg_m", ["quō"]);
828
+ setNominalForm(data.forms, "abl_sg_n", ["quō"]);
829
+
830
+ data.voc = false;
831
+
832
+ if (args[0] == "quī") {
833
+ setNominalForm(data.forms, "nom_sg_m", ["quī"]);
834
+ setNominalForm(data.forms, "nom_sg_f", ["quae"]);
835
+ }
836
+ } else if (args[0] == "quisquis") {
837
+ data.title = "relative/interrogative pronoun";
838
+ setNominalForm(data.forms, "nom_sg_m", ["quisquis"]);
839
+ setNominalForm(data.forms, "nom_sg_f", ["quisquis"]);
840
+ if (!data.declOpts.suppressRareIrregForms) {
841
+ setNominalForm(data.forms, "nom_sg_n", ["quidquid", "quicquid"]);
842
+
843
+ setNominalForm(data.forms, "dat_pl_m", ["quibusquibus", "quīsquīs"]);
844
+ setNominalForm(data.forms, "dat_pl_f", ["quibusquibus", "quīsquīs"]);
845
+ setNominalForm(data.forms, "dat_pl_n", ["quibusquibus", "quīsquīs"]);
846
+
847
+ setNominalForm(data.forms, "acc_sg_n", ["quidquid", "quicquid"]);
848
+
849
+ setNominalForm(data.forms, "abl_pl_m", ["quibusquibus", "quīsquīs"]);
850
+ setNominalForm(data.forms, "abl_pl_f", ["quibusquibus", "quīsquīs"]);
851
+ setNominalForm(data.forms, "abl_pl_n", ["quibusquibus", "quīsquīs"]);
852
+
853
+ setNominalForm(data.forms, "voc_sg_n", ["quidquid", "quicquid"]);
854
+ } else {
855
+ setNominalForm(data.forms, "nom_sg_n", ["quidquid"]);
856
+
857
+ setNominalForm(data.forms, "dat_pl_m", ["quibusquibus"]);
858
+ setNominalForm(data.forms, "dat_pl_f", ["quibusquibus"]);
859
+ setNominalForm(data.forms, "dat_pl_n", ["quibusquibus"]);
860
+
861
+ setNominalForm(data.forms, "acc_sg_n", ["quidquid"]);
862
+
863
+ setNominalForm(data.forms, "abl_pl_m", ["quibusquibus"]);
864
+ setNominalForm(data.forms, "abl_pl_f", ["quibusquibus"]);
865
+ setNominalForm(data.forms, "abl_pl_n", ["quibusquibus"]);
866
+
867
+ setNominalForm(data.forms, "voc_sg_n", ["quidquid"]);
868
+ }
869
+ setNominalForm(data.forms, "nom_pl_m", ["quīquī"]);
870
+ setNominalForm(data.forms, "nom_pl_f", ["quaequae"]);
871
+ setNominalForm(data.forms, "nom_pl_n", ["quaequae"]);
872
+
873
+ setNominalForm(data.forms, "gen_sg_m", ["cuiuscuius"]);
874
+ setNominalForm(data.forms, "gen_sg_f", ["cuiuscuius"]);
875
+ setNominalForm(data.forms, "gen_sg_n", ["cuiuscuius"]);
876
+ setNominalForm(data.forms, "gen_pl_m", ["quōrumquōrum"]);
877
+ setNominalForm(data.forms, "gen_pl_f", ["quārumquārum"]);
878
+ setNominalForm(data.forms, "gen_pl_n", ["quōrumquōrum"]);
879
+
880
+ setNominalForm(data.forms, "dat_sg_m", ["cuicui"]);
881
+ setNominalForm(data.forms, "dat_sg_f", ["cuicui"]);
882
+ setNominalForm(data.forms, "dat_sg_n", ["cuicui"]);
883
+
884
+ setNominalForm(data.forms, "acc_sg_m", ["quemquem"]);
885
+ setNominalForm(data.forms, "acc_sg_f", ["quamquam"]);
886
+ setNominalForm(data.forms, "acc_pl_m", ["quōsquōs"]);
887
+ setNominalForm(data.forms, "acc_pl_f", ["quāsquās"]);
888
+ setNominalForm(data.forms, "acc_pl_n", ["quaequae"]);
889
+
890
+ setNominalForm(data.forms, "abl_sg_m", ["quōquō"]);
891
+ setNominalForm(data.forms, "abl_sg_f", ["quāquā"]);
892
+ setNominalForm(data.forms, "abl_sg_n", ["quōquō"]);
893
+
894
+ setNominalForm(data.forms, "voc_sg_m", ["quisquis"]);
895
+ setNominalForm(data.forms, "voc_sg_f", ["quisquis"]);
896
+ setNominalForm(data.forms, "voc_pl_m", ["quīquī"]);
897
+ setNominalForm(data.forms, "voc_pl_f", ["quaequae"]);
898
+ setNominalForm(data.forms, "voc_pl_n", ["quaequae"]);
899
+
900
+ data.voc = true;
901
+ } else {
902
+ throw Error(`Adjective '${args[0]}' not recognized`);
903
+ }
904
+ }],
905
+ ]);
906
+
907
+ function singularize(plural: string): string {
908
+ if (plural.match(/xes$/) || plural.match(/[cs]hes$/)) {
909
+ return plural.replace(/es$/, "");
910
+ } else {
911
+ return plural.replace(/s$/, "");
912
+ }
913
+ }