Index: compile_rules.py
==================================================================
--- compile_rules.py
+++ compile_rules.py
@@ -449,11 +449,11 @@
del lRule[-1] # tGroups positioning codes are useless for Python
# error messages
for aAction in lRuleJS[6]:
if aAction[1] == "-":
aAction[2] = aAction[2].replace(" ", " ") # nbsp --> nnbsp
- aAction[4] = aAction[4].replace("« ", "« ").replace(" »", " »")
+ aAction[4] = aAction[4].replace("« ", "« ").replace(" »", " »").replace(" :", " :").replace(" :", " :")
# js regexes
lRuleJS[1], lNegLookBehindRegex = regex2js( dJSREGEXES.get(lRuleJS[3], lRuleJS[1]) )
lRuleJS.append(lNegLookBehindRegex)
return lRuleJS
Index: gc_core/js/helpers.js
==================================================================
--- gc_core/js/helpers.js
+++ gc_core/js/helpers.js
@@ -30,10 +30,19 @@
} else {
console.error(sMsg);
}
}
+function inspect (o) {
+ let sMsg = "__inspect__: " + typeof o;
+ for (let sParam in o) {
+ sMsg += "\n" + sParam + ": " + o.sParam;
+ }
+ sMsg += "\n" + JSON.stringify(o) + "\n__end__";
+ echo(sMsg);
+}
+
// load ressources in workers (suggested by Mozilla extensions reviewers)
// for more options have a look here: https://gist.github.com/Noitidart/ec1e6b9a593ec7e3efed
// if not in workers, use sdk/data.load() instead
function loadFile (spf) {
@@ -78,11 +87,12 @@
obj[k] = v;
}
return obj;
}
+exports.setLogOutput = setLogOutput;
exports.echo = echo;
exports.logerror = logerror;
+exports.inspect = inspect;
exports.objectToMap = objectToMap;
exports.mapToObject = mapToObject;
-exports.setLogOutput = setLogOutput;
exports.loadFile = loadFile;
Index: gc_core/js/lang_core/gc_engine.js
==================================================================
--- gc_core/js/lang_core/gc_engine.js
+++ gc_core/js/lang_core/gc_engine.js
@@ -218,11 +218,11 @@
sMessage = oEvalFunc[sMsg.slice(1)](s, m)
} else {
sMessage = sMsg._expand(m);
}
if (bIdRule) {
- sMessage += " #" + sLineId + " #" + sRuleId;
+ sMessage += " ##" + sLineId + " #" + sRuleId;
}
oErr["sMessage"] = sMessage;
// URL
oErr["URL"] = sURL || "";
// Context
Index: gc_core/js/text.js
==================================================================
--- gc_core/js/text.js
+++ gc_core/js/text.js
@@ -37,19 +37,20 @@
}
function getReadableError (oErr) {
// Returns an error oErr as a readable error
try {
- let s = "\n* " + oErr['nStart'] + ":" + oErr['nEnd'] + " # " + oErr['sRuleId']+":\n";
- s += " " + oErr["sMessage"];
+ let sResult = "\n* " + oErr['nStart'] + ":" + oErr['nEnd']
+ + " # " + oErr['sLineId'] + " # " + oErr['sRuleId'] + ":\n";
+ sResult += " " + oErr["sMessage"];
if (oErr["aSuggestions"].length > 0) {
- s += "\n > Suggestions : " + oErr["aSuggestions"].join(" | ");
+ sResult += "\n > Suggestions : " + oErr["aSuggestions"].join(" | ");
}
if (oErr["URL"] !== "") {
- s += "\n > URL: " + oErr["URL"];
+ sResult += "\n > URL: " + oErr["URL"];
}
- return s;
+ return sResult;
}
catch (e) {
helpers.logerror(e);
return "\n# Error. Data: " + oErr.toString();
}
Index: gc_core/js/tokenizer.js
==================================================================
--- gc_core/js/tokenizer.js
+++ gc_core/js/tokenizer.js
@@ -3,17 +3,16 @@
"use strict";
const helpers = require("resource://grammalecte/helpers.js");
-
const aPatterns = {
// All regexps must start with ^.
"default":
[
[/^[ \t]+/, 'SPACE'],
- [/^[,.;:!?…«»“”"()/·]+/, 'SEPARATOR'],
+ [/^[,.;:!?…«»“”‘’"(){}\[\]/·–—]+/, 'SEPARATOR'],
[/^(?:https?:\/\/|www[.]|[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_]+[@.][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_]+[@.])[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_.\/?&!%=+*"'@$#-]+/, 'LINK'],
[/^[#@][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_-]+/, 'TAG'],
[/^<[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+.*?>|<\/[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+ *>/, 'HTML'],
[/^\[\/?[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+\]/, 'PSEUDOHTML'],
[/^&\w+;(?:\w+;|)/, 'HTMLENTITY'],
@@ -22,19 +21,19 @@
[/^[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+(?:[’'`-][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+)*/, 'WORD']
],
"fr":
[
[/^[ \t]+/, 'SPACE'],
- [/^[,.;:!?…«»“”"()/·]+/, 'SEPARATOR'],
+ [/^[,.;:!?…«»“”‘’"(){}\[\]/·–—]+/, 'SEPARATOR'],
[/^(?:https?:\/\/|www[.]|[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_]+[@.][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_]+[@.])[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_.\/?&!%=+*"'@$#-]+/, 'LINK'],
[/^[#@][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_-]+/, 'TAG'],
[/^<[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+.*?>|<\/[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+ *>/, 'HTML'],
[/^\[\/?[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+\]/, 'PSEUDOHTML'],
[/^&\w+;(?:\w+;|)/, 'HTMLENTITY'],
[/^(?:l|d|n|m|t|s|j|c|ç|lorsqu|puisqu|jusqu|quoiqu|qu)['’`]/i, 'ELPFX'],
[/^\d\d?[hm]\d\d\b/, 'HOUR'],
- [/^\d+(?:er|nd|e|de|ième|ème|eme)\b/, 'ORDINAL'],
+ [/^\d+(?:er|nd|e|de|ième|ème|eme)s?\b/, 'ORDINAL'],
[/^-?\d+(?:[.,]\d+|)/, 'NUM'],
[/^[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+(?:[’'`-][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+)*/, 'WORD']
]
}
@@ -44,11 +43,11 @@
constructor (sLang) {
this.sLang = sLang;
if (!aPatterns.hasOwnProperty(sLang)) {
this.sLang = "default";
}
- this.aRules = aPatterns[sLang];
+ this.aRules = aPatterns[this.sLang];
};
* genTokens (sText) {
let m;
let i = 0;
@@ -55,11 +54,17 @@
while (sText) {
let nCut = 1;
for (let [zRegex, sType] of this.aRules) {
try {
if ((m = zRegex.exec(sText)) !== null) {
- yield { "sType": sType, "sValue": m[0], "nStart": i, "nEnd": i + m[0].length }
+ if (sType == 'SEPARATOR') {
+ for (let c of m[0]) {
+ yield { "sType": sType, "sValue": c, "nStart": i, "nEnd": i + m[0].length }
+ }
+ } else {
+ yield { "sType": sType, "sValue": m[0], "nStart": i, "nEnd": i + m[0].length }
+ }
nCut = m[0].length;
break;
}
}
catch (e) {
@@ -67,9 +72,19 @@
}
}
i += nCut;
sText = sText.slice(nCut);
}
+ };
+
+ getSpellingErrors (sText, oDict) {
+ let aSpellErr = [];
+ for (let oToken of this.genTokens(sText)) {
+ if (oToken.sType === 'WORD' && !oDict.isValidToken(oToken.sValue)) {
+ aSpellErr.push(oToken);
+ }
+ }
+ return aSpellErr;
}
}
exports.Tokenizer = Tokenizer;
Index: gc_lang/fr/config.ini
==================================================================
--- gc_lang/fr/config.ini
+++ gc_lang/fr/config.ini
@@ -3,11 +3,11 @@
lang_name = French
locales = fr_FR fr_BE fr_CA fr_CH fr_LU fr_MC fr_BF fr_CI fr_SN fr_ML fr_NE fr_TG fr_BJ
country_default = FR
name = Grammalecte
implname = grammalecte
-version = 0.5.17.2
+version = 0.5.18
author = Olivier R.
provider = Dicollecte
link = http://grammalecte.net
description = Correcteur grammatical pour le français.
extras = README_fr.txt
Index: gc_lang/fr/modules-js/lexicographe.js
==================================================================
--- gc_lang/fr/modules-js/lexicographe.js
+++ gc_lang/fr/modules-js/lexicographe.js
@@ -2,13 +2,15 @@
// License: MPL 2
"use strict";
${string}
+${map}
const helpers = require("resource://grammalecte/helpers.js");
+const tkz = require("resource://grammalecte/tokenizer.js");
const _dTAGS = new Map ([
[':G', "[mot grammatical]"],
[':N', " nom,"],
@@ -155,10 +157,42 @@
["m'en", " (me) pronom personnel objet + (en) pronom adverbial"],
["t'en", " (te) pronom personnel objet + (en) pronom adverbial"],
["s'en", " (se) pronom personnel objet + (en) pronom adverbial"]
]);
+const _dSeparator = new Map ([
+ ['.', "point"],
+ ['·', "point médian"],
+ ['…', "points de suspension"],
+ [':', "deux-points"],
+ [';', "point-virgule"],
+ [',', "virgule"],
+ ['?', "point d’interrogation"],
+ ['!', "point d’exclamation"],
+ ['(', "parenthèse ouvrante"],
+ [')', "parenthèse fermante"],
+ ['[', "crochet ouvrante"],
+ [']', "crochet fermante"],
+ ['{', "accolade ouvrante"],
+ ['}', "accolade fermante"],
+ ['-', "tiret"],
+ ['—', "tiret cadratin"],
+ ['–', "tiret demi-cadratin"],
+ ['«', "guillemet ouvrant (chevrons)"],
+ ['»', "guillemet fermant (chevrons)"],
+ ['“', "guillemet ouvrant double"],
+ ['”', "guillemet fermant double"],
+ ['‘', "guillemet ouvrant"],
+ ['’', "guillemet fermant"],
+ ['/', "signe de la division"],
+ ['+', "signe de l’addition"],
+ ['*', "signe de la multiplication"],
+ ['=', "signe de l’égalité"],
+ ['<', "inférieur à"],
+ ['>', "supérieur à"],
+]);
+
class Lexicographe {
constructor (oDict) {
this.oDict = oDict;
@@ -165,71 +199,58 @@
this._zElidedPrefix = new RegExp ("^([dljmtsncç]|quoiqu|lorsqu|jusqu|puisqu|qu)['’](.+)", "i");
this._zCompoundWord = new RegExp ("([a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ]+)-((?:les?|la)-(?:moi|toi|lui|[nv]ous|leur)|t-(?:il|elle|on)|y|en|[mts][’'](?:y|en)|les?|l[aà]|[mt]oi|leur|lui|je|tu|ils?|elles?|on|[nv]ous)$", "i");
this._zTag = new RegExp ("[:;/][a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ*][^:;/]*", "g");
};
- analyzeText (sText) {
- sText = sText.replace(/[.,.?!:;…\/()\[\]“”«»"„{}–—#+*<>%=\n]/g, " ").replace(/\s+/g, " ");
- let iStart = 0;
- let iEnd = 0;
- let sHtml = '
\n';
- while ((iEnd = sText.indexOf(" ", iStart)) !== -1) {
- sHtml += this.analyzeWord(sText.slice(iStart, iEnd));
- iStart = iEnd + 1;
- }
- sHtml += this.analyzeWord(sText.slice(iStart));
- return sHtml + '
\n';
- }
-
- analyzeWord (sWord) {
+ getInfoForToken (oToken) {
+ // Token: .sType, .sValue, .nStart, .nEnd
+ // return a list [type, token_string, values]
+ let m = null;
try {
- if (!sWord) {
- return "";
- }
- if (sWord._count("-") > 4) {
- return '' + sWord + " : élément complexe indéterminé
\n";
- }
- if (sWord._isDigit()) {
- return '' + sWord + " : nombre
\n";
- }
-
- let sHtml = "";
- // préfixes élidés
- let m = this._zElidedPrefix.exec(sWord);
- if (m !== null) {
- sWord = m[2];
- sHtml += "" + m[1] + "’ : " + _dPFX.get(m[1].toLowerCase()) + "
\n";
- }
- // mots composés
- let m2 = this._zCompoundWord.exec(sWord);
- if (m2 !== null) {
- sWord = m2[1];
- }
- // Morphologies
- let lMorph = this.oDict.getMorph(sWord);
- if (lMorph.length === 1) {
- sHtml += "" + sWord + " : " + this.formatTags(lMorph[0]) + "
\n";
- } else if (lMorph.length > 1) {
- sHtml += "" + sWord + "
- " + [for (s of lMorph) if (s.includes(":")) this.formatTags(s)].join("
- ") + "
\n";
- } else {
- sHtml += '' + sWord + " : absent du dictionnaire
\n";
- }
- // suffixe d’un mot composé
- if (m2) {
- sHtml += "
-" + m2[2] + " : " + this._formatSuffix(m2[2].toLowerCase()) + "
\n";
- }
- // Verbes
- //let aVerb = new Set([ for (s of lMorph) if (s.includes(":V")) s.slice(1, s.indexOf(" ")) ]);
- return sHtml;
+ switch (oToken.sType) {
+ case 'SEPARATOR':
+ return { sType: oToken.sType, sValue: oToken.sValue, aLabel: [_dSeparator._get(oToken.sValue, "caractère indéterminé")] };
+ break;
+ case 'NUM':
+ return { sType: oToken.sType, sValue: oToken.sValue, aLabel: ["nombre"] };
+ break;
+ case 'LINK':
+ return { sType: oToken.sType, sValue: oToken.sValue.slice(0,40)+"…", aLabel: ["hyperlien"] };
+ break;
+ case 'ELPFX':
+ let sTemp = oToken.sValue.replace("’", "").replace("'", "").replace("`", "").toLowerCase();
+ return { sType: oToken.sType, sValue: oToken.sValue, aLabel: [_dPFX._get(sTemp, "préfixe élidé inconnu")] };
+ break;
+ case 'WORD':
+ if (oToken.sValue._count("-") > 4) {
+ return { sType: "COMPLEX", sValue: oToken.sValue, aLabel: ["élément complexe indéterminé"] };
+ }
+ else if (this.oDict.isValidToken(oToken.sValue)) {
+ let lMorph = this.oDict.getMorph(oToken.sValue);
+ let aElem = [ for (s of lMorph) if (s.includes(":")) this._formatTags(s) ];
+ return { sType: oToken.sType, sValue: oToken.sValue, aLabel: aElem};
+ }
+ else if (m = this._zCompoundWord.exec(oToken.sValue)) {
+ // mots composés
+ let lMorph = this.oDict.getMorph(m[1]);
+ let aElem = [ for (s of lMorph) if (s.includes(":")) this._formatTags(s) ];
+ aElem.push("-" + m[2] + ": " + this._formatSuffix(m[2].toLowerCase()));
+ return { sType: oToken.sType, sValue: oToken.sValue, aLabel: aElem };
+ }
+ else {
+ return { sType: "UNKNOWN", sValue: oToken.sValue, aLabel: ["inconnu du dictionnaire"] };
+ }
+ break;
+ }
}
catch (e) {
helpers.logerror(e);
- return "#erreur";
}
+ return null;
};
- formatTags (sTags) {
+ _formatTags (sTags) {
let sRes = "";
sTags = sTags.replace(/V([0-3][ea]?)[itpqnmr_eaxz]+/, "V$1");
let m;
while ((m = this._zTag.exec(sTags)) !== null) {
sRes += _dTAGS.get(m[0]);
Index: gc_lang/fr/xpi/data/gc_panel.css
==================================================================
--- gc_lang/fr/xpi/data/gc_panel.css
+++ gc_lang/fr/xpi/data/gc_panel.css
@@ -5,19 +5,16 @@
header {
background-color: hsl(0, 0%, 96%);
padding: 10px 20px;
border-bottom: 1px solid hsl(0, 0%, 90%);
color: hsl(0, 0%, 0%);
- z-index: 99;
}
-
-
body {
- background-color: hsl(0, 0%, 98%);
- font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
- overflow-x: hidden;
+ background-color: hsl(0, 0%, 98%);
+ font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
+ overflow-x: hidden;
color: hsl(0, 0%, 0%);
}
#special_message {
display: none;
@@ -50,16 +47,20 @@
border-radius: 5px;
text-align: center;
color: hsla(0, 0%, 100%, .9);
font-size: 16px;
font-weight: bold;
- z-index: 99;
}
#message {
padding: 10px 20px;
}
+
+/*
+ Error list
+*/
+
#errorlist {
padding: 60px 20px 30px 20px;
}
#errorlist p.message {
@@ -69,14 +70,19 @@
font-size: 18px;
color: hsla(240, 0%, 96%, 1);
border-radius: 3px;
text-align: center;
}
+
#errorlist p.green {
background-color: hsla(120, 10%, 50%, 1);
color: hsla(120, 0%, 96%, 1);
}
+
+.paragraph_block {
+ margin: 0 0 10px 0;
+}
.paragraph {
background-color: hsla(0, 0%, 90%, 1);
padding: 10px;
border-radius: 2px;
@@ -86,11 +92,11 @@
}
.softred {
background-color: hsla(0, 20%, 90%, 1);
}
.softgreen {
- background-color: hsla(120, 20%, 90%, 1);
+ background-color: hsla(120, 15%, 90%, 1);
}
.paragraph a {
background-color: hsla(210, 50%, 50%, 1);
padding: 1px 5px;
@@ -103,36 +109,12 @@
background-color: hsla(210, 60%, 40%, 1);
color: hsla(0, 0%, 100%, 1);
text-shadow: 0 0 3px hsl(210, 30%, 60%);
}
-.paragraph a.sugg {
- padding: 1px 6px;
- background-color: hsla(150, 50%, 40%, 1);
- color: hsla(150, 0%, 96%, 1);
- border-radius: 2px;
- cursor: pointer;
- text-decoration: none;
-}
-.paragraph a.sugg:hover {
- background-color: hsla(150, 70%, 30%, 1);
- color: hsla(0, 0%, 100%, 1);
- text-shadow: 0 0 3px hsl(150, 30%, 60%);
-}
-
-.paragraph a.ignore {
- padding: 0 2px;
- background-color: hsla(30, 20%, 60%, 1);
- color: hsla(30, 0%, 96%, 1);
- border-radius: 2px;
- cursor: pointer;
- text-decoration: none;
-}
-.paragraph a.ignore:hover {
- background-color: hsla(30, 20%, 50%, 1);
- color: hsla(0, 0%, 100%, 1);
- text-shadow: 0 0 3px hsl(30, 30%, 60%);
+.paragraph u {
+ text-decoration: none;
}
.paragraph u.corrected,
.paragraph u.ignored {
background-color: hsla(120, 50%, 70%, 1);
@@ -152,62 +134,147 @@
}
.paragraph u.error:hover {
cursor: pointer;
}
-.paragraph u.error .tooltip, .paragraph u.error .tooltip_on {
- position: absolute;
- background-color: hsla(210, 10%, 90%, 1);
- font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
- top: 90%;
- left: 0;
- width: 250px;
- font-size: 12px;
- line-height: 18px;
- color: hsla(0, 10%, 20%, 1);
- cursor: default;
- /*visibility: hidden;*/
- display: none;
- padding: 10px;
- box-shadow: 0 0 6px hsla(0, 0%, 0%, 0.3);
- z-index: 10;
- border: 2px solid hsl(0, 0%, 0%);
- border-radius: 3px;
- text-decoration: none;
-}
-.paragraph u.error .tooltip_on {
- display: block;
-}
-
-.tooltip_on s {
- color: hsla(0, 0%, 66%, 1);
- font-weight: bold;
- font-size: 8px;
- line-height: 16px;
- text-transform: uppercase;
- text-decoration: none;
-}
-
-.debug {
- float: right;
- background-color: hsla(0, 5%, 35%, 1);
- padding: 2px 5px;
- margin-left: 5px;
- border-radius: 2px;
- color: hsla(0, 0%, 96%, 1);
+
+/*
+ TOOLTIPS
+*/
+.tooltip {
+ position: absolute;
+ display: none;
+ width: 300px;
+ border-radius: 5px;
+ box-shadow: 0 0 6px hsla(0, 0%, 0%, 0.3);
+ font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
+ font-size: 12px;
+ line-height: 18px;
+ cursor: default;
+ text-decoration: none;
+}
+#gc_tooltip {
+ border: 3px solid hsl(210, 50%, 30%);
+ color: hsla(210, 10%, 20%, 1);
+}
+#sc_tooltip {
+ border: 3px solid hsl(0, 50%, 30%);
+ color: hsla(0, 10%, 20%, 1);
+}
+#gc_tooltip_arrow, #sc_tooltip_arrow {
+ position: absolute;
+ display: none;
+}
+#gc_tooltip #gc_rule_id {
+ display: none;
+ margin: 0 0 5px 0;
+ border: 1px solid hsl(210, 50%, 60%);
+ background-color: hsl(210, 50%, 40%);
+ padding: 2px 5px;
+ border-radius: 2px;
+ color: hsla(210, 0%, 96%, 1);
font-size: 11px;
font-style: normal;
+ text-align: center;
+}
+#gc_message_block {
+ padding: 5px 10px 10px 10px;
+ background-color: hsl(210, 50%, 30%);
+ color: hsl(210, 50%, 96%);
+}
+#sc_message_block {
+ padding: 5px 10px 10px 10px;
+ background-color: hsl(0, 50%, 30%);
+ color: hsl(0, 50%, 96%);
+}
+#gc_message, #sc_message {
+ font-size: 15px;
+ margin-bottom: 5px;
+}
+a#gc_ignore, a#sc_ignore {
+ padding: 0 2px;
+ background-color: hsla(30, 30%, 40%, 1);
+ color: hsla(30, 0%, 96%, 1);
+ border-radius: 2px;
+ cursor: pointer;
+ text-decoration: none;
+}
+a#gc_ignore:hover, a#sc_ignore:hover {
+ background-color: hsla(30, 30%, 50%, 1);
+ color: hsla(0, 0%, 100%, 1);
+ text-shadow: 0 0 3px hsl(30, 30%, 60%);
+}
+a#gc_url {
+ padding: 0 2px;
+ background-color: hsla(210, 50%, 50%, 1);
+ color: hsla(210, 0%, 96%, 1);
+ border-radius: 2px;
+ cursor: pointer;
+ text-decoration: none;
+}
+a#gc_url:hover {
+ background-color: hsla(210, 50%, 60%, 1);
+ color: hsla(0, 0%, 100%, 1);
+ text-shadow: 0 0 3px hsl(210, 30%, 60%);
+}
+#gc_sugg_title {
+ padding: 0 10px;
+ background-color: hsl(210, 10%, 90%);
+ color: hsl(210, 50%, 30%);
+ font-size: 10px;
+ font-weight: bold;
+}
+#sc_sugg_title {
+ padding: 0 10px;
+ background-color: hsl(0, 10%, 90%);
+ color: hsl(0, 50%, 30%);
+ font-size: 9px;
+ font-weight: bold;
+}
+#gc_sugg_block {
+ padding: 10px;
+ background-color: hsl(210, 10%, 96%);
+ border-radius: 0 0 2px 2px;
+ line-height: 20px;
+}
+#sc_sugg_block {
+ padding: 10px;
+ background-color: hsl(0, 10%, 96%);
+ border-radius: 0 0 2px 2px;
+ line-height: 20px;
+}
+#gc_sugg_block a.sugg {
+ padding: 1px 6px;
+ background-color: hsla(180, 60%, 40%, 1);
+ color: hsla(180, 0%, 96%, 1);
+ border-radius: 2px;
+ cursor: pointer;
+ text-decoration: none;
+}
+#gc_sugg_block a.sugg:hover {
+ background-color: hsla(180, 70%, 45%, 1);
+ color: hsla(0, 0%, 100%, 1);
+}
+#sc_sugg_block a.sugg {
+ padding: 1px 6px;
+ background-color: hsla(30, 90%, 45%, 1);
+ color: hsla(30, 0%, 96%, 1);
+ border-radius: 2px;
+ cursor: pointer;
+ text-decoration: none;
}
-
-.data {
- font-style: normal;
+#sc_sugg_block a.sugg:hover {
+ background-color: hsla(30, 100%, 50%, 1);
+ color: hsla(0, 0%, 100%, 1);
}
+/*
+ Action buttons
+*/
.actions {
- margin-top: -10px;
- margin-bottom: 10px;
+ margin: 0 0 5px 10px;
}
.actions .button {
background-color: hsl(0, 0%, 50%);
text-align: center;
@@ -216,11 +283,10 @@
padding: 1px 4px 3px 4px;
/*width: 18px;
height: 18px;*/
cursor: pointer;
font-size: 14px;
- font-weight: bold;
color: hsl(0, 0%, 96%);
border-radius: 2px;
}
.actions .button:hover {
background-color: hsl(0, 0%, 40%);
@@ -249,10 +315,13 @@
}
.actions .orange:hover {
background-color: hsl(30, 70%, 40%);
color: hsl(30, 0%, 100%);
}
+.actions .bold {
+ font-weight: bold;
+}
/*
ERRORS
*/
@@ -266,16 +335,16 @@
background-color: hsl(240, 10%, 40%);
color: hsl(240, 0%, 100%);
}
/* elems */
-.spell {
+.WORD {
background-color: hsl(0, 50%, 50%);
color: hsl(0, 0%, 96%);
/*text-decoration: underline wavy hsl(0, 50%, 50%);*/
}
-.spell:hover {
+.WORD:hover {
background-color: hsl(0, 60%, 40%);
color: hsl(0, 0%, 100%);
}
/* elems */
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
@@ -51,10 +51,34 @@
+
+
+
+
+
+