Index: gc_core/js/ibdawg.js ================================================================== --- gc_core/js/ibdawg.js +++ gc_core/js/ibdawg.js @@ -1,11 +1,14 @@ //// IBDAWG "use strict"; -const st = require("resource://grammalecte/str_transform.js"); -const helpers = require("resource://grammalecte/helpers.js"); + +if (typeof(exports) !== 'undefined') { + var str_transform = require("resource://grammalecte/str_transform.js"); + var helpers = require("resource://grammalecte/helpers.js"); +} // String // Don’t remove. Necessary in TB. ${string} @@ -39,15 +42,15 @@ this.dChar = helpers.objectToMap(this.dChar); //this.byDic = new Uint8Array(this.byDic); // not quicker, even slower if (this.cStemming == "S") { - this.funcStemming = st.getStemFromSuffixCode; + this.funcStemming = str_transform.getStemFromSuffixCode; } else if (this.cStemming == "A") { - this.funcStemming = st.getStemFromAffixCode; + this.funcStemming = str_transform.getStemFromAffixCode; } else { - this.funcStemming = st.noStemming; + this.funcStemming = str_transform.noStemming; } // Configuring DAWG functions according to nVersion switch (this.nVersion) { case 1: Index: gc_core/js/lang_core/gc_engine.js ================================================================== --- gc_core/js/lang_core/gc_engine.js +++ gc_core/js/lang_core/gc_engine.js @@ -2,10 +2,21 @@ ${string} ${regex} ${map} + +if (typeof(exports) !== 'undefined') { + var ibdawg = require("resource://grammalecte/ibdawg.js"); + var helpers = require("resource://grammalecte/helpers.js"); + var gc_options = require("resource://grammalecte/${lang}/gc_options.js"); + var gc_rules = require("resource://grammalecte/${lang}/gc_rules.js"); + var cregex = require("resource://grammalecte/${lang}/cregex.js"); + var text = require("resource://grammalecte/text.js"); + var echo = require("resource://grammalecte/helpers.js").echo; +} + function capitalizeArray (aArray) { // can’t map on user defined function?? let aNew = []; for (let i = 0; i < aArray.length; i = i + 1) { @@ -12,17 +23,10 @@ aNew[i] = aArray[i].gl_toCapitalize(); } return aNew; } -const ibdawg = require("resource://grammalecte/ibdawg.js"); -const helpers = require("resource://grammalecte/helpers.js"); -const gc_options = require("resource://grammalecte/${lang}/gc_options.js"); -const gc_rules = require("resource://grammalecte/${lang}/gc_rules.js"); -const cr = require("resource://grammalecte/${lang}/cregex.js"); -const text = require("resource://grammalecte/text.js"); -const echo = require("resource://grammalecte/helpers.js").echo; // data let _sAppContext = ""; // what software is running let _dOptions = null; let _aIgnoredRules = new Set(); Index: gc_core/js/str_transform.js ================================================================== --- gc_core/js/str_transform.js +++ gc_core/js/str_transform.js @@ -1,10 +1,10 @@ //// STRING TRANSFORMATION // Note: 48 is the ASCII code for "0" -var str_transform = { +const str_transform = { getStemFromSuffixCode: function (sFlex, sSfxCode) { // Suffix only if (sSfxCode == "0") { return sFlex; } Index: gc_core/js/tests.js ================================================================== --- gc_core/js/tests.js +++ gc_core/js/tests.js @@ -1,11 +1,13 @@ // JavaScript "use strict"; -const helpers = require("resource://grammalecte/helpers.js"); +if (typeof(exports) !== 'undefined') { + var helpers = require("resource://grammalecte/helpers.js"); +} class TestGrammarChecking { constructor (gce) { Index: gc_core/js/text.js ================================================================== --- gc_core/js/text.js +++ gc_core/js/text.js @@ -1,12 +1,16 @@ // JavaScript "use strict"; -const helpers = require("resource://grammalecte/helpers.js"); + +if (typeof(exports) !== 'undefined') { + var helpers = require("resource://grammalecte/helpers.js"); +} + -var text = { +const text = { getParagraph: function* (sText) { // generator: returns paragraphs of text let iStart = 0; let iEnd = 0; sText = sText.replace("\r", ""); Index: gc_core/js/tokenizer.js ================================================================== --- gc_core/js/tokenizer.js +++ gc_core/js/tokenizer.js @@ -1,13 +1,17 @@ // JavaScript // Very simple tokenizer "use strict"; -const helpers = require("resource://grammalecte/helpers.js"); + +if (typeof(exports) !== 'undefined') { + var helpers = require("resource://grammalecte/helpers.js"); +} + -const aPatterns = { +const aTkzPatterns = { // All regexps must start with ^. "default": [ [/^[   \t]+/, 'SPACE'], [/^[,.;:!?…«»“”‘’"(){}\[\]/·–—]+/, 'SEPARATOR'], @@ -40,14 +44,14 @@ class Tokenizer { constructor (sLang) { this.sLang = sLang; - if (!aPatterns.hasOwnProperty(sLang)) { + if (!aTkzPatterns.hasOwnProperty(sLang)) { this.sLang = "default"; } - this.aRules = aPatterns[this.sLang]; + this.aRules = aTkzPatterns[this.sLang]; }; * genTokens (sText) { let m; let i = 0; Index: gc_lang/fr/modules-js/gce_analyseur.js ================================================================== --- gc_lang/fr/modules-js/gce_analyseur.js +++ gc_lang/fr/modules-js/gce_analyseur.js @@ -20,11 +20,11 @@ if (s2 == "eux") { return "ils"; } if (s2 == "elle" || s2 == "elles") { // We don’t check if word exists in _dAnalyses, for it is assumed it has been done before - if (cr.mbNprMasNotFem(_dAnalyses.gl_get(s1, ""))) { + if (cregex.mbNprMasNotFem(_dAnalyses.gl_get(s1, ""))) { return "ils"; } // si épicène, indéterminable, mais OSEF, le féminin l’emporte return "elles"; } @@ -32,22 +32,22 @@ } function apposition (sWord1, sWord2) { // returns true if nom + nom (no agreement required) // We don’t check if word exists in _dAnalyses, for it is assumed it has been done before - return cr.mbNomNotAdj(_dAnalyses.gl_get(sWord2, "")) && cr.mbPpasNomNotAdj(_dAnalyses.gl_get(sWord1, "")); + return cregex.mbNomNotAdj(_dAnalyses.gl_get(sWord2, "")) && cregex.mbPpasNomNotAdj(_dAnalyses.gl_get(sWord1, "")); } function isAmbiguousNAV (sWord) { // words which are nom|adj and verb are ambiguous (except être and avoir) if (!_dAnalyses.has(sWord) && !_storeMorphFromFSA(sWord)) { return false; } - if (!cr.mbNomAdj(_dAnalyses.gl_get(sWord, "")) || sWord == "est") { + if (!cregex.mbNomAdj(_dAnalyses.gl_get(sWord, "")) || sWord == "est") { return false; } - if (cr.mbVconj(_dAnalyses.gl_get(sWord, "")) && !cr.mbMG(_dAnalyses.gl_get(sWord, ""))) { + if (cregex.mbVconj(_dAnalyses.gl_get(sWord, "")) && !cregex.mbMG(_dAnalyses.gl_get(sWord, ""))) { return true; } return false; } @@ -56,19 +56,19 @@ // We don’t check if word exists in _dAnalyses, for it is assumed it has been done before let a2 = _dAnalyses.gl_get(sWord2, null); if (!a2 || a2.length === 0) { return false; } - if (cr.checkConjVerb(a2, sReqMorphConj)) { + if (cregex.checkConjVerb(a2, sReqMorphConj)) { // verb word2 is ok return false; } let a1 = _dAnalyses.gl_get(sWord1, null); if (!a1 || a1.length === 0) { return false; } - if (cr.checkAgreement(a1, a2) && (cr.mbAdj(a2) || cr.mbAdj(a1))) { + if (cregex.checkAgreement(a1, a2) && (cregex.mbAdj(a2) || cregex.mbAdj(a1))) { return false; } return true; } @@ -77,26 +77,26 @@ // We don’t check if word exists in _dAnalyses, for it is assumed it has been done before let a2 = _dAnalyses.gl_get(sWord2, null) if (!a2 || a2.length === 0) { return false; } - if (cr.checkConjVerb(a2, sReqMorphConj)) { + if (cregex.checkConjVerb(a2, sReqMorphConj)) { // verb word2 is ok return false; } let a1 = _dAnalyses.gl_get(sWord1, null); if (!a1 || a1.length === 0) { return false; } - if (cr.checkAgreement(a1, a2) && (cr.mbAdj(a2) || cr.mbAdjNb(a1))) { + if (cregex.checkAgreement(a1, a2) && (cregex.mbAdj(a2) || cregex.mbAdjNb(a1))) { return false; } // now, we know there no agreement, and conjugation is also wrong - if (cr.isNomAdj(a1)) { + if (cregex.isNomAdj(a1)) { return true; } - //if cr.isNomAdjVerb(a1): # considered true + //if cregex.isNomAdjVerb(a1): # considered true if (bLastHopeCond) { return true; } return false; } @@ -109,11 +109,11 @@ } let a1 = _dAnalyses.gl_get(sWord1, null); if (!a1 || a1.length === 0) { return true; } - return cr.checkAgreement(a1, a2); + return cregex.checkAgreement(a1, a2); } function mbUnit (s) { if (/[µ\/⁰¹²³⁴⁵⁶⁷⁸⁹Ωℓ·]/.test(s)) { return true; Index: gc_lang/fr/modules-js/gce_suggestions.js ================================================================== --- gc_lang/fr/modules-js/gce_suggestions.js +++ gc_lang/fr/modules-js/gce_suggestions.js @@ -1,10 +1,12 @@ //// GRAMMAR CHECKING ENGINE PLUGIN: Suggestion mechanisms -const conj = require("resource://grammalecte/fr/conj.js"); -const mfsp = require("resource://grammalecte/fr/mfsp.js"); -const phonet = require("resource://grammalecte/fr/phonet.js"); +if (typeof(exports) !== 'undefined') { + var conj = require("resource://grammalecte/fr/conj.js"); + var mfsp = require("resource://grammalecte/fr/mfsp.js"); + var phonet = require("resource://grammalecte/fr/phonet.js"); +} //// verbs function suggVerb (sFlex, sWho, funcSugg2=null) { @@ -195,11 +197,11 @@ // returns plural forms assuming sFlex is singular if (sWordToAgree) { if (!_dAnalyses.has(sWordToAgree) && !_storeMorphFromFSA(sWordToAgree)) { return ""; } - let sGender = cr.getGender(_dAnalyses.gl_get(sWordToAgree, [])); + let sGender = cregex.getGender(_dAnalyses.gl_get(sWordToAgree, [])); if (sGender == ":m") { return suggMasPlur(sFlex); } else if (sGender == ":f") { return suggFemPlur(sFlex); } @@ -261,18 +263,18 @@ if (!sMorph.includes(":V")) { // not a verb if (sMorph.includes(":m") || sMorph.includes(":e")) { aSugg.add(suggSing(sFlex)); } else { - let sStem = cr.getLemmaOfMorph(sMorph); + let sStem = cregex.getLemmaOfMorph(sMorph); if (mfsp.isFemForm(sStem)) { mfsp.getMasForm(sStem, false).forEach(function(x) { aSugg.add(x); }); } } } else { // a verb - let sVerb = cr.getLemmaOfMorph(sMorph); + let sVerb = cregex.getLemmaOfMorph(sMorph); if (conj.hasConj(sVerb, ":PQ", ":Q1") && conj.hasConj(sVerb, ":PQ", ":Q3")) { // We also check if the verb has a feminine form. // If not, we consider it’s better to not suggest the masculine one, as it can be considered invariable. aSugg.add(conj.getConj(sVerb, ":PQ", ":Q1")); } @@ -297,18 +299,18 @@ if (!sMorph.includes(":V")) { // not a verb if (sMorph.includes(":m") || sMorph.includes(":e")) { aSugg.add(suggPlur(sFlex)); } else { - let sStem = cr.getLemmaOfMorph(sMorph); + let sStem = cregex.getLemmaOfMorph(sMorph); if (mfsp.isFemForm(sStem)) { mfsp.getMasForm(sStem, true).forEach(function(x) { aSugg.add(x); }); } } } else { // a verb - let sVerb = cr.getLemmaOfMorph(sMorph); + let sVerb = cregex.getLemmaOfMorph(sMorph); if (conj.hasConj(sVerb, ":PQ", ":Q2")) { aSugg.add(conj.getConj(sVerb, ":PQ", ":Q2")); } else if (conj.hasConj(sVerb, ":PQ", ":Q1")) { let sSugg = conj.getConj(sVerb, ":PQ", ":Q1"); // it is necessary to filter these flexions, like “succédé” or “agi” that are not masculine plural @@ -338,18 +340,18 @@ if (!sMorph.includes(":V")) { // not a verb if (sMorph.includes(":f") || sMorph.includes(":e")) { aSugg.add(suggSing(sFlex)); } else { - let sStem = cr.getLemmaOfMorph(sMorph); + let sStem = cregex.getLemmaOfMorph(sMorph); if (mfsp.isFemForm(sStem)) { aSugg.add(sStem); } } } else { // a verb - let sVerb = cr.getLemmaOfMorph(sMorph); + let sVerb = cregex.getLemmaOfMorph(sMorph); if (conj.hasConj(sVerb, ":PQ", ":Q3")) { aSugg.add(conj.getConj(sVerb, ":PQ", ":Q3")); } } } @@ -372,18 +374,18 @@ if (!sMorph.includes(":V")) { // not a verb if (sMorph.includes(":f") || sMorph.includes(":e")) { aSugg.add(suggPlur(sFlex)); } else { - let sStem = cr.getLemmaOfMorph(sMorph); + let sStem = cregex.getLemmaOfMorph(sMorph); if (mfsp.isFemForm(sStem)) { aSugg.add(sStem+"s"); } } } else { // a verb - let sVerb = cr.getLemmaOfMorph(sMorph); + let sVerb = cregex.getLemmaOfMorph(sMorph); if (conj.hasConj(sVerb, ":PQ", ":Q4")) { aSugg.add(conj.getConj(sVerb, ":PQ", ":Q4")); } } } Index: gc_lang/fr/modules-js/lexicographe.js ================================================================== --- gc_lang/fr/modules-js/lexicographe.js +++ gc_lang/fr/modules-js/lexicographe.js @@ -5,13 +5,13 @@ ${string} ${map} -const helpers = require("resource://grammalecte/helpers.js"); -const tkz = require("resource://grammalecte/tokenizer.js"); - +if (typeof(exports) !== 'undefined') { + const helpers = require("resource://grammalecte/helpers.js"); +} const _dTAGS = new Map ([ [':G', "[mot grammatical]"], [':N', " nom,"], [':A', " adjectif,"], Index: gc_lang/fr/modules-js/mfsp.js ================================================================== --- gc_lang/fr/modules-js/mfsp.js +++ gc_lang/fr/modules-js/mfsp.js @@ -1,10 +1,14 @@ // Grammalecte "use strict"; -const helpers = require("resource://grammalecte/helpers.js"); + +if (typeof(exports) !== 'undefined') { + var helpers = require("resource://grammalecte/helpers.js"); +} + const _oData = JSON.parse(helpers.loadFile("resource://grammalecte/fr/mfsp_data.json")); // list of affix codes const _lTagMiscPlur = _oData.lTagMiscPlur; Index: gc_lang/fr/modules-js/phonet.js ================================================================== --- gc_lang/fr/modules-js/phonet.js +++ gc_lang/fr/modules-js/phonet.js @@ -1,8 +1,11 @@ // Grammalecte - Suggestion phonétique -const helpers = require("resource://grammalecte/helpers.js"); +if (typeof(exports) !== 'undefined') { + var helpers = require("resource://grammalecte/helpers.js"); +} + const _oData = JSON.parse(helpers.loadFile("resource://grammalecte/fr/phonet_data.json")); const _dWord = helpers.objectToMap(_oData.dWord); const _lSet = _oData.lSet; const _dMorph = helpers.objectToMap(_oData.dMorph); Index: gc_lang/fr/modules-js/textformatter.js ================================================================== --- gc_lang/fr/modules-js/textformatter.js +++ gc_lang/fr/modules-js/textformatter.js @@ -196,11 +196,11 @@ "ma_1letter_uppercase": [ [/[  ]([LDJNMTSCÇ]) (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])/g, "$1’"], [/^([LDJNMTSCÇ]) (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])/g, "$1’"] ] }; -const dDefaultOptions = new Map ([ +const dTFDefaultOptions = new Map ([ ["ts_units", true], ["start_of_paragraph", true], ["end_of_paragraph", true], ["between_words", true], ["before_punctuation", true], @@ -249,11 +249,11 @@ ["ma_word", true], ["ma_1letter_lowercase", false], ["ma_1letter_uppercase", false] ]); -const dOptions = dDefaultOptions.gl_shallowCopy(); +const dTFOptions = dTFDefaultOptions.gl_shallowCopy(); class TextFormatter { constructor () { @@ -260,13 +260,13 @@ this.sLang = "fr"; }; formatText (sText, dOpt=null) { if (dOpt !== null) { - dOptions.gl_updateOnlyExistingKeys(dOpt); + dTFOptions.gl_updateOnlyExistingKeys(dOpt); } - for (let [sOptName, bVal] of dOptions) { + for (let [sOptName, bVal] of dTFOptions) { if (bVal && oReplTable.has(sOptName)) { for (let [zRgx, sRep] of oReplTable[sOptName]) { sText = sText.replace(zRgx, sRep); } } @@ -273,14 +273,14 @@ } return sText; }; getDefaultOptions () { - return dDefaultOptions; + return dTFDefaultOptions; } } if (typeof(exports) !== 'undefined') { exports.TextFormatter = TextFormatter; exports.oReplTable = oReplTable; } Index: gc_lang/fr/webext/gce_worker.js ================================================================== --- gc_lang/fr/webext/gce_worker.js +++ gc_lang/fr/webext/gce_worker.js @@ -1,31 +1,30 @@ - - /* -try { - console.log("BEFORE"); - //var myhelpers = require('./grammalecte/helpers.js'); - require(['./grammalecte/helpers.js'], function (foo) { - console.log("LOADING"); - echo("MODULE LOADED2"); - }); - console.log("AFTER"); -} -catch (e) { - console.log("\n" + e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message); - console.error(e); -}*/ - -echo("VA TE FAIRE FOUTRE"); - - - -let gce = null; // module: grammar checker engine -let text = null; -let tkz = null; // module: tokenizer -let lxg = null; // module: lexicographer -let helpers = null; + WARNING. + + JavaScript still sucks. + No module available in WebExtension at the moment! :( + No require, no import/export. + + In order to use the same base of code with XUL-addon for Thunderbird and SDK-addon for Firefox, + all modules have been “objectified”. And while they are still imported via “require” + in the previous extensions, they are loaded as background scripts in WebExtension sharing + the same memory space (it seems)… + + When JavaScript become a modern language, “deobjectify” the modules… + + ATM, import/export are not available by default: + — Chrome 60 – behind the Experimental Web Platform flag in chrome:flags. + — Firefox 54 – behind the dom.moduleScripts.enabled setting in about:config. + — Edge 15 – behind the Experimental JavaScript Features setting in about:flags. + + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export +*/ + +helpers.echo("START"); + let oTokenizer = null; let oDict = null; let oLxg = null; Index: gc_lang/fr/webext/manifest.json ================================================================== --- gc_lang/fr/webext/manifest.json +++ gc_lang/fr/webext/manifest.json @@ -28,11 +28,16 @@ "default_popup": "panel/main.html", "default_title": "Grammalecte [fr]", "browser_style": false }, "background": { - "scripts": ["require.js", "grammalecte/helpers.js", "gce_worker.js"] + "scripts": [ + "grammalecte/helpers.js", + "grammalecte/text.js", + "grammalecte/tokenizer.js", + "gce_worker.js" + ] }, "web_accessible_resources": [ "beasts/frog.jpg", "beasts/turtle.jpg", "beasts/snake.jpg"