Skip to content

Commit 2cd42b8

Browse files
committed
improved article detection & managing for issue #2
1 parent 6b0db17 commit 2cd42b8

File tree

3 files changed

+92
-44
lines changed

3 files changed

+92
-44
lines changed

functions/handlers.js

+16-6
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,14 @@ async function getVERBInfinitive(word, langRef){
125125
}
126126

127127
async function handleNOUN(obj, sentence, langRef, src, defaults){
128-
if (obj.composed && obj.types.at(-2) === 'NOUN') {
129-
obj.words.splice(-1, 0, defaults.CON);
130-
obj.types.splice(-1, 0, "CON");
128+
if (obj.composed) {
129+
if(obj.types.at(-2) === 'NOUN'){
130+
obj.words.splice(-1, 0, defaults.CON);
131+
obj.types.splice(-1, 0, "CON");
132+
} else if (obj.types.at(-2) === 'ART' && obj.types.at(-3) === 'NOUN'){
133+
obj.words.splice(-2, 0, defaults.CON);
134+
obj.types.splice(-2, 0, "CON");
135+
}
131136
}
132137
for (c of obj.children){
133138
switch (sentence[c.position].type){
@@ -141,9 +146,14 @@ async function handleNOUN(obj, sentence, langRef, src, defaults){
141146
}
142147

143148
async function handleSUBJ(obj, sentence, langRef, src, defaults){
144-
if (obj.composed && obj.types.at(-2) === 'SUBJ') {
145-
obj.words.splice(-1, 0, defaults.CON);
146-
obj.types.splice(-1, 0, "CON");
149+
if (obj.composed) {
150+
if(obj.types.at(-2) === 'SUBJ'){
151+
obj.words.splice(-1, 0, defaults.CON);
152+
obj.types.splice(-1, 0, "CON");
153+
} else if (obj.types.at(-2) === 'ART' && obj.types.at(-3) === 'SUBJ'){
154+
obj.words.splice(-2, 0, defaults.CON);
155+
obj.types.splice(-2, 0, "CON");
156+
}
147157
}
148158
for (c of obj.children){
149159
switch (sentence[c.position].type){

functions/methods.js

+9-14
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,15 @@ async function prepareSentence(words, types, props, language){
2727
const personsGenders = personsGendersSn.val() || {};
2828
const advTimesSn = await rt.ref(`${language}/ADVERBS/TIMES`).get()
2929
const advTimes = advTimesSn.val() || {};
30+
const articlesGendersSn = await rt.ref(`${language}/ARTICLES/GENDERS`).get()
31+
const articlesGenders = articlesGendersSn.val() || {};
3032
const defaultsSn = await rt.ref(`${language}/DEFAULTS`).get()
3133
const defaults = defaultsSn.val() || {};
3234
const pastersSn = await rt.ref(`${language}/PASTERS`).get()
3335
const pasters = pastersSn.val() || {};
36+
const langRef = rt.ref(language);
3437

35-
[words, types] = await solveMISC(words.map(w => w.toLowerCase()), types.map(t => t.toUpperCase()), rt.ref(`${language}/DEFINITIVES/MISC`))
38+
[words, types] = await solveMISC(words.map(w => w.toLowerCase()), types.map(t => t.toUpperCase()), langRef)
3639

3740
const prepared = [];
3841
let i=0;
@@ -74,12 +77,14 @@ async function prepareSentence(words, types, props, language){
7477
personsPlurals,
7578
personsGenders,
7679
advTimes,
77-
defaults
80+
articlesGenders,
81+
defaults,
82+
langRef
7883
))
7984
i+=jMax;
8085
}
81-
82-
return await solveMOD(prepared, personsPlurals, personsGenders, advTimes, defaults);
86+
87+
return await solveMOD(await Promise.all(prepared), personsPlurals, personsGenders, advTimes, defaults);
8388
}
8489

8590
const { isDependant } = require('./dependencies.js')
@@ -115,16 +120,6 @@ async function parseDependencies(wordList, headlessList, language){ //Algorithm
115120
break;
116121
}
117122
}
118-
/* HERE: THIS SHOULD NOT BE NECESSARY (and less efficient) IF USING THE headlessList
119-
if(!passedRight){
120-
if(isDependant(wordList[i], wordList[i+j], isHeadOf)) {
121-
wordList[i+j].children.push({position: i, type: wordList[i].type});
122-
wordList[i].headless = false;
123-
headless = false;
124-
break;
125-
}
126-
}
127-
*/
128123
j++;
129124
}
130125
if (headless) headlessList.push({position: i, type: wordList[i].type})

functions/prepares.js

+67-24
Original file line numberDiff line numberDiff line change
@@ -38,52 +38,92 @@ async function solveMOD(tokens, personsPlurals, personsGenders, advTimes, defaul
3838
return tokens;
3939
}
4040

41-
async function solveMISC(words, types, definitivesRef){
42-
var definitives;
43-
41+
async function solveMISC(words, types, langRef){
4442
for (let i=0; i<types.length; i++){
4543
if (types[i] === 'MISC'){
46-
if (!definitives){
47-
const definitivesSn = await definitivesRef.get();
48-
definitives = definitivesSn.val() || {};
49-
}
50-
types[i] = definitives[words[i]] || 'MISC';
44+
const definitiveMiscSn = await langRef.child(`DEFINITIVES/MISC/${words[i]}`).get();
45+
types[i] = definitiveMiscSn.exists() ? definitiveMiscSn.val() : 'MISC';
5146
}
5247
}
5348
return [words, types];
5449
}
5550

56-
function prepareMeta(obj, personsPlurals, personsGenders, advTimes, defaults){
51+
async function findART(obj, articlesGenders){
52+
for(let i=0; i<obj.words.length; i++){
53+
const wordsSplit = obj.words[i].split(' ');
54+
if(wordsSplit.length > 1){
55+
const newWords = []
56+
const newTypes = []
57+
let currentNewWord = []
58+
const articleList = Object.keys(articlesGenders).map(k => articlesGenders[k])
59+
for(w of wordsSplit){
60+
if(articleList.includes(w)){
61+
if(currentNewWord.length > 0){
62+
newWords.push(currentNewWord.join(' '))
63+
newTypes.push(obj.types[i])
64+
currentNewWord = []
65+
}
66+
newWords.push(w)
67+
newTypes.push('ART')
68+
console.log(newWords)
69+
console.log(newTypes)
70+
} else {
71+
currentNewWord.push(w)
72+
}
73+
}
74+
newWords.push(currentNewWord.join(' '))
75+
newTypes.push(obj.types[i])
76+
obj.words.splice(i, 1, ...newWords)
77+
obj.types.splice(i, 1, ...newTypes)
78+
}
79+
}
80+
}
81+
82+
async function prepareMeta(obj, personsPlurals, personsGenders, advTimes, articlesGenders, defaults, langRef){
83+
5784
switch(obj.type){
5885
case 'NOUN':
59-
return prepareMetaNOUN(obj, personsPlurals, personsGenders, defaults);
86+
return await prepareMetaNOUN(obj, personsPlurals, personsGenders, articlesGenders, defaults, langRef);
6087
case 'SUBJ':
61-
return prepareMetaSUBJ(obj, personsPlurals, personsGenders, defaults);
88+
return await prepareMetaSUBJ(obj, personsPlurals, personsGenders, defaults, langRef);
6289
case 'ADV':
63-
return prepareMetaADV(obj, advTimes, defaults);
90+
return await prepareMetaADV(obj, advTimes, defaults);
6491
case 'ADJ':
65-
return prepareMetaADJ(obj);
92+
return await prepareMetaADJ(obj);
6693
}
6794
return obj;
6895
}
6996

70-
function prepareMetaNOUN(obj, personsPlurals, personsGenders, defaults){
97+
async function prepareMetaNOUN(obj, personsPlurals, personsGenders, articlesGenders, defaults, langRef){
7198

99+
await findART(obj, articlesGenders)
72100
const genders = []
101+
const addART = []
73102
for(let i=0; i<obj.words.length; i++){
74103
if (obj.types[i] === 'NOUN'){
75104
if(personsGenders.flat(1).includes(obj.words[i])) genders.push(obj.words[i])
76105
else if(obj.props[i]) genders.push(obj.props[i].gender || defaults.GENDER)
77-
else genders.push(defaults.GENDER)
106+
else {
107+
const definitiveGenderSn = await langRef.child(`DEFINITIVES/GENDER/${obj.words[i]}`).get()
108+
genders.push(definitiveGenderSn.exists() ? definitiveGenderSn.val() : defaults.GENDER)
109+
}
110+
}
111+
if (i === 0){
112+
addART.push([0, articlesGenders[genders.at(-1)]])
113+
}
114+
else if (obj.types[i-1] !== 'ART' && obj.types[i-1] !== 'CON'){
115+
addART.push([i, articlesGenders[genders.at(-1)]])
78116
}
79117
}
118+
addART.forEach((v, i) => {
119+
obj.words.splice(v[0] + i, 0, v[1])
120+
obj.types.splice(v[0] + i, 0, 'ART')
121+
})
80122
if(genders.length > 0){
81-
const foundPerson = personsPlurals.find(person => ( obj.words.includes(person[0]) || obj.words.includes(person[1]))) || defaults.PERSON;
123+
const foundPerson = personsPlurals.find(person => ( obj.words.includes(person[0]) || obj.words.includes(person[1]))) || personsPlurals.at(-1);
82124
obj.meta.PERSON = genders.length > 1 ? foundPerson[1] : foundPerson[0];
83-
if (!personsGenders.flat(1).includes(obj.meta.PERSON)){
84-
const foundGender = personsGenders.find(gender => ( genders.includes(gender[0]) || genders.includes(gender[1])));
85-
obj.meta.GENDER = genders.length > 1 ? foundGender[1] : foundGender[0];
86-
}
125+
const foundGender = personsGenders.find(gender => ( genders.includes(gender[0]) || genders.includes(gender[1])));
126+
obj.meta.GENDER = genders.length > 1 ? foundGender[1] : foundGender[0];
87127
} else {
88128
obj.meta.PERSON = defaults.GENDER;
89129
}
@@ -94,14 +134,17 @@ function prepareMetaNOUN(obj, personsPlurals, personsGenders, defaults){
94134
return obj;
95135
}
96136

97-
function prepareMetaSUBJ(obj, personsPlurals, personsGenders, defaults){
137+
async function prepareMetaSUBJ(obj, personsPlurals, personsGenders, defaults, langRef){
98138

99139
const genders = []
100140
for(let i=0; i<obj.words.length; i++){
101141
if (obj.types[i] === 'SUBJ'){
102142
if(personsGenders.flat(1).includes(obj.words[i])) genders.push(obj.words[i])
103143
else if(obj.props[i]) genders.push(obj.props[i].gender || defaults.GENDER)
104-
else genders.push(defaults.GENDER)
144+
else {
145+
const definitiveGenderSn = await langRef.child(`DEFINITIVES/GENDER/${obj.words[i]}`).get()
146+
genders.push(definitiveGenderSn.exists() ? definitiveGenderSn.val() : defaults.GENDER)
147+
}
105148
}
106149
}
107150
if(genders.length > 0){
@@ -116,7 +159,7 @@ function prepareMetaSUBJ(obj, personsPlurals, personsGenders, defaults){
116159
return obj;
117160
}
118161

119-
function prepareMetaADV(obj, advTimes, defaults){
162+
async function prepareMetaADV(obj, advTimes, defaults){
120163
obj.types = obj.types.map(t => t === 'MOD' ? 'ADV' : t)
121164

122165
for (word of obj.words){
@@ -130,7 +173,7 @@ function prepareMetaADV(obj, advTimes, defaults){
130173
return obj;
131174
}
132175

133-
function prepareMetaADJ(obj){
176+
async function prepareMetaADJ(obj){
134177
obj.types = obj.types.map(t => t === 'MOD' ? 'ADJ' : t)
135178
return obj;
136179
}

0 commit comments

Comments
 (0)