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 @@ -9,13 +9,13 @@ if (xElem.id.startsWith("grammalecte_sugg")) { oGCPanelContent.applySuggestion(xElem.id); } else if (xElem.id === "grammalecte_tooltip_ignore") { oGCPanelContent.ignoreError(xElem.id); } else if (xElem.id.startsWith("grammalecte_check")) { - oGCPanelContent.recheckParagraph(xElem.id.slice(17)); + oGCPanelContent.recheckParagraph(parseInt(xElem.id.slice(17))); } else if (xElem.id.startsWith("grammalecte_hide")) { - document.getElementById(xElem.id).parentNode.parentNode.style.display = "none"; + xElem.parentNode.parentNode.style.display = "none"; } else if (xElem.tagName === "U" && xElem.id.startsWith("grammalecte_err") && xElem.className !== "corrected" && xElem.className !== "ignored") { oGCPanelContent.oTooltip.show(xElem.id); } else if (xElem.id === "grammalecte_tooltip_url") { oGCPanelContent.openURL(xElem.getAttribute("href")); @@ -25,10 +25,22 @@ } else if (xElem.tagName === "A") { oGCPanelContent.openURL(xElem.getAttribute("href")); } else { oGCPanelContent.oTooltip.hide(); } + } + catch (e) { + showError(e); + } +} + +function onGrammalecteGCPanelKeyUp (xEvent) { + try { + let xElem = xEvent.target; + if (xElem.id) { + console.log(xElem.id); + } } catch (e) { showError(e); } } @@ -80,17 +92,22 @@ try { if (oResult) { let xNodeDiv = createNode("div", {className: "grammalecte_paragraph_block"}); // actions let xActionsBar = createNode("div", {className: "grammalecte_paragraph_actions"}); - xActionsBar.appendChild(createNode("div", {id: "grammalecte_check" + oResult.sParaNum, className: "button green", textContent: "Réanalyser"})); - xActionsBar.appendChild(createNode("div", {id: "grammalecte_hide" + oResult.sParaNum, className: "button red bold", textContent: "×"})); + xActionsBar.appendChild(createNode("div", {id: "grammalecte_check" + oResult.iParaNum, className: "button green", textContent: "Réanalyser"})); + xActionsBar.appendChild(createNode("div", {id: "grammalecte_hide" + oResult.iParaNum, className: "button red bold", textContent: "×"})); // paragraph - let xParagraph = createNode("p", {id: "grammalecte_paragraph"+oResult.sParaNum, lang: "fr", contentEditable: "true"}); + let xParagraph = createNode("p", {id: "grammalecte_paragraph"+oResult.iParaNum, lang: "fr", contentEditable: "true"}, {para_num: oResult.iParaNum}); xParagraph.setAttribute("spellcheck", "false"); // doesn’t seem possible to use “spellcheck” as a common attribute. xParagraph.className = (oResult.aGrammErr.length || oResult.aSpellErr.length) ? "grammalecte_paragraph softred" : "grammalecte_paragraph"; - this._tagParagraph(xParagraph, oResult.sParagraph, oResult.sParaNum, oResult.aGrammErr, oResult.aSpellErr); + xParagraph.addEventListener("keyup", function (xEvent) { + this.oTAC.setParagraph(parseInt(xEvent.target.dataset.para_num), this.purgeText(xEvent.target.textContent)); + this.oTAC.write(); + }.bind(this) + , true); + this._tagParagraph(xParagraph, oResult.sParagraph, oResult.iParaNum, oResult.aGrammErr, oResult.aSpellErr); // creation xNodeDiv.appendChild(xActionsBar); xNodeDiv.appendChild(xParagraph); this.xParagraphList.appendChild(xNodeDiv); } @@ -98,23 +115,22 @@ catch (e) { showError(e); } }, - recheckParagraph: function (sParagraphNum) { - let sParagraphId = "grammalecte_paragraph" + sParagraphNum; + recheckParagraph: function (iParaNum) { + let sParagraphId = "grammalecte_paragraph" + iParaNum; let xParagraph = document.getElementById(sParagraphId); this.blockParagraph(xParagraph); - let sText = this.getPurgedTextOfParagraph(xParagraph.textContent); + let sText = this.purgeText(xParagraph.textContent); xPort.postMessage({ sCommand: "parseAndSpellcheck1", dParam: {sText: sText, sCountry: "FR", bDebug: false, bContext: false}, dInfo: {sParagraphId: sParagraphId} }); - this.oTAC.setParagraph(parseInt(sParagraphNum), sText); + this.oTAC.setParagraph(iParaNum, sText); this.oTAC.write(); - //stopWaitIcon(); }, refreshParagraph: function (sParagraphId, oResult) { try { let xParagraph = document.getElementById(sParagraphId); @@ -126,11 +142,11 @@ catch (e) { showError(e); } }, - _tagParagraph: function (xParagraph, sParagraph, sParaNum, aSpellErr, aGrammErr) { + _tagParagraph: function (xParagraph, sParagraph, iParaNum, aSpellErr, aGrammErr) { try { if (aGrammErr.length === 0 && aSpellErr.length === 0) { xParagraph.textContent = sParagraph; return } @@ -146,12 +162,12 @@ let nEndLastErr = 0; for (let oErr of aGrammErr) { let nStart = oErr["nStart"]; let nEnd = oErr["nEnd"]; if (nStart >= nEndLastErr) { - oErr['sErrorId'] = sParaNum + "-" + nErr.toString(); // error identifier - oErr['sIgnoredKey'] = sParaNum + ":" + nStart.toString() + ":" + sParagraph.slice(nStart, nEnd); + oErr['sErrorId'] = iParaNum + "-" + nErr.toString(); // error identifier + oErr['sIgnoredKey'] = iParaNum + ":" + nStart.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", ""); @@ -187,17 +203,14 @@ xNodeErr.className = (this.aIgnoredErrors.has(xNodeErr.dataset.ignored_key)) ? "ignored" : "error " + oErr['sType']; return xNodeErr; }, blockParagraph: function (xParagraph) { - xParagraph.style = "background-color: hsl(30, 100%, 80%)"; - xParagraph.disabled = true; xParagraph.contentEditable = "false"; }, freeParagraph: function (xParagraph) { - xParagraph.style = ""; xParagraph.contentEditable = "true"; }, applySuggestion: function (sNodeSuggId) { // sugg try { @@ -208,11 +221,11 @@ let xNodeErr = document.getElementById("grammalecte_err" + sErrorId); xNodeErr.textContent = document.getElementById(sNodeSuggId).textContent; xNodeErr.className = "corrected"; xNodeErr.removeAttribute("style"); this.oTooltip.hide(); - this.recheckParagraph(sErrorId.slice(0, sErrorId.indexOf("-"))); + this.recheckParagraph(parseInt(sErrorId.slice(0, sErrorId.indexOf("-")))); } catch (e) { showError(e); } }, @@ -230,11 +243,11 @@ catch (e) { showError(e); } }, - getPurgedTextOfParagraph: function (sText) { + purgeText: function (sText) { return sText.replace(/ /g, " ").replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&"); }, addSummary: function () { // todo @@ -330,10 +343,11 @@ } else { xGCSugg.textContent = "Aucune."; } } this.xTooltipArrow.style.display = "block"; + this.xTooltipArrow.style.border = "10px solid hsl(0, 0%, 0%)"; this.xTooltip.style.display = "block"; if (xNodeErr.dataset.error_type === "spelling") { // spelling mistake document.getElementById("grammalecte_tooltip_message").textContent = "Mot inconnu du dictionnaire."; document.getElementById("grammalecte_tooltip_ignore").dataset.error_id = xNodeErr.dataset.error_id; Index: gc_lang/fr/webext/gce_worker.js ================================================================== --- gc_lang/fr/webext/gce_worker.js +++ gc_lang/fr/webext/gce_worker.js @@ -186,16 +186,16 @@ } postMessage(createResponse("parse", null, dInfo, true)); } function parseAndSpellcheck (sText, sCountry, bDebug, bContext, dInfo={}) { - let n = 0; + let i = 0; for (let sParagraph of text.getParagraph(sText)) { let aGrammErr = gc_engine.parse(sParagraph, sCountry, bDebug, bContext); let aSpellErr = oTokenizer.getSpellingErrors(sParagraph, oDict); - postMessage(createResponse("parseAndSpellcheck", {sParagraph: sParagraph, sParaNum: n.toString(), aGrammErr: aGrammErr, aSpellErr: aSpellErr}, dInfo, false)); - n += 1; + postMessage(createResponse("parseAndSpellcheck", {sParagraph: sParagraph, iParaNum: i, aGrammErr: aGrammErr, aSpellErr: aSpellErr}, dInfo, false)); + i += 1; } postMessage(createResponse("parseAndSpellcheck", null, dInfo, true)); } function parseAndSpellcheck1 (sParagraph, sCountry, bDebug, bContext, dInfo={}) {