@fpw/en-wiktionary-la-modules 0.1.2 → 0.1.5

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 (30) hide show
  1. package/dist/modules/conjugation/LaVerb.d.ts +3 -1
  2. package/dist/modules/conjugation/LaVerb.js +201 -32
  3. package/dist/modules/conjugation/LaVerb.js.map +1 -1
  4. package/dist/modules/conjugation/VerbType.d.ts +5 -1
  5. package/dist/modules/conjugation/VerbType.js +4 -0
  6. package/dist/modules/conjugation/VerbType.js.map +1 -1
  7. package/dist/modules/declination/LaAdjData.d.ts +1 -1
  8. package/dist/modules/declination/LaAdjData.js +45 -24
  9. package/dist/modules/declination/LaAdjData.js.map +1 -1
  10. package/dist/modules/declination/LaNominal.d.ts +9 -5
  11. package/dist/modules/declination/LaNominal.js +195 -171
  12. package/dist/modules/declination/LaNominal.js.map +1 -1
  13. package/dist/modules/declination/LaNounData.js +65 -64
  14. package/dist/modules/declination/LaNounData.js.map +1 -1
  15. package/dist/modules/declination/LaPersonalPronoun.js +1 -0
  16. package/dist/modules/declination/LaPersonalPronoun.js.map +1 -1
  17. package/dist/modules/declination/NominalType.d.ts +116 -0
  18. package/dist/modules/declination/NominalType.js +142 -0
  19. package/dist/modules/declination/NominalType.js.map +1 -0
  20. package/dist/modules/headword/HeadwordParser.js +2 -1
  21. package/dist/modules/headword/HeadwordParser.js.map +1 -1
  22. package/package.json +1 -1
  23. package/src/modules/conjugation/LaVerb.ts +206 -35
  24. package/src/modules/conjugation/VerbType.ts +4 -0
  25. package/src/modules/declination/LaAdjData.ts +47 -24
  26. package/src/modules/declination/LaNominal.ts +223 -187
  27. package/src/modules/declination/LaNounData.ts +67 -66
  28. package/src/modules/declination/LaPersonalPronoun.ts +1 -0
  29. package/src/modules/declination/NominalType.ts +153 -0
  30. package/src/modules/headword/HeadwordParser.ts +2 -1
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@fpw/en-wiktionary-la-modules",
3
3
  "author": "Folke Will",
4
4
  "license": "CC-BY-SA-3.0",
5
- "version": "0.1.2",
5
+ "version": "0.1.5",
6
6
  "description": "Reimplementation of some Latin modules of en.wikipedia.org, especially inflections",
7
7
  "repository": {
8
8
  "type": "git",
@@ -5,7 +5,7 @@
5
5
  * A few new options to suppress certain rate forms were added.
6
6
  *
7
7
  * Original source: https://en.wiktionary.org/wiki/Module:la-verb
8
- * Based on version: https://en.wiktionary.org/w/index.php?title=Module:la-verb&oldid=63102127
8
+ * Based on version: https://en.wiktionary.org/w/index.php?title=Module:la-verb&oldid=67964189
9
9
  *
10
10
  * Lua idioms, function and variable names kept as in the original in order to easily
11
11
  * backport later changes to this implementation.
@@ -41,6 +41,9 @@ export interface ConjOptions {
41
41
  // suppress poetic forms that are set using options like poetsyncperf
42
42
  suppressPoet?: boolean;
43
43
 
44
+ // suppress archaic forms
45
+ suppressArchaic?: boolean;
46
+
44
47
  // use short i in perfect infinitive of īre (iisse vs īsse)
45
48
  ireWithShortPerfInf?: boolean;
46
49
 
@@ -135,6 +138,7 @@ export class LaVerb {
135
138
  "np",
136
139
  "highlydef",
137
140
  "sigm",
141
+ "sigmpasv",
138
142
  ]);
139
143
 
140
144
  private static potential_lemma_slots = [
@@ -264,6 +268,7 @@ export class LaVerb {
264
268
  this.override(data, args);
265
269
  this.set_linked_forms(data, typeinfo);
266
270
  this.add_prefix_suffix(data);
271
+ this.notes_override(data, args);
267
272
 
268
273
  return {
269
274
  templateType: "conjugation",
@@ -349,6 +354,72 @@ export class LaVerb {
349
354
  }
350
355
  this.make_pres_3rd(data, typeinfo, typeinfo.pres_stem);
351
356
  this.make_perf_and_supine(data, typeinfo);
357
+
358
+ if (typeinfo.pres_stem.match(/nōsc/) && !this.options.suppressArchaic) {
359
+ const sub = (str: string, x: number, y: number) => {
360
+ return str.substring(x - 1, str.length + y + 1);
361
+ };
362
+ this.add_form(data, "2s_perf_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "stī", 2);
363
+ this.add_form(data, "1p_perf_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "mus", 2);
364
+ this.add_form(data, "2p_perf_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "stis", 2);
365
+ this.add_form(data, "3p_perf_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "runt", 3);
366
+ this.add_form(data, "1s_plup_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "ram", 2);
367
+ this.add_form(data, "2s_plup_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "rās", 2);
368
+ this.add_form(data, "3s_plup_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "rat", 2);
369
+ this.add_form(data, "1p_plup_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "rāmus", 2);
370
+ this.add_form(data, "2p_plup_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "rātis", 2);
371
+ this.add_form(data, "3p_plup_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "rant", 2);
372
+ this.add_form(data, "1s_futp_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "rō", 2);
373
+ this.add_form(data, "2s_futp_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "ris", 2);
374
+ this.add_form(data, "3s_futp_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "rit", 2);
375
+ this.add_form(data, "1p_futp_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "rimus", 2);
376
+ this.add_form(data, "2p_futp_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "ritis", 2);
377
+ this.add_form(data, "3p_futp_actv_indc", "", sub(typeinfo.perf_stem[0], 1, -2) + "rint", 2);
378
+ this.add_form(data, "1s_perf_actv_subj", "", sub(typeinfo.perf_stem[0], 1, -2) + "rim", 2);
379
+ this.add_form(data, "2s_perf_actv_subj", "", sub(typeinfo.perf_stem[0], 1, -2) + "rīs", 2);
380
+ this.add_form(data, "3s_perf_actv_subj", "", sub(typeinfo.perf_stem[0], 1, -2) + "rit", 2);
381
+ this.add_form(data, "1p_perf_actv_subj", "", sub(typeinfo.perf_stem[0], 1, -2) + "rīmus", 2);
382
+ this.add_form(data, "2p_perf_actv_subj", "", sub(typeinfo.perf_stem[0], 1, -2) + "rītis", 2);
383
+ this.add_form(data, "3p_perf_actv_subj", "", sub(typeinfo.perf_stem[0], 1, -2) + "rint", 2);
384
+ this.add_form(data, "1s_plup_actv_subj", "", sub(typeinfo.perf_stem[0], 1, -2) + "ssem", 2);
385
+ this.add_form(data, "2s_plup_actv_subj", "", sub(typeinfo.perf_stem[0], 1, -2) + "ssēs", 2);
386
+ this.add_form(data, "3s_plup_actv_subj", "", sub(typeinfo.perf_stem[0], 1, -2) + "sset", 2);
387
+ this.add_form(data, "1p_plup_actv_subj", "", sub(typeinfo.perf_stem[0], 1, -2) + "ssēmus", 2);
388
+ this.add_form(data, "2p_plup_actv_subj", "", sub(typeinfo.perf_stem[0], 1, -2) + "ssētis", 2);
389
+ this.add_form(data, "3p_plup_actv_subj", "", sub(typeinfo.perf_stem[0], 1, -2) + "ssent", 2);
390
+ this.add_form(data, "perf_actv_inf", "", sub(typeinfo.perf_stem[0], 1, -2) + "sse", 2);
391
+
392
+ const note = "The verb \"nōscō\" and its compounds frequently drop the syllables \"vi\" and \"ve\" from their perfect, pluperfect and future perfect conjugations.";
393
+ data.footnotes.set("2s_perf_actv_indc", [note]);
394
+ data.footnotes.set("1p_perf_actv_indc", [note]);
395
+ data.footnotes.set("2p_perf_actv_indc", [note]);
396
+ data.footnotes.set("3p_perf_actv_indc", [note]);
397
+ data.footnotes.set("1s_plup_actv_indc", [note]);
398
+ data.footnotes.set("2s_plup_actv_indc", [note]);
399
+ data.footnotes.set("3s_plup_actv_indc", [note]);
400
+ data.footnotes.set("1p_plup_actv_indc", [note]);
401
+ data.footnotes.set("2p_plup_actv_indc", [note]);
402
+ data.footnotes.set("3p_plup_actv_indc", [note]);
403
+ data.footnotes.set("1s_futp_actv_indc", [note]);
404
+ data.footnotes.set("2s_futp_actv_indc", [note]);
405
+ data.footnotes.set("3s_futp_actv_indc", [note]);
406
+ data.footnotes.set("1p_futp_actv_indc", [note]);
407
+ data.footnotes.set("2p_futp_actv_indc", [note]);
408
+ data.footnotes.set("3p_futp_actv_indc", [note]);
409
+ data.footnotes.set("1s_perf_actv_subj", [note]);
410
+ data.footnotes.set("2s_perf_actv_subj", [note]);
411
+ data.footnotes.set("3s_perf_actv_subj", [note]);
412
+ data.footnotes.set("1p_perf_actv_subj", [note]);
413
+ data.footnotes.set("2p_perf_actv_subj", [note]);
414
+ data.footnotes.set("3p_perf_actv_subj", [note]);
415
+ data.footnotes.set("1s_plup_actv_subj", [note]);
416
+ data.footnotes.set("2s_plup_actv_subj", [note]);
417
+ data.footnotes.set("3s_plup_actv_subj", [note]);
418
+ data.footnotes.set("1p_plup_actv_subj", [note]);
419
+ data.footnotes.set("2p_plup_actv_subj", [note]);
420
+ data.footnotes.set("3p_plup_actv_subj", [note]);
421
+ data.footnotes.set("perf_actv_inf", [note]);
422
+ }
352
423
  });
353
424
 
354
425
  this.conjugations.set("3rd-io", (args: ArgMap, data: ConjugationData, typeinfo: ConjugationInfo) => {
@@ -389,7 +460,6 @@ export class LaVerb {
389
460
  this.make_perf_and_supine(data, typeinfo);
390
461
 
391
462
  if (!this.options.suppressPoet) {
392
- // guard added by @fpw
393
463
  if (this.form_contains(getVerbForm(data.forms, "1s_pres_actv_indc"), "serviō") || this.form_contains(getVerbForm(data.forms, "1s_pres_actv_indc"), "saeviō")) {
394
464
  this.add_forms(data, "impf_actv_indc", typeinfo.pres_stem,
395
465
  ["iēbam", "ībam"],
@@ -605,6 +675,10 @@ export class LaVerb {
605
675
  }
606
676
  }
607
677
 
678
+ if (orig_lemma.startsWith("-")) {
679
+ addVerbType(subtypes, "suffix");
680
+ }
681
+
608
682
  let conjtype: ConjType;
609
683
  let base = "";
610
684
  let auto_perf = "";
@@ -617,11 +691,20 @@ export class LaVerb {
617
691
  ["ō", []],
618
692
  ["or", ["depon"]],
619
693
  ["at", ["impers"]],
620
- ["ātur", ["depon", "impers"]]
694
+ ["ātur", ["depon", "impers"]],
695
+ ["ī", ["perfaspres"]]
621
696
  ]));
622
697
  if (auto_perf_supine) {
623
- auto_perf = base + "āv";
624
- auto_supine = base + "āt";
698
+ if (hasVerbType(subtypes, "perfaspres")) {
699
+ auto_perf = base;
700
+ } else {
701
+ auto_perf = base + "āv";
702
+ auto_supine = base + "āt";
703
+ }
704
+ if (hasVerbType(subtypes, "suffix")) {
705
+ addVerbType(subtypes, "p3inf");
706
+ addVerbType(subtypes, "sigmpasv");
707
+ }
625
708
  }
626
709
  } else if (conj_arg == "2") {
627
710
  conjtype = "2nd";
@@ -629,11 +712,19 @@ export class LaVerb {
629
712
  ["eō", []],
630
713
  ["eor", ["depon"]],
631
714
  ["et", ["impers"]],
632
- ["ētur", ["depon", "impers"]]
715
+ ["ētur", ["depon", "impers"]],
716
+ ["ī", ["perfaspres"]]
633
717
  ]));
634
718
  if (auto_perf_supine) {
635
- auto_perf = base + "u";
636
- auto_supine = base + "it";
719
+ if (hasVerbType(subtypes, "perfaspres")) {
720
+ auto_perf = base;
721
+ } else {
722
+ auto_perf = base + "u";
723
+ auto_supine = base + "it";
724
+ }
725
+ }
726
+ if (hasVerbType(subtypes, "suffix")) {
727
+ addVerbType(subtypes, "sigmpasv");
637
728
  }
638
729
  } else if (conj_arg == "3") {
639
730
  [base, detected_subtypes] = this.get_subtype_by_ending(lemma, "", subtypes, new Map([
@@ -647,7 +738,8 @@ export class LaVerb {
647
738
  ["ō", []],
648
739
  ["or", ["depon"]],
649
740
  ["it", ["impers"]],
650
- ["itur", ["depon", "impers"]]
741
+ ["itur", ["depon", "impers"]],
742
+ ["ī", ["perfaspres"]],
651
743
  ]));
652
744
  if (hasVerbType(subtypes, "I")) {
653
745
  conjtype = "3rd-io";
@@ -655,26 +747,36 @@ export class LaVerb {
655
747
  conjtype = "3rd";
656
748
  }
657
749
  }
750
+ if (hasVerbType(subtypes, "perfaspres")) {
751
+ auto_perf = base;
752
+ }
753
+ if (hasVerbType(subtypes, "suffix")) {
754
+ auto_perf = "-";
755
+ auto_supine = "-";
756
+ addVerbType(subtypes, "sigmpasv");
757
+ }
658
758
  } else if (conj_arg == "4") {
659
759
  conjtype = "4th";
660
760
  [base, detected_subtypes] = this.get_subtype_by_ending(lemma, "4", subtypes, new Map([
661
761
  ["iō", []],
662
762
  ["ior", ["depon"]],
663
763
  ["it", ["impers"]],
664
- ["ītur", ["depon", "impers"]]
764
+ ["ītur", ["depon", "impers"]],
765
+ ["ī", ["perfaspres"]]
665
766
  ]));
666
767
 
667
- if (auto_perf_supine == "++" && this.options.suppressIPerfect) {
668
- auto_perf_supine = "+";
669
- }
670
-
671
- if (auto_perf_supine == "++") {
768
+ if (hasVerbType(subtypes, "perfaspres")) {
769
+ auto_perf = base;
770
+ } else if (auto_perf_supine == "++") {
672
771
  auto_perf = base + "īv/" + base + "i";
673
772
  auto_supine = base + "īt";
674
773
  } else if (auto_perf_supine == "+") {
675
774
  auto_perf = base + "īv";
676
775
  auto_supine = base + "īt";
677
776
  }
777
+ if (hasVerbType(subtypes, "suffix")) {
778
+ addVerbType(subtypes, "sigm");
779
+ }
678
780
  } else if (conj_arg == "irreg") {
679
781
  let prefix: string;
680
782
  conjtype = "irreg";
@@ -725,27 +827,29 @@ export class LaVerb {
725
827
  args.set("1", base);
726
828
  let perf_stem = "";
727
829
  let supine_stem = "";
728
- if (hasVerbType(subtypes, "depon") || hasVerbType(subtypes, "semidepon")) {
830
+ if (hasVerbType(subtypes, "depon") || hasVerbType(subtypes, "semidepon") || hasVerbType(subtypes, "perfaspres")) {
729
831
  supine_stem = args.get("3") || auto_supine;
730
- if (supine_stem == "-") {
832
+ if (supine_stem == "-" && !hasVerbType(subtypes, "suffix")) {
731
833
  supine_stem = "";
732
834
  }
733
835
  if (!supine_stem) {
734
- addVerbType(subtypes, "noperf");
836
+ if (hasVerbType(subtypes, "depon") || hasVerbType(subtypes, "semidepon")) {
837
+ addVerbType(subtypes, "noperf");
838
+ }
735
839
  addVerbType(subtypes, "nosup");
736
840
  }
737
841
  args.set("2", supine_stem);
738
842
  args.delete("3");
739
843
  } else {
740
844
  perf_stem = args.get("3") || auto_perf;
741
- if (perf_stem == "-") {
845
+ if (perf_stem == "-" && !hasVerbType(subtypes, "suffix")) {
742
846
  perf_stem = "";
743
847
  }
744
848
  if (!perf_stem) {
745
849
  addVerbType(subtypes, "noperf");
746
850
  }
747
851
  supine_stem = args.get("4") || auto_supine;
748
- if (supine_stem == "-") {
852
+ if (supine_stem == "-" && !hasVerbType(subtypes, "suffix")) {
749
853
  supine_stem = "";
750
854
  }
751
855
  if (!supine_stem) {
@@ -766,7 +870,7 @@ export class LaVerb {
766
870
 
767
871
  for (const subtype of subtypes) {
768
872
  if (!this.allowed_subtypes.has(subtype)) {
769
- if (!(conjtype == "3rd" && subtype == "-I") && !(conjtype == "3rd-io" && subtype == "I")) {
873
+ if (!(conjtype == "3rd" && subtype == "-I") && !(conjtype == "3rd-io" && subtype == "I") && !(subtype == "suffix")) {
770
874
  throw Error(`Unrecognized verb subtype: ${subtype}`);
771
875
  }
772
876
  }
@@ -818,18 +922,21 @@ export class LaVerb {
818
922
  pres_stem = this.ine(args.get("1"));
819
923
  supine_stem = this.ine(args.get("2"));
820
924
  perf_stem = this.ine(args.get("3")); // added by @fpw for reverti
925
+ } else if (hasVerbType(typeinfo.subtypes, "perfaspres")) {
926
+ perf_stem = this.ine(args.get("1"));
927
+ supine_stem = this.ine(args.get("2"));
821
928
  } else {
822
929
  pres_stem = this.ine(args.get("1"));
823
930
  perf_stem = this.ine(args.get("2"));
824
931
  supine_stem = this.ine(args.get("3"));
825
932
  }
826
933
 
827
- if (hasVerbType(typeinfo.subtypes, "perfaspres") && !pres_stem) {
828
- pres_stem = "whatever";
829
- }
830
-
831
934
  if (!pres_stem) {
832
- throw Error("Present stem has not been provided");
935
+ if (hasVerbType(typeinfo.subtypes, "perfaspres")) {
936
+ pres_stem = "-";
937
+ } else {
938
+ throw Error("No present stem");
939
+ }
833
940
  }
834
941
 
835
942
  typeinfo.pres_stem = pres_stem;
@@ -1294,7 +1401,7 @@ export class LaVerb {
1294
1401
  endingMap.set("acc", endings.acc);
1295
1402
  endingMap.set("abl", endings.abl);
1296
1403
 
1297
- if (base.match(/[uv]end$/)) {
1404
+ if (base.match(/[uv]end$/) || hasVerbType(typeinfo.subtypes, "nound")) {
1298
1405
  und_variant = false;
1299
1406
  }
1300
1407
 
@@ -1440,6 +1547,7 @@ export class LaVerb {
1440
1547
  if (hasVerbType(typeinfo.subtypes, "perfaspres")) {
1441
1548
  this.insert_if_not(data.categories, "Latin defective verbs");
1442
1549
  this.insert_if_not(data.categories, "Latin active-only verbs");
1550
+ this.insert_if_not(data.categories, "Latin verbs with missing present stem");
1443
1551
  this.insert_if_not(data.categories, "Latin verbs with perfect forms having imperfective meanings");
1444
1552
 
1445
1553
  setVerbForm(data.forms, "perf_actv_ptc", getVerbForm(data.forms, "perf_pasv_ptc") || []);
@@ -1625,14 +1733,41 @@ export class LaVerb {
1625
1733
  newvals.push(fv.replace(/^(.*).$/, "$1" + "ier"));
1626
1734
  }
1627
1735
  setVerbForm(data.forms, form, newvals);
1628
- data.footnotes.set(form, ["The present passive infinitive in -ier is a rare poetic form which is attested for this verb."]);
1736
+ data.footnotes.set(form, ["The present passive infinitive in -ier is a rare poetic form which is attested."]);
1629
1737
  }
1630
1738
 
1631
1739
  if (hasVerbType(typeinfo.subtypes, "poetsyncperf") && !this.options.suppressPoet) {
1632
1740
  const sss: [string, string][] = [
1741
+ // infinitive
1633
1742
  ["perf_actv_inf", "sse"],
1743
+ // perfect actives
1634
1744
  ["2s_perf_actv_indc", "stī"],
1745
+ ["3s_perf_actv_indc", "t"],
1746
+ ["1p_perf_actv_indc", "mus"],
1635
1747
  ["2p_perf_actv_indc", "stis"],
1748
+ ["3p_perf_actv_indc", "runt"],
1749
+ // pluperfect actives
1750
+ ["1s_plup_actv_indc", "ram"],
1751
+ ["2s_plup_actv_indc", "rās"],
1752
+ ["3s_plup_actv_indc", "rat"],
1753
+ ["1p_plup_actv_indc", "rāmus"],
1754
+ ["2p_plup_actv_indc", "rātis"],
1755
+ ["3p_plup_actv_indc", "rant"],
1756
+ // future perfect actives
1757
+ ["1s_futp_actv_indc", "rō"],
1758
+ ["2s_futp_actv_indc", "ris"],
1759
+ ["3s_futp_actv_indc", "rit"],
1760
+ ["1p_futp_actv_indc", "rimus"],
1761
+ ["2p_futp_actv_indc", "ritis"],
1762
+ ["3p_futp_actv_indc", "rint"],
1763
+ // perfect subjunctives
1764
+ ["1s_perf_actv_subj", "rim"],
1765
+ ["2s_perf_actv_subj", "rīs"],
1766
+ ["3s_perf_actv_subj", "rit"],
1767
+ ["1p_perf_actv_subj", "rīmus"],
1768
+ ["2p_perf_actv_subj", "rītis"],
1769
+ ["3p_perf_actv_subj", "rint"],
1770
+ // pluperfect subjunctive
1636
1771
  ["1s_plup_actv_subj", "ssem"],
1637
1772
  ["2s_plup_actv_subj", "ssēs"],
1638
1773
  ["3s_plup_actv_subj", "sset"],
@@ -1644,10 +1779,12 @@ export class LaVerb {
1644
1779
  const add_sync_perf = (form: string, suff_sync: string) => {
1645
1780
  const formval = getVerbForm(data.forms, form) || [];
1646
1781
  for (const fv of formval) {
1647
- const regex1 = new RegExp(`vi${suff_sync}$`);
1648
- const regex2 = new RegExp(`[aeiouyāēīōūȳăĕĭŏŭ]ui${suff_sync}$`);
1649
- if (fv.match(regex1) || fv.match(regex2)) {
1650
- const rep = fv.substr(0, fv.length - suff_sync.length - 2) + suff_sync;
1782
+ const regex1 = new RegExp(`v[ieē]${suff_sync}$`);
1783
+ const regex2 = new RegExp(`vē${suff_sync}$`);
1784
+ const regex3 = new RegExp(`[aeiouyāēīōūȳăĕĭŏŭ]u[ieē]${suff_sync}$`);
1785
+ const regex4 = new RegExp(`[aeiouyāēīōūȳăĕĭŏŭ]uē${suff_sync}$`);
1786
+ if (fv.match(regex1) || fv.match(regex2) || fv.match(regex3) || fv.match(regex4)) {
1787
+ const rep = fv.substring(0, fv.length - suff_sync.length - 2) + suff_sync;
1651
1788
  this.insert_if_not(formval, rep);
1652
1789
  }
1653
1790
  }
@@ -1692,13 +1829,13 @@ export class LaVerb {
1692
1829
  }
1693
1830
 
1694
1831
  private make_perfect_passive(data: ConjugationData) {
1695
- const ppp = getVerbForm(data.forms, "perf_pasv_ptc") || [];
1832
+ let ppp: string[] | undefined = getVerbForm(data.forms, "perf_pasv_ptc") || [];
1696
1833
  const ppplinks: string[] = [];
1697
1834
  for (const pppform of ppp) {
1698
1835
  ppplinks.push(`[[${pppform}]]`);
1699
1836
  }
1700
1837
 
1701
- const ppplink = ppplinks.join(" or ");
1838
+ let ppplink = ppplinks.join(" or ");
1702
1839
  const sumlink = "[[sum]]";
1703
1840
 
1704
1841
  const text_for_slot = new Map<string, string>([
@@ -1729,6 +1866,15 @@ export class LaVerb {
1729
1866
  (passiveSuffix || "");
1730
1867
  setVerbForm(data.forms, slot, [entry]);
1731
1868
  }
1869
+
1870
+ ppp = getVerbForm(data.forms, "1s_pres_actv_indc");
1871
+ if (ppp && ppp[0] == "faciō") {
1872
+ ppplink = "[[factum]]";
1873
+ for (const [slot, text] of text_for_slot) {
1874
+ const ts = getVerbForm(data.forms, slot) ?? [];
1875
+ setVerbForm(data.forms, slot, [ts[0] + " or " + ppplink + " + " + text + " of " + sumlink]);
1876
+ }
1877
+ }
1732
1878
  }
1733
1879
 
1734
1880
  private override(data: ConjugationData, args: ArgMap) {
@@ -1807,6 +1953,14 @@ export class LaVerb {
1807
1953
  }
1808
1954
  }
1809
1955
 
1956
+ private notes_override(data: ConjugationData, args: ArgMap) {
1957
+ if (args.get("notes") == "-") {
1958
+ for (const key of data.footnotes.keys()) {
1959
+ data.footnotes.set(key, [""]);
1960
+ }
1961
+ }
1962
+ }
1963
+
1810
1964
  private set_linked_forms(data: ConjugationData, typeinfo: ConjugationInfo) {
1811
1965
  for (const slot of LaVerb.potential_lemma_slots) {
1812
1966
  const linked_forms: string[] = [];
@@ -1941,6 +2095,17 @@ export class LaVerb {
1941
2095
  this.make_supine(data, typeinfo, [prefix + "dict"]);
1942
2096
 
1943
2097
  this.add_form(data, "2s_pres_actv_impr", prefix, "dīc", 1);
2098
+
2099
+ if (!this.options.suppressArchaic) {
2100
+ this.add_form(data, "2s_pres_actv_impr", prefix, "dīc", 1);
2101
+ data.footnotes.set("2s_pres_actv_impr", ["Archaic."]);
2102
+ if (prefix == "") {
2103
+ this.add_form(data, "1s_futr_actv_indc", prefix, "dīcēbō", 2);
2104
+ this.add_form(data, "3s_futr_actv_indc", prefix, "dīcēbit", 2);
2105
+ data.footnotes.set("1s_futr_actv_indc", ["Archaic."]);
2106
+ data.footnotes.set("3s_futr_actv_indc", ["Archaic."]);
2107
+ }
2108
+ }
1944
2109
  });
1945
2110
 
1946
2111
  this.irreg_conjugations.set("do", (args: ArgMap, data: ConjugationData, typeinfo: ConjugationInfo) => {
@@ -2126,7 +2291,7 @@ export class LaVerb {
2126
2291
 
2127
2292
  this.make_pres_3rd(data, typeinfo, prefix_pres + "fer");
2128
2293
  if (!prefix_perf) {
2129
- if (this.options.suppressPoet) {
2294
+ if (this.options.suppressArchaic) {
2130
2295
  // added by @fpw
2131
2296
  this.make_perf(data, ["tul"]);
2132
2297
  } else {
@@ -2347,6 +2512,7 @@ export class LaVerb {
2347
2512
 
2348
2513
  this.irreg_conjugations.set("coepi", (args: ArgMap, data: ConjugationData, typeinfo: ConjugationInfo) => {
2349
2514
  data.categories.push("Latin third conjugation verbs");
2515
+ data.categories.push("Latin verbs with missing present stem");
2350
2516
  data.categories.push("Latin defective verbs");
2351
2517
 
2352
2518
  const prefix = typeinfo.prefix;
@@ -2399,6 +2565,11 @@ export class LaVerb {
2399
2565
  setVerbForm(data.forms, "2p_pres_actv_subj", [prefix_s + "sītis"]);
2400
2566
  setVerbForm(data.forms, "3p_pres_actv_subj", [prefix_s + "sint"]);
2401
2567
 
2568
+ if (prefix_s == "ad" && !this.options.suppressArchaic) {
2569
+ this.add_form(data, "3p_pres_actv_subj", "", "adessint", 2);
2570
+ data.footnotes.set("3p_pres_actv_subj", ["Archaic."]);
2571
+ }
2572
+
2402
2573
  setVerbForm(data.forms, "1s_impf_actv_subj", [prefix_e + "essem", prefix_f + "forem"]);
2403
2574
  setVerbForm(data.forms, "2s_impf_actv_subj", [prefix_e + "essēs", prefix_f + "forēs"]);
2404
2575
  setVerbForm(data.forms, "3s_impf_actv_subj", [prefix_e + "esset", prefix_f + "foret"]);
@@ -30,10 +30,14 @@ export enum VerbType {
30
30
  NeuterPlural = "np",
31
31
  HighlyDefective = "highlydef",
32
32
  SigM = "sigm",
33
+ SigMPassive = "sigmpasv",
34
+ NoUND = "nound",
35
+ Suffix = "suffix",
33
36
 
34
37
  NoIStem = "-I",
35
38
  NoDeponent = "-depon",
36
39
  NoImpersonal = "-impers",
40
+ NoPerfAsPres = "-perfaspres",
37
41
  }
38
42
 
39
43
  export function addVerbType(types: Set<VerbType>, verbType: string) {