Index: gc_lang/fr/webext/content_scripts/content_modifier.js ================================================================== --- gc_lang/fr/webext/content_scripts/content_modifier.js +++ gc_lang/fr/webext/content_scripts/content_modifier.js @@ -56,11 +56,11 @@ xConjButton.onclick = function() { createConjPanel(); }; let xTFButton = createNode("div", {className: "grammalecte_wrapper_button", textContent: "Formater"}); xTFButton.onclick = function() { createTFPanel(xTextArea); }; let xLxgButton = createNode("div", {className: "grammalecte_wrapper_button", textContent: "Analyser"}); xLxgButton.onclick = function() { - createLxgPanel(xTextArea); + createLxgPanel(); xPort.postMessage({sCommand: "getListOfTokens", dParam: {sText: xTextArea.value}, dInfo: {sTextAreaId: xTextArea.id}}); }; let xGCButton = createNode("div", {className: "grammalecte_wrapper_button", textContent: "Corriger"}); xGCButton.onclick = function() { createGCPanel(); @@ -104,11 +104,11 @@ oTFPanel.setContentNode(createTextFormatter(xTextArea)); oTFPanel.insertIntoPage(); } } -function createLxgPanel (xTextArea) { +function createLxgPanel () { console.log("Lexicographe"); if (oLxgPanel !== null) { oLxgPanelContent.clear(); oLxgPanel.show(); } else { @@ -125,18 +125,15 @@ oGCPanelContent.clear(); oGCPanel.show(); } else { // create the panel oGCPanel = new GrammalectePanel("grammalecte_gc_panel", "Correcteur", 500, 700); + oGCPanel.setContentNode(oGCPanelContent.getNode()); oGCPanel.insertIntoPage(); } } -function updateGCPanel (oErrors) { - oGCPanel.setContentNode(document.createTextNode(JSON.stringify(oErrors))); -} - /* Simple message */ function handleMessage (oMessage, xSender, sendResponse) { @@ -162,11 +159,11 @@ console.log("[Content script] tab id: " + result); nTadId = result; break; case "parseAndSpellcheck": console.log(result); - updateGCPanel(result); + oGCPanelContent.addParagraphResult(result); break; case "getListOfTokens": console.log(result); oLxgPanelContent.addListOfTokens(result); break; Index: gc_lang/fr/webext/content_scripts/gc_content.js ================================================================== --- gc_lang/fr/webext/content_scripts/gc_content.js +++ gc_lang/fr/webext/content_scripts/gc_content.js @@ -4,10 +4,12 @@ const oGCPanelContent = { _xContentNode: createNode("div", {id: "grammalecte_gc_panel_content"}), + aIgnoredErrors: new Map(), + getNode: function () { return this._xContentNode; }, clear: function () { @@ -14,46 +16,48 @@ while (this._xContentNode.firstChild) { this._xContentNode.removeChild(this._xContentNode.firstChild); } }, - addParagraphResult: function (sText, iId, oErrors) { + addParagraphResult: function (oResult) { + try { + if (oResult) { + let xNodeDiv = createNode("div", {className: "grammalecte_paragraph_block"}); + // actions + let xActionsBar = createNode("div", {className: "grammalecte_paragraph_actions"}); + let xCloseButton = createNode("div", {id: "end" + oResult.sParaNum, className: "grammalecte_paragraph_close_button", textContent: "×"}); + let xAnalyseButton = createNode("div", {id: "check" + oResult.sParaNum, className: "grammalecte_paragraph_analyse_button", textContent: "Réanalyser"}); + xActionsBar.appendChild(xAnalyseButton); + xActionsBar.appendChild(xCloseButton); + // paragraph + let xParagraph = createNode("p", {id: "paragr"+oResult.sParaNum, lang: "fr", spellcheck: "false", contenteditable: "true"}); + xParagraph.className = (oResult.aGrammErr.length || oResult.aSpellErr.length) ? "grammalecte_paragraph softred" : "grammalecte_paragraph"; + this._tagParagraph(xParagraph, oResult.sParagraph, oResult.sParaNum, oResult.aGrammErr, oResult.aSpellErr); + // creation + xNodeDiv.appendChild(xActionsBar); + xNodeDiv.appendChild(xParagraph); + this._xContentNode.appendChild(xNodeDiv); + } + } + catch (e) { + showError(e); + } + }, + + refreshParagraph: function (oResult) { try { - let xNodeDiv = createNode("div", {className: "grammalecte_paragraph_block"}); - // actions - let xActionsBar = createNode("div", {className: "grammalecte_paragraph_actions"}); - let xCloseButton = createNode("div", {id: "end" + iId.toString(), className: "grammalecte_paragraph_close_button", textContent: "×"}); - let xAnalyseButton = createNode("div", {id: "check" + iId.toString(), className: "grammalecte_paragraph_analyse_button", textContent: "Réanalyser"}); - xActionsBar.appendChild(xAnalyseButton); - xActionsBar.appendChild(xCloseButton); - // paragraph - let xParagraph = createNode("p", {id: iId, lang: "fr", spellcheck: "false", contenteditable: "true"}); - xParagraph.className = (oErrors.aGrammErr.length || oErrors.aSpellErr.length) ? "grammalecte_paragraph softred" : "grammalecte_paragraph"; - this._tagParagraph(sText, xParagraph, iParagraph, oErrors.aGrammErr, oErrors.aSpellErr); - // creation - xNodeDiv.appendChild(xActionsBar); - xNodeDiv.appendChild(xParagraph); - this._xContentNode.appendChild(xNodeDiv); + let xParagraph = document.getElementById("paragr"+sIdParagr); + xParagraph.className = (oResult.aGrammErr.length || oResult.aSpellErr.length) ? "grammalecte_paragraph softred" : "grammalecte_paragraph"; + xParagraph.textContent = ""; + this._tagParagraph(xParagraph, oResult.sParagraph, oResult.sParaNum, oResult.aGrammErr, oResult.aSpellErr); } catch (e) { showError(e); } }, - refreshParagraph: function (sText, sId, oErrors) { - try { - let xParagraph = document.getElementById("paragr"+sIdParagr); - xParagraph.className = (oErrors.aGrammErr.length || oErrors.aSpellErr.length) ? "grammalecte_paragraph softred" : "grammalecte_paragraph"; - xParagraph.textContent = ""; - this._tagParagraph(sText, xParagraph, iParagraph, oErrors.aGrammErr, oErrors.aSpellErr); - } - catch (e) { - showError(e); - } - }, - - _tagParagraph: function (sParagraph, xParagraph, iParagraph, aSpellErr, aGrammErr) { + _tagParagraph: function (xParagraph, sParagraph, sParaNum, aSpellErr, aGrammErr) { try { if (aGrammErr.length === 0 && aSpellErr.length === 0) { xParagraph.textContent = sParagraph; return } @@ -69,12 +73,12 @@ let nEndLastErr = 0; for (let oErr of aGrammErr) { let nStart = oErr["nStart"]; let nEnd = oErr["nEnd"]; if (nStart >= nEndLastErr) { - oErr['sErrorId'] = iParagraph.toString() + "_" + nErr.toString(); // error identifier - oErr['sIgnoredKey'] = iParagraph.toString() + ":" + nStart.toString() + ":" + nEnd.toString() + ":" + sParagraph.slice(nStart, nEnd); + oErr['sErrorId'] = sParaNum + "_" + nErr.toString(); // error identifier + oErr['sIgnoredKey'] = sParaNum + ":" + nStart.toString() + ":" + nEnd.toString() + ":" + sParagraph.slice(nStart, nEnd); if (nEndLastErr < nStart) { xParagraph.appendChild(document.createTextNode(sParagraph.slice(nEndLastErr, nStart))); } xParagraph.appendChild(this._createError(sParagraph.slice(nStart, nEnd), oErr)); xParagraph.insertAdjacentHTML("beforeend", ""); @@ -105,11 +109,11 @@ xNodeErr.dataset.line_id = oErr['sLineId']; xNodeErr.dataset.rule_id = oErr['sRuleId']; } xNodeErr.dataset.suggestions = oErr["aSuggestions"].join("|"); } - xNodeErr.className = (aIgnoredErrors.has(xNodeErr.dataset.ignored_key)) ? "ignored" : "error " + oErr['sType']; + xNodeErr.className = (this.aIgnoredErrors.has(xNodeErr.dataset.ignored_key)) ? "ignored" : "error " + oErr['sType']; return xNodeErr; }, applySuggestion: function (sSuggId) { // sugg try { @@ -131,11 +135,11 @@ ignoreError: function (sIgnoreButtonId) { // ignore try { //console.log("ignore button: " + sIgnoreButtonId + " // error id: " + document.getElementById(sIgnoreButtonId).dataset.error_id); let xNodeErr = document.getElementById("err"+document.getElementById(sIgnoreButtonId).dataset.error_id); - aIgnoredErrors.add(xNodeErr.dataset.ignored_key); + this.aIgnoredErrors.add(xNodeErr.dataset.ignored_key); xNodeErr.className = "ignored"; xNodeErr.removeAttribute("style"); this.hideAllTooltips(); } catch (e) { Index: gc_lang/fr/webext/content_scripts/panel_creator.js ================================================================== --- gc_lang/fr/webext/content_scripts/panel_creator.js +++ gc_lang/fr/webext/content_scripts/panel_creator.js @@ -12,11 +12,11 @@ this.sId = sId; this.sContentId = sId+"_content"; this.nWidth = nWidth; this.nHeight = nHeight; this.bMovable = bMovable; - this.xContentNode = createNode("div", {id: this.sContentId, className: "grammalecte_panel_content"}); + this.xContentNode = createNode("div", {className: "grammalecte_panel_content"}); this.xPanelNode = this._createPanel(sTitle); this.center(); } _createPanel (sTitle) { Index: gc_lang/fr/webext/gce_worker.js ================================================================== --- gc_lang/fr/webext/gce_worker.js +++ gc_lang/fr/webext/gce_worker.js @@ -134,10 +134,19 @@ let oDict = null; let oTokenizer = null; let oLxg = null; let oTest = null; + +/* + Technical note: + This worker don’t work as a PromiseWorker (which returns a promise), so when we send request + to this worker, we can’t wait the return of the answer just after the request made. + The answer is received by the background in another function (onmessage). + That’s why the full text to analyze is send in one block, but analyse is returned paragraph + by paragraph. +*/ function init (sExtensionPath, sGCOptions="", sContext="JavaScript", dInfo={}) { try { if (!bInitDone) { console.log("[Worker] Loading… Extension path: " + sExtensionPath); @@ -151,11 +160,11 @@ oLxg = new Lexicographe(oDict); if (sGCOptions !== "") { gc_engine.setOptions(helpers.objectToMap(JSON.parse(sGCOptions))); } oTokenizer = new Tokenizer("fr"); - tests(); + //tests(); bInitDone = true; } else { console.log("[Worker] Already initialized…") } // we always retrieve options from the gc_engine, for setOptions filters obsolete options @@ -167,18 +176,26 @@ } } function parse (sText, sCountry, bDebug, bContext, dInfo={}) { - let aGrammErr = gc_engine.parse(sText, sCountry, bDebug, bContext); - postMessage({sActionDone: "parse", result: aGrammErr, dInfo: dInfo}); + for (let sParagraph of text.getParagraph(sText)) { + let aGrammErr = gc_engine.parse(sParagraph, sCountry, bDebug, bContext); + postMessage(createResponse("parse", aGrammErr, dInfo, false)); + } + postMessage(createResponse("parse", null, dInfo, true)); } function parseAndSpellcheck (sText, sCountry, bDebug, bContext, dInfo={}) { - let aGrammErr = gc_engine.parse(sText, sCountry, bDebug, bContext); - let aSpellErr = oTokenizer.getSpellingErrors(sText, oDict); - postMessage(createResponse("parseAndSpellcheck", {aGrammErr: aGrammErr, aSpellErr: aSpellErr}, dInfo, true)); + let n = 0; + for (let sParagraph of text.getParagraph(sText)) { + let aGrammErr = gc_engine.parse(sParagraph, sCountry, bDebug, bContext); + let aSpellErr = oTokenizer.getSpellingErrors(sParagraph, oDict); + n += 1; + postMessage(createResponse("parseAndSpellcheck", {sParagraph: sParagraph, sParaNum: n.toString(), aGrammErr: aGrammErr, aSpellErr: aSpellErr}, dInfo, false)); + } + postMessage(createResponse("parseAndSpellcheck", null, dInfo, true)); } function getOptions (dInfo={}) { postMessage(createResponse("getOptions", gc_engine.getOptions().gl_toString(), dInfo, true)); }