DELETED gc_lang/fr/modules-js/lexicographe.js Index: gc_lang/fr/modules-js/lexicographe.js ================================================================== --- gc_lang/fr/modules-js/lexicographe.js +++ /dev/null @@ -1,599 +0,0 @@ -// Grammalecte - Lexicographe -// License: MPL 2 - -/* jshint esversion:6, -W097 */ -/* jslint esversion:6 */ -/* global require, exports, console */ - -"use strict"; - -${string} -${map} - - -const _dTag = new Map([ - [':N', [" nom,", "Nom"]], - [':A', [" adjectif,", "Adjectif"]], - [':M1', [" prénom,", "Prénom"]], - [':M2', [" patronyme,", "Patronyme, matronyme, nom de famille…"]], - [':MP', [" nom propre,", "Nom propre"]], - [':W', [" adverbe,", "Adverbe"]], - [':J', [" interjection,", "Interjection"]], - [':B', [" nombre,", "Nombre"]], - [':T', [" titre,", "Titre de civilité"]], - - [':e', [" épicène", "épicène"]], - [':m', [" masculin", "masculin"]], - [':f', [" féminin", "féminin"]], - [':s', [" singulier", "singulier"]], - [':p', [" pluriel", "pluriel"]], - [':i', [" invariable", "invariable"]], - - [':V1', [" verbe (1ᵉʳ gr.),", "Verbe du 1ᵉʳ groupe"]], - [':V2', [" verbe (2ᵉ gr.),", "Verbe du 2ᵉ groupe"]], - [':V3', [" verbe (3ᵉ gr.),", "Verbe du 3ᵉ groupe"]], - [':V0e', [" verbe,", "Verbe auxiliaire être"]], - [':V0a', [" verbe,", "Verbe auxiliaire avoir"]], - - [':Y', [" infinitif,", "infinitif"]], - [':P', [" participe présent,", "participe présent"]], - [':Q', [" participe passé,", "participe passé"]], - [':Ip', [" présent,", "indicatif présent"]], - [':Iq', [" imparfait,", "indicatif imparfait"]], - [':Is', [" passé simple,", "indicatif passé simple"]], - [':If', [" futur,", "indicatif futur"]], - [':K', [" conditionnel présent,", "conditionnel présent"]], - [':Sp', [" subjonctif présent,", "subjonctif présent"]], - [':Sq', [" subjonctif imparfait,", "subjonctif imparfait"]], - [':E', [" impératif,", "impératif"]], - - [':1s', [" 1ʳᵉ p. sg.,", "verbe : 1ʳᵉ personne du singulier"]], - [':1ŝ', [" présent interr. 1ʳᵉ p. sg.,", "verbe : 1ʳᵉ personne du singulier (présent interrogatif)"]], - [':1ś', [" présent interr. 1ʳᵉ p. sg.,", "verbe : 1ʳᵉ personne du singulier (présent interrogatif)"]], - [':2s', [" 2ᵉ p. sg.,", "verbe : 2ᵉ personne du singulier"]], - [':3s', [" 3ᵉ p. sg.,", "verbe : 3ᵉ personne du singulier"]], - [':1p', [" 1ʳᵉ p. pl.,", "verbe : 1ʳᵉ personne du pluriel"]], - [':2p', [" 2ᵉ p. pl.,", "verbe : 2ᵉ personne du pluriel"]], - [':3p', [" 3ᵉ p. pl.,", "verbe : 3ᵉ personne du pluriel"]], - [':3p!', [" 3ᵉ p. pl.,", "verbe : 3ᵉ personne du pluriel (prononciation distinctive)"]], - - [':G', ["[mot grammatical]", "Mot grammatical"]], - [':X', [" adverbe de négation,", "Adverbe de négation"]], - [':U', [" adverbe interrogatif,", "Adverbe interrogatif"]], - [':R', [" préposition,", "Préposition"]], - [':Rv', [" préposition verbale,", "Préposition verbale"]], - [':D', [" déterminant,", "Déterminant"]], - [':Dd', [" déterminant démonstratif,", "Déterminant démonstratif"]], - [':De', [" déterminant exclamatif,", "Déterminant exclamatif"]], - [':Dp', [" déterminant possessif,", "Déterminant possessif"]], - [':Di', [" déterminant indéfini,", "Déterminant indéfini"]], - [':Dn', [" déterminant négatif,", "Déterminant négatif"]], - [':Od', [" pronom démonstratif,", "Pronom démonstratif"]], - [':Oi', [" pronom indéfini,", "Pronom indéfini"]], - [':On', [" pronom indéfini négatif,", "Pronom indéfini négatif"]], - [':Ot', [" pronom interrogatif,", "Pronom interrogatif"]], - [':Or', [" pronom relatif,", "Pronom relatif"]], - [':Ow', [" pronom adverbial,", "Pronom adverbial"]], - [':Os', [" pronom personnel sujet,", "Pronom personnel sujet"]], - [':Oo', [" pronom personnel objet,", "Pronom personnel objet"]], - [':Ov', [" préverbe,", "Préverbe (pronom personnel objet, +ne)"]], - [':O1', [" 1ʳᵉ pers.,", "Pronom : 1ʳᵉ personne"]], - [':O2', [" 2ᵉ pers.,", "Pronom : 2ᵉ personne"]], - [':O3', [" 3ᵉ pers.,", "Pronom : 3ᵉ personne"]], - [':C', [" conjonction,", "Conjonction"]], - [':Ĉ', [" conjonction (él.),", "Conjonction (élément)"]], - [':Cc', [" conjonction de coordination,", "Conjonction de coordination"]], - [':Cs', [" conjonction de subordination,", "Conjonction de subordination"]], - [':Ĉs', [" conjonction de subordination (él.),", "Conjonction de subordination (élément)"]], - - [':Ñ', [" locution nominale (él.),", "Locution nominale (élément)"]], - [':Â', [" locution adjectivale (él.),", "Locution adjectivale (élément)"]], - [':Ṽ', [" locution verbale (él.),", "Locution verbale (élément)"]], - [':Ŵ', [" locution adverbiale (él.),", "Locution adverbiale (élément)"]], - [':Ŕ', [" locution prépositive (él.),", "Locution prépositive (élément)"]], - [':Ĵ', [" locution interjective (él.),", "Locution interjective (élément)"]], - - [':Zp', [" préfixe,", "Préfixe"]], - [':Zs', [" suffixe,", "Suffixe"]], - - [':H', ["", ""]], - - [':@', ["", ""]], - [':@p', ["signe de ponctuation", "Signe de ponctuation"]], - [':@s', ["signe", "Signe divers"]], - - [';S', [" : symbole (unité de mesure)", "Symbole (unité de mesure)"]], - - ['/*', ["", "Sous-dictionnaire "]], - ['/C', [" ", "Sous-dictionnaire "]], - ['/M', ["", "Sous-dictionnaire "]], - ['/R', [" ", "Sous-dictionnaire "]], - ['/A', ["", "Sous-dictionnaire "]], - ['/X', ["", "Sous-dictionnaire "]] -]); - - -const _dLocTag = new Map([ - [':L', "locution"], - [':LN', "locution nominale"], - [':LA', "locution adjectivale"], - [':LV', "locution verbale"], - [':LW', "locution adverbiale"], - [':LR', "locution prépositive"], - [':LRv', "locution prépositive verbale"], - [':LO', "locution pronominale"], - [':LC', "locution conjonctive"], - [':LJ', "locution interjective"], - - [':B', " cardinale"], - [':e', " épicène"], - [':m', " masculine"], - [':f', " féminine"], - [':s', " singulière"], - [':p', " plurielle"], - [':i', " invariable"], - ['/L', " (latin)"] -]); - -const _dLocVerb = new Map([ - ['i', " intransitive"], - ['n', " transitive indirecte"], - ['t', " transitive directe"], - ['p', " pronominale"], - ['m', " impersonnelle"], -]); - -const _dElidedPrefix = new Map([ - ['d', "(de), déterminant épicène invariable"], - ['l', "(le/la), déterminant masculin/féminin singulier"], - ['j', "(je), pronom personnel sujet, 1ʳᵉ pers., épicène singulier"], - ['m', "(me), pronom personnel objet, 1ʳᵉ pers., épicène singulier"], - ['t', "(te), pronom personnel objet, 2ᵉ pers., épicène singulier"], - ['s', "(se), pronom personnel objet, 3ᵉ pers., épicène singulier/pluriel"], - ['n', "(ne), adverbe de négation"], - ['c', "(ce), pronom démonstratif, masculin singulier/pluriel"], - ['ç', "(ça), pronom démonstratif, masculin singulier"], - ['qu', "(que), conjonction de subordination"], - ['lorsqu', "(lorsque), conjonction de subordination"], - ['puisqu', "(lorsque), conjonction de subordination"], - ['quoiqu', "(quoique), conjonction de subordination"], - ['jusqu', "(jusque), préposition"] -]); - -const _dPronoms = new Map([ - ['je', " pronom personnel sujet, 1ʳᵉ pers. sing."], - ['tu', " pronom personnel sujet, 2ᵉ pers. sing."], - ['il', " pronom personnel sujet, 3ᵉ pers. masc. sing."], - ['on', " pronom personnel sujet, 3ᵉ pers. sing. ou plur."], - ['elle', " pronom personnel sujet, 3ᵉ pers. fém. sing."], - ['nous', " pronom personnel sujet/objet, 1ʳᵉ pers. plur."], - ['vous', " pronom personnel sujet/objet, 2ᵉ pers. plur."], - ['ils', " pronom personnel sujet, 3ᵉ pers. masc. plur."], - ['elles', " pronom personnel sujet, 3ᵉ pers. masc. plur."], - - ["là", " particule démonstrative"], - ["ci", " particule démonstrative"], - - ['le', " COD, masc. sing."], - ['la', " COD, fém. sing."], - ['les', " COD, plur."], - - ['moi', " COI (à moi), sing."], - ['toi', " COI (à toi), sing."], - ['lui', " COI (à lui ou à elle), sing."], - ['nous2', " COI (à nous), plur."], - ['vous2', " COI (à vous), plur."], - ['leur', " COI (à eux ou à elles), plur."], - - ['y', " pronom adverbial"], - ["m'y", " (me) pronom personnel objet + (y) pronom adverbial"], - ["t'y", " (te) pronom personnel objet + (y) pronom adverbial"], - ["s'y", " (se) pronom personnel objet + (y) pronom adverbial"], - - ['en', " pronom adverbial"], - ["m'en", " (me) pronom personnel objet + (en) pronom adverbial"], - ["t'en", " (te) pronom personnel objet + (en) pronom adverbial"], - ["s'en", " (se) pronom personnel objet + (en) pronom adverbial"] -]); - -const _dChar = new Map([ - ['.', "point"], - ['·', "point médian"], - ['…', "points de suspension"], - [':', "deux-points"], - [';', "point-virgule"], - [',', "virgule"], - ['?', "point d’interrogation"], - ['!', "point d’exclamation"], - ['(', "parenthèse ouvrante"], - [')', "parenthèse fermante"], - ['[', "crochet ouvrant"], - [']', "crochet fermant"], - ['{', "accolade ouvrante"], - ['}', "accolade fermante"], - ['-', "tiret"], - ['—', "tiret cadratin"], - ['–', "tiret demi-cadratin"], - ['«', "guillemet ouvrant (chevrons)"], - ['»', "guillemet fermant (chevrons)"], - ['“', "guillemet ouvrant double"], - ['”', "guillemet fermant double"], - ['‘', "guillemet ouvrant"], - ['’', "guillemet fermant"], - ['"', "guillemets droits (déconseillé en typographie)"], - ['/', "signe de la division"], - ['+', "signe de l’addition"], - ['*', "signe de la multiplication"], - ['=', "signe de l’égalité"], - ['<', "inférieur à"], - ['>', "supérieur à"], - ['⩽', "inférieur ou égal à"], - ['⩾', "supérieur ou égal à"], - ['%', "signe de pourcentage"], - ['‰', "signe pour mille"], -]); - - -class Lexicographe { - - constructor (oSpellChecker, oTokenizer, oLocGraph) { - this.oSpellChecker = oSpellChecker; - this.oTokenizer = oTokenizer; - this.oLocGraph = JSON.parse(oLocGraph); - - this._zPartDemForm = new RegExp("([a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ]+)-(là|ci)$", "i"); - this._aPartDemExceptList = new Set(["celui", "celle", "ceux", "celles", "de", "jusque", "par", "marie-couche-toi"]); - this._zInterroVerb = new RegExp("([a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ]+)-(t-(?:il|elle|on)|je|tu|ils?|elles?|on|[nv]ous)$", "i"); - this._zImperatifVerb = new RegExp("([a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ]+)-((?:les?|la)-(?:moi|toi|lui|[nv]ous|leur)|y|en|[mts][’'](?:y|en)|les?|la|[mt]oi|leur|lui)$", "i"); - this._zTag = new RegExp("[:;/][a-zA-Z0-9ÑÂĴĈŔÔṼŴ!][^:;/]*", "g"); - } - - getInfoForToken (oToken) { - // Token: .sType, .sValue, .nStart, .nEnd - // return a object {sType, sValue, aLabel} - let m = null; - try { - switch (oToken.sType) { - case 'PUNC': - case 'SIGN': - return { - sType: oToken.sType, - sValue: oToken.sValue, - aLabel: [_dChar.gl_get(oToken.sValue, "caractère indéterminé")] - }; - break; - case 'NUM': - return { - sType: oToken.sType, - sValue: oToken.sValue, - aLabel: ["nombre"] - }; - break; - case 'LINK': - return { - sType: oToken.sType, - sValue: oToken.sValue.slice(0, 40) + "…", - aLabel: ["hyperlien"] - }; - break; - case 'TAG': - return { - sType: oToken.sType, - sValue: oToken.sValue, - aLabel: ["étiquette (hashtag)"] - }; - break; - case 'HTML': - return { - sType: oToken.sType, - sValue: oToken.sValue.slice(0, 40) + "…", - aLabel: ["balise HTML"] - }; - break; - case 'PSEUDOHTML': - return { - sType: oToken.sType, - sValue: oToken.sValue, - aLabel: ["balise pseudo-HTML"] - }; - break; - case 'HTMLENTITY': - return { - sType: oToken.sType, - sValue: oToken.sValue, - aLabel: ["entité caractère XML/HTML"] - }; - break; - case 'HOUR': - return { - sType: oToken.sType, - sValue: oToken.sValue, - aLabel: ["heure"] - }; - break; - case 'WORD_ELIDED': - let sTemp = oToken.sValue.replace("’", "").replace("'", "").replace("`", "").toLowerCase(); - return { - sType: oToken.sType, - sValue: oToken.sValue, - aLabel: [_dElidedPrefix.gl_get(sTemp, "préfixe élidé inconnu")] - }; - break; - case 'WORD_ORDINAL': - return { - sType: oToken.sType, - sValue: oToken.sValue, - aLabel: ["nombre ordinal"] - }; - break; - case 'FOLDERUNIX': - return { - sType: oToken.sType, - sValue: oToken.sValue.slice(0, 40) + "…", - aLabel: ["dossier UNIX (et dérivés)"] - }; - break; - case 'FOLDERWIN': - return { - sType: oToken.sType, - sValue: oToken.sValue.slice(0, 40) + "…", - aLabel: ["dossier Windows"] - }; - break; - case 'WORD_ACRONYM': - return { - sType: oToken.sType, - sValue: oToken.sValue, - aLabel: ["Sigle ou acronyme"] - }; - break; - case 'WORD': - if (oToken.sValue.gl_count("-") > 4) { - return { - sType: "COMPLEX", - sValue: oToken.sValue, - aLabel: ["élément complexe indéterminé"] - }; - } else if (m = this._zPartDemForm.exec(oToken.sValue)) { - // mots avec particules démonstratives - if (this._aPartDemExceptList.has(m[1].toLowerCase())) { - return { - sType: "WORD", - sValue: oToken.sValue, - aLabel: this._getMorph(oToken.sValue) - }; - } - return { - sType: oToken.sType, - sValue: oToken.sValue, - aLabel: ["mot avec particule démonstrative"], - aSubElem: [ - { sType: oToken.sType, sValue: m[1], aLabel: this._getMorph(m[1]) }, - { sType: oToken.sType, sValue: "-" + m[2], aLabel: [this._formatSuffix(m[2].toLowerCase())] } - ] - }; - } else if (m = this._zImperatifVerb.exec(oToken.sValue)) { - // formes interrogatives - return { - sType: oToken.sType, - sValue: oToken.sValue, - aLabel: ["forme verbale impérative"], - aSubElem: [ - { sType: oToken.sType, sValue: m[1], aLabel: this._getMorph(m[1]) }, - { sType: oToken.sType, sValue: "-" + m[2], aLabel: [this._formatSuffix(m[2].toLowerCase())] } - ] - }; - } else if (m = this._zInterroVerb.exec(oToken.sValue)) { - // formes interrogatives - return { - sType: oToken.sType, - sValue: oToken.sValue, - aLabel: ["forme verbale interrogative"], - aSubElem: [ - { sType: oToken.sType, sValue: m[1], aLabel: this._getMorph(m[1]) }, - { sType: oToken.sType, sValue: "-" + m[2], aLabel: [this._formatSuffix(m[2].toLowerCase())] } - ] - }; - } else if (this.oSpellChecker.isValidToken(oToken.sValue)) { - return { - sType: oToken.sType, - sValue: oToken.sValue, - aLabel: this._getMorph(oToken.sValue) - }; - } else { - return { - sType: "UNKNOWN_WORD", - sValue: oToken.sValue, - aLabel: ["mot inconnu du dictionnaire"] - }; - } - break; - default: - return { - sType: oToken.sType, - sValue: oToken.sValue, - aLabel: ["token inconnu"] - } - } - } catch (e) { - console.error(e); - } - return null; - } - - _getMorph (sWord) { - let aElem = []; - for (let s of this.oSpellChecker.getMorph(sWord)) { - if (s.includes(":")) aElem.push(this._formatTags(s)); - } - if (aElem.length == 0) { - aElem.push("mot inconnu du dictionnaire"); - } - return aElem; - } - - _formatTags (sTags) { - let sRes = ""; - sTags = sTags.replace(/V([0-3][ea]?)[itpqnmr_eaxz]+/, "V$1"); - let m; - while ((m = this._zTag.exec(sTags)) !== null) { - sRes += _dTag.get(m[0])[0]; - } - if (sRes.startsWith(" verbe") && !sRes.includes("infinitif")) { - sRes += " [" + sTags.slice(1, sTags.indexOf("/")) + "]"; - } - if (!sRes) { - return "#Erreur. Étiquette inconnue : [" + sTags + "]"; - } - return sRes.gl_trimRight(","); - } - - _formatTagsLoc (sTags) { - let sRes = ""; - let m; - while ((m = this._zTag.exec(sTags)) !== null) { - if (m[0].startsWith(":LV")) { - sRes += _dLocTag.get(":LV"); - for (let c of m[0].slice(3)) { - sRes += _dLocVerb.get(c); - } - } else { - sRes += _dLocTag.get(m[0]); - } - } - if (!sRes) { - return "#Erreur. Étiquette inconnue : [" + sTags + "]"; - } - return sRes.gl_trimRight(","); - } - - _formatSuffix (s) { - if (s.startsWith("t-")) { - return "“t” euphonique +" + _dPronoms.get(s.slice(2)); - } - if (!s.includes("-")) { - return _dPronoms.get(s.replace("’", "'")); - } - if (s.endsWith("ous")) { - s += '2'; - } - let nPos = s.indexOf("-"); - return _dPronoms.get(s.slice(0, nPos)) + " +" + _dPronoms.get(s.slice(nPos + 1)); - } - - getListOfTokens (sText, bInfo=true) { - let aElem = []; - if (sText !== "") { - for (let oToken of this.oTokenizer.genTokens(sText)) { - if (bInfo) { - let aRes = this.getInfoForToken(oToken); - if (aRes) { - aElem.push(aRes); - } - } else if (oToken.sType !== "SPACE") { - aElem.push(oToken); - } - } - } - return aElem; - } - - * generateInfoForTokenList (lToken) { - for (let oToken of lToken) { - let aRes = this.getInfoForToken(oToken); - if (aRes) { - yield aRes; - } - } - } - - getListOfTokensReduc (sText, bInfo=true) { - let lToken = this.getListOfTokens(sText.replace("'", "’").trim(), false); - let iToken = 0; - let aElem = []; - if (lToken.length == 0) { - return aElem; - } - do { - let oToken = lToken[iToken]; - let sMorphLoc = ''; - let aTokenTempList = [oToken]; - if (oToken.sType == "WORD" || oToken.sType == "WORD_ELIDED"){ - let iLocEnd = iToken + 1; - let oLocNode = this.oLocGraph[oToken.sValue.toLowerCase()]; - while (oLocNode) { - let oTokenNext = lToken[iLocEnd]; - iLocEnd++; - if (oTokenNext) { - oLocNode = oLocNode[oTokenNext.sValue.toLowerCase()]; - } - if (oLocNode && iLocEnd <= lToken.length) { - sMorphLoc = oLocNode["_:_"]; - aTokenTempList.push(oTokenNext); - } else { - break; - } - } - } - - if (sMorphLoc) { - // we have a locution - let sValue = ''; - for (let oTokenWord of aTokenTempList) { - sValue += oTokenWord.sValue+' '; - } - let oTokenLocution = { - 'nStart': aTokenTempList[0].nStart, - 'nEnd': aTokenTempList[aTokenTempList.length-1].nEnd, - 'sType': "LOC", - 'sValue': sValue.replace('’ ','’').trim(), - 'aSubToken': aTokenTempList - }; - if (bInfo) { - let aSubElem = null; - if (sMorphLoc.startsWith("*|")) { - // cette suite de tokens n’est une locution que dans certains cas minoritaires - oTokenLocution.sType = "LOCP"; - for (let oElem of this.generateInfoForTokenList(aTokenTempList)) { - aElem.push(oElem); - } - sMorphLoc = sMorphLoc.slice(2); - } else { - aSubElem = [...this.generateInfoForTokenList(aTokenTempList)]; - } - // cette suite de tokens est la plupart du temps une locution - let aFormatedTag = []; - for (let sTagLoc of sMorphLoc.split('|') ){ - aFormatedTag.push(this._formatTagsLoc(sTagLoc)); - } - aElem.push({ - sType: oTokenLocution.sType, - sValue: oTokenLocution.sValue, - aLabel: aFormatedTag, - aSubElem: aSubElem - }); - } else { - aElem.push(oTokenLocution); - } - iToken = iToken + aTokenTempList.length; - } else { - // No locution, we just add information - if (bInfo) { - let aRes = this.getInfoForToken(oToken); - if (aRes) { - aElem.push(aRes); - } - } else { - aElem.push(oToken); - } - iToken++; - } - } while (iToken < lToken.length); - return aElem; - } -} - - -if (typeof(exports) !== 'undefined') { - exports.Lexicographe = Lexicographe; -} Index: gc_lang/fr/webext/gce_worker.js ================================================================== --- gc_lang/fr/webext/gce_worker.js +++ gc_lang/fr/webext/gce_worker.js @@ -33,11 +33,11 @@ //console.log(self); importScripts("grammalecte/graphspell/helpers.js"); importScripts("grammalecte/graphspell/str_transform.js"); importScripts("grammalecte/graphspell/char_player.js"); -importScripts("grammalecte/graphspell/suggest.js"); +importScripts("grammalecte/graphspell/lexgraph_fr.js"); importScripts("grammalecte/graphspell/ibdawg.js"); importScripts("grammalecte/graphspell/spellchecker.js"); importScripts("grammalecte/text.js"); importScripts("grammalecte/graphspell/tokenizer.js"); importScripts("grammalecte/fr/conj.js"); @@ -153,11 +153,10 @@ let bInitDone = false; let oSpellChecker = null; let oTokenizer = null; -let oLxg = null; let oTest = null; let oLocution = null; /* @@ -180,11 +179,11 @@ gc_engine.load(sContext, "aHSL", sExtensionPath+"grammalecte/graphspell/_dictionaries"); oSpellChecker = gc_engine.getSpellChecker(); oTest = new TestGrammarChecking(gc_engine, sExtensionPath+"/grammalecte/fr/tests_data.json"); oTokenizer = new Tokenizer("fr"); oLocution = helpers.loadFile(sExtensionPath + "/grammalecte/fr/locutions_data.json"); - oLxg = new Lexicographe(oSpellChecker, oTokenizer, oLocution); + lexgraph_fr.load(oSpellChecker, oTokenizer, oLocution); if (dOptions !== null) { if (!(dOptions instanceof Map)) { dOptions = helpers.objectToMap(dOptions); } gc_options.setOptions(dOptions); @@ -249,11 +248,11 @@ // lexicographer try { sText = sText.replace(/­/g, "").normalize("NFC"); for (let sParagraph of text.getParagraph(sText)) { if (sParagraph.trim() !== "") { - postMessage(createResponse("getListOfTokens", oLxg.getListOfTokensReduc(sParagraph, true), oInfo, false)); + postMessage(createResponse("getListOfTokens", lexgraph_fr.getListOfTokensReduc(sParagraph, true), oInfo, false)); } } postMessage(createResponse("getListOfTokens", null, oInfo, true)); } catch (e) { ADDED graphspell-js/lexgraph_fr.js Index: graphspell-js/lexgraph_fr.js ================================================================== --- /dev/null +++ graphspell-js/lexgraph_fr.js @@ -0,0 +1,723 @@ +// JavaScript + +"use strict"; + + +${string} +${map} + + +//// Default Suggestions + +const dSugg = new Map ([ + ["bcp", "beaucoup"], + ["ca", "ça"], + ["cad", "c’est-à-dire"], + ["cb", "combien|CB"], + ["cdlt", "cordialement"], + ["construirent", "construire|construisirent|construisent|construiront"], + ["càd", "c’est-à-dire"], + ["chui", "j’suis|je suis"], + ["chuis", "j’suis|je suis"], + ["dc", "de|donc"], + ["done", "donc|donne"], + ["email", "courriel|e-mail|émail"], + ["emails", "courriels|e-mails"], + ["ete", "êtes|été"], + ["Etes-vous", "Êtes-vous"], + ["Etiez-vous", "Étiez-vous"], + ["Etions-vous", "Étions-nous"], + ["loins", "loin"], + ["mn", "min"], + ["mns", "min"], + ["parce-que", "parce que"], + ["pcq", "parce que"], + ["pd", "pendant|pédé"], + ["pdq", "pendant que"], + ["pdt", "pendant"], + ["pdtq", "pendant que"], + ["pécunier", "pécuniaire"], + ["pécuniers", "pécuniaires"], + ["pk", "pourquoi"], + ["pkoi", "pourquoi"], + ["pq", "pourquoi|PQ"], + ["prq", "presque"], + ["prsq", "presque"], + ["qcq", "quiconque"], + ["qd", "quand"], + ["qq", "quelque"], + ["qqch", "quelque chose"], + ["qqn", "quelqu’un"], + ["qqne", "quelqu’une"], + ["qqs", "quelques"], + ["qqunes", "quelques-unes"], + ["qquns", "quelques-uns"], + ["tdq", "tandis que"], + ["tj", "toujours"], + ["tjs", "toujours"], + ["tq", "tant que|tandis que"], + ["ts", "tous"], + ["tt", "tant|tout"], + ["tte", "toute"], + ["ttes", "toutes"], + + ["Iier", "Iᵉʳ"], + ["Iière", "Iʳᵉ"], + ["IIième", "IIᵉ"], + ["IIIième", "IIIᵉ"], + ["IVième", "IVᵉ"], + ["Vième", "Vᵉ"], + ["VIième", "VIᵉ"], + ["VIIième", "VIIᵉ"], + ["VIIIième", "VIIIᵉ"], + ["IXième", "IXᵉ"], + ["Xième", "Xᵉ"], + ["XIième", "XIᵉ"], + ["XIIième", "XIIᵉ"], + ["XIIIième", "XIIIᵉ"], + ["XIVième", "XIVᵉ"], + ["XVième", "XVᵉ"], + ["XVIième", "XVIᵉ"], + ["XVIIième", "XVIIᵉ"], + ["XVIIIième", "XVIIIᵉ"], + ["XIXième", "XIXᵉ"], + ["XXième", "XXᵉ"], + ["XXIième", "XXIᵉ"], + ["XXIIième", "XXIIᵉ"], + ["XXIIIième", "XXIIIᵉ"], + ["XXIVième", "XXIVᵉ"], + ["XXVième", "XXVᵉ"], + ["XXVIième", "XXVIᵉ"], + ["XXVIIième", "XXVIIᵉ"], + ["XXVIIIième", "XXVIIIᵉ"], + ["XXIXième", "XXIXᵉ"], + ["XXXième", "XXXᵉ"], + ["Ier", "Iᵉʳ"], + ["Ière", "Iʳᵉ"], + ["IIème", "IIᵉ"], + ["IIIème", "IIIᵉ"], + ["IVème", "IVᵉ"], + ["Vème", "Vᵉ"], + ["VIème", "VIᵉ"], + ["VIIème", "VIIᵉ"], + ["VIIIème", "VIIIᵉ"], + ["IXème", "IXᵉ"], + ["Xème", "Xᵉ"], + ["XIème", "XIᵉ"], + ["XIIème", "XIIᵉ"], + ["XIIIème", "XIIIᵉ"], + ["XIVème", "XIVᵉ"], + ["XVème", "XVᵉ"], + ["XVIème", "XVIᵉ"], + ["XVIIème", "XVIIᵉ"], + ["XVIIIème", "XVIIIᵉ"], + ["XIXème", "XIXᵉ"], + ["XXème", "XXᵉ"], + ["XXIème", "XXIᵉ"], + ["XXIIème", "XXIIᵉ"], + ["XXIIIème", "XXIIIᵉ"], + ["XXIVème", "XXIVᵉ"], + ["XXVème", "XXVᵉ"], + ["XXVIème", "XXVIᵉ"], + ["XXVIIème", "XXVIIᵉ"], + ["XXVIIIème", "XXVIIIᵉ"], + ["XXIXème", "XXIXᵉ"], + ["XXXème", "XXXᵉ"] +]); + + + +//// Lexicographer + +var lexgraph_fr = { + + dTag: new Map([ + [':N', [" nom,", "Nom"]], + [':A', [" adjectif,", "Adjectif"]], + [':M1', [" prénom,", "Prénom"]], + [':M2', [" patronyme,", "Patronyme, matronyme, nom de famille…"]], + [':MP', [" nom propre,", "Nom propre"]], + [':W', [" adverbe,", "Adverbe"]], + [':J', [" interjection,", "Interjection"]], + [':B', [" nombre,", "Nombre"]], + [':T', [" titre,", "Titre de civilité"]], + + [':e', [" épicène", "épicène"]], + [':m', [" masculin", "masculin"]], + [':f', [" féminin", "féminin"]], + [':s', [" singulier", "singulier"]], + [':p', [" pluriel", "pluriel"]], + [':i', [" invariable", "invariable"]], + + [':V1', [" verbe (1ᵉʳ gr.),", "Verbe du 1ᵉʳ groupe"]], + [':V2', [" verbe (2ᵉ gr.),", "Verbe du 2ᵉ groupe"]], + [':V3', [" verbe (3ᵉ gr.),", "Verbe du 3ᵉ groupe"]], + [':V0e', [" verbe,", "Verbe auxiliaire être"]], + [':V0a', [" verbe,", "Verbe auxiliaire avoir"]], + + [':Y', [" infinitif,", "infinitif"]], + [':P', [" participe présent,", "participe présent"]], + [':Q', [" participe passé,", "participe passé"]], + [':Ip', [" présent,", "indicatif présent"]], + [':Iq', [" imparfait,", "indicatif imparfait"]], + [':Is', [" passé simple,", "indicatif passé simple"]], + [':If', [" futur,", "indicatif futur"]], + [':K', [" conditionnel présent,", "conditionnel présent"]], + [':Sp', [" subjonctif présent,", "subjonctif présent"]], + [':Sq', [" subjonctif imparfait,", "subjonctif imparfait"]], + [':E', [" impératif,", "impératif"]], + + [':1s', [" 1ʳᵉ p. sg.,", "verbe : 1ʳᵉ personne du singulier"]], + [':1ŝ', [" présent interr. 1ʳᵉ p. sg.,", "verbe : 1ʳᵉ personne du singulier (présent interrogatif)"]], + [':1ś', [" présent interr. 1ʳᵉ p. sg.,", "verbe : 1ʳᵉ personne du singulier (présent interrogatif)"]], + [':2s', [" 2ᵉ p. sg.,", "verbe : 2ᵉ personne du singulier"]], + [':3s', [" 3ᵉ p. sg.,", "verbe : 3ᵉ personne du singulier"]], + [':1p', [" 1ʳᵉ p. pl.,", "verbe : 1ʳᵉ personne du pluriel"]], + [':2p', [" 2ᵉ p. pl.,", "verbe : 2ᵉ personne du pluriel"]], + [':3p', [" 3ᵉ p. pl.,", "verbe : 3ᵉ personne du pluriel"]], + [':3p!', [" 3ᵉ p. pl.,", "verbe : 3ᵉ personne du pluriel (prononciation distinctive)"]], + + [':G', ["[mot grammatical]", "Mot grammatical"]], + [':X', [" adverbe de négation,", "Adverbe de négation"]], + [':U', [" adverbe interrogatif,", "Adverbe interrogatif"]], + [':R', [" préposition,", "Préposition"]], + [':Rv', [" préposition verbale,", "Préposition verbale"]], + [':D', [" déterminant,", "Déterminant"]], + [':Dd', [" déterminant démonstratif,", "Déterminant démonstratif"]], + [':De', [" déterminant exclamatif,", "Déterminant exclamatif"]], + [':Dp', [" déterminant possessif,", "Déterminant possessif"]], + [':Di', [" déterminant indéfini,", "Déterminant indéfini"]], + [':Dn', [" déterminant négatif,", "Déterminant négatif"]], + [':Od', [" pronom démonstratif,", "Pronom démonstratif"]], + [':Oi', [" pronom indéfini,", "Pronom indéfini"]], + [':On', [" pronom indéfini négatif,", "Pronom indéfini négatif"]], + [':Ot', [" pronom interrogatif,", "Pronom interrogatif"]], + [':Or', [" pronom relatif,", "Pronom relatif"]], + [':Ow', [" pronom adverbial,", "Pronom adverbial"]], + [':Os', [" pronom personnel sujet,", "Pronom personnel sujet"]], + [':Oo', [" pronom personnel objet,", "Pronom personnel objet"]], + [':Ov', [" préverbe,", "Préverbe (pronom personnel objet, +ne)"]], + [':O1', [" 1ʳᵉ pers.,", "Pronom : 1ʳᵉ personne"]], + [':O2', [" 2ᵉ pers.,", "Pronom : 2ᵉ personne"]], + [':O3', [" 3ᵉ pers.,", "Pronom : 3ᵉ personne"]], + [':C', [" conjonction,", "Conjonction"]], + [':Ĉ', [" conjonction (él.),", "Conjonction (élément)"]], + [':Cc', [" conjonction de coordination,", "Conjonction de coordination"]], + [':Cs', [" conjonction de subordination,", "Conjonction de subordination"]], + [':Ĉs', [" conjonction de subordination (él.),", "Conjonction de subordination (élément)"]], + + [':Ñ', [" locution nominale (él.),", "Locution nominale (élément)"]], + [':Â', [" locution adjectivale (él.),", "Locution adjectivale (élément)"]], + [':Ṽ', [" locution verbale (él.),", "Locution verbale (élément)"]], + [':Ŵ', [" locution adverbiale (él.),", "Locution adverbiale (élément)"]], + [':Ŕ', [" locution prépositive (él.),", "Locution prépositive (élément)"]], + [':Ĵ', [" locution interjective (él.),", "Locution interjective (élément)"]], + + [':Zp', [" préfixe,", "Préfixe"]], + [':Zs', [" suffixe,", "Suffixe"]], + + [':H', ["", ""]], + + [':@', ["", ""]], + [':@p', ["signe de ponctuation", "Signe de ponctuation"]], + [':@s', ["signe", "Signe divers"]], + + [';S', [" : symbole (unité de mesure)", "Symbole (unité de mesure)"]], + + ['/*', ["", "Sous-dictionnaire "]], + ['/C', [" ", "Sous-dictionnaire "]], + ['/M', ["", "Sous-dictionnaire "]], + ['/R', [" ", "Sous-dictionnaire "]], + ['/A', ["", "Sous-dictionnaire "]], + ['/X', ["", "Sous-dictionnaire "]] + ]), + + dLocTag: new Map([ + [':L', "locution"], + [':LN', "locution nominale"], + [':LA', "locution adjectivale"], + [':LV', "locution verbale"], + [':LW', "locution adverbiale"], + [':LR', "locution prépositive"], + [':LRv', "locution prépositive verbale"], + [':LO', "locution pronominale"], + [':LC', "locution conjonctive"], + [':LJ', "locution interjective"], + + [':B', " cardinale"], + [':e', " épicène"], + [':m', " masculine"], + [':f', " féminine"], + [':s', " singulière"], + [':p', " plurielle"], + [':i', " invariable"], + ['/L', " (latin)"] + ]), + + dLocVerb: new Map([ + ['i', " intransitive"], + ['n', " transitive indirecte"], + ['t', " transitive directe"], + ['p', " pronominale"], + ['m', " impersonnelle"], + ]), + + dElidedPrefix: new Map([ + ['d', "(de), déterminant épicène invariable"], + ['l', "(le/la), déterminant masculin/féminin singulier"], + ['j', "(je), pronom personnel sujet, 1ʳᵉ pers., épicène singulier"], + ['m', "(me), pronom personnel objet, 1ʳᵉ pers., épicène singulier"], + ['t', "(te), pronom personnel objet, 2ᵉ pers., épicène singulier"], + ['s', "(se), pronom personnel objet, 3ᵉ pers., épicène singulier/pluriel"], + ['n', "(ne), adverbe de négation"], + ['c', "(ce), pronom démonstratif, masculin singulier/pluriel"], + ['ç', "(ça), pronom démonstratif, masculin singulier"], + ['qu', "(que), conjonction de subordination"], + ['lorsqu', "(lorsque), conjonction de subordination"], + ['puisqu', "(lorsque), conjonction de subordination"], + ['quoiqu', "(quoique), conjonction de subordination"], + ['jusqu', "(jusque), préposition"] + ]), + + dPronoms: new Map([ + ['je', " pronom personnel sujet, 1ʳᵉ pers. sing."], + ['tu', " pronom personnel sujet, 2ᵉ pers. sing."], + ['il', " pronom personnel sujet, 3ᵉ pers. masc. sing."], + ['on', " pronom personnel sujet, 3ᵉ pers. sing. ou plur."], + ['elle', " pronom personnel sujet, 3ᵉ pers. fém. sing."], + ['nous', " pronom personnel sujet/objet, 1ʳᵉ pers. plur."], + ['vous', " pronom personnel sujet/objet, 2ᵉ pers. plur."], + ['ils', " pronom personnel sujet, 3ᵉ pers. masc. plur."], + ['elles', " pronom personnel sujet, 3ᵉ pers. masc. plur."], + + ["là", " particule démonstrative"], + ["ci", " particule démonstrative"], + + ['le', " COD, masc. sing."], + ['la', " COD, fém. sing."], + ['les', " COD, plur."], + + ['moi', " COI (à moi), sing."], + ['toi', " COI (à toi), sing."], + ['lui', " COI (à lui ou à elle), sing."], + ['nous2', " COI (à nous), plur."], + ['vous2', " COI (à vous), plur."], + ['leur', " COI (à eux ou à elles), plur."], + + ['y', " pronom adverbial"], + ["m'y", " (me) pronom personnel objet + (y) pronom adverbial"], + ["t'y", " (te) pronom personnel objet + (y) pronom adverbial"], + ["s'y", " (se) pronom personnel objet + (y) pronom adverbial"], + + ['en', " pronom adverbial"], + ["m'en", " (me) pronom personnel objet + (en) pronom adverbial"], + ["t'en", " (te) pronom personnel objet + (en) pronom adverbial"], + ["s'en", " (se) pronom personnel objet + (en) pronom adverbial"] + ]), + + dChar: new Map([ + ['.', "point"], + ['·', "point médian"], + ['…', "points de suspension"], + [':', "deux-points"], + [';', "point-virgule"], + [',', "virgule"], + ['?', "point d’interrogation"], + ['!', "point d’exclamation"], + ['(', "parenthèse ouvrante"], + [')', "parenthèse fermante"], + ['[', "crochet ouvrant"], + [']', "crochet fermant"], + ['{', "accolade ouvrante"], + ['}', "accolade fermante"], + ['-', "tiret"], + ['—', "tiret cadratin"], + ['–', "tiret demi-cadratin"], + ['«', "guillemet ouvrant (chevrons)"], + ['»', "guillemet fermant (chevrons)"], + ['“', "guillemet ouvrant double"], + ['”', "guillemet fermant double"], + ['‘', "guillemet ouvrant"], + ['’', "guillemet fermant"], + ['"', "guillemets droits (déconseillé en typographie)"], + ['/', "signe de la division"], + ['+', "signe de l’addition"], + ['*', "signe de la multiplication"], + ['=', "signe de l’égalité"], + ['<', "inférieur à"], + ['>', "supérieur à"], + ['⩽', "inférieur ou égal à"], + ['⩾', "supérieur ou égal à"], + ['%', "signe de pourcentage"], + ['‰', "signe pour mille"], + ]), + + oSpellChecker: null, + oTokenizer: null, + oLocGraph: null, + + _zPartDemForm: new RegExp("([a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ]+)-(là|ci)$", "i"), + _aPartDemExceptList: new Set(["celui", "celle", "ceux", "celles", "de", "jusque", "par", "marie-couche-toi"]), + _zInterroVerb: new RegExp("([a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ]+)-(t-(?:il|elle|on)|je|tu|ils?|elles?|on|[nv]ous)$", "i"), + _zImperatifVerb: new RegExp("([a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ]+)-((?:les?|la)-(?:moi|toi|lui|[nv]ous|leur)|y|en|[mts][’'](?:y|en)|les?|la|[mt]oi|leur|lui)$", "i"), + _zTag: new RegExp("[:;/][a-zA-Z0-9ÑÂĴĈŔÔṼŴ!][^:;/]*", "g"), + + + load: function (oSpellChecker, oTokenizer, oLocGraph) { + this.oSpellChecker = oSpellChecker; + this.oTokenizer = oTokenizer; + this.oLocGraph = JSON.parse(oLocGraph); + }, + + getInfoForToken: function (oToken) { + // Token: .sType, .sValue, .nStart, .nEnd + // return a object {sType, sValue, aLabel} + let m = null; + try { + switch (oToken.sType) { + case 'PUNC': + case 'SIGN': + return { + sType: oToken.sType, + sValue: oToken.sValue, + aLabel: [this.dChar.gl_get(oToken.sValue, "caractère indéterminé")] + }; + break; + case 'NUM': + return { + sType: oToken.sType, + sValue: oToken.sValue, + aLabel: ["nombre"] + }; + break; + case 'LINK': + return { + sType: oToken.sType, + sValue: oToken.sValue.slice(0, 40) + "…", + aLabel: ["hyperlien"] + }; + break; + case 'TAG': + return { + sType: oToken.sType, + sValue: oToken.sValue, + aLabel: ["étiquette (hashtag)"] + }; + break; + case 'HTML': + return { + sType: oToken.sType, + sValue: oToken.sValue.slice(0, 40) + "…", + aLabel: ["balise HTML"] + }; + break; + case 'PSEUDOHTML': + return { + sType: oToken.sType, + sValue: oToken.sValue, + aLabel: ["balise pseudo-HTML"] + }; + break; + case 'HTMLENTITY': + return { + sType: oToken.sType, + sValue: oToken.sValue, + aLabel: ["entité caractère XML/HTML"] + }; + break; + case 'HOUR': + return { + sType: oToken.sType, + sValue: oToken.sValue, + aLabel: ["heure"] + }; + break; + case 'WORD_ELIDED': + let sTemp = oToken.sValue.replace("’", "").replace("'", "").replace("`", "").toLowerCase(); + return { + sType: oToken.sType, + sValue: oToken.sValue, + aLabel: [this.dElidedPrefix.gl_get(sTemp, "préfixe élidé inconnu")] + }; + break; + case 'WORD_ORDINAL': + return { + sType: oToken.sType, + sValue: oToken.sValue, + aLabel: ["nombre ordinal"] + }; + break; + case 'FOLDERUNIX': + return { + sType: oToken.sType, + sValue: oToken.sValue.slice(0, 40) + "…", + aLabel: ["dossier UNIX (et dérivés)"] + }; + break; + case 'FOLDERWIN': + return { + sType: oToken.sType, + sValue: oToken.sValue.slice(0, 40) + "…", + aLabel: ["dossier Windows"] + }; + break; + case 'WORD_ACRONYM': + return { + sType: oToken.sType, + sValue: oToken.sValue, + aLabel: ["Sigle ou acronyme"] + }; + break; + case 'WORD': + if (oToken.sValue.gl_count("-") > 4) { + return { + sType: "COMPLEX", + sValue: oToken.sValue, + aLabel: ["élément complexe indéterminé"] + }; + } else if (m = this._zPartDemForm.exec(oToken.sValue)) { + // mots avec particules démonstratives + if (this._aPartDemExceptList.has(m[1].toLowerCase())) { + return { + sType: "WORD", + sValue: oToken.sValue, + aLabel: this._getMorph(oToken.sValue) + }; + } + return { + sType: oToken.sType, + sValue: oToken.sValue, + aLabel: ["mot avec particule démonstrative"], + aSubElem: [ + { sType: oToken.sType, sValue: m[1], aLabel: this._getMorph(m[1]) }, + { sType: oToken.sType, sValue: "-" + m[2], aLabel: [this._formatSuffix(m[2].toLowerCase())] } + ] + }; + } else if (m = this._zImperatifVerb.exec(oToken.sValue)) { + // formes interrogatives + return { + sType: oToken.sType, + sValue: oToken.sValue, + aLabel: ["forme verbale impérative"], + aSubElem: [ + { sType: oToken.sType, sValue: m[1], aLabel: this._getMorph(m[1]) }, + { sType: oToken.sType, sValue: "-" + m[2], aLabel: [this._formatSuffix(m[2].toLowerCase())] } + ] + }; + } else if (m = this._zInterroVerb.exec(oToken.sValue)) { + // formes interrogatives + return { + sType: oToken.sType, + sValue: oToken.sValue, + aLabel: ["forme verbale interrogative"], + aSubElem: [ + { sType: oToken.sType, sValue: m[1], aLabel: this._getMorph(m[1]) }, + { sType: oToken.sType, sValue: "-" + m[2], aLabel: [this._formatSuffix(m[2].toLowerCase())] } + ] + }; + } else if (this.oSpellChecker.isValidToken(oToken.sValue)) { + return { + sType: oToken.sType, + sValue: oToken.sValue, + aLabel: this._getMorph(oToken.sValue) + }; + } else { + return { + sType: "UNKNOWN_WORD", + sValue: oToken.sValue, + aLabel: ["mot inconnu du dictionnaire"] + }; + } + break; + default: + return { + sType: oToken.sType, + sValue: oToken.sValue, + aLabel: ["token inconnu"] + } + } + } catch (e) { + console.error(e); + } + return null; + }, + + _getMorph (sWord) { + let aElem = []; + for (let s of this.oSpellChecker.getMorph(sWord)) { + if (s.includes(":")) aElem.push(this._formatTags(s)); + } + if (aElem.length == 0) { + aElem.push("mot inconnu du dictionnaire"); + } + return aElem; + }, + + _formatTags (sTags) { + let sRes = ""; + sTags = sTags.replace(/V([0-3][ea]?)[itpqnmr_eaxz]+/, "V$1"); + let m; + while ((m = this._zTag.exec(sTags)) !== null) { + sRes += this.dTag.get(m[0])[0]; + } + if (sRes.startsWith(" verbe") && !sRes.includes("infinitif")) { + sRes += " [" + sTags.slice(1, sTags.indexOf("/")) + "]"; + } + if (!sRes) { + return "#Erreur. Étiquette inconnue : [" + sTags + "]"; + } + return sRes.gl_trimRight(","); + }, + + _formatTagsLoc (sTags) { + let sRes = ""; + let m; + while ((m = this._zTag.exec(sTags)) !== null) { + if (m[0].startsWith(":LV")) { + sRes += this.dLocTag.get(":LV"); + for (let c of m[0].slice(3)) { + sRes += this.dLocVerb.get(c); + } + } else { + sRes += this.dLocTag.get(m[0]); + } + } + if (!sRes) { + return "#Erreur. Étiquette inconnue : [" + sTags + "]"; + } + return sRes.gl_trimRight(","); + }, + + _formatSuffix (s) { + if (s.startsWith("t-")) { + return "“t” euphonique +" + this.dPronoms.get(s.slice(2)); + } + if (!s.includes("-")) { + return this.dPronoms.get(s.replace("’", "'")); + } + if (s.endsWith("ous")) { + s += '2'; + } + let nPos = s.indexOf("-"); + return this.dPronoms.get(s.slice(0, nPos)) + " +" + this.dPronoms.get(s.slice(nPos + 1)); + }, + + getListOfTokens (sText, bInfo=true) { + let aElem = []; + if (sText !== "") { + for (let oToken of this.oTokenizer.genTokens(sText)) { + if (bInfo) { + let aRes = this.getInfoForToken(oToken); + if (aRes) { + aElem.push(aRes); + } + } else if (oToken.sType !== "SPACE") { + aElem.push(oToken); + } + } + } + return aElem; + }, + + * generateInfoForTokenList (lToken) { + for (let oToken of lToken) { + let aRes = this.getInfoForToken(oToken); + if (aRes) { + yield aRes; + } + } + }, + + getListOfTokensReduc (sText, bInfo=true) { + let lToken = this.getListOfTokens(sText.replace("'", "’").trim(), false); + let iToken = 0; + let aElem = []; + if (lToken.length == 0) { + return aElem; + } + do { + let oToken = lToken[iToken]; + let sMorphLoc = ''; + let aTokenTempList = [oToken]; + if (oToken.sType == "WORD" || oToken.sType == "WORD_ELIDED"){ + let iLocEnd = iToken + 1; + let oLocNode = this.oLocGraph[oToken.sValue.toLowerCase()]; + while (oLocNode) { + let oTokenNext = lToken[iLocEnd]; + iLocEnd++; + if (oTokenNext) { + oLocNode = oLocNode[oTokenNext.sValue.toLowerCase()]; + } + if (oLocNode && iLocEnd <= lToken.length) { + sMorphLoc = oLocNode["_:_"]; + aTokenTempList.push(oTokenNext); + } else { + break; + } + } + } + + if (sMorphLoc) { + // we have a locution + let sValue = ''; + for (let oTokenWord of aTokenTempList) { + sValue += oTokenWord.sValue+' '; + } + let oTokenLocution = { + 'nStart': aTokenTempList[0].nStart, + 'nEnd': aTokenTempList[aTokenTempList.length-1].nEnd, + 'sType': "LOC", + 'sValue': sValue.replace('’ ','’').trim(), + 'aSubToken': aTokenTempList + }; + if (bInfo) { + let aSubElem = null; + if (sMorphLoc.startsWith("*|")) { + // cette suite de tokens n’est une locution que dans certains cas minoritaires + oTokenLocution.sType = "LOCP"; + for (let oElem of this.generateInfoForTokenList(aTokenTempList)) { + aElem.push(oElem); + } + sMorphLoc = sMorphLoc.slice(2); + } else { + aSubElem = [...this.generateInfoForTokenList(aTokenTempList)]; + } + // cette suite de tokens est la plupart du temps une locution + let aFormatedTag = []; + for (let sTagLoc of sMorphLoc.split('|') ){ + aFormatedTag.push(this._formatTagsLoc(sTagLoc)); + } + aElem.push({ + sType: oTokenLocution.sType, + sValue: oTokenLocution.sValue, + aLabel: aFormatedTag, + aSubElem: aSubElem + }); + } else { + aElem.push(oTokenLocution); + } + iToken = iToken + aTokenTempList.length; + } + else { + // No locution, we just add information + if (bInfo) { + let aRes = this.getInfoForToken(oToken); + if (aRes) { + aElem.push(aRes); + } + } else { + aElem.push(oToken); + } + iToken++; + } + } while (iToken < lToken.length); + return aElem; + } +} + + + +if (typeof(exports) !== 'undefined') { + exports.dSugg = dSugg; + exports.lexgraph_fr = lexgraph_fr; +} Index: graphspell-js/spellchecker.js ================================================================== --- graphspell-js/spellchecker.js +++ graphspell-js/spellchecker.js @@ -11,18 +11,17 @@ /* jslint esversion:6 */ /* global require, exports, console, IBDAWG, Tokenizer */ "use strict"; -if(typeof(process) !== 'undefined') { +if (typeof(process) !== 'undefined') { var ibdawg = require("./ibdawg.js"); var tokenizer = require("./tokenizer.js"); - var suggest = require("./suggest.js"); -} else if (typeof(require) !== 'undefined') { +} +else if (typeof(require) !== 'undefined') { var ibdawg = require("resource://grammalecte/graphspell/ibdawg.js"); var tokenizer = require("resource://grammalecte/graphspell/tokenizer.js"); - var suggest = require("resource://grammalecte/graphspell/suggest.js"); } ${map} @@ -44,13 +43,13 @@ this.oCommunityDic = this._loadDictionary(communityDic, sPath); this.oPersonalDic = this._loadDictionary(personalDic, sPath); this.bCommunityDic = Boolean(this.oCommunityDic); this.bPersonalDic = Boolean(this.oPersonalDic); this.oTokenizer = null; - // Default suggestions - this.dDefaultSugg = null; - this.loadSuggestions(sLangCode) + // Lexicographer + this.lexicographer = null; + this.loadLexicographer(sLangCode) // storage this.bStorage = false; this._dMorphologies = new Map(); // key: flexion, value: list of morphologies this._dLemmas = new Map(); // key: flexion, value: list of lemmas } @@ -129,22 +128,23 @@ deactivatePersonalDictionary () { this.bPersonalDic = false; } - // Default suggestions + // Lexicographer - loadSuggestions (sLangCode) { + loadLexicographer (sLangCode) { // load default suggestion module for - // When “import” works everywhere, do like with Python - try { - if (typeof(suggest) !== 'undefined') { - this.dDefaultSugg = suggest[sLangCode]; - } - } - catch (e) { - console.error(e); + if (typeof(process) !== 'undefined') { + this.lexicographer = require(`./lexgraph_${sLangCode}.js`); + } + else if (typeof(require) !== 'undefined') { + this.lexicographer = require(`resource://grammalecte/graphspell/lexgraph_${sLangCode}.js`); + } + else if (self.hasOwnProperty("lexgraph_"+sLangCode)) { + console.log(self); + this.lexicographer = self["lexgraph_"+sLangCode]; } } // Storage @@ -253,15 +253,15 @@ return Array.from(new Set(this.getMorph(sWord).map((sMorph) => { return sMorph.slice(1, sMorph.indexOf("/")); }))); } * suggest (sWord, nSuggLimit=10) { // generator: returns 1, 2 or 3 lists of suggestions - if (this.dDefaultSugg) { - if (this.dDefaultSugg.has(sWord)) { - yield this.dDefaultSugg.get(sWord).split("|"); - } else if (sWord.gl_isTitle() && this.dDefaultSugg.has(sWord.toLowerCase())) { - let lRes = this.dDefaultSugg.get(sWord.toLowerCase()).split("|"); + if (this.lexicographer) { + if (this.lexicographer.dSugg.has(sWord)) { + yield this.lexicographer.dSugg.get(sWord).split("|"); + } else if (sWord.gl_isTitle() && this.lexicographer.dSugg.has(sWord.toLowerCase())) { + let lRes = this.lexicographer.dSugg.get(sWord.toLowerCase()).split("|"); yield lRes.map((sSugg) => { return sSugg.slice(0,1).toUpperCase() + sSugg.slice(1); }); } else { yield this.oMainDic.suggest(sWord, nSuggLimit, true); } } else { DELETED graphspell-js/suggest.js Index: graphspell-js/suggest.js ================================================================== --- graphspell-js/suggest.js +++ /dev/null @@ -1,126 +0,0 @@ -// JavaScript - -"use strict"; - -var suggest = { - fr: new Map ([ - ["bcp", "beaucoup"], - ["ca", "ça"], - ["cad", "c’est-à-dire"], - ["cb", "combien|CB"], - ["cdlt", "cordialement"], - ["construirent", "construire|construisirent|construisent|construiront"], - ["càd", "c’est-à-dire"], - ["chui", "j’suis|je suis"], - ["chuis", "j’suis|je suis"], - ["dc", "de|donc"], - ["done", "donc|donne"], - ["email", "courriel|e-mail|émail"], - ["emails", "courriels|e-mails"], - ["ete", "êtes|été"], - ["Etes-vous", "Êtes-vous"], - ["Etiez-vous", "Étiez-vous"], - ["Etions-vous", "Étions-nous"], - ["loins", "loin"], - ["mn", "min"], - ["mns", "min"], - ["parce-que", "parce que"], - ["pcq", "parce que"], - ["pd", "pendant|pédé"], - ["pdq", "pendant que"], - ["pdt", "pendant"], - ["pdtq", "pendant que"], - ["pécunier", "pécuniaire"], - ["pécuniers", "pécuniaires"], - ["pk", "pourquoi"], - ["pkoi", "pourquoi"], - ["pq", "pourquoi|PQ"], - ["prq", "presque"], - ["prsq", "presque"], - ["qcq", "quiconque"], - ["qd", "quand"], - ["qq", "quelque"], - ["qqch", "quelque chose"], - ["qqn", "quelqu’un"], - ["qqne", "quelqu’une"], - ["qqs", "quelques"], - ["qqunes", "quelques-unes"], - ["qquns", "quelques-uns"], - ["tdq", "tandis que"], - ["tj", "toujours"], - ["tjs", "toujours"], - ["tq", "tant que|tandis que"], - ["ts", "tous"], - ["tt", "tant|tout"], - ["tte", "toute"], - ["ttes", "toutes"], - - ["Iier", "Iᵉʳ"], - ["Iière", "Iʳᵉ"], - ["IIième", "IIᵉ"], - ["IIIième", "IIIᵉ"], - ["IVième", "IVᵉ"], - ["Vième", "Vᵉ"], - ["VIième", "VIᵉ"], - ["VIIième", "VIIᵉ"], - ["VIIIième", "VIIIᵉ"], - ["IXième", "IXᵉ"], - ["Xième", "Xᵉ"], - ["XIième", "XIᵉ"], - ["XIIième", "XIIᵉ"], - ["XIIIième", "XIIIᵉ"], - ["XIVième", "XIVᵉ"], - ["XVième", "XVᵉ"], - ["XVIième", "XVIᵉ"], - ["XVIIième", "XVIIᵉ"], - ["XVIIIième", "XVIIIᵉ"], - ["XIXième", "XIXᵉ"], - ["XXième", "XXᵉ"], - ["XXIième", "XXIᵉ"], - ["XXIIième", "XXIIᵉ"], - ["XXIIIième", "XXIIIᵉ"], - ["XXIVième", "XXIVᵉ"], - ["XXVième", "XXVᵉ"], - ["XXVIième", "XXVIᵉ"], - ["XXVIIième", "XXVIIᵉ"], - ["XXVIIIième", "XXVIIIᵉ"], - ["XXIXième", "XXIXᵉ"], - ["XXXième", "XXXᵉ"], - ["Ier", "Iᵉʳ"], - ["Ière", "Iʳᵉ"], - ["IIème", "IIᵉ"], - ["IIIème", "IIIᵉ"], - ["IVème", "IVᵉ"], - ["Vème", "Vᵉ"], - ["VIème", "VIᵉ"], - ["VIIème", "VIIᵉ"], - ["VIIIème", "VIIIᵉ"], - ["IXème", "IXᵉ"], - ["Xème", "Xᵉ"], - ["XIème", "XIᵉ"], - ["XIIème", "XIIᵉ"], - ["XIIIème", "XIIIᵉ"], - ["XIVème", "XIVᵉ"], - ["XVème", "XVᵉ"], - ["XVIème", "XVIᵉ"], - ["XVIIème", "XVIIᵉ"], - ["XVIIIème", "XVIIIᵉ"], - ["XIXème", "XIXᵉ"], - ["XXème", "XXᵉ"], - ["XXIème", "XXIᵉ"], - ["XXIIème", "XXIIᵉ"], - ["XXIIIème", "XXIIIᵉ"], - ["XXIVème", "XXIVᵉ"], - ["XXVème", "XXVᵉ"], - ["XXVIème", "XXVIᵉ"], - ["XXVIIème", "XXVIIᵉ"], - ["XXVIIIème", "XXVIIIᵉ"], - ["XXIXème", "XXIXᵉ"], - ["XXXème", "XXXᵉ"] - ]) -}; - - -if (typeof(exports) !== 'undefined') { - exports.fr = suggest.fr; -}