From 48992c53d687cca70cf8fe721a9dcdd0608f1c1d Mon Sep 17 00:00:00 2001 From: Valentyne Stigloher Date: Sat, 13 Jan 2024 01:33:40 +0100 Subject: [PATCH] (pronouns) differentiate between empty and unset morphs empty morphs are those which have a real value, which corresponds to a suffix without additional letters, they should still show up in example sentences unset / null morphs are used when a pronoun does not support a specific form at all, so their example sentences should be hidden This reverts in part ed4049b3cc124605a3f9588b19eb63c5ff2dd961 and reintroduces the failure when an unset morpheme is used in an interchangeable pronoun, however this needs more restructering to fix --- locale/de/pronouns/pronouns.tsv | 36 +++++++++++----------- src/buildPronoun.js | 16 ++++++++-- src/classes.js | 8 ++--- test/buildPronoun.test.js | 18 +---------- test/classes.test.js | 20 ++++++++++++- test/fixtures/pronouns.js | 53 +++++++++++++++++++++++++-------- 6 files changed, 95 insertions(+), 56 deletions(-) diff --git a/locale/de/pronouns/pronouns.tsv b/locale/de/pronouns/pronouns.tsv index 18b237de6..d8acf54e1 100644 --- a/locale/de/pronouns/pronouns.tsv +++ b/locale/de/pronouns/pronouns.tsv @@ -4,30 +4,30 @@ sie,sie/ihr Femininum TRUE sie ihrer ihr sie ihre ihrer ihrer ihre ihr ihres ihr es,es/sein,es/ihm Neutrum TRUE es seiner ihm es seine seiner seiner seine sein seines seinem seinen sein seines seinem sein das des dem das dieses dieses diesem dieses FALSE FALSE TRUE es/ihr Neutrum mit femininen Formen FALSE es ihrer ihr es ihre ihrer ihrer ihre ihr ihres ihrem ihren ihr ihres ihrem ihr das der der das dieses dieser dieser dieses FALSE FALSE TRUE Wie {/es=„es/sein“}, wobei Wörter, bei denen das {/es=Neutrum} identisch mit dem {/er=Maskulinum} ist, durch {/sie=feminine} Formen ersetzt werden es/denen Neutrum mit inflexiven Formen FALSE es derer denen es deren deren deren deren deren deren deren deren deren deren deren deren das des dem das dieses dieses diesem dieses FALSE FALSE TRUE Wie {/es=„es/sein“}, wobei die meisten Wörter, bei denen das {/es=Neutrum} identisch mit dem {/er=Maskulinum} ist, durch inflexive Formen ersetzt werden, wie sie auch in {/dey/denen=„dey/denen“} verwendet werden -dey,dey/denen Neopronomen „dey“ FALSE dey derer denen dey deren deren deren deren deren deren deren deren deren deren deren deren FALSE FALSE TRUE Im Akkusativ ist ebenfalls {/dey/denen/demm=„demm”} üblich. pronoun_a -dey/denen/demm Neopronomen „dey“ FALSE dey derer denen demm deren deren deren deren deren deren deren deren deren deren deren deren FALSE FALSE TRUE Im Akkusativ ist ebenfalls {/dey/denen=„dey”} üblich. pronoun_a -die,die/denen Neopronomen „die“ FALSE die derer denen die deren deren deren deren deren deren deren deren deren deren deren deren FALSE FALSE TRUE -el,el/em Neopronomen „el“ FALSE el|ɛl emser|ɛmzɐ em|ɛm en|ɛn emse|ɛmzə emser|ɛmzɐ emser|ɛmzɐ emse|ɛmzə ems|ɛmz emses|ɛmzəs emsem|ɛmzəm emsen|ɛmzən ems|ɛmz emses|ɛmzəs emsem|ɛmzəm ems|ɛmz FALSE FALSE TRUE -em,em/em Neopronomen „em“ FALSE em|ɛm emser|ɛmzɐ em|ɛm em|ɛm ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz FALSE FALSE TRUE +dey,dey/denen Neopronomen „dey“ FALSE dey derer denen dey deren deren deren deren deren deren deren deren deren deren deren deren ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE Im Akkusativ ist ebenfalls {/dey/denen/demm=„demm”} üblich. pronoun_a +dey/denen/demm Neopronomen „dey“ FALSE dey derer denen demm deren deren deren deren deren deren deren deren deren deren deren deren ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE Im Akkusativ ist ebenfalls {/dey/denen=„dey”} üblich. pronoun_a +die,die/denen Neopronomen „die“ FALSE die derer denen die deren deren deren deren deren deren deren deren deren deren deren deren ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE +el,el/em Neopronomen „el“ FALSE el|ɛl emser|ɛmzɐ em|ɛm en|ɛn emse|ɛmzə emser|ɛmzɐ emser|ɛmzɐ emse|ɛmzə ems|ɛmz emses|ɛmzəs emsem|ɛmzəm emsen|ɛmzən ems|ɛmz emses|ɛmzəs emsem|ɛmzəm ems|ɛmz ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE +em,em/em Neopronomen „em“ FALSE em|ɛm emser|ɛmzɐ em|ɛm em|ɛm ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ems|ɛmz ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE en,en/en Neopronomen „en“ FALSE en|ɛn enser|ɛnzɐ en|ɛn en|ɛn ense|ɛnzə enser|ɛnzɐ enser|ɛnzɐ ense|ɛnzə enses|ɛnzəs enses|ɛnzəs ensem|ɛnzəm ensen|ɛnzən ens|ɛnz enses|ɛnzəs ensem|ɛnzəm ens|ɛnz de|deː ders|dɛrz derm|dɛrm de|deː de|deː dersen|dɛrzən derm|dɛrm de|deː FALSE FALSE TRUE Erstellt vom österreichischen LGBTIQA+-Kongress 2018 in St. Pölten en/em Neopronomen „en“ FALSE en|ɛn enser|ɛnzɐ em|ɛm en|ɛn ense|ɛnzə enser|ɛnzɐ enser|ɛnzɐ ense|ɛnzə ens|ɛnz enses|ɛnzəs ensem|ɛnzəm ensen|ɛnzən ens|ɛnz enses|ɛnzəs ensem|ɛnzəm ens|ɛnz de|deː ders|dɛrz derm|dɛrm de|deː de|deː dersen|dɛrzən derm|dɛrm de|deː FALSE FALSE TRUE Erstellt vom {https://geschlechtsneutral.net/=Verein für geschlechtsneutrales Deutsch} -ey,ey/emm Neopronomen „ey“ FALSE ey eyser emm emm eyse eyser eyser eyse eys eyses eysem eysen eys eyses eysem eys FALSE FALSE TRUE -et,et/siem Neopronomen „et“ FALSE et sierer siem sien siere sierer sierer siere sier sieres sierem sieren sier sieres sierem sieren dat diesers diem dien dieset diesigen diesetne FALSE FALSE TRUE -hän,hän/sim Neopronomen „hän“ FALSE hän sirer sim sin sire sirer sirer sire sir sires sirem siren sir sires sirem siren FALSE FALSE TRUE +ey,ey/emm Neopronomen „ey“ FALSE ey eyser emm emm eyse eyser eyser eyse eys eyses eysem eysen eys eyses eysem eys ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE +et,et/siem Neopronomen „et“ FALSE et sierer siem sien siere sierer sierer siere sier sieres sierem sieren sier sieres sierem sieren dat diesers diem dien dieset ~ diesigen diesetne FALSE FALSE TRUE +hän,hän/sim Neopronomen „hän“ FALSE hän sirer sim sin sire sirer sirer sire sir sires sirem siren sir sires sirem siren ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE hen,hen/hen,hen/hem Neopronomen „hen“ FALSE hen henser hem hen hens hens hens hens hens hens hens hens hens hens hens hens dai dais dam dai diesai diesais deisam diesai FALSE FALSE TRUE Aus dem Schwedischen, siehe: {https://sv.pronouns.page/hen=hen/henom}. Auch verwendet im {https://geschlechtsneutralesdeutsch.com/=NoNa-System}. -hie,hie/hein,hie/hiem Neopronomen „hie“ FALSE hie heiner hiem hie heine heiner heiner heine hein heines heinem heinen hein heines heinem hein FALSE FALSE TRUE -iks,iks/iks Neopronomen „iks“ FALSE iks ikser iks iks ikses ikses ikses ikses ikses ikses ikses ikses ikses ikses ikses ikses deks dieseks FALSE FALSE TRUE -ind,ind/inde Neopronomen „ind“ FALSE ind|ɪnd indser|ɪndzɐ inde|ɪndə ind|ɪnd indse|ɪndzə indser|ɪndzɐ indser|ɪndzɐ indse|ɪndzə inds|ɪndz indsens|ɪndzəs indsem|ɪndzəm indsen|ɪndzən inds|ɪndz indsens|ɪndzəns indsem|ɪndzəm inds|ɪndz FALSE FALSE TRUE Vom Wort „Individuum“ -mensch,mensch/mensch Neopronomen „mensch” FALSE mensch menscher mensch mensch menschs menschs menschs menschs menschs menschs menschs menschs menschs menschs menschs menschs FALSE FALSE TRUE Oft wird „mensch” auch als {https://de.wikipedia.org/wiki/Generalisierendes_Personalpronomen=generalisierendes Pronomen} benutzt (statt „man”).@Eher als eines von mehreren Pronomen verwendet ({https://nibi.space/pronomen#mensch=laut nibi.space}). +hie,hie/hein,hie/hiem Neopronomen „hie“ FALSE hie heiner hiem hie heine heiner heiner heine hein heines heinem heinen hein heines heinem hein ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE +iks,iks/iks Neopronomen „iks“ FALSE iks ikser iks iks ikses ikses ikses ikses ikses ikses ikses ikses ikses ikses ikses ikses deks ~ ~ ~ dieseks ~ ~ ~ FALSE FALSE TRUE +ind,ind/inde Neopronomen „ind“ FALSE ind|ɪnd indser|ɪndzɐ inde|ɪndə ind|ɪnd indse|ɪndzə indser|ɪndzɐ indser|ɪndzɐ indse|ɪndzə inds|ɪndz indsens|ɪndzəs indsem|ɪndzəm indsen|ɪndzən inds|ɪndz indsens|ɪndzəns indsem|ɪndzəm inds|ɪndz ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE Vom Wort „Individuum“ +mensch,mensch/mensch Neopronomen „mensch” FALSE mensch menscher mensch mensch menschs menschs menschs menschs menschs menschs menschs menschs menschs menschs menschs menschs ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE Oft wird „mensch” auch als {https://de.wikipedia.org/wiki/Generalisierendes_Personalpronomen=generalisierendes Pronomen} benutzt (statt „man”).@Eher als eines von mehreren Pronomen verwendet ({https://nibi.space/pronomen#mensch=laut nibi.space}). nin,nin/nim Neopronomen „nin“ FALSE nin nimser nim nin nimse nimser nimser nimse nims nimses nimsem nimsen nims nimses nimsem nims din dins dim din diesin diesins diesim diesin FALSE FALSE TRUE Erstellt von {https://www.geschlechtsneutral.com/lit/Liminalis-2008-Sylvain-Balzer.pdf=Cabala de Sylvain und Carsten Balzer} -oj,oj/juj,oj/ojm Neopronomen „oj“ FALSE oj jujer ojm ojn juje jujer jujer juje juj jujes jusem jusen jus juses jusem jus FALSE FALSE TRUE Erstellt von {https://www.frumble.de/blog/2021/03/26/ueberlegungen-zu-einer-genderneutralen-deutschen-grammatik=Frumble}. Siehe auch: {/substantive#Ojum=Ojum}. -per,per/per Neopronomen „per“ FALSE per perer per per pers pers pers pers pers pers pers pers pers pers pers pers FALSE FALSE TRUE Vom Wort „Person“ -ser,ser/sem Neopronomen „ser“ FALSE ser seser sem sen ses ses ses ses ses ses ses ses ses ses ses ses FALSE FALSE TRUE +oj,oj/juj,oj/ojm Neopronomen „oj“ FALSE oj jujer ojm ojn juje jujer jujer juje juj jujes jusem jusen jus juses jusem jus ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE Erstellt von {https://www.frumble.de/blog/2021/03/26/ueberlegungen-zu-einer-genderneutralen-deutschen-grammatik=Frumble}. Siehe auch: {/substantive#Ojum=Ojum}. +per,per/per Neopronomen „per“ FALSE per perer per per pers pers pers pers pers pers pers pers pers pers pers pers ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE Vom Wort „Person“ +ser,ser/sem Neopronomen „ser“ FALSE ser seser sem sen ses ses ses ses ses ses ses ses ses ses ses ses ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE sier,sier/siem Neopronomen „sier“ FALSE sier|zi:ɐ̯ sieser|zi:sɐ siem|zi:m sien|zi:n siese|zi:zə sieser|zi:zɐ sieser|zi:zɐ siese|zi:zə sies|zi:z sieses|zi:zəs siesem|zi:zəm siesen|zi:zən sies|zi:z sieses|zi:zəs siesem|zi:zəm sies|zi:z dier|di:ɐ̯ dies|di:s diem|di:m dien|di:n dier|di:ɐ̯ dies|di:s diem|di:m dien|di:n FALSE FALSE TRUE Erstellt von {https://www.annaheger.de/pronomen21/=Illi Anna Heger} -they,they/them Äquivalent zu englischem „they“ FALSE they them them them their their their their their their their their their their their their FALSE FALSE TRUE Aus dem Englischen, sieh: {https://en.pronouns.page/they=they/them} +they,they/them Äquivalent zu englischem „they“ FALSE they them them them their their their their their their their their their their their their ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE Aus dem Englischen, sieh: {https://en.pronouns.page/they=they/them} xier,xier/xiem Neopronomen „xier“ FALSE xier|ksi:ɐ̯ xieser|ksi:sɐ xiem|ksi:m xien|ksi:n xiese|ksi:zə xieser|ksi:ɐ̯sɐ xieser|ksi:ɐ̯sɐ xiese|ksi:zə xies|ksi:z xieses|ksi:zəs xiesem|ksi:zəm xiesen|ksi:zən xies|ksi:z xieses|ksi:zəs xiesem|ksi:zəm xies|ksi:z dier|di:ɐ̯ dies|di:s diem|di:m dien|di:n dier|di:ɐ̯ dies|di:s diem|di:m dien|di:n FALSE FALSE TRUE Erstellt von {https://www.annaheger.de/pronomen33/=Illi Anna Heger}. -zet,zet/zerm Neopronomen „zet“ FALSE zet zerner zerm zern zets zets zets zets zets zets zets zets zets zets zets zets FALSE FALSE TRUE +zet,zet/zerm Neopronomen „zet“ FALSE zet zerner zerm zern zets zets zets zets zets zets zets zets zets zets zets zets ~ ~ ~ ~ ~ ~ ~ ~ FALSE FALSE TRUE er_sie,er_sie/ihm_ihr Neopronomen „er_sie“ FALSE er_sie seiner_ihrer ihm_ihr ihn_sie seine_ihre seiner_ihrer seiner_ihrer seine_ihre sein_ihr seines_ihres seinem_ihrem seinen_ihren sein_ihr seines_ihres seinem_ihrem sein_ihr der_die des_der dem_der den_die diese_r dieses_dieser diesem_dieser diese_n FALSE FALSE FALSE er*sie,er*sie/ihm*ihr Neopronomen „er*sie“ FALSE er*sie seiner*ihrer ihm*ihr ihn*sie seine*ihre seiner*ihrer seiner*ihrer seine*ihre sein*ihr seines*ihres seinem*ihrem seinen*ihren sein*ihr seines*ihres seinem*ihrem sein*ihr der*die des*der dem*der den*die diese*r dieses*dieser diesem*dieser diese*n FALSE FALSE FALSE er:sie,er:sie/ihm:ihr Neopronomen „er:sie“ FALSE er:sie seiner:ihrer ihm:ihr ihn:sie seine:ihre seiner:ihrer seiner:ihrer seine:ihre sein:ihr seines:ihres seinem:ihrem seinen:ihren sein:ihr seines:ihres seinem:ihrem sein:ihr der:die des:der dem:der den:die diese:r dieses:dieser diesem:dieser diese:n FALSE FALSE FALSE -ersie,ersie/ihmihr Neopronomen „ersie“ FALSE ersie seinerihrer ihmihr ihnsie seineihre seinerihrer seinerihrer seineihre seinihr seinesihres seinemihrem seinenihren seinihr seinesihres seinemihrem seinihr derdie desder demder dendie dieserdiese diesesdieser diesemdieser diesediesen FALSE FALSE FALSE \ No newline at end of file +ersie,ersie/ihmihr Neopronomen „ersie“ FALSE ersie seinerihrer ihmihr ihnsie seineihre seinerihrer seinerihrer seineihre seinihr seinesihres seinemihrem seinenihren seinihr seinesihres seinemihrem seinihr derdie desder demder dendie dieserdiese diesesdieser diesemdieser diesediesen FALSE FALSE FALSE diff --git a/src/buildPronoun.js b/src/buildPronoun.js index c7a186ddc..9127a3358 100644 --- a/src/buildPronoun.js +++ b/src/buildPronoun.js @@ -94,7 +94,7 @@ const buildPronounFromSlashes = (config, path) => { buildDict(function*() { for (const m of MORPHEMES) { const index = slashMorphemes.indexOf(m); - yield [m, index === -1 ? '' : morphemeChunks[index]]; + yield [m, index === -1 ? null : morphemeChunks[index]]; } }), [plural], @@ -193,7 +193,19 @@ export const parsePronouns = (pronounsRaw) => { t.normative, buildDict(function* () { for (const morpheme of MORPHEMES) { - yield [morpheme, t[morpheme]]; + let value; + if (t[morpheme] === null) { + // empty cells are parsed as null in dynamic parse mode, + // but most of the time an empty string is intended + value = ''; + } else if (t[morpheme] === '~') { + // to really describe that a pronoun does not support a morpheme, + // tilde is used to describe null as in yaml. + value = null; + } else { + value = t[morpheme]; + } + yield [morpheme, value]; } }), [t.plural], diff --git a/src/classes.js b/src/classes.js index 0d072a98e..10ebfc341 100644 --- a/src/classes.js +++ b/src/classes.js @@ -307,7 +307,7 @@ export class Pronoun { if (!morphemes.hasOwnProperty(m)) { continue; } - const [morpheme, pronunciation] = morphemes[m] ? morphemes[m].split('|') : [null, null]; + const [morpheme, pronunciation] = typeof morphemes[m] === 'string' ? morphemes[m].split('|') : [null, null]; this.morphemes[m] = morpheme; this.pronunciations[m] = pronunciation; } @@ -405,17 +405,13 @@ export class Pronoun { morpheme = morpheme.substring(1); } - if (!this.morphemes[morpheme]) { + if (this.morphemes[morpheme] === null) { return null; } const options = this.morphemes[morpheme].split('&'); const result = options[counter % options.length]; - if (result === '') { - return null; - } - return capital ? capitalise(result) : result; } diff --git a/test/buildPronoun.test.js b/test/buildPronoun.test.js index 8106a8413..38a17d842 100644 --- a/test/buildPronoun.test.js +++ b/test/buildPronoun.test.js @@ -183,23 +183,7 @@ describe('when configured that slashes contain some morphemes', () => { test('builds generated pronoun from all required morphemes', () => { const actual = expect(buildPronoun(pronouns, 'ae/aer/aer/aerself')); actual.toBeDefined(); - actual.toEqual(new Pronoun( - 'ae/aer', - '', - false, - { - pronoun_subject: 'ae', - pronoun_object: 'aer', - possessive_determiner: 'aer', - possessive_pronoun: null, - reflexive: 'aerself', - }, - [false], - [false], - [], - '__generator__', - false, - )); + actual.toEqual(generatedPronouns.aerWithUnsetPossessivePronoun); }); test('builds nothing if morphemes are missing', () => { expect(buildPronoun(pronouns, 'ae/aer/aer')).toBeUndefined(); diff --git a/test/classes.test.js b/test/classes.test.js index b2fdb20c4..936a55e70 100644 --- a/test/classes.test.js +++ b/test/classes.test.js @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, test } from '@jest/globals'; -import { MergedPronounGroup, PronounGroup, PronounLibrary } from '../src/classes.js'; +import { Example, ExamplePart, MergedPronounGroup, PronounGroup, PronounLibrary } from '../src/classes.js'; import { mockTranslations } from './fixtures/translations.js'; const translations = { @@ -15,6 +15,24 @@ mockTranslations(translations); const { default: pronouns, generated: generatedPronouns } = await import('./fixtures/pronouns.js'); const { default: translator } = await import('../src/translator.js'); +describe('required morphemes for an example', () => { + const exampleParts = [ + new ExamplePart(false, 'This house is '), + new ExamplePart(true, 'possessive_pronoun'), + ]; + const example = new Example(exampleParts, exampleParts); + + test('are present if all morphemes are present', () => { + expect(example.requiredMorphemesPresent(pronouns.they)).toBe(true); + }); + test('are present even if one morpheme is empty', () => { + expect(example.requiredMorphemesPresent(generatedPronouns.aerWithEmptyPossessivePronoun)).toBe(true); + }); + test('are missing if one morpheme is null', () => { + expect(example.requiredMorphemesPresent(generatedPronouns.aerWithUnsetPossessivePronoun)).toBe(false); + }); +}); + describe('formatting a pronoun with slashes', () => { describe('when slashes are not configured', () => { beforeEach(() => { diff --git a/test/fixtures/pronouns.js b/test/fixtures/pronouns.js index 26bb1850b..284b688fe 100644 --- a/test/fixtures/pronouns.js +++ b/test/fixtures/pronouns.js @@ -14,11 +14,8 @@ const he = new Pronoun( [false], [false], ['he/him'], - '', + null, true, - '', - '', - '', ); const she = new Pronoun( @@ -35,11 +32,8 @@ const she = new Pronoun( [false], [false], ['she/her'], - '', + null, true, - '', - '', - '', ); const they = new Pronoun( @@ -56,11 +50,10 @@ const they = new Pronoun( [true], [true], ['they/them'], - '', + null, true, - '', - 'themselves', - '', + null, + 'reflexive', ); export default { @@ -154,6 +147,40 @@ const aerPluralWithDescription = new Pronoun( '__generator__', false, ); +const aerWithEmptyPossessivePronoun = new Pronoun( + 'ae/aer', + '', + false, + { + pronoun_subject: 'ae', + pronoun_object: 'aer', + possessive_determiner: 'aer', + possessive_pronoun: '', + reflexive: 'aerself', + }, + [false], + [false], + [], + '__generator__', + false, +); +const aerWithUnsetPossessivePronoun = new Pronoun( + 'ae/aer', + '', + false, + { + pronoun_subject: 'ae', + pronoun_object: 'aer', + possessive_determiner: 'aer', + possessive_pronoun: null, + reflexive: 'aerself', + }, + [false], + [false], + [], + '__generator__', + false, +); const sSlashHe = new Pronoun( 's/he/hir', @@ -179,5 +206,7 @@ export const generated = { aerPluralHonorific, aerWithDescription, aerPluralWithDescription, + aerWithEmptyPossessivePronoun, + aerWithUnsetPossessivePronoun, sSlashHe, };