Index: gc_lang/fr/modules-js/conj.js ================================================================== --- gc_lang/fr/modules-js/conj.js +++ gc_lang/fr/modules-js/conj.js @@ -178,33 +178,40 @@ }; class Verb { - constructor (sVerb) { + constructor (sVerb, sVerbPattern="") { + // conjugate a unknown verb with rules from sVerbPattern if (typeof sVerb !== "string" || sVerb === "") { throw new TypeError ("The value should be a non-empty string"); } + if (sVerbPattern.length == 0) { + sVerbPattern = sVerb; + } this.sVerb = sVerb; this.sVerbAux = ""; - this._sRawInfo = conj.getVtyp(this.sVerb); + this._sRawInfo = conj.getVtyp(sVerbPattern); this.sInfo = this._readableInfo(this._sRawInfo); - this._tTags = conj._getTags(sVerb); + this._tTags = conj._getTags(sVerbPattern); this._tTagsAux = conj._getTags(this.sVerbAux); this.bProWithEn = (this._sRawInfo[5] === "e"); this.dConj = new Map ([ [":Y", new Map ([ ["label", "Infinitif"], - [":Y", sVerb] + [":", sVerb] + ])], + [":P", new Map ([ + ["label", "Participe présent"], + [":", conj._getConjWithTags(sVerb, this._tTags, ":PQ", ":P")] ])], - [":PQ", new Map ([ - ["label", "Participes passés et présent"], + [":Q", new Map ([ + ["label", "Participes passés"], [":Q1", conj._getConjWithTags(sVerb, this._tTags, ":PQ", ":Q1")], [":Q2", conj._getConjWithTags(sVerb, this._tTags, ":PQ", ":Q2")], [":Q3", conj._getConjWithTags(sVerb, this._tTags, ":PQ", ":Q3")], [":Q4", conj._getConjWithTags(sVerb, this._tTags, ":PQ", ":Q4")], - [":P", conj._getConjWithTags(sVerb, this._tTags, ":PQ", ":P")] ])], [":Ip", new Map ([ ["label", "Présent"], [":1s", conj._getConjWithTags(sVerb, this._tTags, ":Ip", ":1s")], [":1ś", conj._getConjWithTags(sVerb, this._tTags, ":Ip", ":1ś")], @@ -332,22 +339,22 @@ } return sInfi; } participePasse (sWho) { - return this.dConj.get(":PQ").get(sWho); + return this.dConj.get(":Q").get(sWho); } participePresent (bPro, bNeg, bTpsCo, bInt, bFem) { - if (!this.dConj.get(":PQ").get(":P")) { + if (!this.dConj.get(":P").get(":")) { return ""; } let sPartPre; if (bTpsCo) { sPartPre = (!bPro) ? conj._getConjWithTags(this.sVerbAux, this._tTagsAux, ":PQ", ":P") : conj.getConj("être", ":PQ", ":P"); } else { - sPartPre = this.dConj.get(":PQ").get(":P"); + sPartPre = this.dConj.get(":P").get(":"); } if (sPartPre === "") { return ""; } let bEli = conj._zStartVoy.test(sPartPre); @@ -467,19 +474,19 @@ return sImpe; } _seekPpas (bPro, bFem, bPlur) { if (!bPro && this.sVerbAux == "avoir") { - return this.dConj.get(":PQ").get(":Q1"); + return this.dConj.get(":Q").get(":Q1"); } if (!bFem) { - return (bPlur && this.dConj.get(":PQ").get(":Q2")) ? this.dConj.get(":PQ").get(":Q2") : this.dConj.get(":PQ").get(":Q1"); + return (bPlur && this.dConj.get(":Q").get(":Q2")) ? this.dConj.get(":Q").get(":Q2") : this.dConj.get(":Q").get(":Q1"); } if (!bPlur) { - return (this.dConj.get(":PQ").get(":Q3")) ? this.dConj.get(":PQ").get(":Q3") : this.dConj.get(":PQ").get(":Q1"); + return (this.dConj.get(":Q").get(":Q3")) ? this.dConj.get(":Q").get(":Q3") : this.dConj.get(":Q").get(":Q1"); } - return (this.dConj.get(":PQ").get(":Q4")) ? this.dConj.get(":PQ").get(":Q4") : this.dConj.get(":PQ").get(":Q1"); + return (this.dConj.get(":Q").get(":Q4")) ? this.dConj.get(":Q").get(":Q4") : this.dConj.get(":Q").get(":Q1"); } } // Initialization Index: gc_lang/fr/modules/conj.py ================================================================== --- gc_lang/fr/modules/conj.py +++ gc_lang/fr/modules/conj.py @@ -145,36 +145,43 @@ return "## erreur, code : " + str(sSfx) + " ##" class Verb (): - def __init__ (self, sVerb): + def __init__ (self, sVerb, sVerbPattern=""): + # conjugate a unknown verb with rules from sVerbPattern if not isinstance(sVerb, str): raise TypeError if not sVerb: raise ValueError + if sVerbPattern == "": + sVerbPattern = sVerb + self.sVerb = sVerb self.sVerbAux = "" - self._sRawInfo = getVtyp(self.sVerb) + self._sRawInfo = getVtyp(sVerbPattern) self.sInfo = self._readableInfo() self.bProWithEn = (self._sRawInfo[5] == "e") - self._tTags = _getTags(sVerb) + self._tTags = _getTags(sVerbPattern) self._tTagsAux = _getTags(self.sVerbAux) self.dConj = { ":Y": { "label": "Infinitif", - ":Y": sVerb, + ":": sVerb, + }, + ":P": { + "label": "Participe présent", + ":": _getConjWithTags(sVerb, self._tTags, ":PQ", ":P"), }, - ":PQ": { - "label": "Participes passés et présent", + ":Q": { + "label": "Participes passés", ":Q1": _getConjWithTags(sVerb, self._tTags, ":PQ", ":Q1"), ":Q2": _getConjWithTags(sVerb, self._tTags, ":PQ", ":Q2"), ":Q3": _getConjWithTags(sVerb, self._tTags, ":PQ", ":Q3"), ":Q4": _getConjWithTags(sVerb, self._tTags, ":PQ", ":Q4"), - ":P": _getConjWithTags(sVerb, self._tTags, ":PQ", ":P"), }, ":Ip": { "label": "Présent", ":1s": _getConjWithTags(sVerb, self._tTags, ":Ip", ":1s"), ":1ś": _getConjWithTags(sVerb, self._tTags, ":Ip", ":1ś"), @@ -302,23 +309,23 @@ traceback.print_exc() return "# erreur" def participePasse (self, sWho): try: - return self.dConj[":PQ"][sWho] + return self.dConj[":Q"][sWho] except: traceback.print_exc() return "# erreur" def participePresent (self, bPro, bNeg, bTpsCo, bInt, bFem): try: - if not self.dConj[":PQ"][":P"]: + if not self.dConj[":P"][":"]: return "" if bTpsCo: sPartPre = _getConjWithTags(self.sVerbAux, self._tTagsAux, ":PQ", ":P") if not bPro else getConj("être", ":PQ", ":P") else: - sPartPre = self.dConj[":PQ"][":P"] + sPartPre = self.dConj[":P"][":"] if not sPartPre: return "" bEli = True if _zStartVoy.search(sPartPre) else False if bPro: if self.bProWithEn: @@ -425,14 +432,14 @@ return "# erreur" def _seekPpas (self, bPro, bFem, bPlur): try: if not bPro and self.sVerbAux == "avoir": - return self.dConj[":PQ"][":Q1"] + return self.dConj[":Q"][":Q1"] if not bFem: - return self.dConj[":PQ"][":Q2"] if bPlur and self.dConj[":PQ"][":Q2"] else self.dConj[":PQ"][":Q1"] + return self.dConj[":Q"][":Q2"] if bPlur and self.dConj[":Q"][":Q2"] else self.dConj[":Q"][":Q1"] if not bPlur: - return self.dConj[":PQ"][":Q3"] if self.dConj[":PQ"][":Q3"] else self.dConj[":PQ"][":Q1"] - return self.dConj[":PQ"][":Q4"] if self.dConj[":PQ"][":Q4"] else self.dConj[":PQ"][":Q1"] + return self.dConj[":Q"][":Q3"] if self.dConj[":Q"][":Q3"] else self.dConj[":Q"][":Q1"] + return self.dConj[":Q"][":Q4"] if self.dConj[":Q"][":Q4"] else self.dConj[":Q"][":Q1"] except: traceback.print_exc() return "# erreur" Index: gc_lang/fr/webext/panel/lex_conj_data.js ================================================================== --- gc_lang/fr/webext/panel/lex_conj_data.js +++ gc_lang/fr/webext/panel/lex_conj_data.js @@ -1,8 +1,8 @@ // JavaScript -"use script"; +"use strict"; // beta stage, unfinished, may be useless or the root for a new way to generate flexions… /* Règles de conjugaison Index: gc_lang/fr/webext/panel/lex_editor.css ================================================================== --- gc_lang/fr/webext/panel/lex_editor.css +++ gc_lang/fr/webext/panel/lex_editor.css @@ -146,10 +146,13 @@ color: hsl(0, 10%, 50%); font-size: 14px; border-radius: 3px; } +ul { + margin-left: 30px; +} input[type=text] { display: inline-block; width: 250px; margin-left: 5px; Index: gc_lang/fr/webext/panel/lex_editor.html ================================================================== --- gc_lang/fr/webext/panel/lex_editor.html +++ gc_lang/fr/webext/panel/lex_editor.html @@ -16,12 +16,12 @@
Lexique
Ajout
-

Nouveau mot

- +

Nouveau mot (lemme)

+
Nom, adjectif
@@ -67,11 +67,11 @@

[optionnel] Autre forme (masculine, féminine, variante, etc.)

- +

@@ -165,26 +165,26 @@

-

Verbe modèle

-

Indiquez ici le verbe qui doit servir de modèle pour la conjugaison.

+

Verbe modèle [optionnel]

+

Ce n’est pas nécessaire pour la très grande majorité des verbes du 1ᵉʳ groupe et du 2ᵉ groupe. Si les formes fléchies engendrées automatiquement ne vous satisfont pas, vous pouvez indiquer le verbe qui doit servir de modèle pour la conjugaison.

- Il est fortement recommandé d’appliquer les règles d’un verbe du même groupe que celui que vous créez. Mais aucune restriction n’est imposée.
- Classification des groupes : +

Il est fortement recommandé d’appliquer les règles d’un verbe du même groupe que celui que vous créez. Mais aucune restriction n’est imposée.

+

Classification des groupes :

@@ -243,13 +243,13 @@

Autre

-

Indiquez les étiquettes grammaticales que vous voulez appliquer au mot. À utiliser seulement si vous savez ce que vous faites. Dans le cas contraire, tant pis pour vous.

-

Lemme

-

+

Indiquez les étiquettes grammaticales que vous voulez appliquer au mot. À utiliser seulement si vous savez ce que vous faites.

+

Flexion

+

Étiquettes

@@ -275,10 +275,11 @@ + Index: gc_lang/fr/webext/panel/lex_editor.js ================================================================== --- gc_lang/fr/webext/panel/lex_editor.js +++ gc_lang/fr/webext/panel/lex_editor.js @@ -28,15 +28,15 @@ console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message); } document.getElementById("lexicon_button").addEventListener("click", () => { oPage.showPage("lexicon"); }, false); -document.getElementById("add_word_button").addEventListener("click", () => { oPage.showPage("word"); }, false); +document.getElementById("add_word_button").addEventListener("click", () => { oPage.showPage("lemma"); }, false); document.getElementById("editor").addEventListener("click", (xEvent) => { oPage.onSelectionClick(xEvent); }, false); -document.getElementById("word").addEventListener("keyup", () => { oPage.onWrite(); }, false); -document.getElementById("word2").addEventListener("keyup", () => { oPage.onWrite2(); }, false); -document.getElementById("lemma").addEventListener("keyup", () => { oFlex.update(); }, false); +document.getElementById("lemma").addEventListener("keyup", () => { oPage.onWrite(); }, false); +document.getElementById("lemma2").addEventListener("keyup", () => { oPage.onWrite2(); }, false); +document.getElementById("flexion").addEventListener("keyup", () => { oFlex.update(); }, false); document.getElementById("tags").addEventListener("keyup", () => { oFlex.update(); }, false); document.getElementById("add_to_lexicon").addEventListener("click", () => { oFlex.addToLexicon(); }, false); @@ -84,11 +84,11 @@ } }, clear: function () { try { - document.getElementById("word2").value = ""; + document.getElementById("lemma2").value = ""; this.hideWord2(); // nom, adjectif, noms propres for (let xElem of document.getElementsByName("POS")) { xElem.checked = false; } @@ -114,11 +114,11 @@ document.getElementById("up_v_p").checked = false; document.getElementById("up_v_m").checked = false; document.getElementById("up_v_ae").checked = false; document.getElementById("up_v_aa").checked = false; // autre - document.getElementById("lemma").value = ""; + document.getElementById("flexion").value = ""; document.getElementById("tags").value = ""; } catch (e) { showError(e); } @@ -141,21 +141,21 @@ showError(e); } }, onWrite: function () { - if (document.getElementById("word").value.trim() !== "") { + if (document.getElementById("lemma").value.trim() !== "") { this.showEditor(); } else { this.showSection("section_vide"); this.hideEditor(); this.hideActions(); } }, onWrite2: function () { - if (document.getElementById("word2").value.trim() !== "") { + if (document.getElementById("lemma2").value.trim() !== "") { this.showWord2(); } else { this.hideWord2(); } }, @@ -200,99 +200,117 @@ update: function () { try { this.clear(); let sGenderTag = ""; - let sWord = document.getElementById("word").value.trim(); - if (sWord.length > 0) { + let sLemma = document.getElementById("lemma").value.trim(); + if (sLemma.length > 0) { switch (this.cMainTag) { case "N": if (!this.getRadioValue("POS") || !this.getRadioValue("genre")) { break; } let sTag = this.getRadioValue("POS") + this.getRadioValue("genre"); switch (this.getRadioValue("pluriel")) { case "s": - this.addFlexion(sWord, sWord, sTag+":s"); - this.addFlexion(sWord+"s", sWord, sTag+":p"); + this.addFlexion(sLemma, sLemma, sTag+":s"); + this.addFlexion(sLemma+"s", sLemma, sTag+":p"); break; case "x": - this.addFlexion(sWord, sWord, sTag+":s"); - this.addFlexion(sWord+"x", sWord, sTag+":p"); + this.addFlexion(sLemma, sLemma, sTag+":s"); + this.addFlexion(sLemma+"x", sLemma, sTag+":p"); break; case "i": - this.addFlexion(sWord, sWord, sTag+":i"); + this.addFlexion(sLemma, sLemma, sTag+":i"); break; } - let sWord2 = document.getElementById("word2").value.trim(); - if (sWord2.length > 0 && this.getRadioValue("POS2") && this.getRadioValue("genre2")) { + let sLemma2 = document.getElementById("lemma2").value.trim(); + if (sLemma2.length > 0 && this.getRadioValue("POS2") && this.getRadioValue("genre2")) { let sTag2 = this.getRadioValue("POS2") + this.getRadioValue("genre2"); switch (this.getRadioValue("pluriel2")) { case "s": - this.addFlexion(sWord2, sWord, sTag2+":s"); - this.addFlexion(sWord2+"s", sWord, sTag2+":p"); + this.addFlexion(sLemma2, sLemma, sTag2+":s"); + this.addFlexion(sLemma2+"s", sLemma, sTag2+":p"); break; case "x": - this.addFlexion(sWord2, sWord, sTag2+":s"); - this.addFlexion(sWord2+"x", sWord, sTag2+":p"); + this.addFlexion(sLemma2, sLemma, sTag2+":s"); + this.addFlexion(sLemma2+"x", sLemma, sTag2+":p"); break; case "i": - this.addFlexion(sWord2, sWord, sTag2+":i"); + this.addFlexion(sLemma2, sLemma, sTag2+":i"); break; } } break; case "V": { - if (!sWord.endsWith("er") && !sWord.endsWith("ir")) { + if (!sLemma.endsWith("er") && !sLemma.endsWith("ir")) { break; } - sWord = sWord.toLowerCase(); - let c_g = (sWord.endsWith("er")) ? "1" : "2"; + sLemma = sLemma.toLowerCase(); + let c_g = (sLemma.endsWith("er")) ? "1" : "2"; let c_i = (document.getElementById("up_v_i").checked) ? "i" : "_"; let c_t = (document.getElementById("up_v_t").checked) ? "t" : "_"; let c_n = (document.getElementById("up_v_n").checked) ? "n" : "_"; let c_p = (document.getElementById("up_v_p").checked) ? "p" : "_"; let c_m = (document.getElementById("up_v_m").checked) ? "m" : "_"; let c_ae = (document.getElementById("up_v_ae").checked) ? "e" : "_"; let c_aa = (document.getElementById("up_v_aa").checked) ? "a" : "_"; let sVerbTag = c_i + c_t + c_n + c_p + c_m + c_ae + c_aa; if (!sVerbTag.endsWith("__") && !sVerbTag.startsWith("____")) { - for (let [nCut, sAdd, sFlexTags] of this._getConjRule(sWord)) { - this.addFlexion(sWord.slice(0,-nCut)+sAdd, sWord, ":V" + c_g + "_" + sVerbTag+sFlexTags); + let sVerbPattern = document.getElementById("conj_rules_like").value.trim(); + if (sVerbPattern.length == 0) { + // tables de conjugaison du 1er et du 2e groupe + for (let [nCut, sAdd, sFlexTags, sPattern] of this._getConjRule(sLemma)) { + if (!sPattern || RegExp(sPattern).test(sLemma)) { + this.addFlexion(sLemma.slice(0,-nCut)+sAdd, sLemma, ":V" + c_g + "_" + sVerbTag + sFlexTags); + } + } + } else { + // utilisation du conjugueur + let oVerb = new Verb(sLemma, sVerbPattern); + for (let [sTag1, dFlex] of oVerb.dConj.entries()) { + if (sTag1 !== ":Q") { + for (let [sTag2, sConj] of dFlex.entries()) { + if (sTag2.startsWith(":") && sConj !== "") { + this.addFlexion(sConj, sLemma, ":V" + c_g + "_" + sVerbTag + sTag1 + sTag2); + } + } + } + } } } break; } case "W": - sWord = sWord.toLowerCase(); - this.addFlexion(sWord, sWord, ":W"); + sLemma = sLemma.toLowerCase(); + this.addFlexion(sLemma, sLemma, ":W"); break; case "M1": - sWord = sWord.slice(0,1).toUpperCase() + sWord.slice(1); + sLemma = sLemma.slice(0,1).toUpperCase() + sLemma.slice(1); sGenderTag = this.getRadioValue("genre_m1"); if (sGenderTag) { - this.addFlexion(sWord, sWord, ":M1"+sGenderTag+":i"); + this.addFlexion(sLemma, sLemma, ":M1"+sGenderTag+":i"); } break; case "M2": - sWord = sWord.slice(0,1).toUpperCase() + sWord.slice(1); + sLemma = sLemma.slice(0,1).toUpperCase() + sLemma.slice(1); sGenderTag = this.getRadioValue("genre_m2"); if (sGenderTag) { - this.addFlexion(sWord, sWord, ":M2"+sGenderTag+":i"); + this.addFlexion(sLemma, sLemma, ":M2"+sGenderTag+":i"); } break; case "MP": sGenderTag = this.getRadioValue("genre_mp"); if (sGenderTag) { - this.addFlexion(sWord, sWord, ":MP"+sGenderTag+":i"); + this.addFlexion(sLemma, sLemma, ":MP"+sGenderTag+":i"); } break; case "X": - let sLemma = document.getElementById("lemma").value.trim(); + let sFlexion = document.getElementById("flexion").value.trim(); let sTags = document.getElementById("tags").value.trim(); - if (sLemma.length > 0 && sTags.startsWith(":")) { - this.addFlexion(sWord, sLemma, sTags); + if (sFlexion.length > 0 && sTags.startsWith(":")) { + this.addFlexion(sFlexion, sLemma, sTags); } break; } } this.show(); @@ -302,12 +320,14 @@ } }, _getConjRule: function (sVerb) { if (sVerb.endsWith("ir")) { + // deuxième groupe return oConj["V2"]; - } else { + } else if (sVerb.endsWith("er")) { + // premier groupe if (sVerb.slice(-5) in oConj["V1"]) { return oConj["V1"][sVerb.slice(-5)]; } if (sVerb.slice(-4) in oConj["V1"]) { if (sVerb.endsWith("eler") || sVerb.endsWith("eter")) { @@ -317,10 +337,13 @@ } if (sVerb.slice(-3) in oConj["V1"]) { return oConj["V1"][sVerb.slice(-3)]; } return oConj["V1"]["er"]; + } else { + // troisième groupe + return [ [0, "", ":Y/*", false] ]; } }, getRadioValue: function (sName) { if (document.querySelector('input[name="' + sName + '"]:checked')) { @@ -344,11 +367,11 @@ addToLexicon: function () { try { oLexicon.addFlexions(this.lFlexion); oLexicon.save(); - document.getElementById("word").value = ""; + document.getElementById("lemma").value = ""; oPage.showSection("section_vide"); oPage.hideEditor(); oPage.hideActions(); oPage.clear(); this.clear();