Duncan’s Inflector for velut




Testing

Open your browser’s console, then click “Run tests”. The tests confirm that the Inflector generates forms as I expect.

About

Note: If you’re not me, you’re unlikely to have much use for this Inflector.

velut is my Latin rhyming dictionary. All the data for this are stored in Json files on my computer. For example, I have a list of lemmata (dictionary headwords), stored as an array of Json objects. The purpose of the Inflector is to read from the list of lemmata, generate the inflected forms for each lemma, and write them to my hard disk for further processing. I do this by running the inflector.js script in Node.

But I also made this webpage, to demonstrate what the Inflector does. You can input several lemmata (as Json) in the first box, click “Generate forms”, and see the output in the second box. The resultant Json can be downloaded or copied to the clipboard.

The velut website uses the same lemmata data that I use the Inflector with. However, the website does not yet use all the inflected forms that are generated by the Inflector. Over several years, I manually added forms for every lemma, and these were the only forms that the website displayed. Now I have made the Inflector, I am manually checking the forms it produces, and I’m transitioning the website to use those forms instead of the manually-added forms.

I made the Inflector so I could avoid adding inflected forms manually to velut. It’s a lot of work, codifying so much of Latin morphology into JavaScript, but it’s better than continuing the way I was.

Input format

The input needs to be a Json array of objects. Each object must have the string fields of Lemma and PartOfSpeech. Additionally, the Inflector also looks for some optional fields, which can override aspects of the Inflector’s default behaviour. (However, not all of these apply to all parts of speech.)

"ComparativeStems"

String array of stems for the comparative forms of adjectives and adverbs.

"Conjugations"

Integer array (for regular verbs) or string array (for irregular verbs). Potential values are [1], [2], [3], [4], ["dō"], ["eō"], ["faciō"], ["ferō"], ["sum"], ["volō"].

(The value ["dō"] means the verb declines like and circumdōdō/dare/dedī/datum. It should not be used for verbs like addō and condō — which are regular 3rd-conjugation verbs, as addō/addere/addidī/additum. Similarly, ["volō"] means the present infinitive will end in velle, not volāre.)

If a verb has more than one possible conjugation, I have it as more than one lemma. So it is unlikely that any lemma will ever have more than one value in "Conjugations". This property is an array in case I change my mind on that, and for consistency with "Declensions" and other array properties.

"Declensions"

An integer array for nouns and adjectives; adjectives can have the following —

  • [1, 2] is for first/second-declension adjectives (first declension for feminine, second declension for masculine and neuter).
  • [3] is for third-declension adjectives.
  • [0] means the lemma is indeclinable: all forms are the same as the lemma form. Comparative and superlative forms are not generated.
  • [1] is used for rūricola and terrigena, which follow the first declension for both the feminine and the masculine (both adjectives happen to have no neuter). Comparative and superlative forms are not generated.

(Whenever adjective lemmata are labelled as belonging to the first/second declension or the third declension, this only really describes the positive forms. Comparative forms will have third-declension endings and superlative forms will have first/second-declension endings, regardless of the declension of the rest of the adjective.)

For nouns (including proper nouns), the "Declensions" array can contain any integer from 0 to 5. It is possible to have more than one declension. For example, [2, 4] produces both second-declension and fourth-declension forms (eg for domus), and [0, 3] produces both indeclinable forms and third-declension forms (eg for Iōb).

"ExtraEncliticizedForms"

Object of forms to add to whatever the Inflector generates itself, after enclitics have been added.

My main use of this is when I find that some of the forms that I had added to velut manually are incorrect. Since I want the Inflector to generate all the forms that were already in velut, I put these incorrect forms in an array — "ExtraEncliticizedForms": { "incorrect": [] } — so they get copied into the output data, but are easy to ignore.

Otherwise, this field is used for some irregular contractions of words in “-ne”. For example, it’s used on the adjective tantus, to make tantōn appear alongside tantōne.

"ExtraForms"

Object of forms to add to whatever the Inflector generates itself, before any enclitics are added to the result.

"Forms"

Object of forms to use instead of anything the Inflector would generate itself. But if the object does not have "unencliticized" (or "ne" or "que" or "ve") as a field at root, encliticized forms will be generated from anything in the "Forms" object.

"FutureActiveParticipleStems"

String array of stems for the future active participle forms of verbs of the third or fourth conjugation. For example, the array is ["morit"] for morior, so the participle forms are moritūrus etc. If this is not specified (or the verb is not of the third or fourth conjugation), the supine stems are used — either the value of "SupineStems" or a regularly-generated fallback.

"GerundVowels"

String array of vowels to use before the “nd” in gerunds and gerundives for verbs of the third or fourth conjugation. For example, the array is ["u"] for gerō, so the gerundive forms are gerundus etc. If this is not specified (or the verb is not of the third or fourth conjugation), the default is ["e"]. The only lemmata that need this are gerō and orior.

"HasArchaicInfinitiveInIer"

Boolean for whether a verb should have a present passive (or active if deponent) infinitive ending with “-ier”, potentially in addition to one in “-ī”.

"HasIStem"

Boolean for whether a 3rd-declension adjective or 3rd-declension noun should follow the “i-stem” paradigm.

This may not need to be explicitly set to true or false for all 3rd-declension lemmata. For example, if HasThreeTerminations is true (for an adjective), HasIStem is treated as true by default.

"HasLocative"

Boolean for whether a noun (proper or otherwise) should get a locative form, or for whether a first/second-declension adjective should get locative forms.

Most nouns that get the locative have either singular forms and no plural (eg Rōma, locative singular Rōmae) or plural forms and no singular (eg Athēnae, locative plural Athēnīs). Nouns that exist in both singular and plural (eg domus) will get the locative for the singular only.

The only adjectives I mark with "HasLocative": true are the possessives: meus, tuus, suus, noster, voster, vester, aliēnus. These all belong to the first/second declension. They will get the locative for all three genders in both singular and plural, but only for the positive degree. (The adjective aliēnus is not attested in the locative comparative/superlative; the other adjectives have no comparative or superlative at all. Theoretically “in the Athens of complete strangers” could be translated as Athēnīs aliēnissimīs, but I’m not allowing that without attestation.)

"HasPerfectPassiveParticiple"

Boolean for whether perfect passive participles should be generated for deponent or semi-deponent verbs, potentially in addition to perfect active participles. If this property is not specified, the default is false.

For example, effor has "HasPerfectPassiveParticiple": true because haec verba effāta sunt can mean “they [neuter plural] spoke these words” (active) or “these words were spoken” (passive).

This property has no effect on non-deponent verbs or other parts of speech — the perfect participles of non-deponent verbs are passive regardless.

"HasThreeTerminations"

Boolean for whether a third-declension adjective has different forms for all three genders of the nominative singular. For example, ācer (ācer/ācris/ācre) and celer (celer/celeris/celere).

"IsDeclinedLikeAdjective"

Boolean that is true for 3rd-declension nouns that are declined like an adjective with ablative singular in “-ī” and genitive plural in “-ium”.

"IsGreekFirstDeclension"

Boolean that is true for 1st-declension nouns that have their accusative singular in “-ēn”, genitive singular in “-ēs”, and ablative singular in “-ē”.

"IsGreekThirdDeclensionInOmega"

Boolean that is true for feminine nouns, derived from Greek proper nouns, that have identical forms in the nominative/vocative/accusative/dative/ablative, genitive singular in “-ūs”, and no plural or locative.

Examples include Clīō, Ēchō, and Sapphō. There’s also ēchō, which is simply Ēchō as a non-proper noun. These should all end in “-ō” in the non-genitive forms.

The Inflector will not generate masculine, neuter, locative, or plural forms of these words.

"IsImpersonal"

Boolean that is true for verbs that only have third-person singular forms (besides infinitives etc), such as grandinat and oportet.

"IsIntransitive"

Boolean that is true for verbs whose only passive forms are impersonal (third-person singular), such as .

Deponent verbs do not have impersonal passive forms, nor any passive forms except gerundives (passive future participles). But they do have gerundives that are passive — they have the same distinction between active future participles in “-ūrus” and passive future participles in “-ndus” that non-deponent verbs have. Therefore deponent verbs can be classed as transitive or intransitive, too.

The only difference between a transitive deponent verb and an intransitive deponent verb is that the former will have gerundives and the latter will not.

"IsLemmaInQue"

Boolean for whether the lemma’s forms end in grammatical endings followed by “-que”, such as plērusque and uterque. Such lemmata have no encliticized forms: the “-que” suffix does not mean “and”.

"IsPresentParticiple"

Boolean that is true for an adjective lemma representing a present participle (ending in “-āns” or “ēns”) for a non-existent verb. Present participles receive ablative singular forms in both “-e” and “-ī”.

So inciēns has "IsPresentParticiple": true because it (at least supposedly) derives from the verb incieō as its present participle, but incieō doesn’t exist in its own right. Thus it differs from ingēns, which ends in “-ēns” but is not a participle.

Why are some participles made into their own lemmata, other than because the verb doesn’t exist? Forms for verb lemmata do not include comparative or superlative forms — they are not “graded”. If a participle is to be given comparative or superlative forms, I make it its own lemma, as an adjective.

Therefore, amantī is given as the ablative singular masculine/feminine/neuter positive form of an adjective lemma amāns (which has positive, comparative, and superlative forms, but does not have "IsPresentParticiple": true). The forms amante and amantī are the ablative singular masculine/feminine/neuter present participle forms of the verb lemma amō.

Inside the Inflector, present participle forms of verbs are generated as if they belonged to an adjective lemma with "IsPresentParticiple": true. This doesn’t affect the input lemmata data.

"IsSemiDeponent"

Boolean that is true for verbs such as gaudeō that are non-deponent in present-system tenses (present, imperfect, future) and deponent in perfect-system tenses (perfect, pluperfect, future perfect). These verbs have no passive forms except gerundives.

"ObliqueStems"

String array, for adjectives, adverbs, and nouns. It represents the stems to use for oblique (ie, non-lemma) forms. For example, āctiō’ has ["āctiōn"] and vetus has ["veter"].

Most adjectives/adverbs/nouns have only one oblique stem. "ObliqueStems" is not needed if the lemma has one oblique stem and it can be easily deduced from the lemma form.

Adjectives and adverbs can get comparative and superlative forms. Comparative forms and superlative forms are generated from "ObliqueStems" if the fields "ComparativeStems" and "SuperlativeStems" are not specified (respectively).

More precisely — if "ComparativeStems" is not specified, the comparative stems are the oblique stems plus “i”, which will then be combined with the endings “-or”, “-or”, “-us” etc. Likewise, if "SuperlativeStems" is not specified, the superlative stems are the oblique stems plus “issim”, which will then be combined with the regular 1st/2nd-declension endings “-us”, “-a”, “-um” etc.

"ParsingsToExclude"

String array, eg ["comparative", "superlative"] for an adjective/adverb that does not have any comparative or superlative forms.

To remove forms at the intersection of multiple grammatical labels, "ReplacementForms" or "ReplacementEncliticizedForms" can be used with an empty array in a nested object. For example, "ReplacementForms": { "participle": { "active": { "future": [] } } } means that the lemma will not have any future active participles. For this to work, the nesting must match what the Inflector would generate. ("ReplacementForms": { "future": { "active": { "participle": [] } } } does nothing.)

"PerfectStems"

String array of stems for the perfect forms of verbs, eg ["sonu"] for sonō (so the perfect forms are sonuī etc, not the regular sonāvī).

"ReceivesEnclitics"

Boolean that is true for conjunctions that have encliticized forms, such as cum because cumque and cumve are attested.

Words other than conjunctions and interjections receive enclitics by default; this field is not needed and has no effect on them. It is unlikely that interjections can ever be encliticized.

"ReplacementEncliticizedForms"

Object of forms to use instead of the regularly generated forms for the parsings that are specified, after enclitics have been added. For example, it is used on the adjective suus, to make süāve appear instead of suāve. (This is to differentiate from the suāve that is a form of suāvis with consonantal u.)

"ReplacementForms"

Object of forms to use instead of the regularly generated forms for the parsings that are specified, before any enclitics are added to the result.

For example, "ReplacementForms": { "positive": { "masculine": { "singular": { "vocative": ["mī"] } } } } results in the vocative singular masculine positive form being instead of whatever the Inflector would create regularly (which would be the incorrect mee in this case, for the lemma meus).

"SuperlativeStems"

String array of stems for the superlative forms of adjectives and adverbs.

"SupineStems"

String array of stems for the supine and perfect participle forms of verbs, eg ["sonit"] for sonō (so the participle forms are sonitus etc, not the regular sonātus).

The “Load sample” button will give you some examples of my lemma objects.

Forms objects

The output objects, and any "Forms", "ExtraForms", "ExtraEncliticizedForms", "ReplacementForms", or "ReplacementEncliticizedForms" fields in the input, contain string arrays inside nested objects. An example of an output object is below. Fields in the input will not need so many subfields.

Show/hide full inflections object for a regular adjective
{
	"unencliticized": {
		"positive": {
			"masculine": {
				"singular": {
					"nominative": ["absurdus"],
					"vocative": ["absurde"],
					"accusative": ["absurdum"],
					"genitive": ["absurdī"],
					"dative": ["absurdō"],
					"ablative": ["absurdō"]
				},
				"plural": {
					"nominative": ["absurdī"],
					"vocative": ["absurdī"],
					"accusative": ["absurdōs"],
					"genitive": ["absurdōrum"],
					"dative": ["absurdīs"],
					"ablative": ["absurdīs"]
				}
			},
			"feminine": {
				"singular": {
					"nominative": ["absurda"],
					"vocative": ["absurda"],
					"accusative": ["absurdam"],
					"genitive": ["absurdae"],
					"dative": ["absurdae"],
					"ablative": ["absurdā"]
				},
				"plural": {
					"nominative": ["absurdae"],
					"vocative": ["absurdae"],
					"accusative": ["absurdās"],
					"genitive": ["absurdārum"],
					"dative": ["absurdīs"],
					"ablative": ["absurdīs"]
				}
			},
			"neuter": {
				"singular": {
					"nominative": ["absurdum"],
					"vocative": ["absurdum"],
					"accusative": ["absurdum"],
					"genitive": ["absurdī"],
					"dative": ["absurdō"],
					"ablative": ["absurdō"]
				},
				"plural": {
					"nominative": ["absurda"],
					"vocative": ["absurda"],
					"accusative": ["absurda"],
					"genitive": ["absurdōrum"],
					"dative": ["absurdīs"],
					"ablative": ["absurdīs"]
				}
			}
		},
		"comparative": {
			"masculine": {
				"singular": {
					"nominative": ["absurdior"],
					"vocative": ["absurdior"],
					"accusative": ["absurdiōrem"],
					"genitive": ["absurdiōris"],
					"dative": ["absurdiōrī"],
					"ablative": ["absurdiōre"]
				},
				"plural": {
					"nominative": ["absurdiōrēs"],
					"vocative": ["absurdiōrēs"],
					"accusative": ["absurdiōrēs", "absurdiōrīs"],
					"genitive": ["absurdiōrum"],
					"dative": ["absurdiōribus"],
					"ablative": ["absurdiōribus"]
				}
			},
			"feminine": {
				"singular": {
					"nominative": ["absurdior"],
					"vocative": ["absurdior"],
					"accusative": ["absurdiōrem"],
					"genitive": ["absurdiōris"],
					"dative": ["absurdiōrī"],
					"ablative": ["absurdiōre"]
				},
				"plural": {
					"nominative": ["absurdiōrēs"],
					"vocative": ["absurdiōrēs"],
					"accusative": ["absurdiōrēs", "absurdiōrīs"],
					"genitive": ["absurdiōrum"],
					"dative": ["absurdiōribus"],
					"ablative": ["absurdiōribus"]
				}
			},
			"neuter": {
				"singular": {
					"nominative": ["absurdius"],
					"vocative": ["absurdius"],
					"accusative": ["absurdius"],
					"genitive": ["absurdiōris"],
					"dative": ["absurdiōrī"],
					"ablative": ["absurdiōre"]
				},
				"plural": {
					"nominative": ["absurdiōra"],
					"vocative": ["absurdiōra"],
					"accusative": ["absurdiōra"],
					"genitive": ["absurdiōrum"],
					"dative": ["absurdiōribus"],
					"ablative": ["absurdiōribus"]
				}
			}
		},
		"superlative": {
			"masculine": {
				"singular": {
					"nominative": ["absurdissimus"],
					"vocative": ["absurdissime"],
					"accusative": ["absurdissimum"],
					"genitive": ["absurdissimī"],
					"dative": ["absurdissimō"],
					"ablative": ["absurdissimō"]
				},
				"plural": {
					"nominative": ["absurdissimī"],
					"vocative": ["absurdissimī"],
					"accusative": ["absurdissimōs"],
					"genitive": ["absurdissimōrum"],
					"dative": ["absurdissimīs"],
					"ablative": ["absurdissimīs"]
				}
			},
			"feminine": {
				"singular": {
					"nominative": ["absurdissima"],
					"vocative": ["absurdissima"],
					"accusative": ["absurdissimam"],
					"genitive": ["absurdissimae"],
					"dative": ["absurdissimae"],
					"ablative": ["absurdissimā"]
				},
				"plural": {
					"nominative": ["absurdissimae"],
					"vocative": ["absurdissimae"],
					"accusative": ["absurdissimās"],
					"genitive": ["absurdissimārum"],
					"dative": ["absurdissimīs"],
					"ablative": ["absurdissimīs"]
				}
			},
			"neuter": {
				"singular": {
					"nominative": ["absurdissimum"],
					"vocative": ["absurdissimum"],
					"accusative": ["absurdissimum"],
					"genitive": ["absurdissimī"],
					"dative": ["absurdissimō"],
					"ablative": ["absurdissimō"]
				},
				"plural": {
					"nominative": ["absurdissima"],
					"vocative": ["absurdissima"],
					"accusative": ["absurdissima"],
					"genitive": ["absurdissimōrum"],
					"dative": ["absurdissimīs"],
					"ablative": ["absurdissimīs"]
				}
			}
		}
	},
	"ne": {
		"positive": {
			"masculine": {
				"singular": {
					"nominative": ["absurdusne"],
					"vocative": ["absurdene"],
					"accusative": ["absurdumne"],
					"genitive": ["absurdīne"],
					"dative": ["absurdōne"],
					"ablative": ["absurdōne"]
				},
				"plural": {
					"nominative": ["absurdīne"],
					"vocative": ["absurdīne"],
					"accusative": ["absurdōsne"],
					"genitive": ["absurdōrumne"],
					"dative": ["absurdīsne"],
					"ablative": ["absurdīsne"]
				}
			},
			"feminine": {
				"singular": {
					"nominative": ["absurdane"],
					"vocative": ["absurdane"],
					"accusative": ["absurdamne"],
					"genitive": ["absurdaene"],
					"dative": ["absurdaene"],
					"ablative": ["absurdāne"]
				},
				"plural": {
					"nominative": ["absurdaene"],
					"vocative": ["absurdaene"],
					"accusative": ["absurdāsne"],
					"genitive": ["absurdārumne"],
					"dative": ["absurdīsne"],
					"ablative": ["absurdīsne"]
				}
			},
			"neuter": {
				"singular": {
					"nominative": ["absurdumne"],
					"vocative": ["absurdumne"],
					"accusative": ["absurdumne"],
					"genitive": ["absurdīne"],
					"dative": ["absurdōne"],
					"ablative": ["absurdōne"]
				},
				"plural": {
					"nominative": ["absurdane"],
					"vocative": ["absurdane"],
					"accusative": ["absurdane"],
					"genitive": ["absurdōrumne"],
					"dative": ["absurdīsne"],
					"ablative": ["absurdīsne"]
				}
			}
		},
		"comparative": {
			"masculine": {
				"singular": {
					"nominative": ["absurdiorne"],
					"vocative": ["absurdiorne"],
					"accusative": ["absurdiōremne"],
					"genitive": ["absurdiōrisne"],
					"dative": ["absurdiōrīne"],
					"ablative": ["absurdiōrene"]
				},
				"plural": {
					"nominative": ["absurdiōrēsne"],
					"vocative": ["absurdiōrēsne"],
					"accusative": ["absurdiōrēsne", "absurdiōrīsne"],
					"genitive": ["absurdiōrumne"],
					"dative": ["absurdiōribusne"],
					"ablative": ["absurdiōribusne"]
				}
			},
			"feminine": {
				"singular": {
					"nominative": ["absurdiorne"],
					"vocative": ["absurdiorne"],
					"accusative": ["absurdiōremne"],
					"genitive": ["absurdiōrisne"],
					"dative": ["absurdiōrīne"],
					"ablative": ["absurdiōrene"]
				},
				"plural": {
					"nominative": ["absurdiōrēsne"],
					"vocative": ["absurdiōrēsne"],
					"accusative": ["absurdiōrēsne", "absurdiōrīsne"],
					"genitive": ["absurdiōrumne"],
					"dative": ["absurdiōribusne"],
					"ablative": ["absurdiōribusne"]
				}
			},
			"neuter": {
				"singular": {
					"nominative": ["absurdiusne"],
					"vocative": ["absurdiusne"],
					"accusative": ["absurdiusne"],
					"genitive": ["absurdiōrisne"],
					"dative": ["absurdiōrīne"],
					"ablative": ["absurdiōrene"]
				},
				"plural": {
					"nominative": ["absurdiōrane"],
					"vocative": ["absurdiōrane"],
					"accusative": ["absurdiōrane"],
					"genitive": ["absurdiōrumne"],
					"dative": ["absurdiōribusne"],
					"ablative": ["absurdiōribusne"]
				}
			}
		},
		"superlative": {
			"masculine": {
				"singular": {
					"nominative": ["absurdissimusne"],
					"vocative": ["absurdissimene"],
					"accusative": ["absurdissimumne"],
					"genitive": ["absurdissimīne"],
					"dative": ["absurdissimōne"],
					"ablative": ["absurdissimōne"]
				},
				"plural": {
					"nominative": ["absurdissimīne"],
					"vocative": ["absurdissimīne"],
					"accusative": ["absurdissimōsne"],
					"genitive": ["absurdissimōrumne"],
					"dative": ["absurdissimīsne"],
					"ablative": ["absurdissimīsne"]
				}
			},
			"feminine": {
				"singular": {
					"nominative": ["absurdissimane"],
					"vocative": ["absurdissimane"],
					"accusative": ["absurdissimamne"],
					"genitive": ["absurdissimaene"],
					"dative": ["absurdissimaene"],
					"ablative": ["absurdissimāne"]
				},
				"plural": {
					"nominative": ["absurdissimaene"],
					"vocative": ["absurdissimaene"],
					"accusative": ["absurdissimāsne"],
					"genitive": ["absurdissimārumne"],
					"dative": ["absurdissimīsne"],
					"ablative": ["absurdissimīsne"]
				}
			},
			"neuter": {
				"singular": {
					"nominative": ["absurdissimumne"],
					"vocative": ["absurdissimumne"],
					"accusative": ["absurdissimumne"],
					"genitive": ["absurdissimīne"],
					"dative": ["absurdissimōne"],
					"ablative": ["absurdissimōne"]
				},
				"plural": {
					"nominative": ["absurdissimane"],
					"vocative": ["absurdissimane"],
					"accusative": ["absurdissimane"],
					"genitive": ["absurdissimōrumne"],
					"dative": ["absurdissimīsne"],
					"ablative": ["absurdissimīsne"]
				}
			}
		}
	},
	"que": {
		"positive": {
			"masculine": {
				"singular": {
					"nominative": ["absurdusque"],
					"vocative": ["absurdeque"],
					"accusative": ["absurdumque"],
					"genitive": ["absurdīque"],
					"dative": ["absurdōque"],
					"ablative": ["absurdōque"]
				},
				"plural": {
					"nominative": ["absurdīque"],
					"vocative": ["absurdīque"],
					"accusative": ["absurdōsque"],
					"genitive": ["absurdōrumque"],
					"dative": ["absurdīsque"],
					"ablative": ["absurdīsque"]
				}
			},
			"feminine": {
				"singular": {
					"nominative": ["absurdaque"],
					"vocative": ["absurdaque"],
					"accusative": ["absurdamque"],
					"genitive": ["absurdaeque"],
					"dative": ["absurdaeque"],
					"ablative": ["absurdāque"]
				},
				"plural": {
					"nominative": ["absurdaeque"],
					"vocative": ["absurdaeque"],
					"accusative": ["absurdāsque"],
					"genitive": ["absurdārumque"],
					"dative": ["absurdīsque"],
					"ablative": ["absurdīsque"]
				}
			},
			"neuter": {
				"singular": {
					"nominative": ["absurdumque"],
					"vocative": ["absurdumque"],
					"accusative": ["absurdumque"],
					"genitive": ["absurdīque"],
					"dative": ["absurdōque"],
					"ablative": ["absurdōque"]
				},
				"plural": {
					"nominative": ["absurdaque"],
					"vocative": ["absurdaque"],
					"accusative": ["absurdaque"],
					"genitive": ["absurdōrumque"],
					"dative": ["absurdīsque"],
					"ablative": ["absurdīsque"]
				}
			}
		},
		"comparative": {
			"masculine": {
				"singular": {
					"nominative": ["absurdiorque"],
					"vocative": ["absurdiorque"],
					"accusative": ["absurdiōremque"],
					"genitive": ["absurdiōrisque"],
					"dative": ["absurdiōrīque"],
					"ablative": ["absurdiōreque"]
				},
				"plural": {
					"nominative": ["absurdiōrēsque"],
					"vocative": ["absurdiōrēsque"],
					"accusative": ["absurdiōrēsque", "absurdiōrīsque"],
					"genitive": ["absurdiōrumque"],
					"dative": ["absurdiōribusque"],
					"ablative": ["absurdiōribusque"]
				}
			},
			"feminine": {
				"singular": {
					"nominative": ["absurdiorque"],
					"vocative": ["absurdiorque"],
					"accusative": ["absurdiōremque"],
					"genitive": ["absurdiōrisque"],
					"dative": ["absurdiōrīque"],
					"ablative": ["absurdiōreque"]
				},
				"plural": {
					"nominative": ["absurdiōrēsque"],
					"vocative": ["absurdiōrēsque"],
					"accusative": ["absurdiōrēsque", "absurdiōrīsque"],
					"genitive": ["absurdiōrumque"],
					"dative": ["absurdiōribusque"],
					"ablative": ["absurdiōribusque"]
				}
			},
			"neuter": {
				"singular": {
					"nominative": ["absurdiusque"],
					"vocative": ["absurdiusque"],
					"accusative": ["absurdiusque"],
					"genitive": ["absurdiōrisque"],
					"dative": ["absurdiōrīque"],
					"ablative": ["absurdiōreque"]
				},
				"plural": {
					"nominative": ["absurdiōraque"],
					"vocative": ["absurdiōraque"],
					"accusative": ["absurdiōraque"],
					"genitive": ["absurdiōrumque"],
					"dative": ["absurdiōribusque"],
					"ablative": ["absurdiōribusque"]
				}
			}
		},
		"superlative": {
			"masculine": {
				"singular": {
					"nominative": ["absurdissimusque"],
					"vocative": ["absurdissimeque"],
					"accusative": ["absurdissimumque"],
					"genitive": ["absurdissimīque"],
					"dative": ["absurdissimōque"],
					"ablative": ["absurdissimōque"]
				},
				"plural": {
					"nominative": ["absurdissimīque"],
					"vocative": ["absurdissimīque"],
					"accusative": ["absurdissimōsque"],
					"genitive": ["absurdissimōrumque"],
					"dative": ["absurdissimīsque"],
					"ablative": ["absurdissimīsque"]
				}
			},
			"feminine": {
				"singular": {
					"nominative": ["absurdissimaque"],
					"vocative": ["absurdissimaque"],
					"accusative": ["absurdissimamque"],
					"genitive": ["absurdissimaeque"],
					"dative": ["absurdissimaeque"],
					"ablative": ["absurdissimāque"]
				},
				"plural": {
					"nominative": ["absurdissimaeque"],
					"vocative": ["absurdissimaeque"],
					"accusative": ["absurdissimāsque"],
					"genitive": ["absurdissimārumque"],
					"dative": ["absurdissimīsque"],
					"ablative": ["absurdissimīsque"]
				}
			},
			"neuter": {
				"singular": {
					"nominative": ["absurdissimumque"],
					"vocative": ["absurdissimumque"],
					"accusative": ["absurdissimumque"],
					"genitive": ["absurdissimīque"],
					"dative": ["absurdissimōque"],
					"ablative": ["absurdissimōque"]
				},
				"plural": {
					"nominative": ["absurdissimaque"],
					"vocative": ["absurdissimaque"],
					"accusative": ["absurdissimaque"],
					"genitive": ["absurdissimōrumque"],
					"dative": ["absurdissimīsque"],
					"ablative": ["absurdissimīsque"]
				}
			}
		}
	},
	"ve": {
		"positive": {
			"masculine": {
				"singular": {
					"nominative": ["absurdusve"],
					"vocative": ["absurdeve"],
					"accusative": ["absurdumve"],
					"genitive": ["absurdīve"],
					"dative": ["absurdōve"],
					"ablative": ["absurdōve"]
				},
				"plural": {
					"nominative": ["absurdīve"],
					"vocative": ["absurdīve"],
					"accusative": ["absurdōsve"],
					"genitive": ["absurdōrumve"],
					"dative": ["absurdīsve"],
					"ablative": ["absurdīsve"]
				}
			},
			"feminine": {
				"singular": {
					"nominative": ["absurdave"],
					"vocative": ["absurdave"],
					"accusative": ["absurdamve"],
					"genitive": ["absurdaeve"],
					"dative": ["absurdaeve"],
					"ablative": ["absurdāve"]
				},
				"plural": {
					"nominative": ["absurdaeve"],
					"vocative": ["absurdaeve"],
					"accusative": ["absurdāsve"],
					"genitive": ["absurdārumve"],
					"dative": ["absurdīsve"],
					"ablative": ["absurdīsve"]
				}
			},
			"neuter": {
				"singular": {
					"nominative": ["absurdumve"],
					"vocative": ["absurdumve"],
					"accusative": ["absurdumve"],
					"genitive": ["absurdīve"],
					"dative": ["absurdōve"],
					"ablative": ["absurdōve"]
				},
				"plural": {
					"nominative": ["absurdave"],
					"vocative": ["absurdave"],
					"accusative": ["absurdave"],
					"genitive": ["absurdōrumve"],
					"dative": ["absurdīsve"],
					"ablative": ["absurdīsve"]
				}
			}
		},
		"comparative": {
			"masculine": {
				"singular": {
					"nominative": ["absurdiorve"],
					"vocative": ["absurdiorve"],
					"accusative": ["absurdiōremve"],
					"genitive": ["absurdiōrisve"],
					"dative": ["absurdiōrīve"],
					"ablative": ["absurdiōreve"]
				},
				"plural": {
					"nominative": ["absurdiōrēsve"],
					"vocative": ["absurdiōrēsve"],
					"accusative": ["absurdiōrēsve", "absurdiōrīsve"],
					"genitive": ["absurdiōrumve"],
					"dative": ["absurdiōribusve"],
					"ablative": ["absurdiōribusve"]
				}
			},
			"feminine": {
				"singular": {
					"nominative": ["absurdiorve"],
					"vocative": ["absurdiorve"],
					"accusative": ["absurdiōremve"],
					"genitive": ["absurdiōrisve"],
					"dative": ["absurdiōrīve"],
					"ablative": ["absurdiōreve"]
				},
				"plural": {
					"nominative": ["absurdiōrēsve"],
					"vocative": ["absurdiōrēsve"],
					"accusative": ["absurdiōrēsve", "absurdiōrīsve"],
					"genitive": ["absurdiōrumve"],
					"dative": ["absurdiōribusve"],
					"ablative": ["absurdiōribusve"]
				}
			},
			"neuter": {
				"singular": {
					"nominative": ["absurdiusve"],
					"vocative": ["absurdiusve"],
					"accusative": ["absurdiusve"],
					"genitive": ["absurdiōrisve"],
					"dative": ["absurdiōrīve"],
					"ablative": ["absurdiōreve"]
				},
				"plural": {
					"nominative": ["absurdiōrave"],
					"vocative": ["absurdiōrave"],
					"accusative": ["absurdiōrave"],
					"genitive": ["absurdiōrumve"],
					"dative": ["absurdiōribusve"],
					"ablative": ["absurdiōribusve"]
				}
			}
		},
		"superlative": {
			"masculine": {
				"singular": {
					"nominative": ["absurdissimusve"],
					"vocative": ["absurdissimeve"],
					"accusative": ["absurdissimumve"],
					"genitive": ["absurdissimīve"],
					"dative": ["absurdissimōve"],
					"ablative": ["absurdissimōve"]
				},
				"plural": {
					"nominative": ["absurdissimīve"],
					"vocative": ["absurdissimīve"],
					"accusative": ["absurdissimōsve"],
					"genitive": ["absurdissimōrumve"],
					"dative": ["absurdissimīsve"],
					"ablative": ["absurdissimīsve"]
				}
			},
			"feminine": {
				"singular": {
					"nominative": ["absurdissimave"],
					"vocative": ["absurdissimave"],
					"accusative": ["absurdissimamve"],
					"genitive": ["absurdissimaeve"],
					"dative": ["absurdissimaeve"],
					"ablative": ["absurdissimāve"]
				},
				"plural": {
					"nominative": ["absurdissimaeve"],
					"vocative": ["absurdissimaeve"],
					"accusative": ["absurdissimāsve"],
					"genitive": ["absurdissimārumve"],
					"dative": ["absurdissimīsve"],
					"ablative": ["absurdissimīsve"]
				}
			},
			"neuter": {
				"singular": {
					"nominative": ["absurdissimumve"],
					"vocative": ["absurdissimumve"],
					"accusative": ["absurdissimumve"],
					"genitive": ["absurdissimīve"],
					"dative": ["absurdissimōve"],
					"ablative": ["absurdissimōve"]
				},
				"plural": {
					"nominative": ["absurdissimave"],
					"vocative": ["absurdissimave"],
					"accusative": ["absurdissimave"],
					"genitive": ["absurdissimōrumve"],
					"dative": ["absurdissimīsve"],
					"ablative": ["absurdissimīsve"]
				}
			}
		}
	}
}

The velut Excel file

The velut website uses a MongoDB database, and this page produces Json data that could go into the MongoDB database. But I privately have a large Excel file for generating and storing the data in velut. This is far from ideal, so I’m trying to replace the Excel file with Json files and JavaScript scripts.

In the Excel file, I added inflected forms manually, without generating them through a script like the Inflector. I couldn’t add all the forms possible for every lemma. Also, I couldn’t have grammatical data — eg amās is in as a form of amō, but nothing says it’s the second-person singular present active indicative. Another motivation behind making the Inflector was to lessen a risk that I might add forms incorrectly.

(Theoretically I could have had all forms and all the grammatical data, but it would have been extremely impractical.)

One more downside of Excel is that it’s difficult to use version-control tools like Git with it.

Version control

I track the Json data-files in Git so I can check whether a change to my code has (inadvertently or deliberately) altered the output. But I don’t track the file that contains all the output — it’s huge. Instead, the Node-only code splits the data into batches of 1,000 lemmata and saves the batches as files, and Git tracks those files.

Checking the output in Node

I can also use Node to check the output against the forms I had in Excel. The code for this check is at the end of inflector.js.

Excitingly, all the forms in Excel (and therefore all the forms currently on the velut website) are getting generated by the Inflector. (Mistakes in the Excel forms are replicated by the Inflector, but labelled "incorrect" so I’ll easily filter them out.) However, it is still possible that the Inflector generates more forms than I want, and some forms might have wrong grammatical parsings.

Testing in the browser

If you’re not me, you won’t have access to all the input data, nor will you have access to the data from Excel that I compare the output to in Node. But you can run some tests yourself in your browser’s console by clicking the “Run tests” button above. These tests run the Inflector code against some lemmata.

My workflow for managing velut

The Inflector can generate forms for every lemma in my collection, and I can now say I’m happy with those forms for most of my lemmata. Many of the forms that I have checked are now visible on the velut website. (As of late July 2024, I’ve published my generated forms for all lemmata except verbs.) But I haven’t reviewed the forms for all lemmata, so it will be a while until the entire output of the Inflector is visible on velut.

Once I have finished reviewing the output, and then completed a few more tasks, I will be able to deprecate the Excel file and have everything getting derived from my Json data. (This will also make it easier for me to add lemmata to velut, or delete lemmata from it, since I’ll be editing the Json and not Excel.)

It’s all part of my long-term project of converting my Excel file into websites and webpages that are easier to share and maintain. I’m very much in a transition period of using the Excel file for some things and my newer websites/webpages for others. But the Inflector is another step in the process. At the moment, the whole velut project is very convoluted; in the future, it won’t be as bad.

For more information, I have a page about “de-Excellation” on velut, with statistics that update themselves whenever I refresh my local database with the Inflector’s output. And on GitHub I have a checklist of steps that I am working through.