Index: gc_lang/fr/config.ini ================================================================== --- gc_lang/fr/config.ini +++ gc_lang/fr/config.ini @@ -4,11 +4,11 @@ locales = fr_FR fr_BE fr_CA fr_CH fr_LU fr_BF fr_BJ fr_CD fr_CI fr_CM fr_MA fr_ML fr_MU fr_NE fr_RE fr_SN fr_TG country_default = FR name = Grammalecte implname = grammalecte # always use 3 numbers for version: x.y.z -version = 1.12 +version = 1.12.0 author = Olivier R. provider = Grammalecte.net link = https://grammalecte.net description = Correcteur grammatical, orthographique et typographique pour le français. extras = README_fr.txt Index: gc_lang/fr/webext/content_scripts/editor.js ================================================================== --- gc_lang/fr/webext/content_scripts/editor.js +++ gc_lang/fr/webext/content_scripts/editor.js @@ -3,10 +3,23 @@ // Editor for HTML page "use strict"; + +// Exception list +var oGrammalecteExclusions = new Set([ + "twitter.com" +]); + + +var oGrammalecteMessages = { + "no_text_area": "⛔ Aucun champ textuel défini. Les changements ne seront pas répercutés sur la zone d’où le texte a été extrait.", + "format_warning": "❗ La zone de texte est un champ textuel enrichi. Les éléments de formatage direct (non textuels) sont susceptibles d’être effacés lors de la correction.", + "excluded_site": "⛔ Renvoyer les corrections sur ce site s’avère difficile à cause des interférences possibles. La zone d’où a été extrait le texte ne sera pas modifiée. Vous pouvez copier le texte dans le presse-papiers avec le bouton 📋 ci-dessus." +}; + /* Text Editor */ var oGrammalecteTextEditor = { @@ -66,10 +79,11 @@ class HTMLPageEditor { constructor (xWhat, xResultNode=null, bCheckSignature=true) { this.xWhat = xWhat; this.bIframe = false; + this.bWrite = !oGrammalecteExclusions.has(document.location.host); //console.log(xWhat); if (xWhat.tagName && xWhat.tagName == "IFRAME") { // iframe this.xDocument = xWhat.contentWindow.document; this.bIframe = true; @@ -92,11 +106,17 @@ } this.lNode = []; this.bCheckSignature = bCheckSignature; this._lParsableNodes = ["P", "LI", "H1", "H2", "H3", "H4", "H5", "H6"]; this._lRootNodes = ["DIV", "UL", "OL"]; - oGrammalecte.oGCPanel.addMessageToGCPanel("❗ Les éléments de formatage direct (non textuels) sont susceptibles d’être effacés lors de la correction."); + if (!this.bWrite) { + // we don’t write back to the page + oGrammalecte.oGCPanel.addMessageToGCPanel(oGrammalecteMessages["excluded_site"]); + oGrammalecte.oGCPanel.highlightClipboardButton(); + } else { + oGrammalecte.oGCPanel.addMessageToGCPanel(oGrammalecteMessages["format_warning"]); + } let sText = this.getTextFromPage(); oGrammalecteTextEditor.loadText(sText); } * _getParsableNodes (xRootNode) { @@ -178,10 +198,13 @@ oGrammalecteTextEditor.loadText(sText); this.write(); } write () { + if (!this.bWrite) { + return; + } for (let [i, sParagraph] of oGrammalecteTextEditor.getParagraphs()) { if (i < this.lNode.length) { this.lNode[iParagraph].textContent = sParagraph; } } @@ -202,20 +225,21 @@ class TextNodeEditor { constructor (what, xResultNode=null) { this.xNode = null; this.bTextArea = false; + this.bWrite = !oGrammalecteExclusions.has(document.location.host); this.bResultInEvent = false; // if true, the node content is not modified, but an event is dispatched on the node with the modified text this.xResultNode = null; // only useful for text analysed without node if (xResultNode instanceof HTMLElement) { this.xResultNode = xResultNode; this.bResultInEvent = true; } if (typeof(what) == "string") { // SIMPLE TEXT if (!this.xResultNode) { - oGrammalecte.oGCPanel.addMessageToGCPanel("⛔ Aucun champ textuel défini. Les changements ne seront pas répercutés sur la zone d’où le texte a été extrait."); + oGrammalecte.oGCPanel.addMessageToGCPanel(oGrammalecteMessages["no_text_area"]); } this.loadText(what); } else if (what.nodeType && what.nodeType === 1) { // NODE @@ -227,11 +251,17 @@ this.xNode.disabled = true; this.loadText(this.xNode.value); } else { // editable node - oGrammalecte.oGCPanel.addMessageToGCPanel("❗ La zone de texte analysée est un champ textuel enrichi susceptible de contenir des éléments non textuels qui seront effacés lors de la correction."); + if (!this.bWrite) { + // we don’t write back to the page + oGrammalecte.oGCPanel.addMessageToGCPanel(oGrammalecteMessages["excluded_site"]); + oGrammalecte.oGCPanel.highlightClipboardButton(); + } else { + oGrammalecte.oGCPanel.addMessageToGCPanel(oGrammalecteMessages["format_warning"]); + } this.loadText(this.xNode.innerText); } } } @@ -242,15 +272,15 @@ } clear () { if (this.xNode !== null) { this.xNode.disabled = false; - this.bTextArea = false; - this.bResultInEvent = false; - this.xNode = null; - this.xResultNode = null; } + this.bTextArea = false; + this.bResultInEvent = false; + this.xNode = null; + this.xResultNode = null; oGrammalecteTextEditor.clear(); } getText () { return oGrammalecteTextEditor.getText(); @@ -270,10 +300,13 @@ this.xNode.removeChild(this.xNode.firstChild); } } write () { + if (!this.bWrite) { + return; + } if (this.xNode !== null) { if (this.bResultInEvent) { const xEvent = new CustomEvent("GrammalecteResult", { detail: JSON.stringify({ sType: "text", sText: oGrammalecteTextEditor.getText() }) }); this.xNode.dispatchEvent(xEvent); //console.log("[Grammalecte debug] Text sent to xNode via event:", xEvent.detail); Index: gc_lang/fr/webext/content_scripts/panel.css ================================================================== --- gc_lang/fr/webext/content_scripts/panel.css +++ gc_lang/fr/webext/content_scripts/panel.css @@ -69,16 +69,16 @@ font-size: 14px; font-weight: bold; text-align: center; cursor: pointer; } -div.grammalecte_copy_button { +div.grammalecte_clipboard_button { border-radius: 2px; color: hsla(210, 0%, 100%, .4); margin-right: 10px; } -div.grammalecte_copy_button:hover { +div.grammalecte_clipboard_button:hover { background-color: hsl(210, 50%, 55%); color: hsla(210, 0%, 100%, 1); } div.grammalecte_move_button { padding: 1px 5px; @@ -213,11 +213,26 @@ font-family: "Trebuchet MS", "Fira Sans", "Ubuntu Condensed", "Liberation Sans", sans-serif; font-size: 14px; } +/* + Clipboard animation +*/ +div.grammalecte_clipboard_animation { + animation: grammalecte-clipboard-animation 7s 1; +} +@keyframes grammalecte-clipboard-animation { + 0% { color: hsla(210, 0%, 100%, .4); background-color: hsla(210, 100%, 80%, .1); } + 10% { color: hsla(210, 0%, 100%, 1); background-color: hsla(210, 100%, 80%, .9); } + 30% { color: hsla(210, 0%, 100%, 1); background-color: hsla(210, 100%, 80%, .1); } + 50% { color: hsla(210, 0%, 100%, 1); background-color: hsla(210, 100%, 80%, .9); } + 70% { color: hsla(210, 0%, 100%, 1); background-color: hsla(210, 100%, 80%, .1); } + 90% { color: hsla(210, 0%, 100%, 1); background-color: hsla(210, 100%, 80%, .9); } + 100% { color: hsla(210, 0%, 100%, .4); background-color: hsla(210, 100%, 80%, 0); } +} /* Spinner */ Index: gc_lang/fr/webext/content_scripts/panel.js ================================================================== --- gc_lang/fr/webext/content_scripts/panel.js +++ gc_lang/fr/webext/content_scripts/panel.js @@ -92,11 +92,11 @@ let xWaitIcon = oGrammalecte.createNode("div", {className: "grammalecte_spinner"}); return xWaitIcon; } _createCopyButton () { - let xButton = oGrammalecte.createNode("div", {id: "grammalecte_clipboard_button", className: "grammalecte_panel_button grammalecte_copy_button", textContent: "📋", title: "Copier le contenu de l’éditeur dans le presse-papiers"}); + let xButton = oGrammalecte.createNode("div", {id: "grammalecte_clipboard_button", className: "grammalecte_panel_button grammalecte_clipboard_button", textContent: "📋", title: "Copier le contenu de l’éditeur dans le presse-papiers"}); xButton.onclick = () => { this.copyTextToClipboard(); }; return xButton; } _createMoveButton (sAction, sLabel, sTitle) { @@ -251,10 +251,17 @@ stopWaitIcon () { this.bWorking = false; this.xWaitIcon.style.visibility = "hidden"; } + + highlightClipboardButton () { + console.log("$$$$"); + this.xClipboardButton.classList.remove("grammalecte_clipboard_animation"); + this.xClipboardButton.classList.add("grammalecte_clipboard_animation"); + console.log("$$$$"); + } showMessage (sMessage, sActionMessage="", sActionName="") { this.xPanelMessageBlock.style.display = "block"; this.xPanelMessage.textContent = sMessage; if (sActionMessage) {