@@ -693,6 +693,49 @@ function handleAutomatedForms() {
693
693
console . log ( `\nThere were ${ missingForms } missing forms that have now been automatically populated.` ) ;
694
694
}
695
695
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
+
696
739
lr . on ( 'end' , ( ) => {
697
740
clearConsoleLine ( ) ;
698
741
process . stdout . write ( `Processed ${ lineCount } lines...\n` ) ;
@@ -706,13 +749,36 @@ lr.on('end', () => {
706
749
const lemmasFilePath = `${ writeFolder } /${ sourceIso } -${ targetIso } -lemmas.json` ;
707
750
consoleOverwrite ( `3-tidy-up.js: Writing lemma dict to ${ lemmasFilePath } ...` ) ;
708
751
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
+
710
778
for ( const prop of Object . getOwnPropertyNames ( lemmaDict ) ) {
711
779
delete lemmaDict [ prop ] ;
712
780
}
713
781
714
- handleAutomatedForms ( ) ;
715
-
716
782
const formsFilePath = `${ writeFolder } /${ sourceIso } -${ targetIso } -forms.json` ;
717
783
718
784
/** @type {{[chunkIndex: string]: FormsMap} } */
0 commit comments