Skip to content

Commit f5fbe1e

Browse files
authored
handle recursive inflections (#218)
Handles recursive inflections by traversing through their forms and pointing to each lemma they come across, stacking inflection glossaries during the process.
1 parent 1ea40d1 commit f5fbe1e

File tree

1 file changed

+69
-3
lines changed

1 file changed

+69
-3
lines changed

Diff for: 3-tidy-up.js

+69-3
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,49 @@ function handleAutomatedForms() {
693693
console.log(`\nThere were ${missingForms} missing forms that have now been automatically populated.`);
694694
}
695695

696+
/**
697+
* @param {Map<string, Array<{lemma: string, pos: string, glosses: string[]}>>} formPointer
698+
* @param {string} originalForm
699+
* @param {string} originalLemma
700+
* @param {string} form
701+
* @param {string} pos
702+
* @param {string[]} glosses
703+
*/
704+
function handleRecursiveForms(formPointer, originalForm, originalLemma, form, pos, glosses, level = 1, visited = new Set()) {
705+
if (visited.has(form)) return;
706+
707+
visited.add(form);
708+
709+
if (lemmaDict[form] && originalForm !== form) {
710+
if (level > 1) {
711+
const lemma = form;
712+
713+
if (!formsMap.has(lemma)) {
714+
formsMap.set(lemma, new Map());
715+
}
716+
717+
if (!formsMap.get(lemma).has(originalForm)) {
718+
formsMap.get(lemma).set(originalForm, new Map());
719+
}
720+
721+
formsMap.get(lemma).get(originalForm).set(pos, glosses);
722+
723+
formsMap.get(originalLemma)?.delete(originalForm);
724+
}
725+
}
726+
727+
if (!lemmaDict[form] && formPointer.has(form)) {
728+
for (const { lemma, pos: subPos, glosses: subGlosses } of formPointer.get(form)) {
729+
if (level < 5) {
730+
if (pos === subPos) {
731+
glosses.push(...subGlosses);
732+
handleRecursiveForms(formPointer, originalForm, originalLemma, lemma, subPos, glosses, level + 1, visited);
733+
}
734+
}
735+
}
736+
}
737+
}
738+
696739
lr.on('end', () => {
697740
clearConsoleLine();
698741
process.stdout.write(`Processed ${lineCount} lines...\n`);
@@ -706,13 +749,36 @@ lr.on('end', () => {
706749
const lemmasFilePath = `${writeFolder}/${sourceIso}-${targetIso}-lemmas.json`;
707750
consoleOverwrite(`3-tidy-up.js: Writing lemma dict to ${lemmasFilePath}...`);
708751
writeFileSync(lemmasFilePath, JSON.stringify(lemmaDict, mapJsonReplacer));
709-
752+
753+
handleAutomatedForms();
754+
755+
consoleOverwrite('Handling recursive forms...');
756+
757+
/** @type {Map<string, Array<{lemma: string, pos: string, glosses: string[]}>>} */
758+
const formPointer = new Map();
759+
760+
for (const [lemma, formMap] of formsMap.entries()) {
761+
for (const [form, formInfo] of formMap.entries()) {
762+
for (const [pos, glosses] of formInfo.entries()) {
763+
if (!formPointer.has(form)) {
764+
formPointer.set(form, []);
765+
}
766+
767+
formPointer.get(form).push({ lemma, pos, glosses });
768+
}
769+
}
770+
}
771+
772+
for (const [form, entries] of formPointer.entries()) {
773+
for (const { lemma, pos, glosses } of entries) {
774+
handleRecursiveForms(formPointer, form, lemma, lemma, pos, [...glosses]);
775+
}
776+
}
777+
710778
for (const prop of Object.getOwnPropertyNames(lemmaDict)) {
711779
delete lemmaDict[prop];
712780
}
713781

714-
handleAutomatedForms();
715-
716782
const formsFilePath = `${writeFolder}/${sourceIso}-${targetIso}-forms.json`;
717783

718784
/** @type {{[chunkIndex: string]: FormsMap}} */

0 commit comments

Comments
 (0)