Index: gc_lang/fr/webext/background.js ================================================================== --- gc_lang/fr/webext/background.js +++ gc_lang/fr/webext/background.js @@ -94,12 +94,11 @@ } browser.runtime.onMessage.addListener(handleMessage); -function handleConnexion (p) { - var xPort = p; +function handleConnexion (xPort) { let iPortId = xPort.sender.tab.id; // identifier for the port: each port can be found at dConnx[iPortId] console.log("tab_id: " + iPortId); dConnx.set(iPortId, xPort); xPort.onMessage.addListener(function (oRequest) { console.log("[background] message via connexion:"); @@ -144,11 +143,11 @@ type: "separator", contexts: ["selection"] }); browser.contextMenus.create({ - id: "conjugueur_panel", + id: "conjugueur_window", title: "Conjugueur [fenêtre]", contexts: ["all"] }); browser.contextMenus.create({ @@ -155,82 +154,96 @@ id: "conjugueur_tab", title: "Conjugueur [onglet]", contexts: ["all"] }); -function onCreated(windowInfo) { - console.log(`Created window: ${windowInfo.id}`); -} - -function onError(error) { - console.log(`Error: ${error}`); -} - - -browser.contextMenus.onClicked.addListener(function (xInfo, xTab) { - // xInfo = https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/contextMenus/OnClickData - // xTab = https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/Tab - console.log(xInfo); - console.log(xTab); - console.log("Item " + xInfo.menuItemId + " clicked in tab " + xTab.id); - console.log("editable: " + xInfo.editable + " · selected: " + xInfo.selectionText); - // confusing: no way to get the node where we click?! - switch (xInfo.menuItemId) { - case "parseAndSpellcheck": { - let xPort = dConnx.get(xTab.id); - xPort.postMessage({sActionDone: "openGCPanel", result: null, dInfo: null, bEnd: false, bError: false}); - xGCEWorker.postMessage({ - sCommand: "parseAndSpellcheck", - dParam: {sText: xInfo.selectionText, sCountry: "FR", bDebug: false, bContext: false}, - dInfo: {iReturnPort: xTab.id} - }); - break; - } - case "getListOfTokens": { - let xPort = dConnx.get(xTab.id); - xPort.postMessage({sActionDone: "openLxgPanel", result: null, dInfo: null, bEnd: false, bError: false}); - xGCEWorker.postMessage({ - sCommand: "getListOfTokens", - dParam: {sText: xInfo.selectionText}, - dInfo: {iReturnPort: xTab.id} - }); - break; - } - case "conjugueur_panel": - let xConjWindow = browser.windows.create({ - url: browser.extension.getURL("panel/conjugueur.html"), - type: "detached_panel", - width: 710, - height: 980 - }); - xConjWindow.then(onCreated, onError); - break; - case "conjugueur_tab": - let xConjTab = browser.tabs.create({ - url: browser.extension.getURL("panel/conjugueur.html") - }); - xConjTab.then(onCreated, onError); - break; - } -}); - - - -/* - TESTS ONLY -*/ -async function newwin () { - // test for popup window-like, which doesn’t close when losing the focus - console.log("Async on"); - const getActive = browser.tabs.query({ currentWindow: true, active: true, }); - const xWindowInfo = await browser.windows.getLastFocused(); - const width = 710, height = 980; // the maximum size for panels is somewhere around 700x800. Firefox needs some additional pixels: 14x42 for FF54 on Win 10 with dpi 1.25 - const left = Math.round(xWindowInfo.left + xWindowInfo.width - width - 25); - const top = Math.round(xWindowInfo.top + 74); // the actual frame height of the main window varies, but 74px should place the pop-up at the bottom if the button - const xWin = await browser.windows.create({ - type: 'panel', url: browser.extension.getURL("panel/conjugueur.html"), top: top, left: left, width: width, height: height, - }); - browser.windows.update(xWin.id, { top:top, left:left, }); // firefox currently ignores top and left in .create(), so move it here - console.log("Async done"); -} - -//newwin(); + +browser.contextMenus.onClicked.addListener(function (xInfo, xTab) { + // xInfo = https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/contextMenus/OnClickData + // xTab = https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/Tab + //console.log(xInfo); + //console.log(xTab); + // confusing: no way to get the node where we click?! + switch (xInfo.menuItemId) { + case "parseAndSpellcheck": + parseAndSpellcheckSelectedText(xTab.id, xInfo.selectionText); + break; + case "getListOfTokens": + getListOfTokensFromSelectedText(xTab.id, xInfo.selectionText); + break; + case "conjugueur_window": + openConjugueurWindow(); + break; + case "conjugueur_tab": + openConjugueurTab(); + break; + } +}); + + +/* + Keyboard shortcuts +*/ +browser.commands.onCommand.addListener(function (sCommand) { + switch (sCommand) { + case "conjugueur_tab": + openConjugueurTab(); + break; + case "conjugueur_window": + openConjugueurWindow(); + break; + } +}); + + +/* + Actions +*/ +function parseAndSpellcheckSelectedText (iTab, sText) { + // send message to the tab + let xTabPort = dConnx.get(iTab); + xTabPort.postMessage({sActionDone: "openGCPanel", result: null, dInfo: null, bEnd: false, bError: false}); + // send command to the worker + xGCEWorker.postMessage({ + sCommand: "parseAndSpellcheck", + dParam: {sText: sText, sCountry: "FR", bDebug: false, bContext: false}, + dInfo: {iReturnPort: iTab} + }); +} + +function getListOfTokensFromSelectedText (iTab, sText) { + // send message to the tab + let xTabPort = dConnx.get(iTab); + xTabPort.postMessage({sActionDone: "openLxgPanel", result: null, dInfo: null, bEnd: false, bError: false}); + // send command to the worker + xGCEWorker.postMessage({ + sCommand: "getListOfTokens", + dParam: {sText: sText}, + dInfo: {iReturnPort: iTab} + }); +} + +function openConjugueurTab () { + let xConjTab = browser.tabs.create({ + url: browser.extension.getURL("panel/conjugueur.html") + }); + xConjTab.then(onCreated, onError); +} + +function openConjugueurWindow () { + let xConjWindow = browser.windows.create({ + url: browser.extension.getURL("panel/conjugueur.html"), + type: "detached_panel", + width: 710, + height: 980 + }); + xConjWindow.then(onCreated, onError); +} + + +function onCreated (windowInfo) { + console.log(`Created window: ${windowInfo.id}`); +} + +function onError (error) { + console.log(`Error: ${error}`); +} Index: gc_lang/fr/webext/manifest.json ================================================================== --- gc_lang/fr/webext/manifest.json +++ gc_lang/fr/webext/manifest.json @@ -51,10 +51,24 @@ "content_scripts/lxg_content.js", "content_scripts/content_modifier.js" ] } ], + "commands": { + "conjugueur_tab": { + "suggested_key": { + "default": "Ctrl+Shift+F6" + }, + "description": "Ouvre le conjugueur dans un onglet" + }, + "conjugueur_window": { + "suggested_key": { + "default": "Ctrl+Shift+F7" + }, + "description": "Ouvre le conjugueur dans une fenêtre" + } + }, "web_accessible_resources": [ "grammalecte/_dictionaries/French.json", "grammalecte/fr/conj_data.json", "grammalecte/fr/mfsp_data.json", "grammalecte/fr/phonet_data.json", Index: gc_lang/fr/webext/panel/main.css ================================================================== --- gc_lang/fr/webext/panel/main.css +++ gc_lang/fr/webext/panel/main.css @@ -66,16 +66,16 @@ /* Main classes */ html { box-sizing: border-box; - width: 530px; + width: 400px; height: 500px; font-family: "Trebuchet MS", "Liberation Sans", sans-serif; } body { - width: 530px; + width: 400px; height: 500px; } /* Maximal height of a panel in WebExtention seems to be 500px. When going over this limit, a scrollbar appears which destructs the @@ -132,11 +132,14 @@ #home_page { display: block; padding: 20px; } - +#help_page { + display: none; + padding: 20px; +} #gc_options_page { display: none; padding: 20px; } #sc_options_page { Index: gc_lang/fr/webext/panel/main.html ================================================================== --- gc_lang/fr/webext/panel/main.html +++ gc_lang/fr/webext/panel/main.html @@ -14,10 +14,11 @@ @@ -24,25 +25,89 @@
-

GRAMMALECTE

-
TEST
+

Grammalecte

+

+ Version ${version} +

+

+ GPL 3 · Site web +

+ + + +
+ +
+

AIDE

+
+

+

+

+

+

+

+

OPTIONS GRAMMATICALES

+
+ ${optionsHTML} +
+

Options par défaut

OPTIONS ORTHOGRAPHIQUES

+
+

+
+

+

Ce dictionnaire propose l’orthographe telle qu’elle est écrite aujourd’hui le plus couramment. C’est le dictionnaire recommandé si le français n’est pas votre langue maternelle ou si vous ne désirez qu’une seule graphie correcte par mot.

+
+
+

+

Il s’agit du dictionnaire “Moderne”, avec des graphies classiques en sus, certaines encore communément utilisées, d’autres désuètes. C’est le dictionnaire recommandé si le français est votre langue maternelle.

+
+
+

+

Avec ce dictionnaire, seule l’orthographe réformée est reconnue. Attendu que bon nombre de graphies réformées sont considérées comme erronées par beaucoup, ce dictionnaire est déconseillé. Les graphies passées dans l’usage sont déjà incluses dans le dictionnaire “Moderne”.

+
+
+

+

Ce dictionnaire contient les variantes graphiques, classiques, réformées, ainsi que d’autres plus rares encore. Ce dictionnaire est déconseillé à ceux qui ne connaissent pas très bien la langue française.

+
+

TESTS

+
Page for tests
Tests complets
Analyser

         
@@ -53,5 +118,6 @@ +