openct-tasks/_common/modules/pemFioi/sentences_2.js

1332 lines
47 KiB
JavaScript

if(typeof require != 'undefined') {
var {
conjugations,
pastParticiples,
speConjugations,
auxConjugations,
allerConj,
exceptions,
negationWords,
determinerTypes,
determiners,
pronounTypes,
subjPronounTypes,
pronouns,
nounTypes,
nouns,
adjectiveTypes,
adjectives,
auxiliaryVerbs,
verbTypes,
verbs,
adverbTypes,
adverbs,
elisionWithH,
elisionWithHVerb
} = require('./sentences_wordList.js');
var block = "";
}
function init() {
$("#form").html(createForm);
initHandlers();
};
function createForm() {
var html = "<h3>Générer des phrases</h3>";
html += selectStructures();
html += selectSentenceNumber();
html += "<button id=\"createSentences\">Générer</button>";
html += "<h3>Voir les listes de mot</h3>";
html += selectBlock();
html += "<button id=\"wordList\">Voir</button>";
html += "<h3>Générer un texte</h3>";
html += selectTextLength();
html += "<button id=\"createText\">Générer</button>";
return html;
};
function selectStructures() {
var html = "<label for=\"structures\">Structure</label>";
html += "<select id=\"structures\">";
html += "<option value=\"all\">Toutes</option>";
for(var structureIndex in structures){
var str = "";
for(var iBlock in structures[structureIndex][0]){
str += structures[structureIndex][0][iBlock]
if(iBlock != structures[structureIndex][0].length - 1){
str += "+";
}
}
html += "<option value=\""+structureIndex+"\">"+str+"</option>";
}
html += "</select>";
return html;
};
function selectBlock() {
var html = "<label for=\"blocks\">Type</label>";
html += "<select id=\"blocks\">";
for(var blockIndex in structureTypes){
block = structureTypes[blockIndex];
html += "<option value=\""+blockIndex+"\">"+block+"</option>";
}
html += "</select>";
html += "<label for=\"person\" class=\"verb\">Personne + nombre</label>";
html += "<select id=\"person\" class=\"verb\">";
for(var iPerson = 0; iPerson < 6; iPerson++){
personText = (iPerson%3 + 1)+" "+((iPerson <=2) ? "S" : "P");
html += "<option value=\""+iPerson+"\">"+personText+"</option>";
}
html += "</select>";
html += "<label for=\"tense\" class=\"verb\">Temps</label>";
html += "<select id=\"tense\" class=\"verb\">";
for(var iTense = 0; iTense < tenses.length; iTense++){
tenseText = tenses[iTense];
html += "<option value=\""+iTense+"\">"+tenseText+"</option>";
}
html += "</select>";
html += "<label for=\"gender\" class=\"adj\">Genre</label>";
html += "<select id=\"gender\" class=\"adj\">";
html += "<option value=\"M\">M</option>";
html += "<option value=\"F\">F</option>";
html += "</select>";
html += "<label for=\"number\" class=\"adj\">Nombre</label>";
html += "<select id=\"number\" class=\"adj\">";
html += "<option value=\""+0+"\">S</option>";
html += "<option value=\""+1+"\">P</option>";
html += "</select>";
return html;
};
function selectSentenceNumber() {
var html = "<label for=\"structures\">Nombre de phrases</label>";
html += "<select id=\"nSentences\">";
for(var i = 0; i < 4; i++){
html += "<option value=\""+Math.pow(10,i)+"\">"+Math.pow(10,i)+"</option>";
}
html += "</select>";
return html;
};
function selectTextLength() {
var html = "<label for=\"minLength\">Longueur</label>";
html += "<select id=\"minLength\">";
for(var i = 1; i < 5; i++){
var min = Math.pow(10,i)*5;
html += "<option value=\""+min+"\">"+min+"</option>";
}
html += "</select>";
// html += "<label for=\"maxLength\">Longueur maximale</label>";
// html += "<select id=\"maxLength\">";
// for(var i = 1; i < 5; i++){
// var max = Math.pow(10,i)*5 + 50;
// html += "<option value=\""+max+"\">"+max+"</option>";
// }
// html += "</select>";
return html;
};
function initHandlers() {
$(".verb").hide();
$(".adj").hide();
$("#blocks").change(function(){
if(structureTypes[$("#blocks").val()].startsWith("V")){
$(".verb").show();
}else{
$(".verb").hide();
}
if(structureTypes[$("#blocks").val()].startsWith("adj")){
$(".adj").show();
}else{
$(".adj").hide();
}
});
$("#createSentences").off("click");
$("#createSentences").click(function(){
var struct = $("#structures").val();
var n = $("#nSentences").val();
var rng = Math.random;
var text = generateSentence(rng,n,struct,true);
$("#text,#freq").empty();
$("#text").append(text);
});
$("#wordList").off("click");
$("#wordList").click(function(){
var block = $("#blocks").val();
var text = generateWordList(block);
$("#text,#freq").empty();
$("#text").append(text);
});
$("#createText").off("click");
$("#createText").click(function(){
var rng = Math.random;
var min = parseInt($("#minLength").val());
var max = min + 50;
if(min > max){
var newMin = max;
max = min;
min = newMin;
console.log("les valeurs min et max ont été inversées");
}
var text = generateText(rng,min,max,true);
getFrequencies(text);
$("#text").empty();
$("#text").append(text);
});
};
function getFrequencies(text) {
var letterFreq = {};
var digraphFreq = {};
var wordFreq = {};
text = cleanUpSpecialChars(text,true);
var words = text.split(" ");
var nWords = words.length;
text = cleanUpSpecialChars(text,false);
var nLetters = text.length;
for(var letterIndex in text){
if(letterFreq[text.charAt(letterIndex)]){
letterFreq[text.charAt(letterIndex)]++;
}else{
letterFreq[text.charAt(letterIndex)] = 1;
}
if(letterIndex < nLetters - 1){
var digraph = text.charAt(letterIndex) + text.charAt(parseInt(letterIndex) + 1);
if(digraphFreq[digraph]){
digraphFreq[digraph]++;
}else{
digraphFreq[digraph] = 1;
}
}
}
for(var word of words){
if(wordFreq[word]){
wordFreq[word]++;
}else{
wordFreq[word] = 1;
}
}
for(var letter in letterFreq){
letterFreq[letter] = Math.trunc((letterFreq[letter]*100/nLetters)*100)/100;
}
for(var digraph in digraphFreq){
digraphFreq[digraph] = Math.trunc((digraphFreq[digraph]*100/(nLetters - 1))*100)/100;
}
for(var word in wordFreq){
wordFreq[word] = Math.trunc((wordFreq[word]*100/nWords)*100)/100;
}
wordFreq = sort(wordFreq);
displayFreq(letterFreq,digraphFreq,wordFreq);
};
function sort(object) {
var sortable = [];
var newObject = {};
for (var key in object) {
sortable.push([key, object[key]]);
}
sortable.sort(function(a, b) {
return b[1] - a[1];
});
for(var item of sortable){
newObject[item[0]] = item[1];
}
return newObject;
};
function displayFreq(letterFreq,digraphFreq,wordFreq) {
var referenceLetters = {
"E": 17.35, "A": 8.2, "S": 7.93, "I": 7.53, "N": 7.17, "T": 6.99, "R": 6.65, "L": 5.92, "U": 5.73, "O": 5.53,
"D": 4.01, "C": 3.33, "M": 2.97, "P": 2.92, "V": 1.39, "G": 1.09, "F": 1.08, "Q": 1.04, "H": 0.93, "B": 0.92,
"X": 0.47, "J": 0.34, "Y": 0.31, "Z": 0.1, "K": 0.06, "W": 0.03
};
var referenceDigraphs = {
"ES": 3.05, "LE": 2.22, "DE": 2.17, "RE": 2.1, "EN": 2.08, "ON": 1.64, "NT": 1.62, "ER": 1.53, "TE": 1.52, "ET": 1.43,
"EL": 1.42, "AN": 1.37, "SE": 1.32, "LA": 1.29, "AI": 1.24, "NE": 1.14, "OU": 1.12, "QU": 1.11, "ME": 1.08, "IT": 1.06,
"IE": 1.05, "EM": 1.01, "ED": 1.01, "UR": 1.01, "IS": 0.99, "EC": 0.95, "UE": 0.92, "TI": 0.9, "RA": 0.86, "NS": 0.84,
"IN": 0.84, "TA": 0.82, "CE": 0.81, "AR": 0.8, "EE": 0.79, "EU": 0.78, "SA": 0.76, "CO": 0.74, "EP": 0.71, "ND": 0.7,
"IL": 0.7, "SS": 0.68, "ST": 0.66, "SI": 0.65, "TR": 0.64, "AL": 0.64, "UN": 0.63, "PA": 0.62, "AU": 0.61, "EA": 0.6,
"AT": 0.58, "MA": 0.58, "RI": 0.58, "SD": 0.57, "SO": 0.57, "US": 0.57, "UI": 0.56, "LL": 0.53, "NC": 0.53, "VE": 0.53,
"LI": 0.52, "RO": 0.51, "IO": 0.51, "OR": 0.5, "PE": 0.48, "OI": 0.48, "PR": 0.47, "PO": 0.46, "IR": 0.46, "NA": 0.45,
"UT": 0.44, "TD": 0.44, "CH": 0.44, "OM": 0.43, "SP": 0.43, "SL": 0.42, "DA": 0.42, "AS": 0.42, "MO": 0.41, "AC": 0.4,
"DI": 0.4, "RS": 0.39, "DU": 0.39, "TL": 0.38, "TO": 0.38, "TS": 0.38, "RT": 0.37, "AM": 0.37, "AP": 0.37, "SC": 0.36,
"LO": 0.36, "AV": 0.35, "SU": 0.35, "EV": 0.34, "NO": 0.33, "RL": 0.33, "NI": 0.32, "GE": 0.31, "RD": 0.31, "LU": 0.31,
"NN": 0.3, "HE": 0.29, "PL": 0.28, "IQ": 0.28, "EF": 0.28, "MI": 0.27, "VA": 0.27, "TU": 0.27, "VI": 0.27, "CA": 0.27,
"EQ": 0.26, "CI": 0.26, "TT": 0.26, "IC": 0.25, "UX": 0.25, "MM": 0.25, "OL": 0.24,"AG": 0.24, "VO": 0.24, "EI": 0.24,
"MP": 0.23, "TP": 0.23, "SM": 0.23, "UL": 0.22, "HA": 0.22, "FI": 0.21, "FA": 0.21, "IM": 0.21, "EG": 0.21, "ID": 0.2,
"DO": 0.2, "AD": 0.2, "GR": 0.19, "SQ": 0.19, "AB": 0.19, "BL": 0.18, "UV": 0.18, "IV": 0.18, "NG": 0.18, "TC": 0.17,
"IA": 0.17, "OT": 0.17, "CL": 0.17, "RC": 0.17, "RM": 0.17, "OS": 0.17, "OP": 0.16, "CT": 0.16, "FO": 0.16, "UC": 0.16,
"UP": 0.16, "RR": 0.16, "JE": 0.16, "HO": 0.16, "UD": 0.15, "CR": 0.15, "EB": 0.15, "EO": 0.15, "IF": 0.15, "FR": 0.14,
"RU": 0.14, "UA": 0.14, "NP": 0.14, "IG": 0.14, "BA": 0.14, "BR": 0.14, "OC": 0.14, "CU": 0.14, "FE": 0.13, "UM": 0.13,
"EX": 0.13, "BI": 0.13, "BE": 0.13, "GN": 0.13, "MB": 0.13, "AF": 0.12, "HI": 0.12, "EJ": 0.12, "NF": 0.12, "GI": 0.12,
"PP": 0.12, "GA": 0.11, "FF": 0.11, "PU": 0.11, "BO": 0.11, "SF": 0.11, "SR": 0.11, "LS": 0.11, "TQ": 0.11, "OD": 0.1,
"PH": 0.1, "TM": 0.1, "DR": 0.1, "NU": 0.1, "NV": 0.1, "RN": 0.1, "PI": 0.1, "OB": 0.09, "GU": 0.09, "NL": 0.09,
"OG": 0.09, "JO": 0.09, "IP": 0.09, "TH": 0.08, "RP": 0.08, "SB": 0.08, "JA": 0.08, "NM": 0.08, "SN": 0.08, "YS": 0.08,
"MU": 0.08, "UB": 0.08, "VR": 0.08, "SV": 0.08, "YA": 0.07, "XE": 0.07, "RG": 0.07, "EZ": 0.07, "CC": 0.07, "NQ": 0.07,
"IB": 0.07, "SG": 0.07, "NR": 0.06, "AE": 0.06, "RV": 0.06, "LD": 0.06, "EH": 0.06, "SH": 0.06, "AY": 0.06, "PT": 0.06,
"OY": 0.05, "XP": 0.05, "DS": 0.05, "RQ": 0.05, "TF": 0.05, "FL": 0.05, "YE": 0.05, "SJ": 0.05, "LH": 0.05, "JU": 0.05,
"LT": 0.05, "FU": 0.05, "UF": 0.05, "AQ": 0.05, "IX": 0.05, "PS": 0.05, "TN": 0.05, "XI": 0.05, "GO": 0.05, "UG": 0.04,
"TJ": 0.04, "TV": 0.04, "RB": 0.04, "UO": 0.04, "LQ": 0.04, "SY": 0.04, "AA": 0.04, "TB": 0.04, "HU": 0.04, "AJ": 0.04,
"BU": 0.04, "OF": 0.04, "XD": 0.04, "RF": 0.04, "LP": 0.04, "NB": 0.03, "UJ": 0.03, "GL": 0.03, "HY": 0.03, "UU": 0.03,
"LN": 0.03, "XA": 0.03, "LY": 0.03, "NH": 0.03, "XT": 0.03, "XC": 0.03, "NJ": 0.03, "OV": 0.03, "II": 0.03, "LC": 0.03,
"DD": 0.03, "LF": 0.03, "YC": 0.03, "LM": 0.02, "DM": 0.02, "BS": 0.02, "DH": 0.02, "LG": 0.02, "VU": 0.02, "CD": 0.02,
"AH": 0.02, "YP": 0.02, "TY": 0.02, "TG": 0.02, "CS": 0.02, "OQ": 0.02, "XM": 0.02, "LR": 0.02, "ZE": 0.02, "CK": 0.02,
"AO": 0.02, "UQ": 0.02, "CY": 0.02, "WA": 0.02, "KO": 0.02, "XQ": 0.02, "XL": 0.02, "DL": 0.02, "RJ": 0.02, "IJ": 0.02,
"FS": 0.02, "XS": 0.02, "XV": 0.02, "HR": 0.01, "RY": 0.01, "GT": 0.01, "OE": 0.01, "BJ": 0.01, "GM": 0.01, "LV": 0.01,
"HN": 0.01, "IU": 0.01, "EY": 0.01, "XU": 0.01, "NY": 0.01, "KE": 0.01, "AZ": 0.01, "MD": 0.01, "RH": 0.01, "YO": 0.01,
"YR": 0.01, "ZL": 0.01, "ZO": 0.01, "MY": 0.01, "SW": 0.01, "YM": 0.01, "DP": 0.01, "LB": 0.01, "XO": 0.01, "GS": 0.01,
"CQ": 0.01, "RK": 0.01, "OA": 0.01, "MS": 0.01, "OH": 0.01, "ZA": 0.01, "DC": 0.01, "KA": 0.01, "NZ": 0.01, "XF": 0.01,
"DT": 0.01, "PD": 0.01, "YL": 0.01, "ZV": 0.01, "MN": 0.01, "UH": 0.01, "BT": 0.01, "DJ": 0.01, "XX": 0.01, "YD": 0.01,
"EW": 0.01, "OO": 0.01, "XB": 0.01, "ML": 0.01, "GD": 0.01, "YT": 0.01, "EK": 0.01, "ZD": 0.01, "DY": 0.01, "XN": 0.01,
"KI": 0.01, "YN": 0.01, "BB": 0.01, "ZM": 0.01, "CM": 0.01, "AX": 0.01, "CP": 0.01, "LJ": 0.01, "FD": 0.01, "WE": 0.01,
"ZP": 0.01, "UY": 0.01, "YF": 0.01, "AK": 0.01, "HM": 0.01, "ZI": 0.01, "DN": 0.01, "MT": 0.01, "WI": 0.01, "XR": 0.01,
"SX": 0.01, "DQ": 0.01
};
var table = "<table id=\"letter_freq\"><thead><tr>";
table += "<th></th>";
for(var letter in referenceLetters){
table += "<th>" + letter + "</th>";
}
table += "</tr><tr>";
table += "<td>Français</td>";
for(var letter in referenceLetters){
table += "<td>" + referenceLetters[letter] + "</td>";
}
table += "</tr><tr>";
table += "<td>Texte</td>";
for(var letter in referenceLetters){
table += "<td>" + (letterFreq[letter] || 0) + "</td>";
}
table += "</tr></table>";
table += "<table id=\"digraph_freq\"><thead><tr>";
table += "<th></th>";
for(var digraph in referenceDigraphs){
table += "<th>" + digraph + "</th>";
}
table += "</tr><tr>";
table += "<td>Français</td>";
for(var digraph in referenceDigraphs){
table += "<td>" + referenceDigraphs[digraph] + "</td>";
}
table += "</tr><tr>";
table += "<td>Texte</td>";
for(var digraph in referenceDigraphs){
table += "<td>" + (digraphFreq[digraph] || 0) + "</td>";
}
table += "</tr></table>";
table += "<table id=\"word_freq\"><thead><tr>";
table += "<th></th>";
for(var word in wordFreq){
table += "<th>" + word + "</th>";
}
table += "</tr><tr>";
table += "<td>Texte</td>";
for(var word in wordFreq){
table += "<td>" + (wordFreq[word] || 0) + "</td>";
}
table += "</tr></table>";
$("#freq").empty();
$("#freq").append(table);
};
function generateWordList(block) {
var text = "";
var blockLabel = structureTypes[block];
if(!blockLabel){
return "";
}else if(set.hasOwnProperty(blockLabel)){
for(var subset of set[blockLabel]){
var subsetIndex = structureTypes.indexOf(subset[0]);
text += generateWordList(subsetIndex);
}
}else if(blockLabel.startsWith("adj")){
var place = (blockLabel === "adjBefore") ? "before": "after";
for(var adj of adjectives[place]){
var gender = $("#gender").val();
var plural = $("#number").val();
text += makeAdjectiveAgree(adj,gender,plural);
text += "</br>";
}
}else if(blockLabel.startsWith("adv-")){
var batch = batches[blockLabel];
for(var adv of batch){
text += adv+"</br>";
}
}else{
var batch = batches[blockLabel];
var plural = (blockLabel.includes("-P")) ? 1 : 0;
var personIndex = $("#person").val();
var person = personIndex%3 + 1;
var pluralVerb = (personIndex <= 2) ? 0 : 1;
var tenseIndex = $("#tense").val();
var tense = tenses[tenseIndex];
if(blockLabel === "VT" || blockLabel === "VI"){
for(var word of batch){
text += conjugate(word,person,pluralVerb,"M",tense,false,Math.random);
text += "</br>";
}
}else{
for(var subset of batch){
for(var word of subset[0]){
text += (plural) ? pluralize(word[0],word[1]) : word[0];
text += "</br>";
}
}
}
}
return text;
};
function getWord(block,person,plural,gender,tense,rng,coBefore) {
if(set.hasOwnProperty(block)){
block = pickOne(set[block],rng,false,true);
return getWord(block,person,plural,gender,tense,rng,coBefore);
}
if(block.startsWith("double-")){
var word1 = getWord(block.substring(7),person,plural,gender,tense,rng,coBefore);
var word2 = getWord(block.substring(7),person,plural,gender,tense,rng,coBefore);
var word = word1[0] + " et " + word2[0];
person = 3;
plural = 1;
gender = (word1[3] === "F" && word2[3] === "F") ? "F" : "M";
return [word,person,plural,gender];
}
if(block.endsWith("-de")){
var word1 = getWord(block.replace(/-de$/,"-beforeDe"),person,plural,gender,tense,rng,coBefore);
var word2 = getWord("de+Noun",person,plural,gender,tense,rng,coBefore);
var countryM = false;
for(var country of nouns["country"].M){
if(country[0].toLowerCase() === word2[0].toLowerCase()){
countryM = true;
}
}
if(countryM){
var word = elide(word1[0] + " du " + word2[0]);
}else{
var word = elide(word1[0] + " de " + word2[0]);
}
return [word,word1[1],word1[2],word1[3]];
}
if(block.endsWith("-que")){
var mainSubject = getWord(block.replace(/-que$/,"-beforeQue"),person,plural,gender,tense,rng);
var structSubRel = pickOne(structuresQue,rng,false,true);
var subRel = "";
var personSubRel = 3;
var pluralSubRel = 0;
var genderSubRel = "M";
for(var subBlock of structSubRel){
var newWord = getWord(subBlock,personSubRel,pluralSubRel,genderSubRel,tense,rng,mainSubject);
subRel += newWord[0] + " ";
personSubRel = newWord[1];
pluralSubRel = newWord[2];
genderSubRel = newWord[3];
}
var word = elide(mainSubject[0] + " que " + subRel);
return [word,mainSubject[1],mainSubject[2],mainSubject[3]];
}
var batch = batches[block];
switch(block){
case "N-M-S-noDet":
case "N-F-S-noDet":
case "N-M-S-noDetBeforeQue":
case "N-F-S-noDetBeforeQue":
case "CO-M-S-noDet":
case "CO-F-S-noDet":
case "CO-M-S-noDetBeforeQue":
case "CO-F-S-noDetBeforeQue":
case "N-M-P-noDet":
case "N-F-P-noDet":
case "N-M-P-noDetBeforeQue":
case "N-F-P-noDetBeforeQue":
case "CO-M-P-noDet":
case "CO-F-P-noDet":
case "CO-M-P-noDetBeforeQue":
case "CO-F-P-noDetBeforeQue":
person = 3;
plural = block.includes("-P-") ? 1 : 0;
gender = block.includes("-F-") ? "F" : "M";
var type = pickOne(batch,rng,false,true);
var word = pickOne(type,rng)[plural];
break;
case "de+Noun":
var type = pickOne(batch,rng,false,true);
var word = pickOne(type,rng)[0];
break;
case "N-M-S":
case "N-M-S-adj":
case "N-M-S-beforeDe":
case "N-M-S-adj-beforeDe":
case "N-F-S":
case "N-F-S-adj":
case "N-F-S-beforeDe":
case "N-F-S-adj-beforeDe":
case "CO-M-S":
case "CO-F-S":
case "CO-M-S-adj":
case "CO-F-S-adj":
case "CO-M-S-beforeDe":
case "CO-F-S-beforeDe":
case "CO-M-S-adj-beforeDe":
case "CO-F-S-adj-beforeDe":
person = 3;
plural = 0;
gender = block.includes("-M-") ? "M" : "F";
var type = pickOne(batch,rng,false,true);
var noun = pickOne(type,rng)[0];
if(isCountry(noun) || block.endsWith("-beforeDe")){ // if country or before "de"
var det = getDeterminer(gender,0,"definite_article",rng);
}else{
var det = getDeterminer(gender,0,"",rng);
}
if(block.endsWith("-adj") || block.includes("-adj-")){
var word = addAdjective(noun,det,gender,plural,rng);
}else{
var word = elide(det + " " + noun);
}
break;
case "N-M-P":
case "N-M-P-adj":
case "N-M-P-beforeDe":
case "N-M-P-adj-beforeDe":
case "N-F-P":
case "N-F-P-adj":
case "N-F-P-beforeDe":
case "N-F-P-adj-beforeDe":
case "CO-M-P":
case "CO-F-P":
case "CO-M-P-adj":
case "CO-F-P-adj":
case "CO-M-P-beforeDe":
case "CO-F-P-beforeDe":
case "CO-M-P-adj-beforeDe":
case "CO-F-P-adj-beforeDe":
person = 3;
plural = 1;
gender = block.includes("-M-") ? "M" : "F";
var type = pickOne(batch,rng,false,true);
var nounIndex = Math.trunc(rng() * type.length);
var noun = pluralize(type[nounIndex][0],type[nounIndex][1]);
if(block.endsWith("-beforeDe")){
var det = getDeterminer(gender,1,"definite_article",rng);
}else{
var det = getDeterminer(gender,1,"",rng);
}
if(block.endsWith("-adj") || block.includes("-adj-")){
var word = addAdjective(noun,det,gender,plural,rng);
}else{
var word = elide(det + " " + noun);
}
break;
case "1P-S":
case "2P-S":
case "1P-P":
case "2P-P":
person = block.charAt(0);
plural = block.endsWith("-S") ? 0 : 1;
var word = batch[0][0][0][plural];
break;
case "VI":
case "VT":
case "VI-neg":
case "VT-neg":
case "VI-negWithAdv":
case "VT-negWithAdv":
var verb = pickOne(batch,rng);
var negation = block.includes("-neg") ? 1 : 0;
var word = conjugate(verb,person,plural,gender,tense,negation,rng,coBefore);
break;
case "adv-aftVerb":
// case "adv-aftNegVerb":
case "adv-beforeAdj":
case "adv-locution":
var word = pickOne(batch,rng);
break;
case "VI-str":
case "VT-str":
var verbStructure = (tense === "passé_composé") ? pickOne(verbStructuresWithPC[block],rng,false,true) : pickOne(verbStructures[block],rng,false,true);
var verb = "";
for(var subBlock of verbStructure){
verb += getWord(subBlock,person,plural,gender,tense,rng,coBefore)[0]+" ";
}
var word = verb;
}
if(!word){
console.log(block);
}
return [word,person,plural,gender];
}
function generateText(rng,minLength,maxLength,withSpaces){
var text = "";
var curLength = 0;
while (curLength < minLength) {
var sentence = generateSentence(rng,1,"all",withSpaces,true);
curLength += sentence.length;
text += sentence;
}
if(text.length > maxLength){
text = text.substr(0,minLength + Math.trunc((maxLength - minLength)/2));
}
return text;
};
function generateSentence(rng,n,struc,withSpaces,textMode){
var curLength = 0;
var text = "";
for(var iSentence = 0; iSentence < n; iSentence++){
var sentence = "";
var structure = (struc === "all") ? pickOne(structures,rng,false,true) : structures[struc][0];
var person = 3;
var plural = 0;
var gender = "M";
var tense = pickOne(tenses,rng);
for(var block of structure){
var word = getWord(block,person,plural,gender,tense,rng);
person = word[1];
plural = word[2];
gender = word[3];
sentence += word[0]+" ";
}
sentence = elide(sentence);
sentence = cleanUpSpecialChars(sentence, withSpaces);
// if (sentence.length > (maxLength - curLength - 20)) {
// continue;
// }
curLength += sentence.length;
if(!textMode){
text += "<p>"+sentence+"</p>";
}else{
text += sentence;
if(withSpaces){
text += " ";
}
}
}
// var iLastSentence = Math.trunc(rng() * sentences.length);
// for (var iDelta = 0; iDelta < sentences.length; iDelta++) {
// var iSentence = (iLastSentence + iDelta) % sentences.length;
// var sentence = cleanUpSpecialChars(sentences[iSentence], withSpaces);
// var newLength = curLength + sentence.length;
// if ((newLength >= minLength) && (newLength <= maxLength)) {
// text += sentence;
// return text;
// }
// }
// console.log("Error : unable to generate sentences of correct length");
return text;
}
function getDeterminer(gender,plural,type,rng) {
var determinerType = (type) ? type : pickOne(determinerTypes,rng,(determinerTypes.length - 1 + plural),true);
if(determinerType != "numeral_adjective"){
if(plural){
var determiner = determiners[determinerType][gender][0][1];
}else{
var determiner = determiners[determinerType][gender][0][0];
}
}else{
var determiner = pickOne(determiners[determinerType],rng)[0];
}
return determiner;
};
function getAdjective(place,gender,plural,rng) {
var adj = pickOne(adjectives[place],rng);
var adjText = makeAdjectiveAgree(adj,gender,plural);
return adjText;
};
function makeAdjectiveAgree(adj,gender,plural){
var adjText = adj[0];
if(gender === "F" && adj[1].length < 2){
adjText += adj[1];
}else if(gender === "F" && adj[1].length >= 2){
adjText = adj[1];
}
if(plural && plural !== "0"){
adjText = pluralize(adjText);
}
return adjText;
}
function addAdjective(noun,det,gender,plural,rng) {
var place = pickOne(adjectiveTypes,rng);
var adj = getAdjective(place,gender,plural,rng);
if(place && place === "before"){
if(det.toLowerCase() === "des"){
det = "de";
}
var text = elide(det + " " + adj + " " + noun);
}else{
var withAdv = Math.trunc(rng() * 20);
if(withAdv === 0){
var adv = pickOne(adverbs["beforeAdj"],rng);
}else{
var adv = "";
}
var text = elide(det + " " + noun + " " + adv + " " + adj);
}
return text;
};
function pluralize(str,plural) {
str = str.trim();
str = str.toLowerCase();
if(plural){
return plural;
}
if(str.includes(" ")){
var array = str.split(" ");
var newStr = "";
for(var st of array){
newStr += pluralize(st)+" ";
}
return newStr;
}
if(str.endsWith("s") || str.endsWith("x")){
return str;
}else if(str.endsWith("al") && str != "chacal" && str != "banal" && str != "narval"){
return str.replace(/al$/,"aux");
}else if(str.endsWith("au")){
return str.replace(/au$/,"aux");
}else{
return str+"s";
}
};
function conjugate(verb,person,plural,gender,tense,negation,rng,coBefore) {
var infinitive = verb[0].toLowerCase();
var group = verb[1];
var aux = verb[2];
if(tense === "infinitive"){
return infinitive;
}else if(tense === "passé_composé"){
var auxConj = auxConjugations[aux]["present"][person - 1 + plural * 3];
var ending = pastParticiples[group - 1];
if(aux && gender === "F" || (coBefore && !aux && coBefore[3] === "F")){
ending += "e";
}
if(aux && plural || (coBefore && !aux && coBefore[2])){
ending += "s";
}
if(group === 1){
var verbPP = infinitive.replace(/er$/,ending);
}else if(group === 2){
var verbPP = infinitive.replace(/ir$/,ending);
}
if(negation){
var negationWord = block.endsWith("-negWithAdv") ? "pas" : pickOne(negationWords,rng);
return elide("ne " + auxConj + " " + negationWord + " " + verbPP);
}else{
return auxConj + " " + verbPP;
}
// }else if(group === 0){ // auxiliaires
// if(infinitive === "être"){
// return auxConjugations[0][tense][person - 1 + plural * 3];
// }else{
// return auxConjugations[1][tense][person - 1 + plural * 3];
// }
}else if(group === 1){
var ending = conjugations[group-1][tense][person - 1 + plural * 3];
if((infinitive.endsWith("ger") && tense === "present" && person === 1 && plural === 1) ||
(infinitive.endsWith("ger") && tense === "imparfait" && (plural === 0 || (plural === 1 && person === 3)))){ // exceptions orthographiques (sans tenir compte de l'accentuation)
ending = "e"+ending;
var verbConj = infinitive.replace(/er$/,ending);
}else if((infinitive.endsWith("oyer") || infinitive.endsWith("uyer")) && tense !== "imparfait"){
if(tense === "present" && plural && (person == 1 || person == 2)){
var verbConj = infinitive.replace(/er$/,ending);
}else{
var verbConj = infinitive.replace(/yer$/,"i"+ending);
}
}else if(infinitive.endsWith("eler") && !exceptions[0].includes(infinitive) && tense !== "imparfait"){
if(tense === "present" && plural && (person == 1 || person == 2)){
var verbConj = infinitive.replace(/er$/,ending);
}else{
var verbConj = infinitive.replace(/er$/,"l"+ending);
}
}else if(infinitive.endsWith("eter") && !exceptions[0].includes(infinitive) && tense !== "imparfait"){
if(tense === "present" && plural && (person == 1 || person == 2)){
var verbConj = infinitive.replace(/er$/,ending);
}else{
var verbConj = infinitive.replace(/er$/,"t"+ending);
}
}else{
var verbConj = infinitive.replace(/er$/,ending);
}
}else if(group === 2){
var ending = conjugations[group-1][tense][person - 1 + plural * 3];
var verbConj = infinitive.replace(/r$/,ending);
}else if(group === 3){
if(infinitive === "aller"){
var verbConj = allerConj[tense][person - 1 + plural * 3];
}else if(infinitive === "pouvoir"){
var ending = speConjugations[2][tense][person - 1 + plural * 3];
var verbConj = infinitive.replace(/ouvoir$/,ending);
}else if(infinitive === "vouloir"){
var ending = speConjugations[1][tense][person - 1 + plural * 3];
var verbConj = infinitive.replace(/ouloir$/,ending);
}else if(infinitive === "devoir"){
var ending = speConjugations[3][tense][person - 1 + plural * 3];
var verbConj = infinitive.replace(/evoir$/,ending);
}else if(infinitive.endsWith("enir")){
var ending = speConjugations[0][tense][person - 1 + plural * 3];
var verbConj = infinitive.replace(/enir$/,ending);
}else if(infinitive.endsWith("ir") && !infinitive.endsWith("oir")&& !infinitive.endsWith("courir") ){
var ending = conjugations[0][tense][person - 1 + plural * 3];
var verbConj = infinitive.replace(/ir$/,ending);
}else{
var verbConj = infinitive;
}
}else{
var verbConj = infinitive;
}
if(negation){
var negationWord = block.endsWith("-negWithAdv") ? "pas" : pickOne(negationWords,rng);
return elide("ne " + verbConj + " " + negationWord);
}else{
return verbConj;
}
};
function elide(str) {
// str = cleanUpSpecialChars(str,true);
str = str.toLowerCase();
str = str.replace(/[èéêë]/g,"e");
str = str.replace(/[ôö]/g,"o");
str = " " + str;
str = str.replace(/[ ](le|la)[ ]+([aeiouy][^a])/gi," l'$2");
str = str.replace(/[ ](ce)[ ]+([aeiouy][^a])/gi," cet $2");
str = str.replace(/[ ](de|du)[ ]+([aeiouy][^a])/gi," d'$2");
str = str.replace(/[ ](je)[ ]+([aeiouy][^a])/gi," j'$2");
str = str.replace(/[ ](ne)[ ]+([aeiouy][^a])/gi," n'$2");
str = str.replace(/[ ](que)[ ]+([aeiouy][^a])/gi," qu'$2");
str = str.replace(/[ ]à[ ]+le[ ]/gi," au ");
str = str.replace(/[ ]à[ ]+les[ ]/gi," aux ");
str = str.trim();
var words = str.split(" ");
str = "";
for(var wordIndex in words){ // élision pour les mots en H
// console.log(word);
var hElide = false;
if(wordIndex > 0 && (elisionWithH.includes(words[wordIndex]) || isHVerb(words[wordIndex]))){
words[wordIndex - 1] = elideH( " " + words[wordIndex - 1] + " " + words[wordIndex]);
words[wordIndex] = "";
}
}
for(var word of words){
str += word + " ";
}
return str;
};
function isHVerb(word) {
for(var radical of elisionWithHVerb) {
if(word.startsWith(radical)){
return true;
}
}
return false;
};
function elideH(str) {
str = str.replace(/[ ](je)[ ]+(h[aeiouy])/gi," j'$2");
str = str.replace(/[ ](ne)[ ]+(h[aeiouy])/gi," n'$2");
str = str.replace(/[ ](le|la)[ ]+(h[aeiouy])/gi," l'$2");
str = str.replace(/[ ](ce)[ ]+(h[aeiouy])/gi," cet $2");
str = str.replace(/[ ](de)[ ]+(h[aeiouy])/gi," d'$2");
str = str.replace(/[ ](que)[ ]+(h[aeiouy])/gi," qu'$2");
return str;
};
function cleanUpSpecialChars(str, withSpaces) {
str = str.replace(/[ÀÁÂÃÄÅ]/g,"A");
str = str.replace(/[àáâãäå]/g,"a");
str = str.replace(/[ÈÉÊË]/g,"E");
str = str.replace(/[èéêë]/g,"e");
str = str.replace(/[îï]/g,"i");
str = str.replace(/[ôö]/g,"o");
str = str.replace(/[ùüû]/g,"u");
str = str.replace(/[Ç]/g,"C");
str = str.replace(/[ç]/g,"c");
str = str.replace(/['-]/g," ");
str = str.replace(/ {2,}/gi," ");
str = str.replace(/[^a-zA-Z ]/gi,''); // final clean up
str = str.trim();
if (!withSpaces) {
str = str.replace(/[ ]/g,"");
}
return str.toUpperCase();
};
function pickOne(arr,rng,length,weighting) {
if(weighting){
var weightedArray = [];
for(var weightedElement of arr){
var element = weightedElement[0];
var weight = weightedElement[1];
for(var nTimes = 0; nTimes < weight; nTimes++){
weightedArray.push(element);
}
}
arr = weightedArray;
}
if(length){
var arrLength = length;
}else{
var arrLength = arr.length;
}
return arr[Math.trunc(rng() * arrLength)];
};
function isCountry(noun) {
for(var gender in nouns["country"]){
for(var country of nouns["country"][gender]){
if(country[0].toLowerCase() === noun.toLowerCase()){
return true;
}
}
}
return false;
};
const structureTypes = [
"N-M-S-noDet", // nom masculin singulier sans déterminant
"N-M-S",
"N-F-S-noDet",
"N-F-S",
"N-M-P-noDet",
"N-M-P",
"N-F-P-noDet",
"N-F-P",
"1P-S", // 1ère personne su singulier
"2P-S",
// "3P-S", // 3ème personne du singulier, regroupe plusieurs types (cf. array set)
"1P-P",
"2P-P",
// "3P-P", // 3ème personne du pluriel, regroupe plusieurs types (cf. array set)
"VI", // verbe intransitif
"VT",
"CO-M-S-noDet", // complément d'objet direct masculin singulier sans déterminant
"CO-M-S",
"CO-F-S-noDet",
"CO-F-S",
"CO-M-P-noDet",
"CO-M-P",
"CO-F-P-noDet",
"CO-F-P",
"adjBefore",
"adjAfter",
"adv-aftVerb",
// "adv-aftNegVerb",
"adv-beforeAdj",
"adv-locution",
"de+Noun" // nom après "de"
];
const structures = [ // [structure,weight]
[["3P-S","VI-str"],40],
[["3P-P","VI-str"],20],
[["3P-S","VT-str","CO"],80],
[["3P-P","VT-str","CO"],40],
[["1P-S","VI-str"],10],
[["2P-S","VI-str"],10],
[["1P-P","VI-str"],5],
[["2P-P","VI-str"],5],
[["1P-S","VT-str","CO"],20],
[["2P-S","VT-str","CO"],20],
[["1P-P","VT-str","CO"],10],
[["2P-P","VT-str","CO"],10],
[["adv-locution","3P-S","VI-str"],20],
[["adv-locution","3P-P","VI-str"],10],
[["adv-locution","3P-S","VT-str","CO"],40],
[["adv-locution","3P-P","VT-str","CO"],20],
[["adv-locution","1P-S","VI-str"],5],
[["adv-locution","2P-S","VI-str"],5],
[["adv-locution","1P-P","VI-str"],3],
[["adv-locution","2P-P","VI-str"],3],
[["adv-locution","1P-S","VT-str","CO"],10],
[["adv-locution","2P-S","VT-str","CO"],10],
[["adv-locution","1P-P","VT-str","CO"],5],
[["adv-locution","2P-P","VT-str","CO"],5],
/*** avec subordonnée relative en "que" ***/
[["3P-S-que","VI-str"],8],
[["3P-P-que","VI-str"],4],
[["3P-S-que","VT-str","CO"],16],
[["3P-P-que","VT-str","CO"],8],
[["adv-locution","3P-S-que","VI-str"],4],
[["adv-locution","3P-P-que","VI-str"],2],
[["adv-locution","3P-S-que","VT-str","CO"],16],
[["adv-locution","3P-P-que","VT-str","CO"],4],
[["3P-S","VT-str","CO-que"],16],
[["3P-P","VT-str","CO-que"],8],
[["1P-S","VT-str","CO-que"],4],
[["2P-S","VT-str","CO-que"],4],
[["1P-P","VT-str","CO-que"],2],
[["2P-P","VT-str","CO-que"],2],
[["adv-locution","3P-S","VT-str","CO-que"],8],
[["adv-locution","3P-P","VT-str","CO-que"],4],
[["adv-locution","1P-S","VT-str","CO-que"],2],
[["adv-locution","2P-S","VT-str","CO-que"],2],
[["adv-locution","1P-P","VT-str","CO-que"],1],
[["adv-locution","2P-P","VT-str","CO-que"],1],
[["3P-S-que","VT-str","CO-que"],16],
[["3P-P-que","VT-str","CO-que"],8],
[["adv-locution","3P-S-que","VT-str","CO-que"],8],
[["adv-locution","3P-P-que","VT-str","CO-que"],4]
];
const structuresQue = [ // structures de subordonnée relative suivant "que"
[["3P-S","VT-str"],80],
[["3P-P","VT-str"],40],
[["1P-S","VT-str"],20],
[["2P-S","VT-str"],20],
[["1P-P","VT-str"],10],
[["2P-P","VT-str"],10],
];
const verbStructures = {
"VI-str": [ // [structure,weight]
[["VI"],100],
[["VI","adv-aftVerb"],5],
[["VI-neg"],10],
// [["VI-negWithAdv","adv-aftNegVerb"],1]
],
"VT-str": [ // [structure,weight]
[["VT"],100],
[["VT","adv-aftVerb"],5],
[["VT-neg"],10],
// [["VT-negWithAdv","adv-aftNegVerb"],1]
]
};
const verbStructuresWithPC = {
"VI-str": [ // [structure,weight]
[["VI"],100],
[["VI-neg"],10]
],
"VT-str": [ // [structure,weight]
[["VT"],100],
[["VT-neg"],10]
]
};
const tenses = [
"present",
"imparfait",
"futur",
"passé_composé"
];
const nmsNoDet = [ // [subset,weight]
[nouns["name"].M,1],
[pronouns["demonstrative"].M,1],
[pronouns["indefinite"].M.filter(word => word[0] != ""),1],
[[["il"]],1],
[[["le mien"],["le tien"],["le sien"],["le vôtre"],["le nôtre"],["le leur"]],1]
];
const nmsNoDetBeforeQue = [ // [subset,weight]
[nouns["name"].M,2],
[pronouns["demonstrative_2"].M,2],
[[["le mien"],["le tien"],["le sien"],["le vôtre"],["le nôtre"],["le leur"],["Quelque chose"]],1]
];
const nfsNoDet = [ // [subset,weight]
[nouns["name"].F,1],
// [nouns["city"],1],
[pronouns["demonstrative"].F,1],
[pronouns["indefinite"].F.filter(word => word[0] != ""),1],
[[["elle"]],1],
[[["la mienne"],["la tienne"],["la sienne"],["la vôtre"],["la nôtre"],["la leur"]],1]
];
const nfsNoDetBeforeQue = [ // [subset,weight]
[nouns["name"].F,1],
// [nouns["city"],1],
[pronouns["demonstrative_2"].F,1],
[[["la mienne"],["la tienne"],["la sienne"],["la vôtre"],["la nôtre"],["la leur"]],1]
];
const nmpNoDet = [ // [subset,weight]
[pronouns["demonstrative"].M.filter(word => word[1] != ""),1],
[pronouns["indefinite"].M.filter(word => word[1] != ""),1],
[[["","ils"]],1],
[[["","les miens"],["","les tiens"],["","les siens"],["","les vôtres"],["","les nôtres"],["","les leurs"]],1]
];
const nmpNoDetBeforeQue = [ // [subset,weight]
[pronouns["demonstrative_2"].M.filter(word => word[1] != ""),1],
[pronouns["indefinite"].M.filter(word => word[1] != ""),1],
[[["","les miens"],["","les tiens"],["","les siens"],["","les vôtres"],["","les nôtres"],["","les leurs"]],1]
];
const nfpNoDet = [ // [subset,weight]
[pronouns["demonstrative"].F,1],
[pronouns["indefinite"].F.filter(word => word[1] != ""),1],
[[["","elles"]],1],
[[["","les miennes"],["","les tiennes"],["","les siennes"],["","les vôtres"],["","les nôtres"],["","les leurs"]],1]
];
const nfpNoDetBeforeQue = [ // [subset,weight]
[pronouns["demonstrative_2"].F,1],
[pronouns["indefinite"].F.filter(word => word[1] != ""),1],
[[["","les miennes"],["","les tiennes"],["","les siennes"],["","les vôtres"],["","les nôtres"],["","les leurs"]],1]
];
const nms = [ // [subset,weight]
[nouns["job"].M,1],
[nouns["animal"].M,1],
[nouns["plant"].M,1],
[nouns["country"].M,1]
];
const nfs = [ // [subset,weight]
[nouns["job"].F,1],
[nouns["animal"].F,1],
[nouns["plant"].F,1],
[nouns["country"].F,1]
];
const nmp = [ // [subset,weight]
[nouns["job"].M,1],
[nouns["animal"].M,1],
[nouns["plant"].M,1]
];
const nfp = [ // [subset,weight]
[nouns["job"].F,1],
[nouns["animal"].F,1],
[nouns["plant"].F,1]
];
const p1 = [[[["je","nous"]]]];
const p2 = [[[["tu","vous"]]]];
const comsNoDet = [ // [subset,weight]
[nouns["name"].M,1],
[pronouns["demonstrative"].M,1],
[pronouns["indefinite"].M.filter(word => (word[0].toLowerCase() != "on" && word[0].toLowerCase() != "quiconque" && word[0].toLowerCase() != "chacun" && word[0] != "")),1],
[[["le mien"],["le tien"],["le sien"],["le vôtre"],["le nôtre"],["le leur"]],1]
];
const comsNoDetBeforeQue = nmsNoDetBeforeQue;
const cofsNoDet = [ // [subset,weight]
[nouns["name"].F,1],
[nouns["city"],1],
[pronouns["demonstrative"].F,1],
[[["la mienne"],["la tienne"],["la sienne"],["la vôtre"],["la nôtre"],["la leur"]],1]
];
const cofsNoDetBeforeQue = nfsNoDetBeforeQue;
const compNoDet = [ // [subset,weight]
[pronouns["demonstrative"].M.filter(word => word[1] != ""),1],
[[["","les miens"],["","les tiens"],["","les siens"],["","les vôtres"],["","les nôtres"],["","les leurs"]],1]
];
const compNoDetBeforeQue = [ // [subset,weight]
[pronouns["demonstrative_2"].M.filter(word => word[1] != ""),1],
[[["","les miens"],["","les tiens"],["","les siens"],["","les vôtres"],["","les nôtres"],["","les leurs"]],1]
];
const cofpNoDet = [ // [subset,weight]
[pronouns["demonstrative"].F,1],
[[["","les miennes"],["","les tiennes"],["","les siennes"],["","les vôtres"],["","les nôtres"],["","les leurs"]],1]
];
const cofpNoDetBeforeQue = [ // [subset,weight]
[pronouns["demonstrative_2"].F,1],
[[["","les miennes"],["","les tiennes"],["","les siennes"],["","les vôtres"],["","les nôtres"],["","les leurs"]],1]
];
const nmsBeforeDe = [
[nouns["job"].M,1],
[nouns["animal"].M,1],
[nouns["plant"].M,1]
];
const nfsBeforeDe = [ // [subset,weight]
[nouns["job"].F,1],
[nouns["animal"].F,1],
[nouns["plant"].F,1]
];
const deNoun = [
[nouns["name"].M,1],
[nouns["name"].F,1],
[nouns["city"],1],
[nouns["country"].M,1],
[nouns["country"].F,1]
];
const batches = {
"N-M-S-noDet": nmsNoDet,
"N-F-S-noDet": nfsNoDet,
"N-M-S-noDetBeforeQue": nmsNoDetBeforeQue,
"N-F-S-noDetBeforeQue": nfsNoDetBeforeQue,
"N-M-P-noDet": nmpNoDet,
"N-F-P-noDet": nfpNoDet,
"N-M-P-noDetBeforeQue": nmpNoDetBeforeQue,
"N-F-P-noDetBeforeQue": nfpNoDetBeforeQue,
"N-M-S": nms,
"N-M-S-adj": nms,
"N-M-S-beforeDe": nmsBeforeDe, // N-M-S with definite article (before "de")
"N-M-S-adj-beforeDe": nmsBeforeDe,
"N-F-S": nfs,
"N-F-S-adj": nfs,
"N-F-S-beforeDe": nfsBeforeDe, // N-F-S with definite article (before "de")
"N-F-S-adj-beforeDe": nfsBeforeDe,
"N-M-P": nmp,
"N-M-P-adj": nmp,
"N-M-P-beforeDe": nmsBeforeDe, // N-M-P with definite article (before "de")
"N-M-P-adj-beforeDe": nmsBeforeDe,
"N-F-P": nfp,
"N-F-P-adj": nfp,
"N-F-P-beforeDe": nfsBeforeDe, // N-F-P with definite article (before "de")
"N-F-P-adj-beforeDe": nfsBeforeDe,
"1P-S": p1,
"2P-S": p2,
"1P-P": p1,
"2P-P": p2,
"VI": verbs["intransitive"],
"VT": verbs["transitive"],
"VI-neg": verbs["intransitive"],
"VT-negWithAdv": verbs["transitive"],
"VI-negWithAdv": verbs["intransitive"],
"VT-neg": verbs["transitive"],
"CO-M-S-noDet": comsNoDet,
"CO-F-S-noDet": cofsNoDet,
"CO-M-S-noDetBeforeQue": comsNoDetBeforeQue,
"CO-F-S-noDetBeforeQue": cofsNoDetBeforeQue,
"CO-M-S": nms,
"CO-F-S": nfs,
"CO-M-S-adj": nms,
"CO-F-S-adj": nfs,
"CO-M-S-beforeDe": nmsBeforeDe,
"CO-F-S-beforeDe": nfsBeforeDe,
"CO-M-S-adj-beforeDe": nmsBeforeDe,
"CO-F-S-adj-beforeDe": nfsBeforeDe,
"CO-M-P-noDet": compNoDet,
"CO-F-P-noDet": cofpNoDet,
"CO-M-P-noDetBeforeQue": compNoDetBeforeQue,
"CO-F-P-noDetBeforeQue": cofpNoDetBeforeQue,
"CO-M-P": nmp,
"CO-F-P": nfp,
"CO-M-P-adj": nmp,
"CO-F-P-adj": nfp,
"CO-M-P-beforeDe": nmsBeforeDe,
"CO-F-P-beforeDe": nfsBeforeDe,
"CO-M-P-adj-beforeDe": nmsBeforeDe,
"CO-F-P-adj-beforeDe": nfsBeforeDe,
"adv-aftVerb": adverbs["aftVerb"],
// "adv-aftNegVerb": adverbs["aftNegVerb"],
"adv-beforeAdj": adverbs["beforeAdj"],
"adv-locution": adverbs["locution"],
"de+Noun": deNoun // préposition de + nom
};
const set = {
"3P-S": [
["N-M-S-noDet",1],
["N-M-S",1],
["N-M-S-de",1], // groupe (N-M-S + de + nom)
["N-M-S-adj",1],
["N-M-S-adj-de",1],
["N-F-S-noDet",1],
["N-F-S",1],
["N-F-S-de",1],
["N-F-S-adj",1],
["N-F-S-adj-de",1]
],
"3P-S-beforeQue": [
["N-M-S-noDetBeforeQue",1],
["N-M-S",1],
["N-M-S-de",1], // groupe (N-M-S + de + nom)
["N-M-S-adj",1],
["N-M-S-adj-de",1],
["N-F-S-noDetBeforeQue",1],
["N-F-S",1],
["N-F-S-de",1],
["N-F-S-adj",1],
["N-F-S-adj-de",1]
],
"3P-P": [
["N-M-P-noDet",1],
["N-M-P",1],
["N-M-P-de",1],
["N-M-P-adj",1],
["N-M-P-adj-de",1],
["N-F-P-noDet",1],
["N-F-P",1],
["N-F-P-de",1],
["N-F-P-adj",1],
["N-F-P-adj-de",1],
["double-3P",2] // sujet1 + "et" + sujet2
],
"3P-P-beforeQue": [
["N-M-P-noDetBeforeQue",1],
["N-M-P",1],
["N-M-P-de",1],
["N-M-P-adj",1],
["N-M-P-adj-de",1],
["N-F-P-noDetBeforeQue",1],
["N-F-P",1],
["N-F-P-de",1],
["N-F-P-adj",1],
["N-F-P-adj-de",1],
["double-3P",2] // sujet1 + "et" + sujet2
],
"3P": [ // pour les groupes de 2 sujets
["CO-M-S-noDet",1],
["N-M-S",1],
["N-M-S-de",1],
["N-M-S-adj",1],
["N-M-S-adj-de",1],
["CO-F-S-noDet",1],
["N-F-S",1],
["N-F-S-de",1],
["N-F-S-adj",1],
["N-F-S-adj-de",1],
["CO-M-P-noDet",1],
["N-M-P",1],
["N-M-P-de",1],
["N-M-P-adj",1],
["N-M-P-adj-de",1],
["CO-F-P-noDet",1],
["N-F-P",1],
["N-F-P-de",1] ,
["N-F-P-adj",1],
["N-F-P-adj-de",1]
],
"CO": [
["CO-M-S-noDet",1],
["CO-M-S",1],
["CO-M-S-de",1],
["CO-M-S-adj",1],
["CO-M-S-adj-de",1],
["CO-F-S-noDet",1],
["CO-F-S",1],
["CO-F-S-de",1],
["CO-F-S-adj",1],
["CO-F-S-adj-de",1],
["CO-M-P-noDet",1],
["CO-M-P",1],
["CO-M-P-de",1],
["CO-M-P-adj",1],
["CO-M-P-adj-de",1],
["CO-F-P-noDet",1],
["CO-F-P",1],
["CO-F-P-de",1],
["CO-F-P-adj",1],
["CO-F-P-adj-de",1]
],
"CO-beforeQue": [
["CO-M-S-noDetBeforeQue",1],
["CO-M-S",1],
["CO-M-S-de",1],
["CO-M-S-adj",1],
["CO-M-S-adj-de",1],
["CO-F-S-noDetBeforeQue",1],
["CO-F-S",1],
["CO-F-S-de",1],
["CO-F-S-adj",1],
["CO-F-S-adj-de",1],
["CO-M-P-noDetBeforeQue",1],
["CO-M-P",1],
["CO-M-P-de",1],
["CO-M-P-adj",1],
["CO-M-P-adj-de",1],
["CO-F-P-noDetBeforeQue",1],
["CO-F-P",1],
["CO-F-P-de",1],
["CO-F-P-adj",1],
["CO-F-P-adj-de",1]
]
};
if(typeof exports != 'undefined') {
exports.generate = generateText;
exports.generateSentence = generateSentence;
}