Index: gc_lang/fr/tb/content/lex_editor.js ================================================================== --- gc_lang/fr/tb/content/lex_editor.js +++ gc_lang/fr/tb/content/lex_editor.js @@ -420,12 +420,12 @@ let sJSON = await oFileHandler.loadFile("fr.personal.json"); if (sJSON != "") { let oJSON = JSON.parse(sJSON); this.oIBDAWG = new IBDAWG(oJSON); let lEntry = []; - for (let s of this.oIBDAWG.select()) { - lEntry.push(s.split("\t")); + for (let aRes of this.oIBDAWG.select()) { + lEntry.push(aRes); } oLexiconTable.fill(lEntry); this.setDictData(this.oIBDAWG.nEntry, this.oIBDAWG.sDate); enableElement("export_button"); } else { @@ -490,32 +490,22 @@ searchSimilar: function () { oSearchTable.clear(); let sWord = document.getElementById("search_similar").value; if (sWord !== "") { - let lSimilarWords = []; - for (let l of this.oSpellChecker.suggest(sWord, 20)) { - lSimilarWords.push(...l); - } - let lResult = []; - for (let sSimilar of lSimilarWords) { - for (let sMorph of this.oSpellChecker.getMorph(sSimilar)) { - let nCut = sMorph.indexOf(" "); - lResult.push( [sSimilar, sMorph.slice(1, nCut), sMorph.slice(nCut+1)] ); - } - } + let lResult = this.oSpellChecker.getSimilarEntries(sWord, 20); oSearchTable.fill(lResult); } }, searchRegex: function () { let sFlexPattern = document.getElementById("search_flexion_pattern").value.trim(); let sTagsPattern = document.getElementById("search_tags_pattern").value.trim(); let lEntry = []; let i = 0; - for (let s of this.oSpellChecker.select(sFlexPattern, sTagsPattern)) { - lEntry.push(s.split("\t")); + for (let aRes of this.oSpellChecker.select(sFlexPattern, sTagsPattern)) { + lEntry.push(aRes); i++; if (i >= 2000) { break; } } Index: gc_lang/fr/webext/panel/lex_editor.js ================================================================== --- gc_lang/fr/webext/panel/lex_editor.js +++ gc_lang/fr/webext/panel/lex_editor.js @@ -506,12 +506,12 @@ return; } let oJSON = oResult.oPersonalDictionary; this.oIBDAWG = new IBDAWG(oJSON); let lEntry = []; - for (let s of this.oIBDAWG.select()) { - lEntry.push(s.split("\t")); + for (let aRes of this.oIBDAWG.select()) { + lEntry.push(aRes); } oLexiconTable.fill(lEntry); this.setDictData(this.oIBDAWG.nEntry, this.oIBDAWG.sDate); showElement("export_button"); }, @@ -572,32 +572,22 @@ searchSimilar: function () { oSearchTable.clear(); let sWord = document.getElementById("search_similar").value; if (sWord !== "") { - let lSimilarWords = []; - for (let l of this.oSpellChecker.suggest(sWord, 20)) { - lSimilarWords.push(...l); - } - let lResult = []; - for (let sSimilar of lSimilarWords) { - for (let sMorph of this.oSpellChecker.getMorph(sSimilar)) { - let nCut = sMorph.indexOf(" "); - lResult.push( [sSimilar, sMorph.slice(1, nCut), sMorph.slice(nCut+1)] ); - } - } + let lResult = this.oSpellChecker.getSimilarEntries(sWord, 20); oSearchTable.fill(lResult); } }, searchRegex: function () { let sFlexPattern = document.getElementById("search_flexion_pattern").value.trim(); let sTagsPattern = document.getElementById("search_tags_pattern").value.trim(); let lEntry = []; let i = 0; - for (let s of this.oSpellChecker.select(sFlexPattern, sTagsPattern)) { - lEntry.push(s.split("\t")); + for (let aRes of this.oSpellChecker.select(sFlexPattern, sTagsPattern)) { + lEntry.push(aRes); i++; if (i >= 2000) { break; } } Index: grammalecte-cli.py ================================================================== --- grammalecte-cli.py +++ grammalecte-cli.py @@ -196,12 +196,12 @@ sFlexPattern = sSearch[0:nCut] sTagsPattern = sSearch[nCut+1:] else: sFlexPattern = sSearch sTagsPattern = "" - for sRes in oSpellChecker.select(sFlexPattern, sTagsPattern): - echo(sRes) + for aRes in oSpellChecker.select(sFlexPattern, sTagsPattern): + echo("\t".join(aRes)) elif sText.startswith("/+ "): oGrammarChecker.gce.setOptions({ opt:True for opt in sText[3:].strip().split() if opt in oGrammarChecker.gce.getOptions() }) echo("done") elif sText.startswith("/- "): oGrammarChecker.gce.setOptions({ opt:False for opt in sText[3:].strip().split() if opt in oGrammarChecker.gce.getOptions() }) Index: graphspell-js/ibdawg.js ================================================================== --- graphspell-js/ibdawg.js +++ graphspell-js/ibdawg.js @@ -415,11 +415,25 @@ } // morph (sWord) { // is defined in constructor // } - + getSimilarEntries (sWord, nSuggLimit=10) { + // return a list of tuples (similar word, stem, morphology) + if (sWord == "") { + return []; + } + let lResult = []; + for (let sSimilar of this.suggest(sWord, nSuggLimit)) { + for (let sMorph of this.getMorph(sSimilar)) { + let nCut = sMorph.indexOf(" "); + lResult.push( [sSimilar, sMorph.slice(1, nCut), sMorph.slice(nCut+1)] ); + } + } + return lResult; + } + * select (sFlexPattern="", sTagsPattern="") { // generator: returns all entries which flexion fits and morphology fits let zFlexPattern = null; let zTagsPattern = null; try { @@ -441,14 +455,14 @@ if (nVal <= this.nChar) { // simple character yield* this._select1(zFlexPattern, zTagsPattern, jAddr, sWord + this.lArcVal[nVal]); } else { if (!zFlexPattern || zFlexPattern.test(sWord)) { - let sEntry = sWord + "\t" + this.funcStemming(sWord, this.lArcVal[nVal]); + let sStem = this.funcStemming(sWord, this.lArcVal[nVal]); for (let [nMorphVal, _] of this._getArcs1(jAddr)) { if (!zTagsPattern || zTagsPattern.test(this.lArcVal[nMorphVal])) { - yield sEntry + "\t" + this.lArcVal[nMorphVal]; + yield [sWord, sStem, this.lArcVal[nMorphVal]]; } } } } } Index: graphspell-js/spellchecker.js ================================================================== --- graphspell-js/spellchecker.js +++ graphspell-js/spellchecker.js @@ -243,10 +243,25 @@ } if (this.bPersonalDic) { yield* this.oPersonalDic.select(sFlexPattern, sTagsPattern); } } + + getSimilarEntries (sWord, nSuggLimit=10) { + // return a list of tuples (similar word, stem, morphology) + let lResult = this.oMainDic.getSimilarEntries(sWord); + if (this.bExtendedDic) { + lResult.push(...this.oExtendedDic.getSimilarEntries(sWord)); + } + if (this.bCommunityDic) { + lResult.push(...this.oCommunityDic.getSimilarEntries(sWord)); + } + if (this.bPersonalDic) { + lResult.push(...this.oPersonalDic.getSimilarEntries(sWord)); + } + return lResult; + } } if (typeof(exports) !== 'undefined') { exports.SpellChecker = SpellChecker; } Index: graphspell/ibdawg.py ================================================================== --- graphspell/ibdawg.py +++ graphspell/ibdawg.py @@ -406,10 +406,21 @@ if not sWord: return if iPos >= 0: print("\n "+ " " * iPos + "|") self.drawPath(sWord[1:], iNextNodeAddr) + + def getSimilarEntries (self, sWord, nSuggLimit=10): + "return a list of tuples (similar word, stem, morphology)" + if not sWord: + return [] + lResult = [] + for sSimilar in self.suggest(sWord, nSuggLimit): + for sMorph in self.getMorph(sSimilar): + nCut = sMorph.find(" ") + lResult.append( (sSimilar, sMorph[1:nCut], sMorph[nCut+1:]) ) + return lResult def select (self, sFlexPattern="", sTagsPattern=""): "generator: returns all entries which flexion fits and morphology fits " zFlexPattern = None zTagsPattern = None @@ -433,14 +444,14 @@ if nVal <= self.nChar: # simple character yield from self._select1(zFlexPattern, zTagsPattern, jAddr, sWord + self.lArcVal[nVal]) else: if not zFlexPattern or zFlexPattern.search(sWord): - sEntry = sWord + "\t" + self.funcStemming(sWord, self.lArcVal[nVal]) + sStem = self.funcStemming(sWord, self.lArcVal[nVal]) for nMorphVal, _ in self._getArcs1(jAddr): if not zTagsPattern or zTagsPattern.search(self.lArcVal[nMorphVal]): - yield sEntry + "\t" + self.lArcVal[nMorphVal] + yield [sWord, sStem, self.lArcVal[nMorphVal]] def _morph1 (self, sWord): "returns morphologies of " iAddr = 0 for c in sWord: Index: graphspell/spellchecker.py ================================================================== --- graphspell/spellchecker.py +++ graphspell/spellchecker.py @@ -212,5 +212,16 @@ print("-----") self.oCommunityDic.drawPath(sWord) if self.bPersonalDic: print("-----") self.oPersonalDic.drawPath(sWord) + + def getSimilarEntries (self, sWord): + "return a list of tuples (similar word, stem, morphology)" + lResult = self.oMainDic.getSimilarEntries(sWord) + if self.bExtendedDic: + lResult.extend(self.oExtendedDic.getSimilarEntries(sWord)) + if self.bCommunityDic: + lResult.extend(self.oCommunityDic.getSimilarEntries(sWord)) + if self.bPersonalDic: + lResult.extend(self.oPersonalDic.getSimilarEntries(sWord)) + return lResult