diff --git a/src/common/fluentVowels.test.ts b/src/common/fluentVowels.test.ts new file mode 100644 index 0000000..f697d3a --- /dev/null +++ b/src/common/fluentVowels.test.ts @@ -0,0 +1,41 @@ +import { inferFluentVowel, markFluentVowel } from './fluentVowels'; + +describe('fluentVowels', () => { + describe('markFluentVowel', () => { + it('marks the fluent vowel in the word', () => { + expect(markFluentVowel('pes', 'psa')).toBe('p(e)s'); + expect(markFluentVowel('son', 'sna')).toBe('s(o)n'); + }); + + it('returns the same word when there is no fluent vowel', () => { + expect(markFluentVowel('mama', 'mama')).toBe('mama'); + }); + + it('marks the fluent vowel when it includes a diacritic', () => { + expect(markFluentVowel('pènj', 'pnja')).toBe('p(e)nj'); + expect(markFluentVowel('sòn', 'sna')).toBe('s(o)n'); + }); + }); + + describe('inferFluentVowel', () => { + it('infers the fluent vowel in the word', () => { + expect(inferFluentVowel('pės')).toBe('p(e)s'); + expect(inferFluentVowel('pèsȯk')).toBe('pès(o)k'); + expect(inferFluentVowel('sȯn')).toBe('s(o)n'); + expect(inferFluentVowel('dėnj')).toBe('d(e)nj'); + expect(inferFluentVowel('orėl')).toBe('or(e)l'); + }); + + it('infers the fluent vowel in complex words', () => { + expect(inferFluentVowel('pėsȯk, kotȯk i orėl')).toBe( + 'pės(o)k, kot(o)k i or(e)l', + ); + }); + + it('does not infer incorrect fluent vowels in the word', () => { + expect(inferFluentVowel('pėj')).toBe('pėj'); + expect(inferFluentVowel('dvėri')).toBe('dvėri'); + expect(inferFluentVowel('dȯžď')).toBe('dȯžď'); + }); + }); +}); diff --git a/src/common/fluentVowels.ts b/src/common/fluentVowels.ts new file mode 100644 index 0000000..5496dd2 --- /dev/null +++ b/src/common/fluentVowels.ts @@ -0,0 +1,59 @@ +import { ALL_CHARACTERS, CONSONANT_CHARACTERS } from '../constants'; + +const LETTERS = new Set(ALL_CHARACTERS); +const CONSONANTS = new Set(CONSONANT_CHARACTERS); + +export function markFluentVowel(word: string, add: string): string { + let i = 0; + + const L = Math.min(word.length - 1, add.length); + while (i < L && word[i] === add[i]) { + i++; + } + + if (word[i] !== add[i] && word[i + 1] === add[i]) { + return replaceFluentVowel(word, i); + } + + return word; +} + +export function inferFluentVowel(word: string): string { + let i = word.length - 1; + let end = word.length; + let replaced = false; + let result = word; + + while (i > 0) { + const char = word[i]; + if (!LETTERS.has(char)) { + end = i; + replaced = false; + } + + if (!replaced && isFleetingVowel(char)) { + if (isLastSyllable(word, i, end)) { + result = replaceFluentVowel(result, i); + } + } + + i--; + } + + return result; +} + +function isFleetingVowel(char: string): boolean { + return char === 'è' || char === 'ė' || char === 'ȯ' || char === 'ò'; +} + +function replaceFluentVowel(word: string, j: number): string { + const fluentVowel = word[j].normalize('NFD')[0]; + return `${word.slice(0, j)}(${fluentVowel})${word.slice(j + 1)}`; +} + +function isLastSyllable(word: string, i: number, end: number): boolean { + if (i === end - 2) return CONSONANTS.has(word[i + 1]); + if (i === end - 3) return word[i + 1] === 'n' && word[i + 2] === 'j'; + return false; +} diff --git a/src/common/index.ts b/src/common/index.ts index 4551783..4a97367 100644 --- a/src/common/index.ts +++ b/src/common/index.ts @@ -1,2 +1,2 @@ export * from './stripDiacritics'; -export * from './markFluentVowel'; +export * from './fluentVowels'; diff --git a/src/common/markFluentVowel.test.ts b/src/common/markFluentVowel.test.ts deleted file mode 100644 index dbcaffb..0000000 --- a/src/common/markFluentVowel.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { markFluentVowel } from './markFluentVowel'; - -describe('markFluentVowel', () => { - it('marks the fluent vowel in the word', () => { - expect(markFluentVowel('pes', 'psa')).toBe('p(e)s'); - expect(markFluentVowel('son', 'sna')).toBe('s(o)n'); - }); - - it('returns the same word when there is no fluent vowel', () => { - expect(markFluentVowel('mama', 'mama')).toBe('mama'); - }); - - it('marks the fluent vowel when it includes a diacritic', () => { - expect(markFluentVowel('pènj', 'pnja')).toBe('p(e)nj'); - expect(markFluentVowel('sòn', 'sna')).toBe('s(o)n'); - }); -}); diff --git a/src/common/markFluentVowel.ts b/src/common/markFluentVowel.ts deleted file mode 100644 index 53739a4..0000000 --- a/src/common/markFluentVowel.ts +++ /dev/null @@ -1,19 +0,0 @@ -export function markFluentVowel(word: string, add: string): string { - let i = 0; - - const L = Math.min(word.length - 1, add.length); - while (i < L && word[i] === add[i]) { - i++; - } - - if (word[i] !== add[i] && word[i + 1] === add[i]) { - return replaceFluentVowel(word, i); - } - - return word; -} - -function replaceFluentVowel(word: string, j: number): string { - const fluentVowel = word[j].normalize('NFD')[0]; - return `${word.slice(0, j)}(${fluentVowel})${word.slice(j + 1)}`; -} diff --git a/src/constants/alphabet.ts b/src/constants/alphabet.ts new file mode 100644 index 0000000..984024a --- /dev/null +++ b/src/constants/alphabet.ts @@ -0,0 +1,7 @@ +export const ALL_CHARACTERS = + 'aáàăâåąāæbcćçčdďđḓeéèĕêěëėęēǝfghiíìĭîīıjĵklĺľļłŀljmnńňñņnjoóòŏôöȯǫœpqrŕṙřsśšŠtťṱuúùŭûůũųūvwxyýzźżž'.split( + '', + ); + +export const CONSONANT_CHARACTERS = + 'bcćçčdďđḓfghklĺľļłŀljmnńňñņnjpqrŕṙřsśštťṱvwxzźżž'.split(''); diff --git a/src/constants/index.ts b/src/constants/index.ts index acfa977..47771c4 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1,2 +1,3 @@ +export * from './alphabet'; export * from './bcp47'; export * from './glagolitic'; diff --git a/src/noun/__snapshots__/declensionNoun.test.ts.snap b/src/noun/__snapshots__/declensionNoun.test.ts.snap index 6743162..c8fbf9c 100644 --- a/src/noun/__snapshots__/declensionNoun.test.ts.snap +++ b/src/noun/__snapshots__/declensionNoun.test.ts.snap @@ -79305,39 +79305,6 @@ exports[`noun f. urna 1`] = ` } `; -exports[`noun f. uråvenj (uråvnja) 1`] = ` -{ - "acc": [ - "uråvėnj", - "uråvnji", - ], - "dat": [ - "uråvnji", - "uråvnjam", - ], - "gen": [ - "uråvnji", - "uråvnjij", - ], - "ins": [ - "uråvnjjų", - "uråvnjami", - ], - "loc": [ - "uråvnji", - "uråvnjah", - ], - "nom": [ - "uråvėnj", - "uråvnji", - ], - "voc": [ - "uråvnji", - "uråvnji", - ], -} -`; - exports[`noun f. usluga 1`] = ` { "acc": [ @@ -103992,7 +103959,7 @@ exports[`noun m. Svět 1`] = ` } `; -exports[`noun m. Velikdenj (Velikdnja) 1`] = ` +exports[`noun m. Velikdėnj 1`] = ` { "acc": [ "Velikdėnj", @@ -111868,43 +111835,6 @@ exports[`noun m. deminutiv 1`] = ` } `; -exports[`noun m. denj (dnja) 1`] = ` -{ - "acc": [ - "den / denj", - "dni / dnje", - ], - "dat": [ - "dni / dnju", - "dnam / dnjam", - ], - "gen": [ - "dne / dnja", - "dnev / dnjev", - ], - "ins": [ - "dnem / dnjem", - "dnami / dnjami", - ], - "loc": [ - "dni / dnju", - "dnah / dnjah", - ], - "nom": [ - "den / denj", - "dni / dnje", - ], - "voc": [ - "den / dnju", - "dni / dnje", - ], -} -`; - -exports[`noun m. denj oplakyvańja 1`] = `null`; - -exports[`noun m. denj rođeńja 1`] = `null`; - exports[`noun m. departament 1`] = ` { "acc": [ @@ -114082,6 +114012,43 @@ exports[`noun m. dyšnik 1`] = ` } `; +exports[`noun m. dėnj 1`] = ` +{ + "acc": [ + "den / denj", + "dni / dnje", + ], + "dat": [ + "dni / dnju", + "dnam / dnjam", + ], + "gen": [ + "dne / dnja", + "dnev / dnjev", + ], + "ins": [ + "dnem / dnjem", + "dnami / dnjami", + ], + "loc": [ + "dni / dnju", + "dnah / dnjah", + ], + "nom": [ + "den / denj", + "dni / dnje", + ], + "voc": [ + "den / dnju", + "dni / dnje", + ], +} +`; + +exports[`noun m. dėnj oplakyvańja 1`] = `null`; + +exports[`noun m. dėnj rođeńja 1`] = `null`; + exports[`noun m. dęgylj 1`] = ` { "acc": [ @@ -140611,39 +140578,6 @@ exports[`noun m. penis 1`] = ` } `; -exports[`noun m. penj (pnja) 1`] = ` -{ - "acc": [ - "pėnj", - "pnje", - ], - "dat": [ - "pnju", - "pnjam", - ], - "gen": [ - "pnja", - "pnjev", - ], - "ins": [ - "pnjem", - "pnjami", - ], - "loc": [ - "pnju", - "pnjah", - ], - "nom": [ - "pėnj", - "pnje", - ], - "voc": [ - "pnju", - "pnje", - ], -} -`; - exports[`noun m. pensijny fond 1`] = `null`; exports[`noun m. penthaus 1`] = ` @@ -143261,39 +143195,6 @@ exports[`noun m. pol 2`] = ` } `; -exports[`noun m. poldenj (poldnja) 1`] = ` -{ - "acc": [ - "poldėnj", - "poldnje", - ], - "dat": [ - "poldnju", - "poldnjam", - ], - "gen": [ - "poldnja", - "poldnjev", - ], - "ins": [ - "poldnjem", - "poldnjami", - ], - "loc": [ - "poldnju", - "poldnjah", - ], - "nom": [ - "poldėnj", - "poldnje", - ], - "voc": [ - "poldnju", - "poldnje", - ], -} -`; - exports[`noun m. polder 1`] = ` { "acc": [ @@ -143360,6 +143261,39 @@ exports[`noun m. poldnik 1`] = ` } `; +exports[`noun m. poldėnj (poldnja) 1`] = ` +{ + "acc": [ + "poldėnj", + "poldnje", + ], + "dat": [ + "poldnju", + "poldnjam", + ], + "gen": [ + "poldnja", + "poldnjev", + ], + "ins": [ + "poldnjem", + "poldnjami", + ], + "loc": [ + "poldnju", + "poldnjah", + ], + "nom": [ + "poldėnj", + "poldnje", + ], + "voc": [ + "poldnju", + "poldnje", + ], +} +`; + exports[`noun m. polet 1`] = ` { "acc": [ @@ -143628,7 +143562,7 @@ exports[`noun m. pončik 1`] = ` } `; -exports[`noun m. popoldenj (popoldnja) 1`] = ` +exports[`noun m. popoldėnj 1`] = ` { "acc": [ "popoldėnj", @@ -149002,6 +148936,39 @@ exports[`noun m. pčeľnik 1`] = ` } `; +exports[`noun m. pėnj 1`] = ` +{ + "acc": [ + "pėnj", + "pnje", + ], + "dat": [ + "pnju", + "pnjam", + ], + "gen": [ + "pnja", + "pnjev", + ], + "ins": [ + "pnjem", + "pnjami", + ], + "loc": [ + "pnju", + "pnjah", + ], + "nom": [ + "pėnj", + "pnje", + ], + "voc": [ + "pnju", + "pnje", + ], +} +`; + exports[`noun m. pętikųtnik 1`] = ` { "acc": [ @@ -157599,7 +157566,7 @@ exports[`noun m. stěnj 1`] = ` } `; -exports[`noun m. stųpenj (stųpnja) 1`] = ` +exports[`noun m. stųpėnj 1`] = ` { "acc": [ "stųpėnj", @@ -157632,7 +157599,7 @@ exports[`noun m. stųpenj (stųpnja) 1`] = ` } `; -exports[`noun m. stųpenj (stųpnja) 2`] = ` +exports[`noun m. stųpėnj 2`] = ` { "acc": [ "stųpėnj", @@ -158799,7 +158766,7 @@ exports[`noun m. sųd 1`] = ` } `; -exports[`noun m. sųdny denj 1`] = `null`; +exports[`noun m. sųdny dėnj 1`] = `null`; exports[`noun m. sųdny pozȯv 1`] = `null`; @@ -161593,7 +161560,9 @@ exports[`noun m. tvoriteljnik 1`] = ` exports[`noun m. tvoriteljny padež 1`] = `null`; -exports[`noun m. tydenj (tydnja) 1`] = ` +exports[`noun m. tydnjevy žurnal 1`] = `null`; + +exports[`noun m. tydėnj (tydnja) 1`] = ` { "acc": [ "tydėnj", @@ -161626,8 +161595,6 @@ exports[`noun m. tydenj (tydnja) 1`] = ` } `; -exports[`noun m. tydnjevy žurnal 1`] = `null`; - exports[`noun m. tyl 1`] = ` { "acc": [ @@ -162521,7 +162488,7 @@ exports[`noun m. urođaj 1`] = ` } `; -exports[`noun m. uråvenj (uråvnja) 1`] = ` +exports[`noun m. uråvėnj 1`] = ` { "acc": [ "uråvėnj", @@ -219032,34 +218999,34 @@ exports[`noun m.sg. brom 1`] = ` } `; -exports[`noun m.sg. brězenj 1`] = ` +exports[`noun m.sg. brězėnj 1`] = ` { "acc": [ - "brězenj", + "brězėnj", null, ], "dat": [ - "brězenju", + "brěznju", null, ], "gen": [ - "brězenja", + "brěznja", null, ], "ins": [ - "brězenjem", + "brěznjem", null, ], "loc": [ - "brězenju", + "brěznju", null, ], "nom": [ - "brězenj", + "brězėnj", null, ], "voc": [ - "brězenju", + "brěznju", null, ], } @@ -219296,34 +219263,34 @@ exports[`noun m.sg. cukr 1`] = ` } `; -exports[`noun m.sg. cvětenj 1`] = ` +exports[`noun m.sg. cvětėnj 1`] = ` { "acc": [ - "cvětenj", + "cvětėnj", null, ], "dat": [ - "cvětenju", + "cvětnju", null, ], "gen": [ - "cvětenja", + "cvětnja", null, ], "ins": [ - "cvětenjem", + "cvětnjem", null, ], "loc": [ - "cvětenju", + "cvětnju", null, ], "nom": [ - "cvětenj", + "cvětėnj", null, ], "voc": [ - "cvětenju", + "cvětnju", null, ], } @@ -222701,34 +222668,34 @@ exports[`noun m.sg. lignit 1`] = ` } `; -exports[`noun m.sg. lipenj 1`] = ` +exports[`noun m.sg. lipėnj 1`] = ` { "acc": [ - "lipenj", + "lipėnj", null, ], "dat": [ - "lipenju", + "lipnju", null, ], "gen": [ - "lipenja", + "lipnja", null, ], "ins": [ - "lipenjem", + "lipnjem", null, ], "loc": [ - "lipenju", + "lipnju", null, ], "nom": [ - "lipenj", + "lipėnj", null, ], "voc": [ - "lipenju", + "lipnju", null, ], } @@ -226205,34 +226172,34 @@ exports[`noun m.sg. styd 1`] = ` } `; -exports[`noun m.sg. styčenj 1`] = ` +exports[`noun m.sg. styčėnj 1`] = ` { "acc": [ - "styčenj", + "styčėnj", null, ], "dat": [ - "styčenju", + "styčnju", null, ], "gen": [ - "styčenja", + "styčnja", null, ], "ins": [ - "styčenjem", + "styčnjem", null, ], "loc": [ - "styčenju", + "styčnju", null, ], "nom": [ - "styčenj", + "styčėnj", null, ], "voc": [ - "styčenju", + "styčnju", null, ], } @@ -226504,67 +226471,67 @@ exports[`noun m.sg. sěverozapad 1`] = ` } `; -exports[`noun m.sg. sěčenj 1`] = ` +exports[`noun m.sg. sěčėnj 1`] = ` { "acc": [ - "sěčenj", + "sěčėnj", null, ], "dat": [ - "sěčenju", + "sěčnju", null, ], "gen": [ - "sěčenja", + "sěčnja", null, ], "ins": [ - "sěčenjem", + "sěčnjem", null, ], "loc": [ - "sěčenju", + "sěčnju", null, ], "nom": [ - "sěčenj", + "sěčėnj", null, ], "voc": [ - "sěčenju", + "sěčnju", null, ], } `; -exports[`noun m.sg. sŕpenj 1`] = ` +exports[`noun m.sg. sŕpėnj 1`] = ` { "acc": [ - "sŕpenj", + "sŕpėnj", null, ], "dat": [ - "sŕpenju", + "sŕpnju", null, ], "gen": [ - "sŕpenja", + "sŕpnja", null, ], "ins": [ - "sŕpenjem", + "sŕpnjem", null, ], "loc": [ - "sŕpenju", + "sŕpnju", null, ], "nom": [ - "sŕpenj", + "sŕpėnj", null, ], "voc": [ - "sŕpenju", + "sŕpnju", null, ], } @@ -226770,34 +226737,34 @@ exports[`noun m.sg. totalitarizm 1`] = ` } `; -exports[`noun m.sg. travenj 1`] = ` +exports[`noun m.sg. travėnj 1`] = ` { "acc": [ - "travenj", + "travėnj", null, ], "dat": [ - "travenju", + "travnju", null, ], "gen": [ - "travenja", + "travnja", null, ], "ins": [ - "travenjem", + "travnjem", null, ], "loc": [ - "travenju", + "travnju", null, ], "nom": [ - "travenj", + "travėnj", null, ], "voc": [ - "travenju", + "travnju", null, ], } @@ -227199,34 +227166,34 @@ exports[`noun m.sg. volfram 1`] = ` } `; -exports[`noun m.sg. vresenj 1`] = ` +exports[`noun m.sg. vresėnj 1`] = ` { "acc": [ - "vresenj", + "vresėnj", null, ], "dat": [ - "vresenju", + "vresnju", null, ], "gen": [ - "vresenja", + "vresnja", null, ], "ins": [ - "vresenjem", + "vresnjem", null, ], "loc": [ - "vresenju", + "vresnju", null, ], "nom": [ - "vresenj", + "vresėnj", null, ], "voc": [ - "vresenju", + "vresnju", null, ], } @@ -227496,34 +227463,34 @@ exports[`noun m.sg. česnȯk 1`] = ` } `; -exports[`noun m.sg. črvenj 1`] = ` +exports[`noun m.sg. črvėnj 1`] = ` { "acc": [ - "črvenj", + "črvėnj", null, ], "dat": [ - "črvenju", + "črvnju", null, ], "gen": [ - "črvenja", + "črvnja", null, ], "ins": [ - "črvenjem", + "črvnjem", null, ], "loc": [ - "črvenju", + "črvnju", null, ], "nom": [ - "črvenj", + "črvėnj", null, ], "voc": [ - "črvenju", + "črvnju", null, ], } diff --git a/src/noun/declensionNoun.ts b/src/noun/declensionNoun.ts index 05caa73..b3a150d 100644 --- a/src/noun/declensionNoun.ts +++ b/src/noun/declensionNoun.ts @@ -3,7 +3,7 @@ */ import { declensionAdjective } from '../adjective'; -import { markFluentVowel } from '../common'; +import { inferFluentVowel, markFluentVowel } from '../common'; import type { Noun } from '../partOfSpeech'; import { removeBrackets } from '../utils'; import { establishGender } from './establishGender'; @@ -101,6 +101,8 @@ export function declensionNoun( if (add && noun !== add) { noun = markFluentVowel(noun, add); + } else if (originGender === 'masculine') { + noun = inferFluentVowel(noun); } const rawGender = prepareGender(originGender, animated); diff --git a/src/noun/testCases.yml b/src/noun/testCases.yml index f54e4fc..97ead4e 100644 --- a/src/noun/testCases.yml +++ b/src/noun/testCases.yml @@ -1441,7 +1441,7 @@ morphology: m. - lemma: brěza morphology: f. -- lemma: brězenj +- lemma: brězėnj morphology: m.sg. - lemma: bridž morphology: m.sg. @@ -1725,7 +1725,7 @@ morphology: m. - lemma: cvět morphology: m. -- lemma: cvětenj +- lemma: cvětėnj morphology: m.sg. - lemma: cvěteńje morphology: n.sg. @@ -2020,7 +2020,7 @@ morphology: m.anim. - lemma: črvenica morphology: f. -- lemma: črvenj +- lemma: črvėnj morphology: m.sg. - lemma: črvenogrlka morphology: f. @@ -2257,12 +2257,11 @@ morphology: m.anim. - lemma: demonstracija morphology: f. -- lemma: denj oplakyvańja +- lemma: dėnj oplakyvańja morphology: m. -- lemma: denj rođeńja +- lemma: dėnj rođeńja morphology: m. -- extra: "(dnja)" - lemma: denj +- lemma: dėnj morphology: m. - lemma: denonočje morphology: n. @@ -7052,7 +7051,7 @@ morphology: f. - lemma: lipan morphology: m.anim. -- lemma: lipenj +- lemma: lipėnj morphology: m.sg. - lemma: Lisabon morphology: m. @@ -10296,8 +10295,7 @@ morphology: m.pl. - lemma: penis morphology: m. -- extra: "(pnja)" - lemma: penj +- lemma: pėnj morphology: m. - lemma: pěnna kųpělj morphology: f. @@ -10931,7 +10929,7 @@ - lemma: polarno sijańje morphology: n.sg. - extra: "(poldnja)" - lemma: poldenj + lemma: poldėnj morphology: m. - lemma: polder morphology: m. @@ -11059,8 +11057,7 @@ morphology: f. - lemma: pop-muzika morphology: f. -- extra: "(popoldnja)" - lemma: popoldenj +- lemma: popoldėnj morphology: m. - lemma: popoldenno spańje morphology: n. @@ -13305,7 +13302,7 @@ morphology: f. - lemma: sěča morphology: f. -- lemma: sěčenj +- lemma: sěčėnj morphology: m.sg. - lemma: sědališče morphology: n. @@ -14211,7 +14208,7 @@ morphology: n. - lemma: sŕp morphology: m. -- lemma: sŕpenj +- lemma: sŕpėnj morphology: m.sg. - lemma: sŕsť morphology: f. @@ -14465,11 +14462,9 @@ morphology: m. - lemma: stųpenišče morphology: n. -- extra: "(stųpnja)" - lemma: stųpenj +- lemma: stųpėnj morphology: m. -- extra: "(stųpnja)" - lemma: stųpenj +- lemma: stųpėnj morphology: m. - lemma: stųpnica morphology: f. @@ -14483,7 +14478,7 @@ morphology: m. - lemma: stvorjeńje morphology: n. -- lemma: styčenj +- lemma: styčėnj morphology: m.sg. - lemma: styd morphology: m.sg. @@ -14519,7 +14514,7 @@ morphology: f. - lemma: sųďja morphology: m.anim. -- lemma: sųdny denj +- lemma: sųdny dėnj morphology: m. - lemma: sųdny pozȯv morphology: m. @@ -15380,7 +15375,7 @@ morphology: f. - lemma: trava morphology: f. -- lemma: travenj +- lemma: travėnj morphology: m.sg. - lemma: travjeńje morphology: n.sg. @@ -15559,7 +15554,7 @@ - lemma: tyčkoskok morphology: m. - extra: "(tydnja)" - lemma: tydenj + lemma: tydėnj morphology: m. - lemma: tydnjeva gazeta morphology: f. @@ -15783,12 +15778,8 @@ morphology: m.sg. - lemma: Uran morphology: m.sg. -- extra: "(uråvnja)" - lemma: uråvenj +- lemma: uråvėnj morphology: m. -- extra: "(uråvnja)" - lemma: uråvenj - morphology: f. - lemma: uraza morphology: f. - lemma: uręd @@ -16105,8 +16096,7 @@ morphology: f. - lemma: velikan morphology: m.anim. -- extra: "(Velikdnja)" - lemma: Velikdenj +- lemma: Velikdėnj morphology: m. - lemma: velikodušnosť morphology: f. @@ -16820,7 +16810,7 @@ morphology: n. - lemma: vrěs morphology: m. -- lemma: vresenj +- lemma: vresėnj morphology: m.sg. - lemma: vrěsk morphology: m.