From 77986b320dfc33625ea2df7f4049cb6c7f8c222e Mon Sep 17 00:00:00 2001 From: Denise sur Lya Date: Wed, 28 Jul 2021 10:31:46 +0200 Subject: =?UTF-8?q?Am=C3=A9liorations=20diverses.=20Lancement=20officiel?= =?UTF-8?q?=20de=20la=20b=C3=AAta=20!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 13 +++++--- config.py | 4 +-- data/bingo_data.txt | 20 +++++++++++ data_textes.py | 91 +++++++++++++++++++++++++++++++++++++++++++-------- gere_grille.py | 67 ++++++++++++++++++++++++++++--------- static/outilspage.js | 61 +++++++++++++++++++++++++++++++--- static/style.css | 8 +++++ templates/custom.html | 16 +++++++-- templates/index.html | 18 +++++++--- 9 files changed, 251 insertions(+), 47 deletions(-) create mode 100644 data/bingo_data.txt diff --git a/app.py b/app.py index 8b558ea..6ef4667 100644 --- a/app.py +++ b/app.py @@ -10,7 +10,8 @@ Created on Mon Jul 26 17:31:48 2021 # -*- coding: utf-8 -*- import flask -from data_textes import liste_textes + +from data_textes import tabletextes, tablecomplete, extraire_textes_par_cat import gere_grille as g import gere_erreurs as e from config import DEFAUT, CONFIG @@ -32,11 +33,12 @@ app = flask.Flask(__name__) @app.route('/', methods=["GET", "POST"]) def index(): liste_err = e.initialise_erreurs() + #print(tabletextes) idg = flask.request.args.get("grille", "") # Id de grille passée en param (ou pas) if idg != "": # Si on a mis un url de grille conf = g.decode_grille(idg, liste_err) if conf == {}: # Erreur à la génération - bingo = g.genere_grille(DEFAUT, liste_textes) + bingo = g.genere_grille(DEFAUT, tabletextes) conf = DEFAUT.copy() e.erreur("L'url de la grille n'est pas valide...", liste_err) else: @@ -47,7 +49,7 @@ def index(): conf = g.gere_donnees_custom(flask.request.form, liste_err) else: conf= DEFAUT.copy() - bingo = g.genere_grille(conf, liste_textes) # aléatoire + bingo = g.genere_grille(conf, tabletextes) # aléatoire chainecode = g.encode_grille(conf, bingo, liste_err) @@ -57,7 +59,10 @@ def index(): @app.route('/custom') def custom(): liste_err = e.initialise_erreurs() - return flask.render_template("custom.html", DEFAUT=DEFAUT,CONFIG=CONFIG, e=liste_err[0]+liste_err[1]+liste_err[2]) + categ, tableqr = extraire_textes_par_cat(tablecomplete) + nombre_categ = [len(elt) for elt in tableqr] + print(nombre_categ) + return flask.render_template("custom.html", DEFAUT=DEFAUT,CONFIG=CONFIG, nbdata=len(tabletextes), categ=categ, nbparcat = nombre_categ, e=liste_err[0]+liste_err[1]+liste_err[2]) if __name__ == "__main__": # print("Mode debug maison : "+str(niveau_debug)) diff --git a/config.py b/config.py index deb461a..eafe94d 100644 --- a/config.py +++ b/config.py @@ -12,7 +12,7 @@ DEFAUT["titre"] = "Le bingo de l'allaitement" DEFAUT["nblignes"] = 4 DEFAUT["nbcolonnes"] = 3 DEFAUT["nbcasesvides"] = 0 - +DEFAUT["reponses_presentes"] = True # veut-on proposer les réponses # Configuration @@ -21,4 +21,4 @@ CONFIG["lmax_titre"] = 50 CONFIG["maxlignes"] = 20 CONFIG["minlignes"] = 1 CONFIG["maxcolonnes"] = 20 -CONFIG["mincolonnes"] = 1 \ No newline at end of file +CONFIG["mincolonnes"] = 1 diff --git a/data/bingo_data.txt b/data/bingo_data.txt new file mode 100644 index 0000000..0d25331 --- /dev/null +++ b/data/bingo_data.txt @@ -0,0 +1,20 @@ +"Allaitement","Tu vas l'allaiter jusqu'à [X] ?","Jusqu'à ce qu'il ait son permis !" +"Allaitement","Tu es sûre que tu as encore/assez de lait ?" +"Allaitement","Quand est-ce que tu vas lui donner du lait normal ?","J'hésite encore entre le lait de baleine et le lait d'ourse, tu en penses quoi ?" +"Allaitement","Ton lait n'est pas assez nourrissant.","Probablement plus que ton sperme !" +"Allaitement","Donne-lui un biberon, tu vois bien que bébé a faim." +"Allaitement","Donne-lui un biberon, ça le/la calera pour la nuit." +"Allaitement","Tu arrêteras quand bébé aura des dents" +"Allaitement","Tu ne devrais pas l'endormir au sein" +"Allaitement","Encore au sein ?" + +"Sommeil","Bébé fait (enfin) ses nuits ?","Et toi, tu fais tes nuits ?","Bébé fait SES nuits bien à lui/elle.","Oui.","Non." +"Sommeil","Bébé dort (encore) avec vous ?" +"Sommeil","Laisse bébé pleurer il/elle finira bien par dormir." +"Sommeil","Il faut lui donner un rythme." + +"Pleurs","Laisse bébé pleurer, ça lui fera les poumons." + +"Éducation","Il/elle doit apprendre à se détacher de maman." + +"Divers","Tu as pris combien de kilos ?" diff --git a/data_textes.py b/data_textes.py index 8082ecf..85baa54 100644 --- a/data_textes.py +++ b/data_textes.py @@ -6,17 +6,80 @@ Created on Mon Jul 26 22:50:08 2021 @author: sekhmet """ -liste_textes = [ - "Tu vas pas l'allaiter jusqu'à [âge quelconque] !", - "Tu es sûre que tu as assez de lait ?", - "Quand est-ce que tu vas lui donner du lait normal ?", - "Il/elle fait ses nuits ?", - "Il/elle dort encore avec vous ?", - "Laisse le/la pleurer il/elle finira bien par dormir (et/ou ça lui fera les poumons).", - "Ton lait n'est pas/plus assez nourrissant.", - "Il/elle doit apprendre à se détacher de maman.", - "Tu as pris combien de kilos ?", - "Donne lui un biberon, il/elle fera ses nuits.", - "Tu arrêteras quand il/elle aura des dents, puisqu'il/elle va te mordre", - - ] \ No newline at end of file +#liste_textes = [ +# "Tu vas pas l'allaiter jusqu'à [âge quelconque] !", +# "Tu es sûre que tu as assez de lait ?", +# "Quand est-ce que tu vas lui donner du lait normal ?", +# "Il/elle fait ses nuits ?", +# "Il/elle dort encore avec vous ?", +# "Laisse le/la pleurer il/elle finira bien par dormir (et/ou ça lui fera les poumons).", +# "Ton lait n'est pas/plus assez nourrissant.", +# "Il/elle doit apprendre à se détacher de maman.", +# "Tu as pris combien de kilos ?", +# "Donne lui un biberon, il/elle fera ses nuits.", +# "Tu arrêteras quand il/elle aura des dents, puisqu'il/elle va te mordre", +# +# ] + +import csv + +chemin_data = "data/" +fichier_bingo = chemin_data+"bingo_data.txt" +# Au format : catégorie, phrase, réponses. + +#fichier_FAQ = chemin_data+"FAQ_data.txt" +#fichier_changelog = chemin_data+"changelog_data.txt" + + + +def lire_fichier_csv_simple(fichier, minlong=2): + """ lire un fichier csv et le renvoyer en tableau de tableaux + minlong est la longueur minimale d'une ligne pour que ça soit accepté + (plus court on ne met même pas)""" + table=[] + with open(fichier, "r") as fichier_csv: + reader_notes = csv.reader(fichier_csv,delimiter=",",dialect="unix") + for ligne in reader_notes: + if len(ligne) >= minlong: # La ligne doit avoir plus de deux éléments + table.append(ligne) + return table + +def extraire_categories(table): + """ extrait les catégories (1ere colonne du tableau de tableau) + renvoie sous forme de liste""" + liste_cat = [] + for ligne in table: + if not (ligne[0] in liste_cat): + liste_cat.append(ligne[0]) + return liste_cat + +def extraire_textes_par_cat(table): + """ construit deux tables : une de catégories (liste simple) + une autre qui est un tableau dont chaque élément est un tuple + (phrase, reponses) où reponses est une liste (éventuellement vide) + + categ[i] va correspondre à tableqr[i] en terme de catégorie""" + categ = extraire_categories(table) + tableqr = [ [] for i in range(len(categ)) ] + + for ligne in table: + try: + cat = ligne[0] + q = ligne[1] + lister = ligne[2:] # Le reste + ind = categ.index(cat) + tableqr[ind].append((q,lister)) + except: + print("Impossible de lire la ligne : "+str(ligne)) + + return (categ,tableqr) + +def extraire_qr(table): + """ on enlève juste la catégorie en début de ligne""" + table2 = [ ligne[1:] for ligne in table] + return table2 + +tablecomplete = lire_fichier_csv_simple(fichier_bingo) +tabletextes = extraire_qr(tablecomplete) + +#liste_cat, liste_textes = extraire_textes_par_cat(lire_fichier_csv_simple(fichier_bingo)) \ No newline at end of file diff --git a/gere_grille.py b/gere_grille.py index 9a472ed..6898f52 100644 --- a/gere_grille.py +++ b/gere_grille.py @@ -5,31 +5,49 @@ Created on Mon Jul 26 22:58:28 2021 @author: sekhmet """ -import random -import zlib, base64, json +import random, zlib, base64, json import gere_erreurs as e from config import DEFAUT, CONFIG def genere_grille(config, textes): - """ génère une grille avec des éléments aléatoires du tableau textes. Si y'a pas assez, on complète aléatoirement avec des 0. - config contient tout ce qu'on veut pour la grille""" + """ génère une grille avec des éléments aléatoires du tableau textes. + textes est un tableau de tableau : la phrase, puis les réponses + Dans la grille on mettra une liste avec la question et les réponses + Si y'a pas assez, on met la liste vide [] + + config contient tout ce qu'on veut pour la grille, + ici on utilisera les dimensions et les phrases_additionnelles + on enlève aussi les réponses si config['reponses_presentes'] n'est pas là""" nblignes, nbcol = config["nblignes"], config["nbcolonnes"] - # Créer la grille - grille = [ [""]*nbcol for i in range(nblignes)] - nbdata = nbcol*nblignes - config["nbcasesvides"] # Nombre d'entrées + soustab = config.get("phrases_add",[]).copy() # On met les phrases custom en premier + soustab = soustab + [ [] ]*config["nbcasesvides"] # On ajoute les blocs vides voulus + + #print(soustab) - # Créer le sous-tableau - if len(textes)>= nbdata: # Si y'a assez de textes - soustab = random.sample(textes, nbdata) + ["0"]*config["nbcasesvides"] - else: - # On met tous les textes + complète avec des "0" - soustab = textes + ["0"]*(nbcol*nblignes - len(textes)) - random.shuffle(soustab) + nbdata = nbcol*nblignes - config["nbcasesvides"]-len(config.get("phrases_add", [])) # Nombre d'entrées à prendre + if nbdata>0: # Sinon y'a pas besoin du tableau + if nbdata <= len(textes): + soustab = soustab+random.sample(textes, nbdata) + else: # on n'a pas assez de textes, on met des 0 + soustab = soustab + textes + ['0']*(nbdata - len(textes)) + #print(soustab) + # On mélange ! + random.shuffle(soustab) + # Si on ne veut pas des réponses, on ne garde que le premier élément + if not(config.get("reponses_presentes", True)): + #print("Je veux pas les réponses !") + soustab = [ [elt[0] ] for elt in soustab ] + #print(soustab) + + + # Créer la grille + grille = [ [ [] ]*nbcol for i in range(nblignes)] + # On met tout ça dans la grille for i in range(nblignes): for j in range(nbcol): @@ -86,8 +104,21 @@ def gere_donnees_custom(data, liste_err): # Les cases vides conf["nbcasesvides"] = minimaxi(data.get("nbcasesvides",""), 0, CONFIG["maxlignes"]*CONFIG["maxcolonnes"], DEFAUT["nbcasesvides"], liste_err) + # Les phrases additionnelles + conf["phrases_add"] = [] + i=0 + while "phrase_add_"+str(i) in data: + p = data.get("phrase_add_"+str(i), "") + if len(p)>1: + conf["phrases_add"].append([p]) + i=i+1 + + # Veut-on les réponses ? + conf["reponses_presentes"] = gere_checkbox(data.get("reponses_presentes","")) + return conf -### + +### Fonctions pour gérer les données saisies def minimaxi(donnee, mini, maxi, defaut, liste_err): """ donnee est une chaine qui est censée être un nombre entier. On vérifie que la donnée est valide, qu'elle est bien dans l'inter @@ -98,4 +129,8 @@ def minimaxi(donnee, mini, maxi, defaut, liste_err): e.warning("La donnée "+donnee+ "est invalide !", liste_err) x = defaut x = max(mini, min(x, maxi)) - return x \ No newline at end of file + return x + +def gere_checkbox(donnee): + """ renvoie True si la donnee est à "on" et False sinon""" + return donnee == "on" \ No newline at end of file diff --git a/static/outilspage.js b/static/outilspage.js index b8db8b3..1ddb713 100644 --- a/static/outilspage.js +++ b/static/outilspage.js @@ -11,17 +11,25 @@ var couleur_valide = 'rgb(255, 136, 136)' ; // Valide la case et la colore en rouge function validecase(elem) { - elem.style.backgroundColor = couleur_valide ; - - detectelignes() ; + if (elem.style.backgroundColor == couleur_valide) { + alterne_phrase_reponse(elem) + } else { + elem.style.backgroundColor = couleur_valide ; + detectelignes() ; + } + } // efface la grille function effacegrille() { var table=document.getElementById("grille") ; var listetd = table.getElementsByTagName("td") ; + var ltemp ; for (var i=0; i< listetd.length; i++){ - listetd[i].style.backgroundColor = couleur_base ; + if (!(listetd[i].classList.contains("vide"))) { + listetd[i].style.backgroundColor = couleur_base ; + affiche_phrase(listetd[i]) ; + } } metscore(0) ; } @@ -151,3 +159,48 @@ function detectelignes(elem) { score = (nb_lignes_completes + nb_colonnes_completes + nb_diagonales_1 + nb_diagonales_2) *points_par_ligne + nbcases ; metscore(score) ; } + + +/* Outils divers */ +function ajouter_phrase_perso() { + var ul = document.getElementById("liste_phrases_add") ; + var nb = ul.children.length ; + var elt = document.createElement("li") ; + elt.innerHTML = '' ; + ul.appendChild(elt) ; + +} + +function alterne_phrase_reponse(elem) { + var liste = elem.children ; + // qui est actif ? + for(var i=0; i< liste.length; i++) { + if(liste[i].style.display != "none") { + liste[i].style.display = "none" ; // on efface celui-là + liste[(i+1) % liste.length].style.display = "block" ; // on met le suivant + break // on s'arrête là + } + + } + /* + if(elem.getElementsByClassName("phrase")[0].style.display == "none"){ + affiche_phrase(elem) + } else { + affiche_reponse(elem) + }*/ +} + +function affiche_reponse(elem) { + var ltemp = elem.getElementsByClassName("phrase") ; + if (ltemp.length >0) ltemp[0].style.display = "none" ; + ltemp = elem.getElementsByClassName("reponse") + if (ltemp.length >0) ltemp[0].style.display = "block" ; +} + +function affiche_phrase(elem) { + var ltemp = elem.getElementsByClassName("phrase") + if (ltemp.length >0 ) ltemp[0].style.display = "block" ; + ltemp = elem.getElementsByClassName("reponse") + for (var i=0; iTitre de la page :
  • Nombre de lignes :
  • Nombre de colonnes :
  • -
  • Nombre de cases vides : Remarque : s'il n'y a pas assez de données, la grille sera automatiquement complétée par des cass vides.
  • - +
  • Nombre de cases vides : Remarque : s'il n'y a pas assez de données, la grille sera automatiquement complétée par des cases vides. Il y a actuellement {{ nbdata }} entrées disponibles.
  • + +
  • Proposer les réponses :
  • +
  • Ajouter une (ou des) phrase(s) personnalisée (plus !) : +
    • +
    +
  • + +
  • Choisir les catégories de remarques : +
      + {% for cat in categ %} +
    • {{ cat }} ({{ nbparcat[loop.index -1] }} phrase(s))
    • + {% endfor %} +
  • diff --git a/templates/index.html b/templates/index.html index 852fdd7..af8ac6c 100644 --- a/templates/index.html +++ b/templates/index.html @@ -16,14 +16,22 @@

    Cochez la case dès que vous entendez une réplique idiote !

    +{% if conf.reponses_presentes %} +

    Un deuxième clic permet d'afficher (ou de masquer) une réponse épique !

    {%endif %} {% for ligne in bingo %} {% for elt in ligne %} - {% if elt == "0" %} - - {% else %} - - {% endif %} + {% if elt | length == 0 %} + {% else %} + {% endif %} {% endfor %} {% endfor %} -- cgit v1.2.3
    {{ elt }} + {% for p in elt %} + {% if loop.index == 1 %} + {{ p }} + {% else %} + {{ p }} + {% endif %} + {% endfor %} +