Index: gc_core/js/helpers.js
==================================================================
--- gc_core/js/helpers.js
+++ gc_core/js/helpers.js
@@ -1,88 +1,97 @@
// HELPERS
"use strict";
-// In Firefox, there is no console.log in PromiseWorker, but there is worker.log.
-// In Thunderbird, you can’t access to console directly. So it’s required to pass a log function.
-let funcOutput = null;
-
-function setLogOutput (func) {
- funcOutput = func;
-}
-
-function echo (obj) {
- if (funcOutput !== null) {
- funcOutput(obj);
- } else {
- console.log(obj);
- }
- return true;
-}
-
-function logerror (e, bStack=false) {
- let sMsg = "\n" + e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message;
- if (bStack) {
- sMsg += "\n--- Stack ---\n" + e.stack;
- }
- if (funcOutput !== null) {
- funcOutput(sMsg);
- } else {
- console.error(sMsg);
- }
-}
-
-
-// load ressources in workers (suggested by Mozilla extensions reviewers)
-// for more options have a look here: https://gist.github.com/Noitidart/ec1e6b9a593ec7e3efed
-// if not in workers, use sdk/data.load() instead
-function loadFile (spf) {
- try {
- let xRequest;
- if (typeof XMLHttpRequest !== "undefined") {
- xRequest = new XMLHttpRequest();
- }
- else {
- // JS bullshit again… necessary for Thunderbird
- let { Cc, Ci } = require("chrome");
- xRequest = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance();
- xRequest.QueryInterface(Ci.nsIXMLHttpRequest);
- }
- xRequest.open('GET', spf, false); // 3rd arg is false for synchronous, sync is acceptable in workers
- xRequest.send();
- return xRequest.responseText;
- }
- catch (e) {
- logerror(e);
- return null
- }
-}
-
-
-
-
-
-// conversions
-function objectToMap (obj) {
- let m = new Map();
- for (let param in obj) {
- //console.log(param + " " + obj[param]);
- m.set(param, obj[param]);
- }
- return m;
-}
-
-function mapToObject (m) {
- let obj = {};
- for (let [k, v] of m) {
- obj[k] = v;
- }
- return obj;
-}
-
-exports.echo = echo;
-exports.logerror = logerror;
-exports.objectToMap = objectToMap;
-exports.mapToObject = mapToObject;
-exports.setLogOutput = setLogOutput;
-exports.loadFile = loadFile;
+const helpers = {
+ // In Firefox, there is no console.log in PromiseWorker, but there is worker.log.
+ // In Thunderbird, you can’t access to console directly. So it’s required to pass a log function.
+ _funcOutput: null,
+
+ setLogOutput: function (func) {
+ this._funcOutput = func;
+ },
+
+ echo: function (obj) {
+ if (this._funcOutput !== null) {
+ this._funcOutput(obj);
+ } else {
+ console.log(obj);
+ }
+ return true;
+ },
+
+ logerror: function (e, bStack=false) {
+ let sMsg = "\n" + e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message;
+ if (bStack) {
+ sMsg += "\n--- Stack ---\n" + e.stack;
+ }
+ if (this._funcOutput !== null) {
+ this._funcOutput(sMsg);
+ } else {
+ console.error(sMsg);
+ }
+ },
+
+ inspect: function (o) {
+ let sMsg = "__inspect__: " + typeof o;
+ for (let sParam in o) {
+ sMsg += "\n" + sParam + ": " + o.sParam;
+ }
+ sMsg += "\n" + JSON.stringify(o) + "\n__end__";
+ this.echo(sMsg);
+ },
+
+ loadFile: function (spf) {
+ // load ressources in workers (suggested by Mozilla extensions reviewers)
+ // for more options have a look here: https://gist.github.com/Noitidart/ec1e6b9a593ec7e3efed
+ // if not in workers, use sdk/data.load() instead
+ try {
+ let xRequest;
+ if (typeof XMLHttpRequest !== "undefined") {
+ xRequest = new XMLHttpRequest();
+ }
+ else {
+ // JS bullshit again… necessary for Thunderbird
+ let { Cc, Ci } = require("chrome");
+ xRequest = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance();
+ xRequest.QueryInterface(Ci.nsIXMLHttpRequest);
+ }
+ xRequest.open('GET', spf, false); // 3rd arg is false for synchronous, sync is acceptable in workers
+ xRequest.send();
+ return xRequest.responseText;
+ }
+ catch (e) {
+ this.logerror(e);
+ return null
+ }
+ },
+
+ objectToMap: function (obj) {
+ let m = new Map();
+ for (let param in obj) {
+ //console.log(param + " " + obj[param]);
+ m.set(param, obj[param]);
+ }
+ return m;
+ },
+
+ mapToObject: function (m) {
+ let obj = {};
+ for (let [k, v] of m) {
+ obj[k] = v;
+ }
+ return obj;
+ }
+}
+
+
+if (typeof(exports) !== 'undefined') {
+ exports.setLogOutput = helpers.setLogOutput;
+ exports.echo = helpers.echo;
+ exports.logerror = helpers.logerror;
+ exports.inspect = helpers.inspect;
+ exports.loadFile = helpers.loadFile;
+ exports.objectToMap = helpers.objectToMap;
+ exports.mapToObject = helpers.mapToObject;
+}
Index: gc_core/js/ibdawg.js
==================================================================
--- gc_core/js/ibdawg.js
+++ gc_core/js/ibdawg.js
@@ -286,6 +286,8 @@
// to do
};
}
-exports.IBDAWG = IBDAWG;
+if (typeof(exports) !== 'undefined') {
+ exports.IBDAWG = IBDAWG;
+}
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
@@ -604,20 +604,21 @@
${callablesJS}
-
-exports.load = load;
-exports.parse = parse;
-exports.lang = lang;
-exports.version = version;
-exports.getDictionary = getDictionary;
-exports.setOption = setOption;
-exports.setOptions = setOptions;
-exports.getOptions = getOptions;
-exports.getDefaultOptions = getDefaultOptions;
-exports.resetOptions = resetOptions;
-exports.ignoreRule = ignoreRule;
-exports.reactivateRule = reactivateRule;
-exports.resetIgnoreRules = resetIgnoreRules;
-exports.listRules = listRules;
+if (typeof(exports) !== 'undefined') {
+ exports.load = load;
+ exports.parse = parse;
+ exports.lang = lang;
+ exports.version = version;
+ exports.getDictionary = getDictionary;
+ exports.setOption = setOption;
+ exports.setOptions = setOptions;
+ exports.getOptions = getOptions;
+ exports.getDefaultOptions = getDefaultOptions;
+ exports.resetOptions = resetOptions;
+ exports.ignoreRule = ignoreRule;
+ exports.reactivateRule = reactivateRule;
+ exports.resetIgnoreRules = resetIgnoreRules;
+ exports.listRules = listRules;
+}
Index: gc_core/js/lang_core/gc_options.js
==================================================================
--- gc_core/js/lang_core/gc_options.js
+++ gc_core/js/lang_core/gc_options.js
@@ -17,8 +17,11 @@
"Thunderbird": new Map (${dOptThunderbird}),
}
const dOptLabel = ${dOptLabel};
-exports.getOptions = getOptions;
-exports.lStructOpt = lStructOpt;
-exports.dOptLabel = dOptLabel;
+
+if (typeof(exports) !== 'undefined') {
+ exports.getOptions = getOptions;
+ exports.lStructOpt = lStructOpt;
+ exports.dOptLabel = dOptLabel;
+}
Index: gc_core/js/lang_core/gc_rules.js
==================================================================
--- gc_core/js/lang_core/gc_rules.js
+++ gc_core/js/lang_core/gc_rules.js
@@ -7,7 +7,9 @@
const lParagraphRules = ${paragraph_rules_JS};
const lSentenceRules = ${sentence_rules_JS};
-exports.lParagraphRules = lParagraphRules;
-exports.lSentenceRules = lSentenceRules;
+if (typeof(exports) !== 'undefined') {
+ exports.lParagraphRules = lParagraphRules;
+ exports.lSentenceRules = lSentenceRules;
+}
Index: gc_core/js/str_transform.js
==================================================================
--- gc_core/js/str_transform.js
+++ gc_core/js/str_transform.js
@@ -1,58 +1,33 @@
//// STRING TRANSFORMATION
-var dSimilarChars = new Map ([
- ["a", "aàâáä"],
- ["à", "aàâáä"],
- ["â", "aàâáä"],
- ["á", "aàâáä"],
- ["ä", "aàâáä"],
- ["c", "cç"],
- ["ç", "cç"],
- ["e", "eéêèë"],
- ["é", "eéêèë"],
- ["ê", "eéêèë"],
- ["è", "eéêèë"],
- ["ë", "eéêèë"],
- ["i", "iîïíì"],
- ["î", "iîïíì"],
- ["ï", "iîïíì"],
- ["í", "iîïíì"],
- ["ì", "iîïíì"],
- ["o", "oôóòö"],
- ["ô", "oôóòö"],
- ["ó", "oôóòö"],
- ["ò", "oôóòö"],
- ["ö", "oôóòö"],
- ["u", "uûùüú"],
- ["û", "uûùüú"],
- ["ù", "uûùüú"],
- ["ü", "uûùüú"],
- ["ú", "uûùüú"]
-]);
-
-// Note: 48 is the ASCII code for "0"
-
-// Suffix only
-function getStemFromSuffixCode (sFlex, sSfxCode) {
- if (sSfxCode == "0") {
- return sFlex;
- }
- return sSfxCode[0] == '0' ? sFlex + sSfxCode.slice(1) : sFlex.slice(0, -(sSfxCode.charCodeAt(0)-48)) + sSfxCode.slice(1);
-}
-
-// Prefix and suffix
-function getStemFromAffixCode (sFlex, sAffCode) {
- if (sAffCode == "0") {
- return sFlex;
- }
- if (!sAffCode.includes("/")) {
- return "# error #";
- }
- var [sPfxCode, sSfxCode] = sAffCode.split('/');
- sFlex = sPfxCode.slice(1) + sFlex.slice(sPfxCode.charCodeAt(0)-48);
- return sSfxCode[0] == '0' ? sFlex + sSfxCode.slice(1) : sFlex.slice(0, -(sSfxCode.charCodeAt(0)-48)) + sSfxCode.slice(1);
-}
-
-
-exports.getStemFromSuffixCode = getStemFromSuffixCode;
-exports.getStemFromAffixCode = getStemFromAffixCode;
+// Note: 48 is the ASCII code for "0"
+
+const str_transform = {
+
+ getStemFromSuffixCode: function (sFlex, sSfxCode) {
+ // Suffix only
+ if (sSfxCode == "0") {
+ return sFlex;
+ }
+ return sSfxCode[0] == '0' ? sFlex + sSfxCode.slice(1) : sFlex.slice(0, -(sSfxCode.charCodeAt(0)-48)) + sSfxCode.slice(1);
+ },
+
+ getStemFromAffixCode: function (sFlex, sAffCode) {
+ // Prefix and suffix
+ if (sAffCode == "0") {
+ return sFlex;
+ }
+ if (!sAffCode.includes("/")) {
+ return "# error #";
+ }
+ let [sPfxCode, sSfxCode] = sAffCode.split('/');
+ sFlex = sPfxCode.slice(1) + sFlex.slice(sPfxCode.charCodeAt(0)-48);
+ return sSfxCode[0] == '0' ? sFlex + sSfxCode.slice(1) : sFlex.slice(0, -(sSfxCode.charCodeAt(0)-48)) + sSfxCode.slice(1);
+ }
+}
+
+
+if (typeof(exports) !== 'undefined') {
+ exports.getStemFromSuffixCode = str_transform.getStemFromSuffixCode;
+ exports.getStemFromAffixCode = str_transform.getStemFromAffixCode;
+}
Index: gc_core/js/tests.js
==================================================================
--- gc_core/js/tests.js
+++ gc_core/js/tests.js
@@ -145,6 +145,9 @@
return [" ".repeat(sLine.length), ""];
};
}
-exports.TestGrammarChecking = TestGrammarChecking;
+
+if (typeof(exports) !== 'undefined') {
+ exports.TestGrammarChecking = TestGrammarChecking;
+}
Index: gc_core/js/text.js
==================================================================
--- gc_core/js/text.js
+++ gc_core/js/text.js
@@ -168,10 +168,12 @@
return '# Error. Data: ' + oErr.toString();
}
}
-exports.getParagraph = getParagraph;
-exports.addHtmlEntities = addHtmlEntities;
-exports.createHTMLBlock = createHTMLBlock;
-exports.tagParagraph = tagParagraph;
-exports.getReadableError = getReadableError;
+if (typeof(exports) !== 'undefined') {
+ exports.getParagraph = getParagraph;
+ exports.addHtmlEntities = addHtmlEntities;
+ exports.createHTMLBlock = createHTMLBlock;
+ exports.tagParagraph = tagParagraph;
+ exports.getReadableError = getReadableError;
+}
Index: gc_core/js/tokenizer.js
==================================================================
--- gc_core/js/tokenizer.js
+++ gc_core/js/tokenizer.js
@@ -70,6 +70,9 @@
sText = sText.slice(nCut);
}
}
}
-exports.Tokenizer = Tokenizer;
+
+if (typeof(exports) !== 'undefined') {
+ exports.Tokenizer = Tokenizer;
+}
Index: gc_lang/fr/build.py
==================================================================
--- gc_lang/fr/build.py
+++ gc_lang/fr/build.py
@@ -7,12 +7,23 @@
import helpers
def build (sLang, dVars, spLangPack):
"complementary build launched from make.py"
- createFirefoxExtension(sLang, dVars)
- createThunderbirdExtension(sLang, dVars, spLangPack)
+ #createFirefoxExtension(sLang, dVars)
+ createWebExtension(sLang, dVars)
+ #createThunderbirdExtension(sLang, dVars, spLangPack)
+
+
+def createWebExtension (sLang, dVars):
+ "create Web-extension"
+ print("Building Web-extension")
+ helpers.createCleanFolder("_build/webext/"+sLang)
+ dir_util.copy_tree("gc_lang/"+sLang+"/webext/", "_build/webext/"+sLang)
+ dir_util.copy_tree("grammalecte-js", "_build/webext/"+sLang+"/grammalecte")
+ with helpers.cd("_build/webext/"+sLang):
+ os.system("web-ext build")
def createFirefoxExtension (sLang, dVars):
"create extension for Firefox"
print("Building extension for Firefox")
Index: gc_lang/fr/config.ini
==================================================================
--- gc_lang/fr/config.ini
+++ gc_lang/fr/config.ini
@@ -28,10 +28,15 @@
oxt_identifier = French.linguistic.resources.from.Dicollecte.by.OlivierR
# Firefox
fx_identifier = French-GC@grammalecte.net
fx_name = Grammalecte [fr]
+
+fx_standard_path = C:\Program Files\Mozilla Firefox\firefox.exe
+fx_beta_path = C:\Program Files\Mozilla Firefox Beta\firefox.exe
+fx_nightly_path = C:\Program Files (x86)\Nightly\firefox.exe
+
# Thunderbird
tb_identifier = French-GC-TB@grammalecte.net
tb_name = Grammalecte [fr]
tb_debug_extension_path = _build/tb-debug.profile/extensions/French-GC-TB@grammalecte.net
Index: gc_lang/fr/data/phonet_simil.txt
==================================================================
--- gc_lang/fr/data/phonet_simil.txt
+++ gc_lang/fr/data/phonet_simil.txt
@@ -666,10 +666,11 @@
sommet sommets sommer
son sons sont
sonnet sonnets sonner
sors sort sorts
sortie sorties sortis sortit
+sou sous soue soues
souci soucis soucie soucies soucient
souper soupers sous-paie sous-paies sous-paient
soupir soupirs soupire soupires soupirent
soutien soutiens soutient
soufflet soufflets soufflé soufflés souffler
Index: gc_lang/fr/modules-js/conj.js
==================================================================
--- gc_lang/fr/modules-js/conj.js
+++ gc_lang/fr/modules-js/conj.js
@@ -485,10 +485,11 @@
return (this.dConj.get(":PQ").get(":Q3")) ? this.dConj.get(":PQ").get(":Q3") : this.dConj.get(":PQ").get(":Q1");
}
return (this.dConj.get(":PQ").get(":Q4")) ? this.dConj.get(":PQ").get(":Q4") : this.dConj.get(":PQ").get(":Q1");
}
}
+
if (typeof(exports) !== 'undefined') {
// Used for Grammalecte library.
// In content scripts, these variable are directly reachable
exports.Verb = Verb;
Index: gc_lang/fr/modules-js/cregex.js
==================================================================
--- gc_lang/fr/modules-js/cregex.js
+++ gc_lang/fr/modules-js/cregex.js
@@ -262,39 +262,40 @@
}
return lMorph.some(s => zNPm.test(s));
}
-
-exports.getLemmaOfMorph = getLemmaOfMorph;
-exports.checkAgreement = checkAgreement;
-exports.checkConjVerb = checkConjVerb;
-exports.getGender = getGender;
-exports.getNumber = getNumber;
-exports.isNom = isNom;
-exports.isNomNotAdj = isNomNotAdj;
-exports.isAdj = isAdj;
-exports.isNomAdj = isNomAdj;
-exports.isNomVconj = isNomVconj;
-exports.isInv = isInv;
-exports.isSg = isSg;
-exports.isPl = isPl;
-exports.isEpi = isEpi;
-exports.isMas = isMas;
-exports.isFem = isFem;
-exports.mbNom = mbNom;
-exports.mbAdj = mbAdj;
-exports.mbAdjNb = mbAdjNb;
-exports.mbNomAdj = mbNomAdj;
-exports.mbNomNotAdj = mbNomNotAdj;
-exports.mbPpasNomNotAdj = mbPpasNomNotAdj;
-exports.mbVconj = mbVconj;
-exports.mbVconj123 = mbVconj123;
-exports.mbMG = mbMG;
-exports.mbInv = mbInv;
-exports.mbSg = mbSg;
-exports.mbPl = mbPl;
-exports.mbEpi = mbEpi;
-exports.mbMas = mbMas;
-exports.mbFem = mbFem;
-exports.mbNpr = mbNpr;
-exports.mbNprMasNotFem = mbNprMasNotFem;
+if (typeof(exports) !== 'undefined') {
+ exports.getLemmaOfMorph = getLemmaOfMorph;
+ exports.checkAgreement = checkAgreement;
+ exports.checkConjVerb = checkConjVerb;
+ exports.getGender = getGender;
+ exports.getNumber = getNumber;
+ exports.isNom = isNom;
+ exports.isNomNotAdj = isNomNotAdj;
+ exports.isAdj = isAdj;
+ exports.isNomAdj = isNomAdj;
+ exports.isNomVconj = isNomVconj;
+ exports.isInv = isInv;
+ exports.isSg = isSg;
+ exports.isPl = isPl;
+ exports.isEpi = isEpi;
+ exports.isMas = isMas;
+ exports.isFem = isFem;
+ exports.mbNom = mbNom;
+ exports.mbAdj = mbAdj;
+ exports.mbAdjNb = mbAdjNb;
+ exports.mbNomAdj = mbNomAdj;
+ exports.mbNomNotAdj = mbNomNotAdj;
+ exports.mbPpasNomNotAdj = mbPpasNomNotAdj;
+ exports.mbVconj = mbVconj;
+ exports.mbVconj123 = mbVconj123;
+ exports.mbMG = mbMG;
+ exports.mbInv = mbInv;
+ exports.mbSg = mbSg;
+ exports.mbPl = mbPl;
+ exports.mbEpi = mbEpi;
+ exports.mbMas = mbMas;
+ exports.mbFem = mbFem;
+ exports.mbNpr = mbNpr;
+ exports.mbNprMasNotFem = mbNprMasNotFem;
+}
Index: gc_lang/fr/modules-js/lexicographe.js
==================================================================
--- gc_lang/fr/modules-js/lexicographe.js
+++ gc_lang/fr/modules-js/lexicographe.js
@@ -262,6 +262,8 @@
return _dAD.get(s.slice(0, nPos)) + " +" + _dAD.get(s.slice(nPos+1));
};
}
-exports.Lexicographe = Lexicographe;
+if (typeof(exports) !== 'undefined') {
+ exports.Lexicographe = Lexicographe;
+}
Index: gc_lang/fr/modules-js/mfsp.js
==================================================================
--- gc_lang/fr/modules-js/mfsp.js
+++ gc_lang/fr/modules-js/mfsp.js
@@ -77,9 +77,11 @@
return "## erreur, code : " + sSfx + " ##";
}
}
-exports.isFemForm = isFemForm;
-exports.getMasForm = getMasForm;
-exports.hasMiscPlural = hasMiscPlural;
-exports.getMiscPlural = getMiscPlural;
+if (typeof(exports) !== 'undefined') {
+ exports.isFemForm = isFemForm;
+ exports.getMasForm = getMasForm;
+ exports.hasMiscPlural = hasMiscPlural;
+ exports.getMiscPlural = getMiscPlural;
+}
Index: gc_lang/fr/modules-js/phonet.js
==================================================================
--- gc_lang/fr/modules-js/phonet.js
+++ gc_lang/fr/modules-js/phonet.js
@@ -66,8 +66,10 @@
}
return aSelect;
}
-exports.hasSimil = hasSimil;
-exports.getSimil = getSimil;
-exports.selectSimil = selectSimil;
+if (typeof(exports) !== 'undefined') {
+ exports.hasSimil = hasSimil;
+ exports.getSimil = getSimil;
+ exports.selectSimil = selectSimil;
+}
Index: gc_lang/fr/modules-js/textformatter.js
==================================================================
--- gc_lang/fr/modules-js/textformatter.js
+++ gc_lang/fr/modules-js/textformatter.js
@@ -276,10 +276,11 @@
getDefaultOptions () {
return dDefaultOptions;
}
}
+
if (typeof(exports) !== 'undefined') {
exports.TextFormatter = TextFormatter;
exports.oReplTable = oReplTable;
}
ADDED gc_lang/fr/oxt/_img/Algoo_logo.png
Index: gc_lang/fr/oxt/_img/Algoo_logo.png
==================================================================
--- /dev/null
+++ gc_lang/fr/oxt/_img/Algoo_logo.png
cannot compute difference between binary files
ADDED gc_lang/fr/oxt/_img/logo120_text.png
Index: gc_lang/fr/oxt/_img/logo120_text.png
==================================================================
--- /dev/null
+++ gc_lang/fr/oxt/_img/logo120_text.png
cannot compute difference between binary files
Index: gc_lang/fr/rules.grx
==================================================================
--- gc_lang/fr/rules.grx
+++ gc_lang/fr/rules.grx
@@ -3158,11 +3158,11 @@
<<- __else__ -2>> _ # Incohérence : “\1” est une préposition. “\2” est un verbe conjugué.
__[i]/conf(conf_a_à_locutions1)__
(a) (?:nouveau|présent|(?:bonne distance|bord|cause|contre-courant|côté|court|défaut|droite|gauche|l’(?:arrière|autre bout|écart|égard|extérieur|aune|avant|encontre|ins(?:u|tar)|intérieur|opposé)|la (?:portée|suite)|partir|portée|propos|rebours) d(?:es?|u)) @@0
<<- -1>> à # Confusion. Utilisez la préposition “à”.
__[s]/conf(conf_a_à_locutions2)__
- (a) (?:califourchon|contre(?:cœur|temps)|côté d(?:e|’\w[\w-]+)|demi-mot|nouveau|présent|rebrousse-poil|regret|travers|tout-va|l’(?:heure (?:actuelle|qu il est)|accoutumée|amiable|avance|aven(?:ir|ant)|air libre|aveuglette|emporte-pièce|évidence|exclusion de toute autre chose|improviste|inverse|ordre du jour|œil nu|en croire|un(?:animité| (?:d’entre eux|des leurs)|e (?:d’entre elles|des leurs)))|la (?:bonne franquette|con|dér(?:ive|obée)|diable|fois|limite du supportable|lumière de tout ce(?:ci|la)|mords-moi-le-nœud|papa|petite semaine|pointe du progrès|queue leu leu|rescousse|sauvette|surprise générale|virgule près|volée)|partir (?:de (?:demain|là|maintenant|rien)|d’(?:aujourd’hui|hier|ici))|au(?:cun prix|trui|tre chose)|bas co[ûu]t|bâ(?:bord|tons rompus)|beaucoup près|belles dents|bien (?:des égards|y (?:penser|réfléchir|songer))|bon (?:compte|escient|droit)|bout (?:de (?:bras|souffle|forces?)|portant|touchant)|bras (?:ouverts|le corps)|brève échéance|but non lucratif|cause d(?:e (?:ça|[mt]oi|lui|[nv]ous)|’e(?:lles?|ux))|ce (?:compte-là|moment-là|titre)|cet (?:égard|instant(?: précis|))|cette (?:époque(?: de l’année|)|heure de la (?:journée|nuit))|chaque (?:fois|instant)|chaudes larmes|cœur (?:joie|ouvert|perdu)|ciel ouvert|contre-cœur|corps perdu|cou(?:p sûr|per le souffle|rt terme|rte (?:échéance|portée))|de nombreuses reprises|des kilomètres à la ronde|dose homéopathique|double (?:titre|tranchant)|durée limitée|en (?:juger par (?:[mts]on|[nv]otre|leur) expérience|perdre (?:haleine|la tête))|faible (?:allure|revenu)|feu et à sang|flanc de (?:colline|montagne)|fleur de peau|géométrie variable|grand(?:-peine|e échelle)|haut risque|hue et à dia|huis clos|intervalles (?:ir|)réguliers|juste (?:raison|titre)|long terme|longue(?: échéance| portée|ur (?:de (?:temps|journée))|d’année)|loyer modéré|main (?:armée|droite|gauche|levée)|maint(?:s égards|es reprises)|marche forcée|merveille|mi-(?:course|distance|temps)|mi(?:di|nuit)(?: pile|)|moindres frais|moyen(?: terme|ne échéance)|mots couverts|ne (?:jamais|pas|rien|guère)|n’en (?:pas douter|point douter|plus finir)|outrance|parler franc|part (?:entière|ça|ce(?:la|ci))|partir de là|part(?:ir de rien|s égales)|pas de (?:géant|loup|tortue|velours)|personne en danger|perte de vue|petit(?: feu|e (?:dose|échelle))|peu (?:de choses? |)près|pieds joints|pile ou face|plat(?: ventre|e couture)|plein(?: (?:régime|temps|nez)|s poumons)|plus (?:forte raison|d’un titre)|point nommé|portée de main|première vue|prix (?:cassé|modique)s?|proprement parler|qui (?:mieux mieux|que ce soit|de droit)|quelque distance|quelques exceptions près|ras bords?|rude épreuve|tel point|temps (?:plein|partiel|complet)|tête reposée|tire[ -]d’aile|titre (?:conservatoire|d’exemple|indicatif|informatif|grâcieux|personnel|posthume)|tombeau ouvert|tort (?:ou à raison|et à travers)|tour de (?:bras|rôle)|tous (?:crins|points de vue)|tout(?: (?:âge|bout de champ|crin|instant|jamais|le (?:moins|monde)|moment|point de vue|prix|un chacun)|e (?:allure|bride|épreuve|force|heure|vitesse|volée))|toutes (?:fins utiles|jambes)|tribord|un moment donné|usage interne|visage découvert|vive allure|voix (?:haute|basse)|vol d’oiseau|vrai dire|vue d’œil|y (?:regarder de plus près|réfléchir)) @@0
+ (a) (?:califourchon|contre(?:cœur|temps)|côté d(?:e|’\w[\w-]+)|demi-mot|nouveau|présent|rebrousse-poil|regret|travers|tout-va|l’(?:heure (?:actuelle|qu il est)|accoutumée|amiable|avance|aven(?:ir|ant)|air libre|aveuglette|emporte-pièce|évidence|exclusion de toute autre chose|improviste|inverse|ordre du jour|œil nu|en croire|un(?:animité| (?:d’entre eux|des leurs)|e (?:d’entre elles|des leurs)))|la (?:bonne franquette|con|dér(?:ive|obée)|diable|fois|limite du supportable|lumière de tout ce(?:ci|la)|mords-moi-le-nœud|papa|petite semaine|pointe du progrès|queue leu leu|rescousse|sauvette|surprise générale|virgule près|volée)|partir (?:de (?:demain|là|maintenant|rien)|d’(?:aujourd’hui|hier|ici))|au(?:cun prix|trui|tre chose)|bas co[ûu]t|bâ(?:bord|tons rompus)|beaucoup près|belles dents|bien (?:des égards|y (?:penser|réfléchir|songer))|bon (?:compte|escient|droit)|bout (?:de (?:bras|souffle|forces?)|portant|touchant)|bras (?:ouverts|le corps)|brève échéance|but non lucratif|cause d(?:e (?:ça|[mt]oi|lui|[nv]ous)|’e(?:lles?|ux))|ce (?:compte-là|moment-là|titre)|cet (?:égard|instant(?: précis|))|cette (?:époque(?: de l’année|)|heure de la (?:journée|nuit))|chaque (?:fois|instant)|chaudes larmes|cœur (?:joie|ouvert|perdu)|ciel ouvert|contre-cœur|corps perdu|cou(?:p sûr|per le souffle|rt terme|rte (?:échéance|portée))|couilles rabattues|de nombreuses reprises|des kilomètres à la ronde|dose homéopathique|double (?:titre|tranchant)|durée limitée|en (?:juger par (?:[mts]on|[nv]otre|leur) expérience|perdre (?:haleine|la tête))|faible (?:allure|revenu)|feu et à sang|flanc de (?:colline|montagne)|fleur de peau|géométrie variable|grand(?:-peine|e échelle)|haut risque|hue et à dia|huis clos|intervalles (?:ir|)réguliers|juste (?:raison|titre)|long terme|longue(?: échéance| portée|ur (?:de (?:temps|journée))|d’année)|loyer modéré|main (?:armée|droite|gauche|levée)|maint(?:s égards|es reprises)|marche forcée|merveille|mi-(?:course|distance|temps)|mi(?:di|nuit)(?: pile|)|moindres frais|moyen(?: terme|ne échéance)|mots couverts|ne (?:jamais|pas|rien|guère)|n’en (?:pas douter|point douter|plus finir)|outrance|parler franc|part (?:entière|ça|ce(?:la|ci))|partir de là|part(?:ir de rien|s égales)|pas de (?:géant|loup|tortue|velours)|personne en danger|perte de vue|petit(?: feu|e (?:dose|échelle))|peu (?:de choses? |)près|pieds joints|pile ou face|plat(?: ventre|e couture)|plein(?: (?:régime|temps|nez)|s poumons)|plus (?:forte raison|d’un titre)|point nommé|portée de main|première vue|prix (?:cassé|modique)s?|proprement parler|qui (?:mieux mieux|que ce soit|de droit)|quelque distance|quelques exceptions près|ras bords?|rude épreuve|tel point|temps (?:plein|partiel|complet)|tête reposée|tire[ -]d’aile|titre (?:conservatoire|d’exemple|indicatif|informatif|grâcieux|personnel|posthume)|tombeau ouvert|tort (?:ou à raison|et à travers)|tour de (?:bras|rôle)|tous (?:crins|points de vue)|tout(?: (?:âge|bout de champ|crin|instant|jamais|le (?:moins|monde)|moment|point de vue|prix|un chacun)|e (?:allure|bride|épreuve|force|heure|vitesse|volée))|toutes (?:fins utiles|jambes)|tribord|un moment donné|usage interne|visage découvert|vive allure|voix (?:haute|basse)|vol d’oiseau|vrai dire|vue d’œil|y (?:regarder de plus près|réfléchir)) @@0
<<- not before(r"(?i)[ln]’$|(?> à # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0
__[s]/conf(conf_a_à_locutions3)__
(a) (?:confesse|mi(?:di|nuit)|r(?:allonge|eculons|enverse|isque)|tâtons|vélo|la (?:manque|ramasse|re(?:dresse|nverse))) @@0
<<- not before(r"(?i)(?:\bque? |[ln]’$|(?> *
__[i](p_à_côté_de)__ à côté (?:de (?:ça|lui|[mt]oi|[nv]ous)|d’(?:elles|eux))(?! et) <<- ~>> *
__[i](p_à_la_qqch)__ à la (?:bo(?:nne franquette|urre)|con|dér(?:ive|obée)|diable|fois|leur|limite du supportable|longue|lumière de tout ce(?:ci|la)|manque|mords-moi-le-nœud|papa|petite semaine|pointe du progrès|queue leu leu|ramasse|re(?:nverse|dresse|scousse)|sauvette|surprise générale|virgule près|volée) <<- ~>> *
__[i](p_à_heure)__ à \d\d? ?h(?: ?\d\d|)(?: (?:du (?:matin|soir)|de l’après-midi|ce (?:matin|soir)|cet après-midi|demain (?:matin|soir|après-midi)|)|) <<- ~>> *
__[i](p_à_loc_qqch1)__ à (?:califourchon|chacun|confesse|contre(?:cœur|temps)|demi-mot|foison|grand-peine|loisir|merveille|moitié|nouveau|outrance|peine|perpétuité|présent|raison|rallonge|rebrousse-poil|reculons|regret|renverse|risque|tâtons|tort|tout-va) <<- ~>> *
-__[i](p_à_loc_qqch2)__ à (?:au(?:cun prix|trui|tre chose)|bas (?:co[ûu]t|prix)|bâ(?:bord|tons rompus)|beaucoup près|belles dents|bien (?:des égards|pire|y (?:penser|réfléchir|songer))|bon (?:compte|escient|droit)|bout (?:de (?:bras|souffle|forces?)|nerfs|portant|touchant)|bras (?:ouverts|le corps)|brève échéance|but (?:non |)lucratif|cause d(?:e (?:ça|[mt]oi|lui|[nv]ous)|’e(?:lles?|ux))|ce (?:compte-là|moment-là|titre)|cet (?:égard|instant(?: précis|))|cette (?:date|époque(?: de l’année|)|heure de la (?:journée|nuit)|occasion)|chaque (?:fois|instant)|chaudes larmes|cœur (?:joie|ouvert|perdu)|ciel ouvert|contre-cœur|corps perdu|cou(?:p sûr|per le souffle|rt terme|rte (?:échéance|portée))|de (?:nombreuses|multiples) reprises|des kilomètres à la ronde|défaut d’autre chose|dose homéopathique|double (?:titre|tranchant)|durée limitée|en (?:juger par (?:[mts]on|[nv]otre|leur) expérience|perdre (?:haleine|la tête))|faible (?:allure|revenu)|feu et à sang|flanc de (?:colline|montagne)|fleur de peau|géométrie variable|grand(?:-peine|e échelle)|haut risque|hue et à dia|huis clos|intervalles (?:ir|)réguliers|juste (?:raison|titre)|long terme|longue(?: échéance| portée|ur (?:de (?:temps|journée))|d’année)|loyer modéré|main(?: (?:armée|droite|gauche|levée)|s nues)|maint(?:s égards|es reprises)|marche forcée|merveille|mi-(?:course|distance|temps)|mi(?:di|nuit)(?: pile|)|moindres frais|mots couverts|moyen(?: terme|ne échéance)|n’en (?:pas douter|point douter|plus finir)|outrance|parler franc|part (?:entière|ça|ce(?:la|ci))|partir de là|part(?:ir de rien|s égales)|pas de (?:géant|loup|tortue|velours)|personne en danger|perte de vue|petit(?: feu|e (?:dose|échelle))|peu (?:de (?:distance|choses près|frais)|près)|pieds joints|pile ou face|plat(?: ventre|e couture)|plein(?: (?:régime|temps|nez)|s poumons)|plus (?:forte raison|d’un titre)|point nommé|portée de (?:main|tir)|première vue|prix (?:cassé|modique)s?|proprement parler|qui (?:mieux mieux|que ce soit|de droit)|quelque(?: distance|s (?:exceptions|nuances) près)|ras bords?|rude épreuve|s’y méprendre|somme nulle|tel point|temps (?:plein|partiel|complet)|tête reposée|tire[ -]d’aile|titre (?:conservatoire|d’exemple|expérimental|indicatif|informatif|grâcieux|personnel|posthume)|tombeau ouvert|tort (?:ou à raison|et à travers)|tour de (?:bras|rôle)|tous (?:crins|points de vue)|toutes (?:fins utiles|jambes)|tribord|tu et à toi|un moment donné|usage interne|visage (?:découvert|humain)|vive allure|voix (?:haute|basse)|vol d’oiseau|vrai dire|vue d’œil|y (?:regarder de plus près|réfléchir)) <<- ~>> *
+__[i](p_à_loc_qqch2)__ à (?:au(?:cun prix|trui|tre chose)|bas (?:co[ûu]t|prix)|bâ(?:bord|tons rompus)|beaucoup près|belles dents|bien (?:des égards|pire|y (?:penser|réfléchir|songer))|bon (?:compte|escient|droit)|bout (?:de (?:bras|souffle|forces?)|nerfs|portant|touchant)|bras (?:ouverts|le corps)|brève échéance|but (?:non |)lucratif|cause d(?:e (?:ça|[mt]oi|lui|[nv]ous)|’e(?:lles?|ux))|ce (?:compte-là|moment-là|titre)|cet (?:égard|instant(?: précis|))|cette (?:date|époque(?: de l’année|)|heure de la (?:journée|nuit)|occasion)|chaque (?:fois|instant)|chaudes larmes|cœur (?:joie|ouvert|perdu)|ciel ouvert|contre-cœur|corps perdu|cou(?:p sûr|per le souffle|rt terme|rte (?:échéance|portée))|couilles rabattues|de (?:nombreuses|multiples) reprises|des kilomètres à la ronde|défaut d’autre chose|dose homéopathique|double (?:titre|tranchant)|durée limitée|en (?:juger par (?:[mts]on|[nv]otre|leur) expérience|perdre (?:haleine|la tête))|faible (?:allure|revenu)|feu et à sang|flanc de (?:colline|montagne)|fleur de peau|géométrie variable|grand(?:-peine|e échelle)|haut risque|hue et à dia|huis clos|intervalles (?:ir|)réguliers|juste (?:raison|titre)|long terme|longue(?: échéance| portée|ur (?:de (?:temps|journée))|d’année)|loyer modéré|main(?: (?:armée|droite|gauche|levée)|s nues)|maint(?:s égards|es reprises)|marche forcée|merveille|mi-(?:course|distance|temps)|mi(?:di|nuit)(?: pile|)|moindres frais|mots couverts|moyen(?: terme|ne échéance)|n’en (?:pas douter|point douter|plus finir)|outrance|parler franc|part (?:entière|ça|ce(?:la|ci))|partir de là|part(?:ir de rien|s égales)|pas de (?:géant|loup|tortue|velours)|personne en danger|perte de vue|petit(?: feu|e (?:dose|échelle))|peu (?:de (?:distance|choses près|frais)|près)|pieds joints|pile ou face|plat(?: ventre|e couture)|plein(?: (?:régime|temps|nez)|s poumons)|plus (?:forte raison|d’un titre)|point nommé|portée de (?:main|tir)|première vue|prix (?:cassé|modique)s?|proprement parler|qui (?:mieux mieux|que ce soit|de droit)|quelque(?: distance|s (?:exceptions|nuances) près)|ras bords?|rude épreuve|s’y méprendre|somme nulle|tel point|temps (?:plein|partiel|complet)|tête reposée|tire[ -]d’aile|titre (?:conservatoire|d’exemple|expérimental|indicatif|informatif|grâcieux|personnel|posthume)|tombeau ouvert|tort (?:ou à raison|et à travers)|tour de (?:bras|rôle)|tous (?:crins|points de vue)|toutes (?:fins utiles|jambes)|tribord|tu et à toi|un moment donné|usage interne|visage (?:découvert|humain)|vive allure|voix (?:haute|basse)|vol d’oiseau|vrai dire|vue d’œil|y (?:regarder de plus près|réfléchir)) <<- ~>> *
__[i](p_à_partir_de)__ à partir (?:de (?:demain(?: matin| midi| soir|)|là|maintenant|rien)|d’(?:aujourd’hui|hier(?: matin| midi| soir|)|ici)) <<- ~>> *
__[i](p_à_quelques_uns)__ à quelques-un(?:s d’entre (?:eux|nous|vous)|es d’entre (?:nous|vous|elles)) <<- ~>> *
__[i](p_à_tout_qqch)__ à tout(?: (?:âge|bout de champ|crin|instant|jamais|le (?:moins|monde)|moment|point de vue|prix|un chacun)|e (?:allure|bride|épreuve|force|heure(?: d(?:u jour|e la nuit)|)|vitesse|volée)) <<- ~>> *
__[i](p_à_l_qqch)__ à l’(?:heure (?:actuelle|qu il est)|accoutumée|amiable|avance|aven(?:ir(?: incertain)|ant)|air libre|aveuglette|emporte-pièce|échelle (?:nationale|mondiale|régionale|départementale|cantonale|locale|galactique|universelle)|évidence|exclusion de toute autre chose|improviste|inverse|occasion|ordre du jour|œil nu|en croire|un(?:animité| (?:d’entre eux|des leurs)|e (?:d’entre elles|des leurs))) <<- ~>> *
__[i](p_à_det_plur_qqch)__ à (?:[mts]es|[nv]os|leurs) (?:côtés|dépens|risques et périls|trousses) <<- ~>> *
@@ -4467,11 +4467,11 @@
__[i](p_du_même_ordre_coup)__ du même (?:ordre|coup) <<- ~>> *
__[i](p_en_nombre_années)__ en \d\d+(?: ans| années|) <<- ~>> *
__[i](p_en_cours)__ en cours(?! d[e’]) <<- ~>> *
__[i](p_en_pronom)__ en (?:[mt]oi|eux|elles?) <<- ~>> *
__[i](p_en_qqch1)__ en (?:aparté|apparence|arrière|avance|avant|cachette|ceci|cela|clair|commun|conséquence|continu|contrepartie|définitive|détail|direct|douce|effet|émoi|filigrane|général|goguette|hâte|majorité|outre|pâmoison|parallèle|partie|particulier|permanence|personne|pratique|prime|privé|principe|priorité|public|réalité|retour|revanche|rien|rogne|route|secret|silence|somme|suspens|théorie|trompe-l’œil|vain|vérité|ville|vitesse) <<- ~>> *
-__[i](p_en_qqch2)__ en (?:aucun(?: cas|e (?:circonstance|façon|manière))|bon(?: état|ne (?:compagnie|et due forme|posture|santé(?: physique| mentale|)|voie))|bout de course|cas d(?:e (?:besoin|doute)|’urgence)|chacune? d(?:e [nv]ous|’(?:eux|elles))|chair et en os|chute libre|comparution immédiate|connaissance de cause|coupe réglée|cours de route|d’autres (?:circonstances|termes|temps)|de telles circonstances|début d(?:e (?:journée|matinée|soirée)|’après-midi)|définitive|dehors de (?:tout|)(?:ça|cela|ceci)|dents de scie|dernier (?:lieu|recours|ressort)|désespoir de cause|détention provisoire|direction d(?:u (?:nord|sud)(?:-est|-ouest|)|e l’(?:est|ouest))|état (?:de (?:choc(?: circulatoire|)|marche)|d’ébriété(?: avancée|))|excellent état|file indienne|fin d(?:e (?:compte|journée|matinée|soirée)|’après-midi)|forte (?:baisse|hausse)|garde à vue(?: prolongée|)|grand(?: nombre|e (?:difficulté|majorité|partie|pompe))|haut lieu|l’occurrence|lieu sûr|ligne de (?:compte|mire)|mains propres|mauvais(?: état|e (?:posture|santé))|même temps|milieu d(?:e (?:journée|matinée|soirée)|’après-midi)|nombre (?:plus que |)suffisant|partant de zéro|plein(?: air| cœur| jour|e (?:gueule|figure|forme|nuit))|perte de vitesse|peu de temps|piteux état|point de mire|position de force|premi(?:er lieu|ère (?:instance|ligne))|pure perte|quantité (?:plus que |)suffisante|quelque sorte|queue de peloton|rangs serrés|rase campagne|règle générale|roue libre|sens inverse|si peu de temps|sous-main|tête à tête|temps (?:et en heure|normal|opportun|ordinaire|utile|voulu)|termes choisis|toile de fond|tous (?:les cas|sens)|tout (?:bien tout honneur|cas|genre|lieu|et pour tout|état de cause|premier lieu|sens|temps)|toute(?: (?:bonne foi|circonstance|connaissance de cause|confiance|discrétion|franchise|hâte|impartialité|impunité|innocence|légalité|liberté|logique|sécurité|simplicité)|s circonstances)|un (?:clin d’œil|rien de temps)|une autre occasion|vase clos|voie de développement|y réfléchissant bien) <<- ~>> *
+__[i](p_en_qqch2)__ en (?:aucun(?: cas|e (?:circonstance|façon|manière))|bon(?: état|ne (?:compagnie|et due forme|posture|santé(?: physique| mentale|)|voie))|bout de course|cas d(?:e (?:besoin|doute)|’urgence)|chacune? d(?:e [nv]ous|’(?:eux|elles))|chair et en os|chute libre|comparution immédiate|connaissance de cause|coupe réglée|cours de route|d’autres (?:circonstances|termes|temps)|de telles circonstances|début d(?:e (?:journée|matinée|soirée)|’après-midi)|définitive|dehors de (?:tout|)(?:ça|cela|ceci)|dents de scie|dernier (?:lieu|recours|ressort)|désespoir de cause|détention provisoire|direction d(?:u (?:nord|sud)(?:-est|-ouest|)|e l’(?:est|ouest))|état (?:de (?:choc(?: circulatoire|)|marche)|d’ébriété(?: avancée|))|excellent état|file indienne|fin d(?:e (?:compte|journée|matinée|soirée)|’après-midi)|forte (?:baisse|hausse)|garde à vue(?: prolongée|)|grand(?: nombre|e (?:difficulté|majorité|partie|pompe))|haut lieu|l’occurrence|lieu sûr|ligne de (?:compte|mire)|mains propres|mauvais(?: état|e (?:posture|santé))|même temps|milieu d(?:e (?:journée|matinée|soirée)|’après-midi)|nombre (?:plus que |)suffisant|partant de zéro|plein(?: air| cœur| jour|e (?:gueule|figure|forme|poire|nuit|tronche))|perte de vitesse|peu de temps|piteux état|point de mire|position de force|premi(?:er lieu|ère (?:instance|ligne))|pure perte|quantité (?:plus que |)suffisante|quelque sorte|queue de peloton|rangs serrés|rase campagne|règle générale|roue libre|sens inverse|si peu de temps|sous-main|tête à tête|temps (?:et en heure|normal|opportun|ordinaire|utile|voulu)|termes choisis|toile de fond|tous (?:les cas|sens)|tout (?:bien tout honneur|cas|genre|lieu|et pour tout|état de cause|premier lieu|sens|temps)|toute(?: (?:bonne foi|circonstance|connaissance de cause|confiance|discrétion|franchise|hâte|impartialité|impunité|innocence|légalité|liberté|logique|sécurité|simplicité)|s circonstances)|un (?:clin d’œil|rien de temps)|une autre occasion|vase clos|voie de développement|y réfléchissant bien) <<- ~>> *
__[i](p_en_mois_dernier)__ en (?:janvier|février|mars|avril|mai|jui(?:n|llet)|ao[ûu]t|septembre|octobre|novembre|décembre) dernier <<- ~>> *
__[i](p_en_dat_mas_qqch)__ en (?:[mts]on|leur|[nv]otre) (?:âme et conscience|for intérieur|nom propre) <<- ~>> *
__[i](p_en_ce_qqch)__ en ce(?: (?:moment|temps-là|qui (?:[mt]e|l(?:es?|a)|[nv]ous) concern(?:e|ait))|t instant) <<- ~>> *
__[i](p_encore_qqch)__ encore (?:une fois|et (?:encore|toujours)) <<- ~>> *
__[i](p_envers_qqch)__ envers (?:autrui|et contre tout|les uns et les autres|tout le monde) <<- ~>> *
@@ -4729,10 +4729,11 @@
__[i](p_salle)__ salles? (à manger|d’attente|de (?:bains?|conférence)) @@$ <<- ~1>> *
__[i](p_sain_de_corps)__ saine?s? (d(?:e corps et d|)’esprit) @@$ <<- ~1>> *
__[i](p_sclérose_en_plaques)__ scléroses? (en plaques) @@$ <<- ~1>> *
__[i](p_sembler_paraitre_être)__ (sembl\w+|par[au]\w+) +(être|avoir été) +({w_2}) @@0,w,$ <<- morph(\1, ">(?:sembler|para[îi]tre) ") and morphex(\3, ":A", ":G") ~2>> *
__[i](p_silo)__ silos? (à (?:grains?|blé)) @@$ <<- ~1>> *
+__[i](p_soue_à_cochons)__ soues? (à cochons?) @@$ <<- ~1>> *
__[u](p_système)__ systèmes? (d’exploitation|D) @@$ <<- ~1>> *
__[i](p_taille)__ taille (\d+) @@$ <<- ~1>> *
__[i](p_taux_de_qqch)__ taux (d’(?:abstention|absorption|alcool|alphabétisation|endettement|inflation|intérêt|imposition|occupation|ouverture|œstrogène|urée|usure)|de (?:change|cholest[ée]rol|glycémie|fécondité|participation|testostérone|TVA)) @@$ <<- ~1>> *
__[i](p_tête_de_déterré)__ têtes? (de déterrée?s?) @@$ <<- ~1>> *
__[i](p_tenir_compte)__ (t[eiî]\w+) +(compte) d(?:es?|u) @@0,w <<- morph(\1, ">tenir ", False) ~2>> *
ADDED gc_lang/fr/tb/skin/Algoo_logo.png
Index: gc_lang/fr/tb/skin/Algoo_logo.png
==================================================================
--- /dev/null
+++ gc_lang/fr/tb/skin/Algoo_logo.png
cannot compute difference between binary files
ADDED gc_lang/fr/webext/README.md
Index: gc_lang/fr/webext/README.md
==================================================================
--- /dev/null
+++ gc_lang/fr/webext/README.md
@@ -0,0 +1,22 @@
+# Grammalecte
+
+**French Grammar Checker**
+
+écrit en JavaScript ES6/ES7
+par Olivier R.
+
+## Fonctionnalités ##
+
+* correcteur grammatical
+* conjugueur
+* formateur de texte
+* lexicographe
+
+## Site web ##
+
+https://grammalecte.net
+
+## Licence ##
+
+GNU GPL 3.0+
+http://www.gnu.org/copyleft/gpl.html
ADDED gc_lang/fr/webext/content_scripts/modify_page.js
Index: gc_lang/fr/webext/content_scripts/modify_page.js
==================================================================
--- /dev/null
+++ gc_lang/fr/webext/content_scripts/modify_page.js
@@ -0,0 +1,28 @@
+import { echo } from "../mymodule";
+
+echo("CONTENT SCRIPRT!!!");
+
+function handleMessage2 (oRequest, xSender, sendResponse) {
+ console.log(`[Content script] received: ${oRequest.content}`);
+ change(request.myparam);
+ //browser.runtime.onMessage.removeListener(handleMessage);
+ sendResponse({response: "response from content script"});
+}
+
+function removeEverything () {
+ while (document.body.firstChild) {
+ document.body.firstChild.remove();
+ }
+}
+
+function change (param) {
+ document.getElementById("title").setAttribute("background-color", "#809060");
+ console.log("param: " + param);
+ document.getElementById("title").setAttribute("background-color", "#FF0000");
+}
+
+
+/*
+ Assign do_something() as a listener for messages from the extension.
+*/
+browser.runtime.onMessage.addListener(handleMessage2);
ADDED gc_lang/fr/webext/gce_worker.js
Index: gc_lang/fr/webext/gce_worker.js
==================================================================
--- /dev/null
+++ gc_lang/fr/webext/gce_worker.js
@@ -0,0 +1,136 @@
+
+
+/*
+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);
+}*/
+
+
+let gce = null; // module: grammar checker engine
+let text = null;
+let tkz = null; // module: tokenizer
+let lxg = null; // module: lexicographer
+let helpers = null;
+
+let oTokenizer = null;
+let oDict = null;
+let oLxg = null;
+
+function loadGrammarChecker (sGCOptions="", sContext="JavaScript") {
+ if (gce === null) {
+ try {
+ gce = require("resource://grammalecte/fr/gc_engine.js");
+ helpers = require("resource://grammalecte/helpers.js");
+ text = require("resource://grammalecte/text.js");
+ tkz = require("resource://grammalecte/tokenizer.js");
+ lxg = require("resource://grammalecte/fr/lexicographe.js");
+ oTokenizer = new tkz.Tokenizer("fr");
+ helpers.setLogOutput(console.log);
+ gce.load(sContext);
+ oDict = gce.getDictionary();
+ oLxg = new lxg.Lexicographe(oDict);
+ if (sGCOptions !== "") {
+ gce.setOptions(helpers.objectToMap(JSON.parse(sGCOptions)));
+ }
+ // we always retrieve options from the gce, for setOptions filters obsolete options
+ return gce.getOptions()._toString();
+ }
+ catch (e) {
+ console.log("# Error: " + e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message);
+ }
+ }
+}
+
+function parse (sText, sLang, bDebug, bContext) {
+ let aGrammErr = gce.parse(sText, sLang, bDebug, bContext);
+ return JSON.stringify(aGrammErr);
+}
+
+function parseAndSpellcheck (sText, sLang, bDebug, bContext) {
+ let aGrammErr = gce.parse(sText, sLang, bDebug, bContext);
+ let aSpellErr = oTokenizer.getSpellingErrors(sText, oDict);
+ return JSON.stringify({ aGrammErr: aGrammErr, aSpellErr: aSpellErr });
+}
+
+function getOptions () {
+ return gce.getOptions()._toString();
+}
+
+function getDefaultOptions () {
+ return gce.getDefaultOptions()._toString();
+}
+
+function setOptions (sGCOptions) {
+ gce.setOptions(helpers.objectToMap(JSON.parse(sGCOptions)));
+ return gce.getOptions()._toString();
+}
+
+function setOption (sOptName, bValue) {
+ gce.setOptions(new Map([ [sOptName, bValue] ]));
+ return gce.getOptions()._toString();
+}
+
+function resetOptions () {
+ gce.resetOptions();
+ return gce.getOptions()._toString();
+}
+
+function fullTests (sGCOptions="") {
+ if (!gce || !oDict) {
+ return "# Error: grammar checker or dictionary not loaded."
+ }
+ let dMemoOptions = gce.getOptions();
+ if (sGCOptions) {
+ gce.setOptions(helpers.objectToMap(JSON.parse(sGCOptions)));
+ }
+ let tests = require("resource://grammalecte/tests.js");
+ let oTest = new tests.TestGrammarChecking(gce);
+ let sAllRes = "";
+ for (let sRes of oTest.testParse()) {
+ dump(sRes+"\n");
+ sAllRes += sRes+"\n";
+ }
+ gce.setOptions(dMemoOptions);
+ return sAllRes;
+}
+
+
+// Lexicographer
+
+function getListOfElements (sText) {
+ try {
+ let aElem = [];
+ let aRes = null;
+ for (let oToken of oTokenizer.genTokens(sText)) {
+ aRes = oLxg.getInfoForToken(oToken);
+ if (aRes) {
+ aElem.push(aRes);
+ }
+ }
+ return JSON.stringify(aElem);
+ }
+ catch (e) {
+ helpers.logerror(e);
+ }
+ return JSON.stringify([]);
+}
+
+
+function handleMessage (oRequest, xSender, sendResponse) {
+ console.log(`[background] received: ${oRequest.content}`);
+ sendResponse({response: "response from background script"});
+}
+
+browser.runtime.onMessage.addListener(handleMessage);
+
+
ADDED gc_lang/fr/webext/img/logo-16.png
Index: gc_lang/fr/webext/img/logo-16.png
==================================================================
--- /dev/null
+++ gc_lang/fr/webext/img/logo-16.png
cannot compute difference between binary files
ADDED gc_lang/fr/webext/img/logo-32.png
Index: gc_lang/fr/webext/img/logo-32.png
==================================================================
--- /dev/null
+++ gc_lang/fr/webext/img/logo-32.png
cannot compute difference between binary files
ADDED gc_lang/fr/webext/img/logo-48.png
Index: gc_lang/fr/webext/img/logo-48.png
==================================================================
--- /dev/null
+++ gc_lang/fr/webext/img/logo-48.png
cannot compute difference between binary files
ADDED gc_lang/fr/webext/img/logo-64.png
Index: gc_lang/fr/webext/img/logo-64.png
==================================================================
--- /dev/null
+++ gc_lang/fr/webext/img/logo-64.png
cannot compute difference between binary files
ADDED gc_lang/fr/webext/img/logo-96.png
Index: gc_lang/fr/webext/img/logo-96.png
==================================================================
--- /dev/null
+++ gc_lang/fr/webext/img/logo-96.png
cannot compute difference between binary files
ADDED gc_lang/fr/webext/manifest.json
Index: gc_lang/fr/webext/manifest.json
==================================================================
--- /dev/null
+++ gc_lang/fr/webext/manifest.json
@@ -0,0 +1,43 @@
+{
+ "manifest_version": 2,
+ "name": "Grammalecte [fr]",
+ "short_name": "Grammalecte [fr]",
+ "version": "0.6",
+
+ "applications": {
+ "gecko": {
+ "id": "French-GC@grammalecte.net",
+ "strict_min_version": "54.0"
+ }
+ },
+
+ "author": "Olivier R.",
+ "homepage_url": "https://grammalecte.net",
+ "offline_enabled": true,
+
+ "description": "Correcteur grammatical pour le français.",
+
+ "icons": { "16": "img/logo-16.png",
+ "32": "img/logo-32.png",
+ "48": "img/logo-48.png",
+ "64": "img/logo-64.png",
+ "96": "img/logo-96.png" },
+
+ "browser_action": {
+ "default_icon": "img/logo-32.png",
+ "default_popup": "panel/main.html",
+ "default_title": "Grammalecte [fr]",
+ "browser_style": false
+ },
+ "background": {
+ "scripts": ["require.js", "grammalecte/helpers.js", "gce_worker.js"]
+ },
+ "web_accessible_resources": [
+ "beasts/frog.jpg",
+ "beasts/turtle.jpg",
+ "beasts/snake.jpg"
+ ],
+ "permissions": [
+ "activeTab"
+ ]
+}
ADDED gc_lang/fr/webext/panel/main.css
Index: gc_lang/fr/webext/panel/main.css
==================================================================
--- /dev/null
+++ gc_lang/fr/webext/panel/main.css
@@ -0,0 +1,457 @@
+/*
+ flexbox:
+ https://css-tricks.com/snippets/css/a-guide-to-flexbox/
+*/
+
+
+/* reset */
+
+* { margin: 0; padding: 0; }
+img { border: none; }
+
+
+/* Selection */
+
+::-moz-selection {
+ background-color: hsl(210, 50%, 60%);
+ color: hsl(210, 20%, 100%);
+ text-shadow: 0 0 2px hsl(210, 80%, 20%);
+ border-radius: 2px;
+}
+::selection {
+ background-color: hsl(210, 50%, 60%);
+ color: hsl(210, 20%, 100%);
+ text-shadow: 0 0 2px hsl(210, 80%, 20%);
+ border-radius: 2px;
+}
+
+
+/* Generic classes */
+
+.fleft { float: left; }
+.fright { float: right; }
+
+.center { text-align: center; }
+.right { text-align: right; }
+.left { text-align: left; }
+.justify { text-align: justify; }
+
+.hidden { display: none; }
+.clearer { clear: both; font-size: 0; height: 0; }
+
+.red { background-color: hsl(0, 50%, 50%); color: hsl(0, 0%, 96%); }
+.red:hover { background-color: hsl(0, 60%, 40%); color: hsl(0, 0%, 100%); }
+.cyan { background-color: hsl(180, 50%, 50%); color: hsl(0, 0%, 96%); }
+.cyan:hover { background-color: hsl(180, 60%, 40%); color: hsl(0, 0%, 100%); }
+.green { background-color: hsl(120, 50%, 40%); color: hsl(120, 10%, 96%); }
+.green:hover { background-color: hsl(120, 60%, 30%); color: hsl(120, 10%, 96%); }
+.blue { background-color: hsl(210, 50%, 50%); color: hsl(210, 10%, 96%); }
+.blue:hover { background-color: hsl(210, 60%, 40%); color: hsl(210, 10%, 96%); }
+
+
+/* links */
+
+a:link, a:visited {
+ color: hsl(210, 70%, 40%);
+ /*text-decoration: none;*/
+}
+a:hover, a:active {
+ text-shadow: 0 0 2px hsl(210, 80%, 60%);
+}
+
+a.extlink:hover:after {
+ content: " >";
+}
+
+
+/* Main classes */
+
+html {
+ box-sizing: border-box;
+ width: 530px;
+ height: 880px;
+ font-family: "Trebuchet MS", "Liberation Sans", sans-serif;
+}
+body {
+ width: 530px;
+ height: 880px;
+}
+
+#main {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ align-items: stretch;
+ background-color: hsl(210, 0%, 100%);
+ min-height: 100%;
+}
+
+#left {
+ width: 54px;
+ background-color: hsl(210, 10%, 96%);
+ border-right: solid 1px hsl(210, 0%, 70%);
+ color: hsl(210, 10%, 96%);
+}
+#logo {
+ padding: 10px;
+}
+#left li {
+ padding: 10px 5px;
+ border-bottom: 1px solid hsl(210, 10%, 90%);
+ text-align: center;
+ cursor: pointer;
+ color: hsl(210, 10%, 50%);
+ list-style-type: none;
+}
+#left li:hover {
+ background-color: hsl(210, 10%, 92%);
+
+}
+
+#page {
+ background-color: hsl(210, 0%, 100%);
+}
+#page h1 {
+ margin: 0 0 10px 0;
+ color: hsl(210, 70%, 70%);
+ font: bold 30px 'Yanone Kaffeesatz', "Liberation Sans Narrow", sans-serif;
+}
+#page p {
+ margin: 10px 0 5px 0;
+}
+
+#home_page {
+ display: block;
+ padding: 20px;
+}
+
+#tf_page {
+ display: none;
+ padding: 20px;
+}
+#gc_page {
+ display: none;
+ padding: 20px 20px 30px 20px;
+}
+#gc_options_page {
+ display: none;
+ padding: 20px;
+}
+#sc_options_page {
+ display: none;
+ padding: 20px;
+}
+#lxg_page {
+ display: none;
+ padding: 20px;
+}
+
+
+/*
+ Conjugueur page
+*/
+
+#conj_page {
+ display: none;
+ padding: 10px;
+}
+
+#conj_page h2 {
+ margin: 5px 0 2px 0;
+ color: hsl(210, 50%, 50%);
+ font: bold 30px Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
+}
+#conj_page h3 {
+ margin: 5px 0 2px 0;
+ color: hsl(0, 50%, 50%);
+ font: bold 16px Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
+}
+#conj_page h4 {
+ margin: 5px 0 2px 0;
+ color: hsl(210, 50%, 50%);
+ font: bold 14px Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
+}
+
+#conj_page .colonne {
+ float: left;
+ width: 240px;
+}
+#conj_page .colsep {
+ float: left;
+ width: 20px;
+}
+
+#conj_page .colonne p {
+ font-size: 12px;
+}
+
+
+#conj_page input#verb {
+ display: inline-block;
+ width: 230px;
+ margin-left: 5px;
+ padding: 5px 10px;
+ border: 2px solid hsl(0, 0%, 80%);
+ border-radius: 3px;
+ height: 24px;
+ background: transparent;
+ font: normal 20px Tahoma, "Ubuntu Condensed";
+ color: hsl(0, 0%, 30%);
+}
+#conj_page input[placeholder]#verb {
+ color: hsl(0, 0%, 70%);
+}
+
+#conj_page a#conjugate {
+ display: inline-block;
+ padding: 7px 10px;
+ font-size: 20px;
+ background-color: hsl(0, 30%, 30%);
+ color: hsl(0, 30%, 60%);
+ border-radius: 3px;
+ text-transform: uppercase;
+ text-align: center;
+ text-decoration: none;
+}
+#conj_page a#conjugate:hover {
+ background-color: hsl(0, 60%, 40%);
+ color: hsl(0, 60%, 70%);
+ box-shadow: 0 0 2px hsl(0, 60%, 50%);
+}
+
+#conj_options {
+ margin: 10px 5px 0 5px;
+ font-size: 16px;
+ text-align: center;
+}
+
+#conj_smallnote {
+ float: right;
+ width: 190px;
+ margin: 15px 0 0 0;
+ padding: 0 5px;
+ font-size: 8.5px;
+ color: hsl(0, 0%, 60%);
+ text-align: center;
+}
+
+
+/*
+ Test page
+*/
+
+#test_page {
+ display: none;
+}
+#test_cmd {
+ padding: 15px;
+ background-color: hsl(0, 0%, 92%);
+ border-bottom: 1px solid hsl(0, 0%, 86%);
+}
+#test_cmd textarea {
+ width: 100%;
+ border: 2px solid hsl(0, 0%, 89%);
+ border-radius: 3px;
+ resize: vertical;
+}
+
+#test_results {
+ padding: 15px;
+ background-color: hsl(0, 0%, 96%);
+}
+
+#test_page .button {
+ display: inline-block;
+ padding: 5px 10px;
+ width: 120px;
+ border-radius: 3px;
+ font-size: 12px;
+ text-align: center;
+ cursor: pointer;
+}
+
+
+/*
+ Text formatter
+*/
+
+#tf_options {
+
+}
+
+#tf_options fieldset {
+ margin: 5px 0;
+ padding: 5px 10px 10px 10px;
+ background-color: hsl(0, 0%, 92%);
+ border-radius: 3px;
+}
+
+#tf_options legend {
+ font-size: 20px;
+ color: hsla(210, 20%, 50%, .8);
+ font-weight: bold;
+}
+#tf_options legend span {
+ display: none;
+}
+
+#tf_options fieldset h2 {
+ color: hsl(210, 80%, 40%);
+}
+
+#tf_options fieldset .blockopt {
+ padding: 2px 3px;
+ font-size: 12.5px;
+}
+#tf_options fieldset .underline:hover {
+ background-color: hsl(180, 10%, 86%);
+ border-radius: 2px;
+}
+
+#tf_options fieldset .option {
+ margin: 1px 3px 0 0;
+ float: left;
+}
+#tf_options legend .option {
+ margin: 7px 5px 0 3px;
+ float: left;
+}
+
+#tf_options fieldset .opt_lbl {
+ display: inline-block;
+ color: hsl(0, 0%, 20%);
+}
+
+
+#tf_options fieldset .largew {
+ width: 300px;
+}
+#tf_options fieldset .reducedw {
+ width: 200px;
+}
+#tf_options fieldset .smallw {
+ width: 90px;
+}
+
+#tf_options fieldset .secondoption {
+ display: inline-block;
+}
+
+#tf_options fieldset label span {
+ display: none;
+}
+
+#tf_options .groupblock {
+ opacity: 0.3;
+}
+
+#tf_options .inlineblock {
+ display: inline-block;
+}
+#tf_options .indent {
+ margin-left: 15px;
+}
+
+#tf_actions {
+ background-color: hsl(120, 10%, 92%);
+ padding: 15px;
+ border-top: 1px solid hsl(120, 20%, 86%);
+}
+
+#tf_options .button {
+ display: inline-block;
+ padding: 5px 10px;
+ width: 100px;
+ border-radius: 3px;
+ font-size: 16px;
+ font-weight: bold;
+ text-align: center;
+ cursor: pointer;
+}
+
+#tf_progressbarbox {
+ display: inline-block;
+ padding: 10px 20px;
+}
+
+
+/*
+ Other elements
+*/
+
+#movewindow {
+ position: fixed;
+ right: 0;
+ top: 50;
+ width: 16px;
+ margin-top: 60px;
+ z-index: 100;
+}
+#movewindow .arrow {
+ background-color: hsl(180, 60%, 50%);
+ cursor: pointer;
+ padding: 1px 3px;
+ font-size: 10px;
+ font-weight: bold;
+ text-align: center;
+ color: hsl(180, 50%, 90%);
+}
+#movewindow .arrow:hover {
+ background-color: hsl(180, 70%, 40%);
+ cursor: hsl(180, 50%, 96%);
+}
+
+#rightcorner {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+a.rightcornerbutton1 {
+ float: right;
+ padding: 2px 10px 5px 10px;
+ border-radius: 0 0 0 3px;
+ font-size: 18px;
+ text-decoration: none;
+}
+a.rightcornerbutton {
+ float: right;
+ padding: 2px 10px 5px 10px;
+ font-size: 18px;
+ text-decoration: none;
+}
+
+
+/*
+ CSS Spinner
+ Double bounce
+ http://tobiasahlin.com/spinkit/
+*/
+.spinner {
+ width: 40px;
+ height: 40px;
+ position: absolute;
+ top: 2px;
+ right: 120px;
+}
+.double-bounce1, .double-bounce2 {
+ width: 100%;
+ height: 100%;
+ border-radius: 50%;
+ background-color: hsl(180, 50%, 75%);
+ opacity: 0.6;
+ position: absolute;
+ top: 0;
+ left: 0;
+ animation: sk-bounce 2.0s infinite ease-in-out;
+}
+.double-bounce2 {
+ animation-delay: -1.0s;
+}
+
+@keyframes sk-bounce {
+ 0%, 100% {
+ transform: scale(0.0);
+ } 50% {
+ transform: scale(1.0);
+ }
+}
ADDED gc_lang/fr/webext/panel/main.html
Index: gc_lang/fr/webext/panel/main.html
==================================================================
--- /dev/null
+++ gc_lang/fr/webext/panel/main.html
@@ -0,0 +1,495 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CORRECTEUR GRAMMATICAL
+
+
+
+
+ OPTIONS GRAMMATICALES
+
+
+
+ OPTIONS ORTHOGRAPHIQUES
+
+
+
+
+
+
+
TESTS
+
+
Tests complets
Analyser
+
+
+
+
+
+
+ CONJUGUEUR
+
+
+ Conjuguer
+
+
+
+
+ Ce verbe n’a pas encore été vérifié. C’est pourquoi les options “pronominal” et “temps composés” sont désactivées.
+
+
+ ·
+ ·
+
+ ·
+
+
+
+
+
+
+
+
+
+
Impératif
+
Présent
+
+
+
+
+
+
+
+
+
+
+
+
Participes passés
+
+
+
+
+
+
+
+
+
+
+
+
+
Indicatif
+
+
+
Imparfait
+
+
+
+
+
+
+
+
+
Passé simple
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Subjonctif
+
+
+
Imparfait
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FORMATEUR DE TEXTE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Par défaut
+
Appliquer
+
+
+
+
+
+
+
+
+
+
+
+
+
ADDED gc_lang/fr/webext/panel/main.js
Index: gc_lang/fr/webext/panel/main.js
==================================================================
--- /dev/null
+++ gc_lang/fr/webext/panel/main.js
@@ -0,0 +1,70 @@
+
+function showError (e) {
+ console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message);
+}
+
+function beastNameToURL(beastName) {
+ switch (beastName) {
+ case "Frog":
+ return browser.extension.getURL("beasts/frog.jpg");
+ case "Snake":
+ return browser.extension.getURL("beasts/snake.jpg");
+ case "Turtle":
+ return browser.extension.getURL("beasts/turtle.jpg");
+ }
+}
+
+window.addEventListener(
+ "click",
+ function (xEvent) {
+ let xElem = xEvent.target;
+ if (xElem.id) {
+ if (xElem.id) {
+
+ }
+ } else if (xElem.className === "select") {
+ showPage(xElem.dataset.page);
+ } else if (xElem.tagName === "A") {
+ openURL(xElem.getAttribute("href"));
+ }
+ },
+ false
+);
+
+function showPage (sPageName) {
+ try {
+ // hide them all
+ for (let xNodePage of document.getElementsByClassName("page")) {
+ xNodePage.style.display = "None";
+ }
+ // show the one
+ document.getElementById(sPageName).style.display = "block";
+ sendMessage("Mon message");
+ // specific modifications
+ if (sPageName === "conj_page") {
+ document.body.style.width = "600px";
+ document.documentElement.style.width = "600px";
+ document.getElementById("movewindow").style.display = "none";
+ } else {
+ document.body.style.width = "530px";
+ document.documentElement.style.width = "530px";
+ document.getElementById("movewindow").style.display = "block";
+ }
+ }
+ catch (e) {
+ showError(e);
+ }
+}
+
+function handleResponse(message) {
+ console.log(`[Panel] received: ${message.response}`);
+}
+
+function handleError(error) {
+ console.log(`[Panel] Error: ${error}`);
+}
+
+function sendMessage (sMessage) {
+ let sending = browser.runtime.sendMessage({content: sMessage});
+ sending.then(handleResponse, handleError);
+}
Index: gc_lang/fr/xpi/data/gc_panel.html
==================================================================
--- gc_lang/fr/xpi/data/gc_panel.html
+++ gc_lang/fr/xpi/data/gc_panel.html
@@ -2,19 +2,10 @@
-
×
−
ADDED gc_lang/fr/xpi/data/img/Algoo_logo.png
Index: gc_lang/fr/xpi/data/img/Algoo_logo.png
==================================================================
--- /dev/null
+++ gc_lang/fr/xpi/data/img/Algoo_logo.png
cannot compute difference between binary files
Index: make.py
==================================================================
--- make.py
+++ make.py
@@ -286,10 +286,11 @@
xParser.add_argument("-t", "--tests", help="run unit tests", action="store_true")
xParser.add_argument("-p", "--perf", help="run performance tests", action="store_true")
xParser.add_argument("-pm", "--perf_memo", help="run performance tests and store results in perf_memo.txt", action="store_true")
xParser.add_argument("-js", "--javascript", help="JavaScript build for Firefox", action="store_true")
xParser.add_argument("-fx", "--firefox", help="Launch Firefox Nightly for XPI testing", action="store_true")
+ xParser.add_argument("-we", "--web_ext", help="Launch Firefox Nightly for WebExtension testing", action="store_true")
xParser.add_argument("-tb", "--thunderbird", help="Launch Thunderbird", action="store_true")
xParser.add_argument("-i", "--install", help="install the extension in Writer (path of unopkg must be set in config.ini)", action="store_true")
xArgs = xParser.parse_args()
if xArgs.build_data:
@@ -349,14 +350,18 @@
# Firefox
if xArgs.firefox:
with helpers.cd("_build/xpi/"+sLang):
os.system("jpm run -b nightly")
+ if xArgs.web_ext:
+ with helpers.cd("_build/webext/"+sLang):
+ os.system(r'web-ext run --firefox="' + dVars['fx_beta_path'] + '" --browser-console')
+
# Thunderbird
if xArgs.thunderbird:
os.system("thunderbird -jsconsole -P debug")
else:
print("Folder not found: gc_lang/"+sLang)
if __name__ == '__main__':
main()