Changes In Branch tbnext
Through [8705474045]
Excluding Merge-Ins
This is equivalent to a diff from
94e2e47aea
to 8705474045
Modified gc_lang/fr/build.py
from [9ca6336e46]
to [a54b2ffcfb].
| ︙ |  |  | 
| 
89
90
91
92
93
94
95
96
97
98
99
100
101
102
 | 
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
 | 
+
+
 | 
    for sp in os.listdir(spDict):
        if os.path.isdir(spDict+"/"+sp):
            hZip.write(spDict+"/"+sp+"/"+sp+".dic", "content/dictionaries/"+sp+"/"+sp+".dic")
            hZip.write(spDict+"/"+sp+"/"+sp+".aff", "content/dictionaries/"+sp+"/"+sp+".aff")
    hZip.close()
    spfDebugProfile = dVars['win_tb_debug_extension_path']  if platform.system() == "Windows"  else dVars['linux_tb_debug_extension_path']
    helpers.unzip(spfZip, spfDebugProfile)
    spfBetaProfile = dVars['win_tb_beta_extension_path']  if platform.system() == "Windows"  else dVars['linux_tb_beta_extension_path']
    helpers.unzip(spfZip, spfBetaProfile)
def _createOptionsForThunderbird (dVars):
    dVars['sXULTabs'] = ""
    dVars['sXULTabPanels'] = ""
    # dialog options
    for sSection, lOpt in dVars['lStructOpt']:
 | 
| ︙ |  |  | 
Modified gc_lang/fr/config.ini
from [eb081b50e5]
to [5bcacb50e3].
| ︙ |  |  | 
| 
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 | 
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 | 
+
+
+
+
+
+
+
 | 
win_fx_nightly_path = C:\Program Files\Nightly\firefox.exe
linux_fx_dev_path = /usr/bin/firefox
linux_fx_nightly_path = /usr/bin/firefox
# Thunderbird
tb_identifier = French-GC-TB@grammalecte.net
tb_name = Grammalecte [fr]
win_tb_path = C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe
#win_tb_beta_path = C:\Program Files (x86)\Mozilla Thunderbird (Beta)\thunderbird.exe
win_tb_beta_path = C:\Program Files\Thunderbird Daily\thunderbird.exe
linux_tb_path = /usr/bin/thunderbird
linux_tb_beta_path = /usr/bin/thunderbird
win_tb_debug_extension_path = D:\_temp\tb-debug.profile\extensions\French-GC-TB@grammalecte.net
linux_tb_debug_extension_path = ~/tb-debug.profile/extensions/French-GC-TB@grammalecte.net
win_tb_beta_extension_path = D:\_temp\tb-beta.profile\extensions\French-GC-TB@grammalecte.net
linux_tb_beta_extension_path = ~/tb-beta.profile/extensions/French-GC-TB@grammalecte.net
# Set Thunderbird folder in your PATH variable
# Create a local profile:
#     	thunderbird -CreateProfile "debug _build\tb-debug.profile"
# Or you can use the GUI with:
#	 	thunderbird -P
# To launch Thunderbird with the profile debug, type:
#     	thunderbird -P debug
 | 
| ︙ |  |  | 
Modified gc_lang/fr/tb/chrome.manifest
from [39608040f5]
to [a8f859a2c4].
| 
1
2
3
4
5
6
7
8
9
 | 
1
2
3
4
5
6
7
8
9
 | 
-
+
 | 
# https://developer.mozilla.org/en-US/docs/Chrome_Registration
content	grammarchecker	content/
content promiseworker ./worker/
resource grammalecte ./grammalecte-js/
locale	grammarchecker	fr	locale/fr/
locale	grammarchecker	en	locale/en/
skin	grammarchecker	classic/1.0	skin/
overlay	chrome://messenger/content/messengercompose/messengercompose.xul	chrome://grammarchecker/content/overlay.xul
style	chrome://gstyle	chrome://messenger/content/customizeToolbar.xul	chrome://grammarchecker/content/overlay.csslobal/content/customizeToolbar.xul	chrome://grammarchecker/content/overlay.css | 
Modified gc_lang/fr/tb/content/about.css
from [d621de3251]
to [0c03b7bf9e].
| ︙ |  |  | 
| 
21
22
23
24
25
26
27
 | 
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 | 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 | 
#contrib {
	font-size: 16px;
	text-align: center;
	color: hsl(210, 50%, 50%);
	cursor: pointer;
}
/*
    TB Next: fix dialogheaders
*/
dialogheader {
  -moz-binding: url("chrome://messenger/content/generalBindings.xml#dialogheader");
  margin: 0 5px 5px;
  border: 1px solid ThreeDDarkShadow;
  padding: 5px 8px;
  background-color: Highlight;
  color: HighlightText;
}
.dialogheader-title {
  margin: 0 !important;
  font-size: larger;
  font-weight: bold;
}
 | 
Modified gc_lang/fr/tb/content/about.js
from [2bc9ad5ee7]
to [c5c1006b2d].
| 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | 
1
2
3
4
5
6
7
8
9
10
11
12
 | 
-
-
-
-
-
 | 
// JavaScript
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
function openInBrowserURL (sURL) {
    // method found in S3.Google.Translator
    try {
        openURL(sURL);
        // Works in overlay.js, but not here… Seems there is no documentation available about this feature on Mozilla.org//const { require } = Cu.import("resource://gre/modules/commonjs/toolkit/require.js", {});function echo (...args) {    Services.console.logStringMessage(args.join(" -- ") + "\n");} | 
| ︙ |  |  | 
Modified gc_lang/fr/tb/content/about.xul
from [fc21852913]
to [9407ba6c78].
| ︙ |  |  | 
| 
30
31
32
33
34
35
36
37
38 | 
30
31
32
33
34
35
36
37
38
 | 
-
+
 | 
    onclick="openInTabURL('http://lamouette.org/?from=grammalecte-tb');" />
  <label class="stdlabel" value="&" />
  <image src="chrome://grammarchecker/skin/Algoo_logo.png" style="cursor: pointer;"
    onclick="openInTabURL('https://www.algoo.fr/?from=grammalecte-tb');" />
  <label id="contrib" value="&contrib;"
    onclick="openInTabURL('https://www.dicollecte.org/#thanks');" />
  <script type="application/<script type="application/javascript" src="about.js"/>
</dialog>x-javascript" src="about.js"/> | 
Modified gc_lang/fr/tb/content/conjugueur.css
from [0ecfe596a1]
to [f9d44fa63b].
| ︙ |  |  | 
| 
37
38
39
40
41
42
43
 | 
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 | 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 | 
	color: hsl(210, 50%, 50%);
	font-size: 13px;
	font-weight: bold;
}
label.cj {
	font-size: 11px;
}
/*
    TB Next: fix dialogheaders
*/
dialogheader {
  -moz-binding: url("chrome://messenger/content/generalBindings.xml#dialogheader");
  margin: 0 5px 5px;
  border: 1px solid ThreeDDarkShadow;
  padding: 5px 8px;
  background-color: Highlight;
  color: HighlightText;
}
.dialogheader-title {
  margin: 0 !important;
  font-size: larger;
  font-weight: bold;
}
 | 
Modified gc_lang/fr/tb/content/conjugueur.js
from [52fcb1616a]
to [e2b39bc09c].
| 
1
2
3
4
5
6
7
8
9
10
11
12
13
1415
16
1718
19
20
2122
23
24
2526
27
2829
30
3132
33
3435
36
3738
39
40
41
42
43
44
45
46 | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 | 
-
-
+
+
-
-
-
-
-
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
 | 
// JavaScript
const Cu = Components.utils;
const { require } = Cu.import("resource://gre/modules/commonjs/toolkit/require.js", {});
const conj = require("resource://grammalecte/fr/conj.js");
//const { require } = Cu.import("resource://gre/modules/commonjs/toolkit/require.js", {});
//const conj = require("resource://grammalecte/fr/conj.js");let oConj = {
    init: function () {function echo (...args) {    Services.console.logStringMessage(args.join(" -- ") + "\n");}        let console.log("Init conjugueur");
        try {
            // buttonthat = this;            document.getElementById('conjugate').addEventListener("click", document.getElementById('conjugate').addEventListener("click", (xEvent) => {
                this.getVerbAndConjugate();
            });
            // text fieldfunction (event) {
                that.getVerbAndConjugate();            document.getElementById('verb').addEventListener("change", document.getElementById('verb').addEventListener("change", (xEvent) => {
                this.getVerbAndConjugate();
            });
            // optionsfunction (event) {
                that.getVerbAndConjugate();            document.getElementById('oneg').addEventListener("click", document.getElementById('oneg').addEventListener("click", (xEvent) => {
                this._displayResults();
            });function (event) {
                that._displayResults();            document.getElementById('opro').addEventListener("click", document.getElementById('opro').addEventListener("click", (xEvent) => {
                this._displayResults();
            });function (event) {
                that._displayResults();            document.getElementById('oint').addEventListener("click", document.getElementById('oint').addEventListener("click", (xEvent) => {
                this._displayResults();
            });function (event) {
                that._displayResults();            document.getElementById('ofem').addEventListener("click", document.getElementById('ofem').addEventListener("click", (xEvent) => {
                this._displayResults();
            });function (event) {
                that._displayResults();            document.getElementById('otco').addEventListener("click", document.getElementById('otco').addEventListener("click", (xEvent) => {
                this._displayResults();
            });
        }
        catch (e) {
            Cu.reportError(e);
        }
        this.conjugate("être");
    },function (event) {
                that._displayResults(); | 
| ︙ |  |  | 
| 
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 | 
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 | 
-
+
 | 
                if (!conj.isVerb(sVerb)) {
                    document.getElementById('verb').style = "color: #BB4411;";
                } else {
                    document.getElementById('verb_title').textContent = sVerb;
                    document.getElementById('verb').style = "color: #999999;";
                    document.getElementById('verb').value = "";
                    this.oVerb = new this.oVerb = new Verb(sVerb);
                    let sRawInfo = this.oVerb._sRawInfo;
                    document.getElementById('info').textContent = this.oVerb.sInfo;
                    document.getElementById('opro').textContent = "pronominal";
                    if (sRawInfo.endsWith("zz")) {
                        document.getElementById('opro').checked = false;
                        document.getElementById('opro').disabled = true;
                        document.getElementById('opro').style = "color: #CCC;";conj.Verb(sVerb); | 
| ︙ |  |  | 
| 
269
270
271
272
273
274
275
276
277
 | 
264
265
266
267
268
269
270
271
272
 | 
+
-
 | 
        }
        catch (e) {
            Cu.reportError(e);
        }
    }
};
conj.init(helpers.loadFile("resource://grammalecte/fr/conj_data.json"));
oConj.init();
 | 
Modified gc_lang/fr/tb/content/conjugueur.xul
from [ee8b63b554]
to [a9e15bac00].
| ︙ |  |  | 
| 
150
151
152
153
154
155
156
157
158 | 
150
151
152
153
154
155
156
157
158
159
160
 | 
+
+
-
+
 | 
        <label id="condb4" class="cj">.</label>
        <label id="condb5" class="cj">.</label>
        <label id="condb6" class="cj">.</label>
      </groupbox>
    </column>
  </columns>
  <script type="application/javascript" src="resource://grammalecte/graphspell/helpers.js"/>
  <script type="application/javascript" src="resource://grammalecte/fr/conj.js"/>
  <script type="application/<script type="application/javascript" src="conjugueur.js"/>
</dialog>x-javascript" src="conjugueur.js"/> | 
Modified gc_lang/fr/tb/content/editor.js
from [71421bf6bc]
to [8eea7833f2].
| ︙ |  |  | 
| 
17
18
19
20
21
22
23
24
25
26
2728
29
30
31
32
33
34
35 | 
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 | 
-
-
 | 
        }
    };
    * _getParsableNodes (xRootNode=this.xEditor.rootElement) {
        // recursive function
        try {
            for (let xNode of xRootNode.childNodes) {
if (xNode.className !== "moz-cite-prefix" && xNode.tagName !== "BLOCKQUOTE"
                    && (xNode.nodeType == Node.TEXT_NODE || (xNode.nodeType == Node.ELEMENT_NODE && !xNode.textContent.startsWith(">")))
                    && xNode.textContent !== "") {                //echo("tag: " + xNode.tagName);if (xNode.tagName === undefined) {
                        if (!prefs.getBoolPref("bCheckSignature") && xNode.textContent.startsWith("-- ")) {
                            break;
                        }
                        yield xNode;
                    } else if (this.lParsableNodes.includes(xNode.tagName)) {
                        yield xNode;                    //echo("<"+xNode.tagName+">["+xNode.textContent+"]"); | 
| ︙ |  |  | 
Modified gc_lang/fr/tb/content/gc_options.css
from [6199209734]
to [df2e253402].
| 
1
2
3
4
5
6
7
 | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 | 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 | 
/* CSS */
.section {
	font-size: 16px;
	font-weight: bold;
	color: hsl(210, 50%, 50%);
}
/*
    TB Next: fix dialogheaders
*/
dialogheader {
  -moz-binding: url("chrome://messenger/content/generalBindings.xml#dialogheader");
  margin: 0 5px 5px;
  border: 1px solid ThreeDDarkShadow;
  padding: 5px 8px;
  background-color: Highlight;
  color: HighlightText;
}
.dialogheader-title {
  margin: 0 !important;
  font-size: larger;
  font-weight: bold;
}
 | 
Modified gc_lang/fr/tb/content/gc_options.js
from [f85fde1089]
to [aee78a8d90].
| 
1
2
3
4
5
6
7
89
10
11
12
13
14
15
16
17
18
19
2021
22
2324
25
26
27
28
29
30
31
32
33
34
35
36
37
38
3940
41
42
43
44
45
46
47
48
49
50
51 | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 | 
-
-
-
-
-
-
-
 | 
// JavaScript
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
const prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).getBranch("extensions.grammarchecker.");
//const { require } = Cu.import("resource://gre/modules/commonjs/toolkit/require.js", {});var oOptControl = {
    oOptions: null,
    load: function () {
        this._setDialogOptions(false);
    },
    _setDialogOptions: function (bDefaultOptions=false) {
        try {
            sOptions = bDefaultOptions ? prefs.getCharPref("sGCDefaultOptions") : prefs.getCharPref("sGCOptions");function echo (...args) {    Services.console.logStringMessage(args.join(" -- ") + "\n");}this.oOptions = JSON.parse(sOptions);
            for (let sParam in this.oOptions) {            //echo(">> " + sOptions);if (document.getElementById("option_"+sParam) !== null) {
                    document.getElementById("option_"+sParam).checked = this.oOptions[sParam];
                }
            }
        }
        catch (e) {
            Cu.reportError(e);
        }
    },
    save: function () {
        try {
            for (let xNode of document.getElementsByClassName("option")) {
                this.oOptions[xNode.id.slice(7)] = xNode.checked;
            }
            prefs.setCharPref("sGCOptions", JSON.stringify(this.oOptions));                //echo(sParam + ":" + oOptions[sParam]);}
        catch (e) {
            Cu.reportError(e);
        }
    },
    reset: function () {
        this._setDialogOptions(true);
    }
}
oOptControl.load();            //echo("<< " + JSON.stringify(this.oOptions)); | 
Modified gc_lang/fr/tb/content/gc_options.xul
from [8e6b4a963d]
to [65926a1200].
| ︙ |  |  | 
| 
27
28
29
30
31
32
33
34
35
36 | 
27
28
29
30
31
32
33
34
35
36
 | 
-
+
 | 
${sXULTabs}
    </tabs>
    <tabpanels>
${sXULTabPanels}
    </tabpanels>
  </tabbox>
  <script type="application/<script type="application/javascript" src="gc_options.js" />
</dialog>x-javascript" src="gc_options.js" /> | 
Added gc_lang/fr/tb/content/options.css version [20756f5a2f].
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
 | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 | 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 | 
/* CSS */
/*
    TB Next: fix dialogheaders
*/
dialogheader {
  -moz-binding: url("chrome://messenger/content/generalBindings.xml#dialogheader");
  margin: 0 5px 5px;
  border: 1px solid ThreeDDarkShadow;
  padding: 5px 8px;
  background-color: Highlight;
  color: HighlightText;
}
.dialogheader-title {
  margin: 0 !important;
  font-size: larger;
  font-weight: bold;
}
 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | 
Added gc_lang/fr/tb/content/options.js version [73166a402f].
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
 | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 | 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 | 
// JavaScript
"use strict";
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
const prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).getBranch("extensions.grammarchecker.");
var oOptControl = {
    load: function () {
        try {
            document.getElementById('check_signature').checked = prefs.getBoolPref('bCheckSignature');
        }
        catch (e) {
            Cu.reportError(e);
        }
    },
    save: function () {
        try {
            prefs.setBoolPref('bCheckSignature', document.getElementById('check_signature').checked);
        }
        catch (e) {
            Cu.reportError(e);
        }
    }
}
oOptControl.load();
 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | 
Modified gc_lang/fr/tb/content/options.xul
from [4546c76788]
to [b4b7f2b7c3].
| 
1
2
34
56
7
8
910
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 | 
-
+
+
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
+
+
-
-
-
-
-
+
+
+
 | 
<?xml version="1.0"<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://grammarchecker/content/options.css" type="text/css"?> encoding="UTF-8"?><!DOCTYPE <!DOCTYPE dialog SYSTEM "chrome://grammarchecker/locale/options.dtd">
<dialogprefwindowSYSTEM "chrome://grammarchecker/locale/options.dtd">id="grammalecte-options-window"
  title="&window.title;"
  orient="vertical"
  buttons="accept, cancel"
  ondialogaccept="oOptControl.save();"
  ondialogcancel="return;"
  defaultButton="accept"
  width="400"
  onload="document.getElementById('grammalecte-options-window').centerWindowOnScreen();"
  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <!-- Other elements go here --><prefwindowid="grammarcheckerPreferences"
  title="&prefwindow.title;"  <dialogheader id="grammalecte-title" title="&dialogheader.label;" description="" /><prefpane id="pane1" label="&pane1.title;">  <dialogheader id="grammalecte-title" title="&pane1.title;" description="" />    <preferences><checkbox id="check_signature" label="&check_signature.label;" accesskey="&check_signature.accesskey;" />      <preference id="check_signature" name="extensions.grammarchecker.bCheckSignature" type="bool" />      <!--<preference id="gc_options" name="extensions.grammarchecker.sGCOptions" type="string" />      <preference id="tf_options" name="extensions.grammarchecker.sTFOptions" type="string" />      <preference id="mothertongue" name="extensions.grammarchecker.mothertongue" type="string"/>-->    </preferences>  <checkbox label="&check_signature.label;" accesskey="&check_signature.accesskey;" preference="check_signature"/>    <!--<label accesskey="&gc_options.accesskey;" control="texturlpref1">&gc_options.label;</label><textbox id="texturlpref1" preference="gc_options"/><script type="application/javascript" src="options.js" />
</dialog>    <label accesskey="&tf_options.accesskey;" control="texturlpref2">&tf_options.label;</label><textbox id="texturlpref2" preference="tf_options"/>    <label accesskey="&mothertongue.accesskey;" control="textmothertongue">&mothertongue.label;</label><textbox id="textmothertongue" preference="mothertongue"/>-->  <!--<description>&panel.description;</description>-->  </prefpane></prefwindow> | 
Modified gc_lang/fr/tb/content/overlay.css
from [778a1d344a]
to [8c73a24356].
| ︙ |  |  | 
| 
183
184
185
186
187
188
189
 | 
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
 | 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 | 
/* elems */
.bs, .pleo, .neg, .redon1, .redon2, .mc, .date, .notype {
    background-color: hsl(180, 50%, 40%);
    color: hsl(180, 10%, 96%);
    border-radius: 3px;
}
/*
    TB Next: fix dialogheaders
*/
dialogheader {
  -moz-binding: url("chrome://messenger/content/generalBindings.xml#dialogheader");
  margin: 0 5px 5px;
  border: 1px solid ThreeDDarkShadow;
  padding: 5px 8px;
  background-color: Highlight;
  color: HighlightText;
}
.dialogheader-title {
  margin: 0 !important;
  font-size: larger;
  font-weight: bold;
}
 | 
Modified gc_lang/fr/tb/content/overlay.js
from [0f3db968a0]
to [fcc7e4e2d6].
| 
1
2
3
4
5
6
7
8
9
10
11
12
1314
15
16
1718
19
20
21
22
23
24
25
26
27
28
29
30
31
32 | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 | 
-
+
-
-
-
-
-
+
+
-
-
-
-
-
-
 | 
// JavaScript
"use strict";
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
const { require } = Cu.import("resource://gre/modules/commonjs/toolkit/require.js", {});
//const { require } = Cu.import("resource://gre/modules/commonjs/toolkit/require.js", {});
const { BasePromiseWorker } = Cu.import('resource://gre/modules/PromiseWorker.jsm', {});
const Task = Cu.import("resource://gre/modules/Task.jsm").Task;
const prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).getBranch("extensions.grammarchecker.");//Cu.import("resource://gre/modules/Console.jsm"); // doesn’t work//const xConsole = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService);//xConsole.logStringMessage("Grammalecte: " + args.join(" · ")); // useless now. Use: Services.console.logStringMessage("***");const text = require("resource://grammalecte/text.js");
const tf = require("resource://grammalecte/fr/textformatter.js");
//const text = require("resource://grammalecte/text.js");
//const tf = require("resource://grammalecte/fr/textformatter.js");const oConverterToExponent = {
    dNumbers: new Map ([
        ["1", "¹"], ["2", "²"], ["3", "³"], ["4", "⁴"], ["5", "⁵"],
        ["6", "⁶"], ["7", "⁷"], ["8", "⁸"], ["9", "⁹"], ["0", "⁰"]
    ]),function echo (...args) {    dump(args.join(" -- ") + "\n");  // obsolete since TB 52?    Services.console.logStringMessage("Grammalecte: " + args.join(" · "));} | 
| ︙ |  |  | 
| 
43
44
45
46
47
48
49
50
51
52
53
5455
56
5758
5960
61
62
63
6465
66
67
6869
70
7172
7374
75
76
7778
79
80
81
82
83
8485
86
8788
89
9091
9293
94
95
9697
98
99
100101
102
103104
105106
107
108
109
110
111
112113
114
115116
117118
119
120
121
122
123
124
125 | 
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
 | 
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
 | 
var oGrammarChecker = {
    // you must use var to be able to call this object from elsewhere
    xGCEWorker: null,
    bDictActive: null,
    loadGC: function () {
        if (this.xGCEWorker === null) {
            // Grammar checker
            console.log('Loading Grammalecte');
            this.xGCEWorker = new BasePromiseWorker('chrome://promiseworker/content/gce_worker.js');
            let xPromise = this.xGCEWorker.post('loadGrammarChecker', [prefs.getCharPref("sGCOptions"), "Thunderbird"]);
            xPromise.then(
                function (aVal) {echo('Loading Grammalecte');                    console.log(aVal);
                    prefs.setCharPref("sGCOptions", aVal);
                },echo(aVal);                function (aReason) { function (aReason) { console.log('Promise rejected - ', aReason); }
            ).catch(echo('Promise rejected - ', aReason); }                function (aCaught) { function (aCaught) { console.log('Promise Error - ', aCaught); }
            );
        }
    },
    fullTests: function () {echo('Promise Error - ', aCaught); }        console.log('Performing tests... Wait...');
        let xPromise = this.xGCEWorker.post('fullTests', ['{"nbsp":true, "esp":true, "unit":true, "num":true}']);
        xPromise.then(
            function (aVal) {echo('Performing tests... Wait...');                console.log('Done.');
                console.log(aVal);
            },echo('Done.');echo(aVal);            function (aReason) { function (aReason) { console.log('Promise rejected', aReason); }
        ).catch(echo('Promise rejected', aReason); }            function (aCaught) { function (aCaught) { console.log('Promise Error', aCaught); }
        );
    },
    test: function (sText) {echo('Promise Error', aCaught); }        console.log("Test...");
        let xPromise = this.xGCEWorker.post('parse', [sText, "FR", true]);
        xPromise.then(
            function (aVal) {
                let lErr = JSON.parse(aVal);
                if (lErr.length > 0) {
                    for (let dErr of lErr) {echo("Test...");                        console.log(text.getReadableError(dErr));
                    }
                } else {echo(text.getReadableError(dErr));                    console.log("no error found");
                }
            },echo("no error found");            function (aReason) { function (aReason) { console.log('Promise rejected', aReason); }
        ).catch(echo('Promise rejected', aReason); }            function (aCaught) { function (aCaught) { console.log('Promise Error', aCaught); }
        );
    },
    setOptions: function () {echo('Promise Error', aCaught); }        console.log('Set options');
        let xPromise = this.xGCEWorker.post('setOptions', [prefs.getCharPref("sGCOptions")]);
        xPromise.then(
            function (aVal) {echo('Set options');                console.log(aVal);
                prefs.setCharPref("sGCOptions", aVal);
            },echo(aVal);            function (aReason) { function (aReason) { console.log('Promise rejected', aReason); }
        ).catch(echo('Promise rejected', aReason); }            function (aCaught) { function (aCaught) { console.log('Promise Error', aCaught); }
        );
    },
    resetOptions: function () {
        let xPromise = this.xGCEWorker.post('resetOptions');
        xPromise.then(
            function (aVal) {echo('Promise Error', aCaught); }                console.log(aVal);
                prefs.setCharPref("sGCOptions", aVal);
            },echo(aVal);            function (aReason) { function (aReason) { console.log('Promise rejected', aReason); }
        ).catch(echo('Promise rejected', aReason); }            function (aCaught) { function (aCaught) { console.log('Promise Error', aCaught); }
        );
    },
    _getGCResultPromise: function (sParagraph, sLang, bDebug, bContext) {
        // For some reason, you can’t use result of PromiseWorker within a Task,
        // you have to wrap it in a common Promise. Task and yield can be replaced with async / await when it is available.
        let that = this;
        return new Promise(function (resolve, reject) {echo('Promise Error', aCaught); } | 
| ︙ |  |  | 
| 
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198 | 
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
 | 
-
+
 | 
        try {
            let that = this;
            let xResultNode = document.getElementById("resnode"+iParagraph);
            xResultNode.textContent = "…………… réanalyse en cours ……………";
            let sParagraph = xEditor.getParagraph(iParagraph);
            let xPromise = this._getGCResultPromise(sParagraph, "FR", false, false);
            xPromise.then(function (res) {
                ////console.log("res: " + res);
                xResultNode.textContent = "";
                let oRes = JSON.parse(res);
                if (oRes.aGrammErr.length > 0 || oRes.aSpellErr.length > 0) {
                    that.fillResultNode(xResultNode, xEditor, sParagraph, iParagraph, oRes.aGrammErr, oRes.aSpellErr);
                }
            }, function (res) {
                xResultNode.textContent = "Erreur: " + res;echo("res: " + res); | 
| ︙ |  |  | 
| 
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381 | 
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
 | 
-
+
 | 
            }
        });
        xNodeSuggLine.appendChild(xNodeSuggButton);
        xNodeDiv.appendChild(xNodeSuggLine);
        return xNodeDiv;
    },
    loadUI: function() {
        console.log("loadUI");
        this._strings = document.getElementById("grammarchecker-strings");
        let that = this;
        let nsGrammarCommand = {
            isCommandEnabled: function (aCommand, dummy) {
                return (IsDocumentEditable() && !IsInHTMLSourceMode());
            },
            getCommandStateParams: function (aCommand, aParams, aRefCon) {},echo("loadUI"); | 
| ︙ |  |  | 
| 
470
471
472
473
474
475
476
477
478
479480
481482
483
484
485
486
487488
489490
491
492
493
494
495
496
497 | 
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
 | 
-
+
-
+
-
+
-
+
-
+
 | 
        this.closePanel();
    },
    onOpenGCOptions: function (e) {
        let that = this;
        let xPromise = this.xGCEWorker.post('getDefaultOptions');
        xPromise.then(
            function (aVal) {
                console.log(aVal);
                prefs.setCharPref("sGCDefaultOptions", aVal);
            },echo(aVal);            function (aReason) { function (aReason) { console.log('Promise rejected', aReason); }
        ).catch(echo('Promise rejected', aReason); }            function (aCaught) { function (aCaught) { console.log('Promise Error', aCaught); }
        ).then(
            function () {
                that.openDialog("chrome://grammarchecker/content/gc_options.xul", "", "chrome, dialog, modal, resizable=no");
                that.setOptions();
            },echo('Promise Error', aCaught); }            function (aReason) { function (aReason) { console.log('Error options dialog', aReason); }
        ).catch(echo('Error options dialog', aReason); }            function (aCaught) { function (aCaught) { console.log('Error', aCaught); }
        );
    },
    onOpenSpellOptions: function (e) {
        this.openDialog("chrome://grammarchecker/content/spell_options.xul", "", "chrome, dialog, modal, resizable=no");
    },
    onOpenOptions: function (e) {
        this.openDialog("chrome://grammarchecker/content/options.xul", "", "chrome, dialog, modal, resizable=no");echo('Error', aCaught); } | 
| ︙ |  |  | 
| 
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578 | 
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
 | 
-
+
 | 
        }
    },
    saveOptions: function () {
        let oOptions = {};
        for (let xNode of document.getElementsByClassName("option")) {
            oOptions[xNode.id] = xNode.checked;
        }
        ////console.log("save options: " + JSON.stringify(oOptions));
        prefs.setCharPref("sTFOptions", JSON.stringify(oOptions));
    },
    setOptionsInPanel: function (oOptions) {
        for (let sOptName in oOptions) {
            //console.log(sOptName + ":" + oOptions[sOptName]);
            if (document.getElementById(sOptName) !== null) {
                document.getElementById(sOptName).checked = oOptions[sOptName];echo("save options: " + JSON.stringify(oOptions)); | 
| ︙ |  |  | 
| 
878
879
880
881
882
883
884
885
886
887
888889
890
891
892
893
894
895
896 | 
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
 | 
-
-
+
+
-
+
 | 
            Cu.reportError(e);
        }
        return sText;
    },
    formatText: function (sText, sOptName) {
        let nCount = 0;
        try {
            if (!if (!oReplTable.hasOwnProperty(sOptName)) {
                console.log("# Error. TF: there is no option “" + sOptName+ "”.");
                return [sText, nCount];
            }tf.oReplTable.hasOwnProperty(sOptName)) {echo("# Error. TF: there is no option “" + sOptName+ "”.");            for (let [zRgx, sRep] of for (let [zRgx, sRep] of oReplTable[sOptName]) {
                nCount += (sText.match(zRgx) || []).length;
                sText = sText.replace(zRgx, sRep);
            }
        }
        catch (e) {
            Cu.reportError(e);
        }tf.oReplTable[sOptName]) { | 
| ︙ |  |  | 
Modified gc_lang/fr/tb/content/overlay.xul
from [f4f8642995]
to [32fb17e890].
| 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 | 
-
-
-
-
+
+
+
+
+
+
 | 
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="chrome://grammarchecker/content/overlay.css" type="text/css"?>
<!DOCTYPE overlay SYSTEM "chrome://grammarchecker/locale/overlay.dtd">
<overlay id="grammarchecker-overlay"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script type="application/<script type="application/javascript" src="chrome://global/content/globalOverlay.js"/>
  <script type="application/javascript" src="resource://grammalecte/text.js"/>
  <script type="application/javascript" src="resource://grammalecte/fr/textformatter.js"/>
  <script type="application/javascript" src="overlay.js"/>
  <script type="application/javascript" src="spellchecker.js"/>
  <script type="application/javascript" src="editor.js"/>
  <stringbundleset id="stringbundleset">
    <stringbundle id="grammarchecker-strings" src="chrome://grammarchecker/locale/grammarchecker.properties"/>
  </stringbundleset>
  <commandset id="composerEditMenuItems" commandupdater="true" 
              events="focus"x-javascript" src="chrome://global/content/globalOverlay.js"/>
  <script type="application/x-javascript" src="overlay.js"/>
  <script type="application/x-javascript" src="spellchecker.js"/>
  <script type="application/x-javascript" src="editor.js"/> | 
| ︙ |  |  | 
Modified gc_lang/fr/tb/content/spell_options.css
from [2179034562]
to [870a0276f1].
| ︙ |  |  | 
| 
11
12
13
14
15
16
17
 | 
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 | 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 | 
	font-weight: bold;
	color: hsl(210, 50%, 50%);
}
.dicdescr {
	margin-left: 27px;
}
/*
    TB Next: fix dialogheaders
*/
dialogheader {
  -moz-binding: url("chrome://messenger/content/generalBindings.xml#dialogheader");
  margin: 0 5px 5px;
  border: 1px solid ThreeDDarkShadow;
  padding: 5px 8px;
  background-color: Highlight;
  color: HighlightText;
}
.dialogheader-title {
  margin: 0 !important;
  font-size: larger;
  font-weight: bold;
}
 | 
Modified gc_lang/fr/tb/content/spell_options.js
from [9ebffece09]
to [4444b40148].
| 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 | 
-
-
-
-
-
-
 | 
// JavaScript
"use strict";
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
const prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).getBranch("extensions.grammarchecker.");
var oDialogControl = {
	load: function () {
		try {
			document.getElementById('fr-FR-modern').checked = prefs.getBoolPref('bDictModern');
			document.getElementById('fr-FR-classic').checked = prefs.getBoolPref('bDictClassic');const { require } = Cu.import("resource://gre/modules/commonjs/toolkit/require.js", {});function echo (...args) {	Services.console.logStringMessage(args.join(" -- ") + "\n");} | 
| ︙ |  |  | 
Modified gc_lang/fr/tb/content/spell_options.xul
from [5453a7e2cc]
to [e6c1baec4c].
| ︙ |  |  | 
| 
30
31
32
33
34
35
36
37
38
39
40 | 
30
31
32
33
34
35
36
37
38
39
40
 | 
-
-
+
+
 | 
    <description class="dicdescr">&option.classic.descr;</description>
    <checkbox id="fr-FR-reform" class="option" label="&option.reform.label;" />
    <description class="dicdescr">&option.reform.descr;</description>
    <checkbox id="fr-FR-classic-reform" class="option" label="&option.allvar.label;" />
    <description class="dicdescr">&option.allvar.descr;</description>
  </groupbox>
  <script type="application/<script type="application/javascript" src="spell_options.js"/>
  <script type="application/javascript" src="spellchecker.js"/>
</dialog>x-javascript" src="spell_options.js"/>
  <script type="application/x-javascript" src="spellchecker.js"/> | 
Modified gc_lang/fr/tb/content/spellchecker.js
from [3be1484aff]
to [bf36be002a].
| 
1
2
3
4
56
7
89
1011
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2930
31
32
33
34
35
36
37
3839
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154 | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
 | 
-
+
-
-
+
+
-
+
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 | 
// JavaScript
/*
Hunspell wrapper	Hunspell wrapperXPCOM obsolete (?), but there is nothing else...
    Overly complicated and weird. To throw away ASAP if possible.	XPCOM obsolete (?), but there is nothing else...	Overly complicated and weird. To throw away ASAP if possible.And you can’t access to this from a PromiseWorker (it sucks).	And you can’t access to this from a PromiseWorker (it sucks).https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/mozISpellCheckingEngine
    https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/Using_spell_checking_in_XUL
    https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIFile
    https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/FileUtils.jsm
*/
"use strict";
/*
// Loaded in another file
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
const { require } = Cu.import("resource://gre/modules/commonjs/toolkit/require.js", {});
*/
const FileUtils = Cu.import("resource://gre/modules/FileUtils.jsm").FileUtils;
const AddonManager = Cu.import("resource://gre/modules/AddonManager.jsm").AddonManager;	https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/mozISpellCheckingEngine	https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/Using_spell_checking_in_XUL	https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIFile	https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/FileUtils.jsmvar oSpellControl = {/*const parser = Cc["@mozilla.org/parserutils;1"].getService(Ci.nsIParserUtils);const persodict = Cc["@mozilla.org/spellchecker/personaldictionary;1"].getService(Ci.mozIPersonalDictionary);*/const system = require("sdk/system");xSCEngine: null,
    init: function () {
        if (this.xSCEngine === null) {
            try {
                let sSpellchecker = "@mozilla.org/spellchecker/myspell;1";
                if ("@mozilla.org/spellchecker/hunspell;1" in Cc) {
                    sSpellchecker = "@mozilla.org/spellchecker/hunspell;1";
                }
                if ("@mozilla.org/spellchecker/engine;1" in Cc) {
                    sSpellchecker = "@mozilla.org/spellchecker/engine;1";
                }
                this.xSCEngine = Cc[sSpellchecker].getService(Ci.mozISpellCheckingEngine);
            }
            catch (e) {
                console.log("Can’t initiate the spellchecker.");
                Cu.reportError(e);
            }
        }
    },
    getDictionariesList: function () {
        this.init();
        try {
            let l = {};
            let c = {};
            this.xSCEngine.getDictionaryList(l, c);
            return l.value;
        }
        catch (e) {
            Cu.reportError(e);
            return [];
        }
    },
    setDictionary: function (sLocale) {
        if (this.getDictionariesList().includes(sLocale)) {
            try {
                this.xSCEngine.dictionary = sLocale; // en-US, fr, etc.
                return true;
            }
            catch (e) {
                Cu.reportError(e);
                return false;
            }
        } else {
            console.log("Warning. No dictionary for locale: " + sLocale);
            console.log("Existing dictionaries: " + this.getDictionariesList().join(" | "));
        }
        return false;
    },
    check: function (sWord) {
        // todo: check in personal dict?
        try {
            return this.xSCEngine.check(sWord);
        }
        catch (e) {
            Cu.reportError(e);
            return false;
        }
    },
    suggest: function (sWord) {
        try {
            let lSugg = {};
            this.xSCEngine.suggest(sWord, lSugg, {});
            return lSugg.value;
            // lSugg.value is a JavaScript Array of strings
        }
        catch (e) {
            Cu.reportError(e);
            return ['#Erreur.'];
        }
    },
    addDirectory: function (sFolder) {
        try {
            let xNsiFolder = new FileUtils.File(sFolder);
            this.xSCEngine.addDirectory(xNsiFolder);
        }
        catch (e) {
            console.log("Unable to add directory: " + sFolder);
            Cu.reportError(e);
        }
    },
    removeDirectory: function (sFolder) {
        // does not work but no exception raised (bug?)
        try {
            let xNsiFolder = new FileUtils.File(sFolder);
            this.xSCEngine.removeDirectory(xNsiFolder);
        }
        catch (e) {
            console.log("Unable to remove directory: " + sFolder);
            Cu.reportError(e);
        }
    },
    setExtensionDictFolder: function (sDictName, bActivate) {
        try {
            let that = this;
            let sPath = "/content/dictionaries/" + sDictName;
            AddonManager.getAddonByID("French-GC-TB@grammalecte.net", function (addon) {
                let xURI = addon.getResourceURI(sPath);
                //console.log(xURI);
                let sFolder = xURI.filePath;
                if (sFolder !== undefined) {
                    if (/^\/[A-Z]:\//.test(sFolder)) {
                        // Windows path
                        sFolder = sFolder.slice(1).replace(/\//g, "\\\\");
                    }
                    console.log("folder: " + sFolder);
                    if (bActivate) {
                        that.addDirectory(sFolder);
                    } else {
                        that.removeDirectory(sFolder);
                    }
                }
            });
        }
        catch (e) {
            console.log("Unable to add extension folder");
            Cu.reportError(e);
        }
    }
};	xSCEngine: null,	init: function () {		if (this.xSCEngine === null) {			try {				let sSpellchecker = "@mozilla.org/spellchecker/myspell;1";				if ("@mozilla.org/spellchecker/hunspell;1" in Cc) {				sSpellchecker = "@mozilla.org/spellchecker/hunspell;1";				}				if ("@mozilla.org/spellchecker/engine;1" in Cc) {				sSpellchecker = "@mozilla.org/spellchecker/engine;1";				}				this.xSCEngine = Cc[sSpellchecker].getService(Ci.mozISpellCheckingEngine);			}			catch (e) {				echo("Can’t initiate the spellchecker.");				Cu.reportError(e);			}		}	},	getDictionariesList: function () {		this.init();		try {			let l = {};			let c = {};			this.xSCEngine.getDictionaryList(l, c);			return l.value;		}		catch (e) {			Cu.reportError(e);			return [];		}	},	setDictionary: function (sLocale) {		if (this.getDictionariesList().includes(sLocale)) {			try {				this.xSCEngine.dictionary = sLocale; // en-US, fr, etc.				return true;			}			catch (e) {				Cu.reportError(e);				return false;			}		} else {			echo("Warning. No dictionary for locale: " + sLocale);			echo("Existing dictionaries: " + this.getDictionariesList().join(" | "));		}		return false;	},	check: function (sWord) {		// todo: check in personal dict?		try {			return this.xSCEngine.check(sWord);		}		catch (e) {			Cu.reportError(e);			return false;		}	},	suggest: function (sWord) {		try {			let lSugg = {};			this.xSCEngine.suggest(sWord, lSugg, {});			return lSugg.value;			// lSugg.value is a JavaScript Array of strings		}		catch (e) {			Cu.reportError(e);			return ['#Erreur.'];		}	},	addDirectory: function (sFolder) {		try {			let xNsiFolder = new FileUtils.File(sFolder);			this.xSCEngine.addDirectory(xNsiFolder);		}		catch (e) {			echo("Unable to add directory: " + sFolder);			Cu.reportError(e);		}	},	removeDirectory: function (sFolder) {		// does not work but no exception raised (bug?)		try {			let xNsiFolder = new FileUtils.File(sFolder);			this.xSCEngine.removeDirectory(xNsiFolder);		}		catch (e) {			echo("Unable to remove directory: " + sFolder);			Cu.reportError(e);		}	},	setExtensionDictFolder: function (sDictName, bActivate) {		try {			let that = this;			let sPath = "/content/dictionaries/" + sDictName;			AddonManager.getAddonByID("French-GC-TB@grammalecte.net", function (addon) {				let xURI = addon.getResourceURI(sPath);				//console.log("> " + xURI.path);				let sFolder = xURI.path;				if (system.platform ==="winnt") {					sFolder = sFolder.slice(1).replace(/\//g, "\\\\");				}				//console.log(">" + sFolder);				if (bActivate) {					that.addDirectory(sFolder);				} else {					that.removeDirectory(sFolder);				}			});		}		catch (e) {			echo("Unable to add extension folder");			Cu.reportError(e);		}	} | 
Modified gc_lang/fr/tb/install.rdf
from [c98ee16b92]
to [95227f9159].
| 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 | 
-
+
 | 
<?xml version="1.0" encoding="UTF-8"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
 xmlns:em="http://www.mozilla.org/2004/em-rdf#">
  <Description about="urn:mozilla:install-manifest">
    <em:id>${tb_identifier}</em:id>
    <em:name>${tb_name}</em:name>
    <em:type>2</em:type>
    <em:version>${version}</em:version>
    <em:creator>${author}</em:creator>
    <em:description>${description}</em:description>
    <em:homepageURL>${link}</em:homepageURL>
    <em:optionsURL>chrome://grammarchecker/content/options.xul</em:optionsURL>
<!--<em:optionsURL>chrome://grammarchecker/content/options.xul</em:optionsURL>-->
    <em:unpack>true</em:unpack>
    <em:targetApplication>
      <Description>
        <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id> <!-- thunderbird -->
        <em:minVersion>45.8.0</em:minVersion>
        <em:maxVersion>55.*</em:maxVersion> | 
| ︙ |  |  | 
Modified gc_lang/fr/tb/locale/en/options.dtd
from [071253db94]
to [5fe56718ba].
| 
1
2
3
4
5
6
7 | 
1
2
3
4
5
6
 | 
-
-
+
+
-
-
-
+
+
 | 
<!ENTITY <!ENTITY window.title "Grammalecte · Options">
<!ENTITY dialogheader.label "Other options">prefwindow.title "Grammalecte · Options">
<!ENTITYpane1.title"Other options"><!ENTITY check_signature.label "Check signature text (in text mode)">
<!ENTITY check_signature.accesskey "C"><!ENTITY pane1.description "Options are available in the menu Grammalecte in composing windows."><!ENTITY mothertongue.label "Mother tongue:"><!ENTITY mothertongue.accesskey "M"> | 
Modified gc_lang/fr/tb/locale/fr/options.dtd
from [a50c0f39f8]
to [37a043f079].
| 
1
2
3
4
5
6
7 | 
1
2
3
4
 | 
-
-
+
+
-
-
-
 | 
<!ENTITY <!ENTITY window.title "Grammalecte · Options">
<!ENTITY dialogheader.label "Autres options">prefwindow.title "Grammalecte · Options">
<!ENTITYpane1.title"Autres options"><!ENTITY check_signature.label "Vérifier le texte de la signature (en mode texte)">
<!ENTITY check_signature.accesskey "V"><!ENTITY pane1.description "Les options sont disponibles dans le menu Grammalecte des fenêtres de rédaction."><!ENTITY mothertongue.label "Langue maternelle:"><!ENTITY mothertongue.accesskey "M"> | 
Modified graphspell-js/helpers.js
from [b70dea39e2]
to [d93f7e0941].
| ︙ |  |  | 
| 
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 | 
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 | 
-
-
+
-
-
-
-
-
-
 | 
    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;
xRequest = new XMLHttpRequest();            if (typeof XMLHttpRequest !== "undefined") {    xRequest = new XMLHttpRequest();xRequest.open('GET', spf, false); // 3rd arg is false for synchronous, sync is acceptable in workers
            xRequest.overrideMimeType('text/json');
            xRequest.send();
            return xRequest.responseText;
        }
        catch (e) {
            this.logerror(e);            } else {                // JS sucks again… necessary for Thunderbird                let { Cc, Ci } = require("chrome");                xRequest = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance();                xRequest.QueryInterface(Ci.nsIXMLHttpRequest);            } | 
| ︙ |  |  | 
Modified make.py
from [dbe9299caf]
to [4008460ad6].
| ︙ |  |  | 
| 
361
362
363
364
365
366
367
368
369
370
371
372
373
374
 | 
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
 | 
+
 | 
    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("-aed", "--add_extended_dictionary", help="add extended dictionary to the build", action="store_true")
    xParser.add_argument("-apd", "--add_personal_dictionary", help="add personal dictionary to the build", action="store_true")
    xParser.add_argument("-fx", "--firefox", help="Launch Firefox Developper for WebExtension 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("-tbb", "--thunderbird_beta", help="Launch Thunderbird Beta", 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:
        xArgs.build_data_before = True
        xArgs.build_data_after = True
 | 
| ︙ |  |  | 
| 
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462 | 
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
 | 
+
+
-
+
+
+
+
+
 | 
                    else:
                        # Firefox Nightly edition
                        spfFirefox = dVars['win_fx_nightly_path']  if platform.system() == "Windows"  else dVars['linux_fx_nightly_path']
                    os.system(r'web-ext run --firefox="' + spfFirefox + '" --browser-console --firefox-profile=debug')            
            # Thunderbird
            if xArgs.thunderbird:
                spfThunderbird = '"'+dVars['win_tb_path']+'"'  if platform.system() == "Windows"  else dVars['linux_tb_path']
                print(spfThunderbird)
                os.system(os.system(spfThunderbird + ' -jsconsole -P debug')
            if xArgs.thunderbird_beta:
                spfThunderbird = '"'+dVars['win_tb_beta_path']+'"'  if platform.system() == "Windows"  else dVars['linux_tb_beta_path']
                print(spfThunderbird)
                os.system(spfThunderbird + ' -jsconsole -P beta')
        else:
            print("Folder not found: gc_lang/"+sLang)
    oNow = datetime.datetime.now()
    print("============== MAKE GRAMMALECTE [finished] at {0.hour:>2} h {0.minute:>2} min {0.second:>2} s ==============".format(oNow))
if __name__ == '__main__':
    main()"thunderbird -jsconsole -P debug") |