Index: gc_lang/fr/build.py ================================================================== --- gc_lang/fr/build.py +++ gc_lang/fr/build.py @@ -7,12 +7,23 @@ import helpers def build (sLang, dVars, spLangPack): "complementary build launched from make.py" - createFirefoxExtension(sLang, dVars) - createThunderbirdExtension(sLang, dVars, spLangPack) + #createFirefoxExtension(sLang, dVars) + createWebExtension(sLang, dVars) + #createThunderbirdExtension(sLang, dVars, spLangPack) + + +def createWebExtension (sLang, dVars): + "create Web-extension" + print("Building Web-extension") + helpers.createCleanFolder("_build/webext/"+sLang) + dir_util.copy_tree("gc_lang/"+sLang+"/webext/", "_build/webext/"+sLang) + dir_util.copy_tree("grammalecte-js", "_build/webext/"+sLang+"/grammalecte") + with helpers.cd("_build/webext/"+sLang): + os.system("web-ext build") def createFirefoxExtension (sLang, dVars): "create extension for Firefox" print("Building extension for Firefox") Index: gc_lang/fr/config.ini ================================================================== --- gc_lang/fr/config.ini +++ gc_lang/fr/config.ini @@ -28,10 +28,12 @@ oxt_identifier = French.linguistic.resources.from.Dicollecte.by.OlivierR # Firefox fx_identifier = French-GC@grammalecte.net fx_name = Grammalecte [fr] + +fx_nightly_path = C:\Program Files (x86)\Nightly\firefox.exe # Thunderbird tb_identifier = French-GC-TB@grammalecte.net tb_name = Grammalecte [fr] tb_debug_extension_path = _build/tb-debug.profile/extensions/French-GC-TB@grammalecte.net Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -4467,11 +4467,11 @@ __[i](p_du_même_ordre_coup)__ du même (?:ordre|coup) <<- ~>> * __[i](p_en_nombre_années)__ en \d\d+(?: ans| années|) <<- ~>> * __[i](p_en_cours)__ en cours(?! d[e’]) <<- ~>> * __[i](p_en_pronom)__ en (?:[mt]oi|eux|elles?) <<- ~>> * __[i](p_en_qqch1)__ en (?:aparté|apparence|arrière|avance|avant|cachette|ceci|cela|clair|commun|conséquence|continu|contrepartie|définitive|détail|direct|douce|effet|émoi|filigrane|général|goguette|hâte|majorité|outre|pâmoison|parallèle|partie|particulier|permanence|personne|pratique|prime|privé|principe|priorité|public|réalité|retour|revanche|rien|rogne|route|secret|silence|somme|suspens|théorie|trompe-l’œil|vain|vérité|ville|vitesse) <<- ~>> * -__[i](p_en_qqch2)__ en (?:aucun(?: cas|e (?:circonstance|façon|manière))|bon(?: état|ne (?:compagnie|et due forme|posture|santé(?: physique| mentale|)|voie))|bout de course|cas d(?:e (?:besoin|doute)|’urgence)|chacune? d(?:e [nv]ous|’(?:eux|elles))|chair et en os|chute libre|comparution immédiate|connaissance de cause|coupe réglée|cours de route|d’autres (?:circonstances|termes|temps)|de telles circonstances|début d(?:e (?:journée|matinée|soirée)|’après-midi)|définitive|dehors de (?:tout|)(?:ça|cela|ceci)|dents de scie|dernier (?:lieu|recours|ressort)|désespoir de cause|détention provisoire|direction d(?:u (?:nord|sud)(?:-est|-ouest|)|e l’(?:est|ouest))|état (?:de (?:choc(?: circulatoire|)|marche)|d’ébriété(?: avancée|))|excellent état|file indienne|fin d(?:e (?:compte|journée|matinée|soirée)|’après-midi)|forte (?:baisse|hausse)|garde à vue(?: prolongée|)|grand(?: nombre|e (?:difficulté|majorité|partie|pompe))|haut lieu|l’occurrence|lieu sûr|ligne de (?:compte|mire)|mains propres|mauvais(?: état|e (?:posture|santé))|même temps|milieu d(?:e (?:journée|matinée|soirée)|’après-midi)|nombre (?:plus que |)suffisant|partant de zéro|plein(?: air| cœur| jour|e (?:gueule|figure|forme|nuit))|perte de vitesse|peu de temps|piteux état|point de mire|position de force|premi(?:er lieu|ère (?:instance|ligne))|pure perte|quantité (?:plus que |)suffisante|quelque sorte|queue de peloton|rangs serrés|rase campagne|règle générale|roue libre|sens inverse|si peu de temps|sous-main|tête à tête|temps (?:et en heure|normal|opportun|ordinaire|utile|voulu)|termes choisis|toile de fond|tous (?:les cas|sens)|tout (?:bien tout honneur|cas|genre|lieu|et pour tout|état de cause|premier lieu|sens|temps)|toute(?: (?:bonne foi|circonstance|connaissance de cause|confiance|discrétion|franchise|hâte|impartialité|impunité|innocence|légalité|liberté|logique|sécurité|simplicité)|s circonstances)|un (?:clin d’œil|rien de temps)|une autre occasion|vase clos|voie de développement|y réfléchissant bien) <<- ~>> * +__[i](p_en_qqch2)__ en (?:aucun(?: cas|e (?:circonstance|façon|manière))|bon(?: état|ne (?:compagnie|et due forme|posture|santé(?: physique| mentale|)|voie))|bout de course|cas d(?:e (?:besoin|doute)|’urgence)|chacune? d(?:e [nv]ous|’(?:eux|elles))|chair et en os|chute libre|comparution immédiate|connaissance de cause|coupe réglée|cours de route|d’autres (?:circonstances|termes|temps)|de telles circonstances|début d(?:e (?:journée|matinée|soirée)|’après-midi)|définitive|dehors de (?:tout|)(?:ça|cela|ceci)|dents de scie|dernier (?:lieu|recours|ressort)|désespoir de cause|détention provisoire|direction d(?:u (?:nord|sud)(?:-est|-ouest|)|e l’(?:est|ouest))|état (?:de (?:choc(?: circulatoire|)|marche)|d’ébriété(?: avancée|))|excellent état|file indienne|fin d(?:e (?:compte|journée|matinée|soirée)|’après-midi)|forte (?:baisse|hausse)|garde à vue(?: prolongée|)|grand(?: nombre|e (?:difficulté|majorité|partie|pompe))|haut lieu|l’occurrence|lieu sûr|ligne de (?:compte|mire)|mains propres|mauvais(?: état|e (?:posture|santé))|même temps|milieu d(?:e (?:journée|matinée|soirée)|’après-midi)|nombre (?:plus que |)suffisant|partant de zéro|plein(?: air| cœur| jour|e (?:gueule|figure|forme|poire|nuit|tronche))|perte de vitesse|peu de temps|piteux état|point de mire|position de force|premi(?:er lieu|ère (?:instance|ligne))|pure perte|quantité (?:plus que |)suffisante|quelque sorte|queue de peloton|rangs serrés|rase campagne|règle générale|roue libre|sens inverse|si peu de temps|sous-main|tête à tête|temps (?:et en heure|normal|opportun|ordinaire|utile|voulu)|termes choisis|toile de fond|tous (?:les cas|sens)|tout (?:bien tout honneur|cas|genre|lieu|et pour tout|état de cause|premier lieu|sens|temps)|toute(?: (?:bonne foi|circonstance|connaissance de cause|confiance|discrétion|franchise|hâte|impartialité|impunité|innocence|légalité|liberté|logique|sécurité|simplicité)|s circonstances)|un (?:clin d’œil|rien de temps)|une autre occasion|vase clos|voie de développement|y réfléchissant bien) <<- ~>> * __[i](p_en_mois_dernier)__ en (?:janvier|février|mars|avril|mai|jui(?:n|llet)|ao[ûu]t|septembre|octobre|novembre|décembre) dernier <<- ~>> * __[i](p_en_dat_mas_qqch)__ en (?:[mts]on|leur|[nv]otre) (?:âme et conscience|for intérieur|nom propre) <<- ~>> * __[i](p_en_ce_qqch)__ en ce(?: (?:moment|temps-là|qui (?:[mt]e|l(?:es?|a)|[nv]ous) concern(?:e|ait))|t instant) <<- ~>> * __[i](p_encore_qqch)__ encore (?:une fois|et (?:encore|toujours)) <<- ~>> * __[i](p_envers_qqch)__ envers (?:autrui|et contre tout|les uns et les autres|tout le monde) <<- ~>> * ADDED gc_lang/fr/webext/README.md Index: gc_lang/fr/webext/README.md ================================================================== --- /dev/null +++ gc_lang/fr/webext/README.md @@ -0,0 +1,22 @@ +# Grammalecte + +**French Grammar Checker** + +écrit en JavaScript ES6/ES7 +par Olivier R. + +## Fonctionnalités ## + +* correcteur grammatical +* conjugueur +* formateur de texte +* lexicographe + +## Site web ## + +https://grammalecte.net + +## Licence ## + +GNU GPL 3.0+ +http://www.gnu.org/copyleft/gpl.html ADDED gc_lang/fr/webext/content_scripts/modify_page.js Index: gc_lang/fr/webext/content_scripts/modify_page.js ================================================================== --- /dev/null +++ gc_lang/fr/webext/content_scripts/modify_page.js @@ -0,0 +1,25 @@ + +function do_something (request, sender, sendResponse) { + //removeEverything(); + change(request.myparam); + console.log("DONE!!"); + browser.runtime.onMessage.removeListener(do_something); +} + +function removeEverything () { + while (document.body.firstChild) { + document.body.firstChild.remove(); + } +} + +function change (param) { + document.getElementById("title").setAttribute("background-color", "#809060"); + console.log("param: " + param); + document.getElementById("title").setAttribute("background-color", "#FF0000"); +} + + +/* + Assign do_something() as a listener for messages from the extension. +*/ +browser.runtime.onMessage.addListener(do_something); ADDED gc_lang/fr/webext/gce_worker.js Index: gc_lang/fr/webext/gce_worker.js ================================================================== --- /dev/null +++ gc_lang/fr/webext/gce_worker.js @@ -0,0 +1,120 @@ +// Background script +// for calling the grammar checker engine + + +let gce = null; // module: grammar checker engine +let text = null; +let tkz = null; // module: tokenizer +let lxg = null; // module: lexicographer +let helpers = null; + +let oTokenizer = null; +let oDict = null; +let oLxg = null; + +function loadGrammarChecker (sGCOptions="", sContext="JavaScript") { + if (gce === null) { + try { + gce = require("resource://grammalecte/fr/gc_engine.js"); + helpers = require("resource://grammalecte/helpers.js"); + text = require("resource://grammalecte/text.js"); + tkz = require("resource://grammalecte/tokenizer.js"); + lxg = require("resource://grammalecte/fr/lexicographe.js"); + oTokenizer = new tkz.Tokenizer("fr"); + helpers.setLogOutput(console.log); + gce.load(sContext); + oDict = gce.getDictionary(); + oLxg = new lxg.Lexicographe(oDict); + if (sGCOptions !== "") { + gce.setOptions(helpers.objectToMap(JSON.parse(sGCOptions))); + } + // we always retrieve options from the gce, for setOptions filters obsolete options + return gce.getOptions()._toString(); + } + catch (e) { + console.log("# Error: " + e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message); + } + } +} + +function parse (sText, sLang, bDebug, bContext) { + let aGrammErr = gce.parse(sText, sLang, bDebug, bContext); + return JSON.stringify(aGrammErr); +} + +function parseAndSpellcheck (sText, sLang, bDebug, bContext) { + let aGrammErr = gce.parse(sText, sLang, bDebug, bContext); + let aSpellErr = oTokenizer.getSpellingErrors(sText, oDict); + return JSON.stringify({ aGrammErr: aGrammErr, aSpellErr: aSpellErr }); +} + +function getOptions () { + return gce.getOptions()._toString(); +} + +function getDefaultOptions () { + return gce.getDefaultOptions()._toString(); +} + +function setOptions (sGCOptions) { + gce.setOptions(helpers.objectToMap(JSON.parse(sGCOptions))); + return gce.getOptions()._toString(); +} + +function setOption (sOptName, bValue) { + gce.setOptions(new Map([ [sOptName, bValue] ])); + return gce.getOptions()._toString(); +} + +function resetOptions () { + gce.resetOptions(); + return gce.getOptions()._toString(); +} + +function fullTests (sGCOptions="") { + if (!gce || !oDict) { + return "# Error: grammar checker or dictionary not loaded." + } + let dMemoOptions = gce.getOptions(); + if (sGCOptions) { + gce.setOptions(helpers.objectToMap(JSON.parse(sGCOptions))); + } + let tests = require("resource://grammalecte/tests.js"); + let oTest = new tests.TestGrammarChecking(gce); + let sAllRes = ""; + for (let sRes of oTest.testParse()) { + dump(sRes+"\n"); + sAllRes += sRes+"\n"; + } + gce.setOptions(dMemoOptions); + return sAllRes; +} + + +// Lexicographer + +function getListOfElements (sText) { + try { + let aElem = []; + let aRes = null; + for (let oToken of oTokenizer.genTokens(sText)) { + aRes = oLxg.getInfoForToken(oToken); + if (aRes) { + aElem.push(aRes); + } + } + return JSON.stringify(aElem); + } + catch (e) { + helpers.logerror(e); + } + return JSON.stringify([]); +} + + +function handleMessage (oRequest, xSender, sendResponse) { + console.log(`content script sent a message: ${oRequest.content}`); + sendResponse({response: "response from background script"}); +} + +browser.runtime.onMessage.addListener(handleMessage); ADDED gc_lang/fr/webext/img/logo-16.png Index: gc_lang/fr/webext/img/logo-16.png ================================================================== --- /dev/null +++ gc_lang/fr/webext/img/logo-16.png cannot compute difference between binary files ADDED gc_lang/fr/webext/img/logo-32.png Index: gc_lang/fr/webext/img/logo-32.png ================================================================== --- /dev/null +++ gc_lang/fr/webext/img/logo-32.png cannot compute difference between binary files ADDED gc_lang/fr/webext/img/logo-48.png Index: gc_lang/fr/webext/img/logo-48.png ================================================================== --- /dev/null +++ gc_lang/fr/webext/img/logo-48.png cannot compute difference between binary files ADDED gc_lang/fr/webext/img/logo-64.png Index: gc_lang/fr/webext/img/logo-64.png ================================================================== --- /dev/null +++ gc_lang/fr/webext/img/logo-64.png cannot compute difference between binary files ADDED gc_lang/fr/webext/img/logo-96.png Index: gc_lang/fr/webext/img/logo-96.png ================================================================== --- /dev/null +++ gc_lang/fr/webext/img/logo-96.png cannot compute difference between binary files ADDED gc_lang/fr/webext/manifest.json Index: gc_lang/fr/webext/manifest.json ================================================================== --- /dev/null +++ gc_lang/fr/webext/manifest.json @@ -0,0 +1,43 @@ +{ + "manifest_version": 2, + "name": "Grammalecte [fr]", + "short_name": "Grammalecte [fr]", + "version": "0.6", + + "applications": { + "gecko": { + "id": "French-GC@grammalecte.net", + "strict_min_version": "54.0" + } + }, + + "author": "Olivier R.", + "homepage_url": "https://grammalecte.net", + "offline_enabled": true, + + "description": "Correcteur grammatical pour le français.", + + "icons": { "16": "img/logo-16.png", + "32": "img/logo-32.png", + "48": "img/logo-48.png", + "64": "img/logo-64.png", + "96": "img/logo-96.png" }, + + "browser_action": { + "default_icon": "img/logo-32.png", + "default_popup": "panel/main.html", + "default_title": "Grammalecte [fr]", + "browser_style": false + }, + "background": { + "scripts": ["gce_worker.js"] + }, + "web_accessible_resources": [ + "beasts/frog.jpg", + "beasts/turtle.jpg", + "beasts/snake.jpg" + ], + "permissions": [ + "activeTab" + ] +} ADDED gc_lang/fr/webext/panel/main.css Index: gc_lang/fr/webext/panel/main.css ================================================================== --- /dev/null +++ gc_lang/fr/webext/panel/main.css @@ -0,0 +1,457 @@ +/* + flexbox: + https://css-tricks.com/snippets/css/a-guide-to-flexbox/ +*/ + + +/* reset */ + +* { margin: 0; padding: 0; } +img { border: none; } + + +/* Selection */ + +::-moz-selection { + background-color: hsl(210, 50%, 60%); + color: hsl(210, 20%, 100%); + text-shadow: 0 0 2px hsl(210, 80%, 20%); + border-radius: 2px; +} +::selection { + background-color: hsl(210, 50%, 60%); + color: hsl(210, 20%, 100%); + text-shadow: 0 0 2px hsl(210, 80%, 20%); + border-radius: 2px; +} + + +/* Generic classes */ + +.fleft { float: left; } +.fright { float: right; } + +.center { text-align: center; } +.right { text-align: right; } +.left { text-align: left; } +.justify { text-align: justify; } + +.hidden { display: none; } +.clearer { clear: both; font-size: 0; height: 0; } + +.red { background-color: hsl(0, 50%, 50%); color: hsl(0, 0%, 96%); } +.red:hover { background-color: hsl(0, 60%, 40%); color: hsl(0, 0%, 100%); } +.cyan { background-color: hsl(180, 50%, 50%); color: hsl(0, 0%, 96%); } +.cyan:hover { background-color: hsl(180, 60%, 40%); color: hsl(0, 0%, 100%); } +.green { background-color: hsl(120, 50%, 40%); color: hsl(120, 10%, 96%); } +.green:hover { background-color: hsl(120, 60%, 30%); color: hsl(120, 10%, 96%); } +.blue { background-color: hsl(210, 50%, 50%); color: hsl(210, 10%, 96%); } +.blue:hover { background-color: hsl(210, 60%, 40%); color: hsl(210, 10%, 96%); } + + +/* links */ + +a:link, a:visited { + color: hsl(210, 70%, 40%); + /*text-decoration: none;*/ +} +a:hover, a:active { + text-shadow: 0 0 2px hsl(210, 80%, 60%); +} + +a.extlink:hover:after { + content: " >"; +} + + +/* Main classes */ + +html { + box-sizing: border-box; + width: 530px; + height: 880px; + font-family: "Trebuchet MS", "Liberation Sans", sans-serif; +} +body { + width: 530px; + height: 880px; +} + +#main { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: stretch; + background-color: hsl(210, 0%, 100%); + min-height: 100%; +} + +#left { + width: 54px; + background-color: hsl(210, 10%, 96%); + border-right: solid 1px hsl(210, 0%, 70%); + color: hsl(210, 10%, 96%); +} +#logo { + padding: 10px; +} +#left li { + padding: 10px 5px; + border-bottom: 1px solid hsl(210, 10%, 90%); + text-align: center; + cursor: pointer; + color: hsl(210, 10%, 50%); + list-style-type: none; +} +#left li:hover { + background-color: hsl(210, 10%, 92%); + +} + +#page { + background-color: hsl(210, 0%, 100%); +} +#page h1 { + margin: 0 0 10px 0; + color: hsl(210, 70%, 70%); + font: bold 30px 'Yanone Kaffeesatz', "Liberation Sans Narrow", sans-serif; +} +#page p { + margin: 10px 0 5px 0; +} + +#home_page { + display: block; + padding: 20px; +} + +#tf_page { + display: none; + padding: 20px; +} +#gc_page { + display: none; + padding: 20px 20px 30px 20px; +} +#gc_options_page { + display: none; + padding: 20px; +} +#sc_options_page { + display: none; + padding: 20px; +} +#lxg_page { + display: none; + padding: 20px; +} + + +/* + Conjugueur page +*/ + +#conj_page { + display: none; + padding: 10px; +} + +#conj_page h2 { + margin: 5px 0 2px 0; + color: hsl(210, 50%, 50%); + font: bold 30px Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif; +} +#conj_page h3 { + margin: 5px 0 2px 0; + color: hsl(0, 50%, 50%); + font: bold 16px Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif; +} +#conj_page h4 { + margin: 5px 0 2px 0; + color: hsl(210, 50%, 50%); + font: bold 14px Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif; +} + +#conj_page .colonne { + float: left; + width: 240px; +} +#conj_page .colsep { + float: left; + width: 20px; +} + +#conj_page .colonne p { + font-size: 12px; +} + + +#conj_page input#verb { + display: inline-block; + width: 230px; + margin-left: 5px; + padding: 5px 10px; + border: 2px solid hsl(0, 0%, 80%); + border-radius: 3px; + height: 24px; + background: transparent; + font: normal 20px Tahoma, "Ubuntu Condensed"; + color: hsl(0, 0%, 30%); +} +#conj_page input[placeholder]#verb { + color: hsl(0, 0%, 70%); +} + +#conj_page a#conjugate { + display: inline-block; + padding: 7px 10px; + font-size: 20px; + background-color: hsl(0, 30%, 30%); + color: hsl(0, 30%, 60%); + border-radius: 3px; + text-transform: uppercase; + text-align: center; + text-decoration: none; +} +#conj_page a#conjugate:hover { + background-color: hsl(0, 60%, 40%); + color: hsl(0, 60%, 70%); + box-shadow: 0 0 2px hsl(0, 60%, 50%); +} + +#conj_options { + margin: 10px 5px 0 5px; + font-size: 16px; + text-align: center; +} + +#conj_smallnote { + float: right; + width: 190px; + margin: 15px 0 0 0; + padding: 0 5px; + font-size: 8.5px; + color: hsl(0, 0%, 60%); + text-align: center; +} + + +/* + Test page +*/ + +#test_page { + display: none; +} +#test_cmd { + padding: 15px; + background-color: hsl(0, 0%, 92%); + border-bottom: 1px solid hsl(0, 0%, 86%); +} +#test_cmd textarea { + width: 100%; + border: 2px solid hsl(0, 0%, 89%); + border-radius: 3px; + resize: vertical; +} + +#test_results { + padding: 15px; + background-color: hsl(0, 0%, 96%); +} + +#test_page .button { + display: inline-block; + padding: 5px 10px; + width: 120px; + border-radius: 3px; + font-size: 12px; + text-align: center; + cursor: pointer; +} + + +/* + Text formatter +*/ + +#tf_options { + +} + +#tf_options fieldset { + margin: 5px 0; + padding: 5px 10px 10px 10px; + background-color: hsl(0, 0%, 92%); + border-radius: 3px; +} + +#tf_options legend { + font-size: 20px; + color: hsla(210, 20%, 50%, .8); + font-weight: bold; +} +#tf_options legend span { + display: none; +} + +#tf_options fieldset h2 { + color: hsl(210, 80%, 40%); +} + +#tf_options fieldset .blockopt { + padding: 2px 3px; + font-size: 12.5px; +} +#tf_options fieldset .underline:hover { + background-color: hsl(180, 10%, 86%); + border-radius: 2px; +} + +#tf_options fieldset .option { + margin: 1px 3px 0 0; + float: left; +} +#tf_options legend .option { + margin: 7px 5px 0 3px; + float: left; +} + +#tf_options fieldset .opt_lbl { + display: inline-block; + color: hsl(0, 0%, 20%); +} + + +#tf_options fieldset .largew { + width: 300px; +} +#tf_options fieldset .reducedw { + width: 200px; +} +#tf_options fieldset .smallw { + width: 90px; +} + +#tf_options fieldset .secondoption { + display: inline-block; +} + +#tf_options fieldset label span { + display: none; +} + +#tf_options .groupblock { + opacity: 0.3; +} + +#tf_options .inlineblock { + display: inline-block; +} +#tf_options .indent { + margin-left: 15px; +} + +#tf_actions { + background-color: hsl(120, 10%, 92%); + padding: 15px; + border-top: 1px solid hsl(120, 20%, 86%); +} + +#tf_options .button { + display: inline-block; + padding: 5px 10px; + width: 100px; + border-radius: 3px; + font-size: 16px; + font-weight: bold; + text-align: center; + cursor: pointer; +} + +#tf_progressbarbox { + display: inline-block; + padding: 10px 20px; +} + + +/* + Other elements +*/ + +#movewindow { + position: fixed; + right: 0; + top: 50; + width: 16px; + margin-top: 60px; + z-index: 100; +} +#movewindow .arrow { + background-color: hsl(180, 60%, 50%); + cursor: pointer; + padding: 1px 3px; + font-size: 10px; + font-weight: bold; + text-align: center; + color: hsl(180, 50%, 90%); +} +#movewindow .arrow:hover { + background-color: hsl(180, 70%, 40%); + cursor: hsl(180, 50%, 96%); +} + +#rightcorner { + position: absolute; + top: 0; + right: 0; +} +a.rightcornerbutton1 { + float: right; + padding: 2px 10px 5px 10px; + border-radius: 0 0 0 3px; + font-size: 18px; + text-decoration: none; +} +a.rightcornerbutton { + float: right; + padding: 2px 10px 5px 10px; + font-size: 18px; + text-decoration: none; +} + + +/* + CSS Spinner + Double bounce + http://tobiasahlin.com/spinkit/ +*/ +.spinner { + width: 40px; + height: 40px; + position: absolute; + top: 2px; + right: 120px; +} +.double-bounce1, .double-bounce2 { + width: 100%; + height: 100%; + border-radius: 50%; + background-color: hsl(180, 50%, 75%); + opacity: 0.6; + position: absolute; + top: 0; + left: 0; + animation: sk-bounce 2.0s infinite ease-in-out; +} +.double-bounce2 { + animation-delay: -1.0s; +} + +@keyframes sk-bounce { + 0%, 100% { + transform: scale(0.0); + } 50% { + transform: scale(1.0); + } +} ADDED gc_lang/fr/webext/panel/main.html Index: gc_lang/fr/webext/panel/main.html ================================================================== --- /dev/null +++ gc_lang/fr/webext/panel/main.html @@ -0,0 +1,495 @@ + + + + + + + + + +
+ +
+ +
+ +
+
+
+
+
+
+ +
+ +
+

GRAMMALECTE

+
+ +
+

CORRECTEUR GRAMMATICAL

+
+
+ +
+

OPTIONS GRAMMATICALES

+
+ +
+

OPTIONS ORTHOGRAPHIQUES

+
+ +
+

LEXICOGRAPHE

+
+
+ +
+
+

TESTS

+ +
Tests complets
Analyser
+
+
+
+
+ +
+

CONJUGUEUR

+

+ + Conjuguer +

+ +

+ + +

+ + · + · +
+ · +

+ +

 

+

 

+ + +
+
+

Infinitif

+

 

+
+
+

Impératif

+

Présent

+

 

+

 

+

 

+
+
+ +
 
+ +
+
+

Participe présent

+

 

+
+
+

Participes passés

+

 

+

 

+

 

+

 

+
+
+ +
+ + +
+
+

Indicatif

+
+

Présent

+

 

+

 

+

 

+

 

+

 

+

 

+
+
+

Imparfait

+

 

+

 

+

 

+

 

+

 

+

 

+
+
+

Passé simple

+

 

+

 

+

 

+

 

+

 

+

 

+
+
+

Futur

+

 

+

 

+

 

+

 

+

 

+

 

+
+
+
+ +
 
+ +
+
+

Subjonctif

+
+

Présent

+

 

+

 

+

 

+

 

+

 

+

 

+
+
+

Imparfait

+

 

+

 

+

 

+

 

+

 

+

 

+
+
+
+

Conditionnel

+
+

Présent

+

 

+

 

+

 

+

 

+

 

+

 

+
+
+

 

+

 

+

 

+

 

+

 

+

 

+

 

+
+
+
+ +
+
+ +
+

FORMATEUR DE TEXTE

+
+ + +
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+ +
+
+
+ + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+ +
+
+
+ + +
+
+
+ + +
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ +
+
+ +
+
+
+
+ + +
+
+
+ +
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+  
+  
+  
+  
+  
+  
+
+
+
+ + +
+ +
+
+
+ + +
+ + +
+
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+ + +
+ +
+
+
+ + +
+
+
+ + +
+
+
+
+ +
+
Par défaut
+
Appliquer
+
+ +
+
+ +
+ +
+ + + + + ADDED gc_lang/fr/webext/panel/main.js Index: gc_lang/fr/webext/panel/main.js ================================================================== --- /dev/null +++ gc_lang/fr/webext/panel/main.js @@ -0,0 +1,70 @@ + +function showError (e) { + console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message); +} + +function beastNameToURL(beastName) { + switch (beastName) { + case "Frog": + return browser.extension.getURL("beasts/frog.jpg"); + case "Snake": + return browser.extension.getURL("beasts/snake.jpg"); + case "Turtle": + return browser.extension.getURL("beasts/turtle.jpg"); + } +} + +window.addEventListener( + "click", + function (xEvent) { + let xElem = xEvent.target; + if (xElem.id) { + if (xElem.id) { + + } + } else if (xElem.className === "select") { + showPage(xElem.dataset.page); + } else if (xElem.tagName === "A") { + openURL(xElem.getAttribute("href")); + } + }, + false +); + +function showPage (sPageName) { + try { + // hide them all + for (let xNodePage of document.getElementsByClassName("page")) { + xNodePage.style.display = "None"; + } + // show the one + document.getElementById(sPageName).style.display = "block"; + sendMessage("Mon message"); + // specific modifications + if (sPageName === "conj_page") { + document.body.style.width = "600px"; + document.documentElement.style.width = "600px"; + document.getElementById("movewindow").style.display = "none"; + } else { + document.body.style.width = "530px"; + document.documentElement.style.width = "530px"; + document.getElementById("movewindow").style.display = "block"; + } + } + catch (e) { + showError(e); + } +} + +function handleResponse(message) { + console.log(`background script sent a response: ${message.response}`); +} + +function handleError(error) { + console.log(`Error: ${error}`); +} + +function sendMessage (sMessage) { + let sending = browser.runtime.sendMessage({content: sMessage}); + sending.then(handleResponse, handleError); +} Index: gc_lang/fr/xpi/data/gc_panel.html ================================================================== --- gc_lang/fr/xpi/data/gc_panel.html +++ gc_lang/fr/xpi/data/gc_panel.html @@ -2,19 +2,10 @@ -
× Index: make.py ================================================================== --- make.py +++ make.py @@ -286,10 +286,11 @@ xParser.add_argument("-t", "--tests", help="run unit tests", action="store_true") xParser.add_argument("-p", "--perf", help="run performance tests", action="store_true") 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("-fx", "--firefox", help="Launch Firefox Nightly for XPI 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("-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: @@ -349,14 +350,18 @@ # Firefox if xArgs.firefox: with helpers.cd("_build/xpi/"+sLang): os.system("jpm run -b nightly") + if xArgs.web_ext: + with helpers.cd("_build/webext/"+sLang): + os.system(r'web-ext run --firefox="' + dVars['fx_nightly_path'] + '" --browser-console') + # Thunderbird if xArgs.thunderbird: os.system("thunderbird -jsconsole -P debug") else: print("Folder not found: gc_lang/"+sLang) if __name__ == '__main__': main()