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
dō
andcircumdō
—dō/dare/dedī/datum
. It should not be used for verbs likeaddō
andcondō
— which are regular 3rd-conjugation verbs, asaddō/addere/addidī/additum
. Similarly, ["volō"] means the present infinitive will end invelle
, notvolā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
andterrigena
, 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 fordomus
), and [0, 3] produces both indeclinable forms and third-declension forms (eg forIō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 maketantōn
appear alongsidetantō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 aremoritū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 ["e", "u"] for
gerō
, so the gerundive forms aregerendus/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 currently have this arefaciō
andgerō
; curiously one of the few verbs in Latin with an irregular gerund is the source of the word “gerund”.(I previously considered
orior
as a verb with "GerundVowels": ["u"]. Butoriundus
should be an adjective meaning “originating from”, not a gerund or gerundive.) "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 singularRōmae
) or plural forms and no singular (egAthēnae
, locative pluralAthēnīs
). Nouns that exist in both singular and plural (egdomus
) 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 adjectivealiē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 asAthē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
becausehaec 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
) andceler
(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ō
, andSapphō
. 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
andoportet
. "IsIntransitive"
-
Boolean that is true for verbs whose only passive forms are impersonal (third-person singular), such as
eō
.Deponent verbs do not have impersonal passive forms, nor any passive forms except gerundives (passive future participles) and ablative supines (if ablative supines can be considered passive). 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.
An intransitive deponent verb may get impersonal gerundives (eg
moriendum
), but not the full suite of gerundives (like a transitive verb would). Intransitive verbs do not get the ablative supine, but transitive verbs do. These two differences are the only differences between a transitive deponent verb and an intransitive deponent verb, at least with regard to the forms generated by the Inflector.Very reasonably, scholarly convention describes supines as accusative (ending in “-um”) or ablative (ending in “-ū”), and those are the labels the Inflector applies. It doesn’t label them as active or passive. My idea is that ablative supines are passive and therefore should not exist for intransitive verbs; this is not entirely unreasonable when considering expressions such as
sermō mīrābilis dictū
(“a speech marvellous in being said”). Admittedly some would considernātū
to be the ablative supine for the intransitivenāscor
, and the supine in Statius’vēnātū reditūrum opperiēns
(“waiting for him to return from the hunt”) is no more passive thanvēnātum īre
(“to go to hunt”). And ablative supines are not actually attested for many verbs, even the transitive ones. But I still like to create ablative supines for transitive verbs and withhold them for intransitive verbs. (I can make an exemption fornātū
.) "IsLemmaInQue"
-
Boolean for whether the lemma’s forms end in grammatical endings followed by “-que”, such as
plērusque
anduterque
. 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 verbincieō
as its present participle, butincieō
doesn’t exist in its own right. Thus it differs fromingē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 lemmaamāns
(which has positive, comparative, and superlative forms, but does not have"IsPresentParticiple": true
). The formsamante
andamantī
are the ablative singular masculine/feminine/neuter present participle forms of the verb lemmaamō
.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 participles. "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"] andvetus
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 aresonuī
etc, not the regularsonāvī
). "ReceivesEnclitics"
-
Boolean that is true for conjunctions that have encliticized forms, such as
cum
becausecumque
andcumve
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 makesüāve
appear instead ofsuāve
. (This is to differentiate from thesuāve
that is a form ofsuā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
mī
instead of whatever the Inflector would create regularly (which would be the incorrectmee
in this case, for the lemmameus
). "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 aresonitus
etc, not the regularsonā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 that I used for generating and storing the data in velut. This is far from ideal, so I’ve been replacing 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 have no more use for the Excel file. Everything will be 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.
(I haven’t actually made any edits to the Excel file since October 2022, when I started making the Inflector. Any edits would need to be replicated in the new architecture.)
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’ve been 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.