Update
This commit is contained in:
parent
916525e86f
commit
4311dc7be8
1 changed files with 86 additions and 58 deletions
144
main.py
144
main.py
|
|
@ -11,7 +11,7 @@ import re
|
|||
import sys
|
||||
import readline
|
||||
|
||||
DATA_DIR = os.environ['XDG_DATA_HOME'] + '/klette'
|
||||
DATA_DIR = os.environ.get('XDG_DATA_HOME', os.environ['HOME'] + '/.local/share') + '/klette'
|
||||
VOKABELN_FILE = DATA_DIR + '/vokabeln.json'
|
||||
STATUS_FILE = DATA_DIR + '/status.json'
|
||||
AUDIO_BASE = DATA_DIR + '/audio/'
|
||||
|
|
@ -96,12 +96,19 @@ assert vergleiche("hacer algo", "hacer (irr.) algo") == 0
|
|||
assert vergleiche("padres", "padres (pl.)") == 0
|
||||
|
||||
class Resultado:
|
||||
CORRECTO = 0
|
||||
BIEN = 1
|
||||
MAL = 2
|
||||
ADIOS = 3
|
||||
NO_BIEN = 2
|
||||
MAL = 3
|
||||
ADIOS = 4
|
||||
|
||||
def einzelne_abfrage(palabra, status):
|
||||
status_text = f"({status})" if status > 0 else f"{bcolors.OKGREEN}neu{bcolors.ENDC}"
|
||||
if status == None:
|
||||
status_text = f"{bcolors.OKCYAN}neu{bcolors.ENDC}"
|
||||
status = 0
|
||||
else:
|
||||
status_text = f"({status})"
|
||||
|
||||
try:
|
||||
respuesta = input(f"{status_text} {bcolors.BOLD}{palabra['de']}{bcolors.ENDC} {bcolors.OKCYAN}")
|
||||
except EOFError:
|
||||
|
|
@ -111,26 +118,88 @@ def einzelne_abfrage(palabra, status):
|
|||
print(bcolors.ENDC, end="")
|
||||
print('\033[{}C\033[1A'.format(4 + len(palabra['de']) + 1 + len(respuesta)), end="")
|
||||
resultado = vergleiche(respuesta, palabra['es'])
|
||||
match status:
|
||||
case 0: bien = resultado < 4
|
||||
case 1: bien = resultado < 3
|
||||
case 2: bien = resultado < 3
|
||||
case 3: bien = resultado < 2
|
||||
case 4: bien = resultado < 1
|
||||
if resultado == 0:
|
||||
bien = Resultado.CORRECTO
|
||||
else:
|
||||
match status:
|
||||
case 0: bien = Resultado.BIEN if resultado < 4 else Resultado.NO_BIEN
|
||||
case 1: bien = Resultado.BIEN if resultado < 2 else (RESULTADO.NO_BIEN if resultado < 4 else Resultado.MAL)
|
||||
case 2: bien = Resultado.BIEN if resultado < 2 else (RESULTADO.NO_BIEN if resultado < 3 else Resultado.MAL)
|
||||
case 3: bien = resultado < 2
|
||||
case 4: bien = resultado < 1
|
||||
bien = Resultado.BIEN if bien else Resultado.MAL
|
||||
print(f" {bcolors.LINK_START}file://{AUDIO_BASE}{palabra['audio']}.aac{bcolors.LINK_MIDDLE}",end="")
|
||||
if bien and resultado == 0:
|
||||
if bien == Resultado.CORRECTO:
|
||||
print(f"{bcolors.OKGREEN}✓{bcolors.ENDC}",end="")
|
||||
elif bien:
|
||||
elif bien == Resultado.BIEN:
|
||||
print(f"{bcolors.WARNING}{palabra['es']}{bcolors.ENDC}",end="")
|
||||
else:
|
||||
print(f"{bcolors.FAIL}{palabra['es']}{bcolors.ENDC}",end="")
|
||||
print(bcolors.LINK_END,end="")
|
||||
try:
|
||||
input(" ")
|
||||
if input(" ") == "+":
|
||||
bien = Resultado.CORRECTO
|
||||
except EOFError:
|
||||
print()
|
||||
return Resultado.ADIOS
|
||||
return Resultado.BIEN if bien else Resultado.MAL
|
||||
return bien
|
||||
|
||||
class Sesion:
|
||||
def __init__(self, palabras, status):
|
||||
self.palabras = palabras
|
||||
self.status = status
|
||||
self.bien = 0
|
||||
self.mal = 0
|
||||
|
||||
def empezar(self, quiero_unidad):
|
||||
unidad = False
|
||||
unidad_no = -1
|
||||
paso = False
|
||||
cur_palabras = False
|
||||
for palabra in self.palabras:
|
||||
if paso != palabra['paso']:
|
||||
if cur_palabras != False and (quiero_unidad == None or quiero_unidad == unidad_no):
|
||||
c = [len(cur_palabras[x]) for x in cur_palabras]
|
||||
print(f"{bcolors.BOLD}{unidad}{bcolors.ENDC}: {paso} ({c[0] + c[6]}/{c[1]}/{c[2]}/{c[3]}/{c[4]}/{bcolors.OKGREEN}{c[5]}{bcolors.ENDC})")
|
||||
for n in range(5): # 1..4, no 5
|
||||
if self.hace_palabras(cur_palabras[n], n) == Resultado.ADIOS:
|
||||
return
|
||||
n = None
|
||||
if self.hace_palabras(cur_palabras[n], n) == Resultado.ADIOS:
|
||||
return
|
||||
|
||||
cur_palabras = {0: [], 1: [], 2: [], 3: [], 4: [], 5: [], None: []}
|
||||
if unidad != palabra['unidad']:
|
||||
unidad_no += 1
|
||||
unidad = palabra['unidad']
|
||||
paso = palabra['paso']
|
||||
|
||||
cur_palabras[self.status.get(palabra['id'])].append(palabra)
|
||||
|
||||
def hace_palabras(self, palabras, status):
|
||||
random.shuffle(palabras)
|
||||
for palabra in palabras:
|
||||
match einzelne_abfrage(palabra, status):
|
||||
case Resultado.CORRECTO:
|
||||
self.status[palabra['id']] = status + (2 if status < 2 else 1)
|
||||
self.bien += 1
|
||||
case Resultado.BIEN:
|
||||
self.status[palabra['id']] = status + 1
|
||||
self.bien += 1
|
||||
case Resultado.NO_BIEN:
|
||||
continue
|
||||
case Resultado.MAL:
|
||||
self.status[palabra['id']] = status - 1
|
||||
self.mal += 1
|
||||
case Resultado.ADIOS:
|
||||
return Resultado.ADIOS
|
||||
with open(STATUS_FILE + '.new', 'w') as f:
|
||||
json.dump(self.status, f)
|
||||
f.flush()
|
||||
os.fsync(f.fileno())
|
||||
with open(STATUS_FILE + '.new', 'r') as f:
|
||||
pass
|
||||
os.replace(STATUS_FILE + '.new', STATUS_FILE)
|
||||
|
||||
def abfrage(parser, quiero_unidad):
|
||||
random.seed()
|
||||
|
|
@ -145,50 +214,9 @@ def abfrage(parser, quiero_unidad):
|
|||
parser.print_help()
|
||||
return
|
||||
|
||||
unidad = False
|
||||
unidad_no = -1
|
||||
paso = False
|
||||
cur_palabras = False
|
||||
bien = 0
|
||||
mal = 0
|
||||
for palabra in palabras:
|
||||
if paso != palabra['paso']:
|
||||
if cur_palabras != False and (quiero_unidad == None or quiero_unidad == unidad_no):
|
||||
c = [len(cur_palabras[x]) for x in cur_palabras]
|
||||
print(f"{bcolors.BOLD}{unidad}{bcolors.ENDC}: {paso} (",end="")
|
||||
print(*c, sep="/", end=")")
|
||||
print()
|
||||
for n in range(5): # 1..4, no 5
|
||||
random.shuffle(cur_palabras[n])
|
||||
for a_palabra in cur_palabras[n]:
|
||||
s = status.get(a_palabra['id'], 0)
|
||||
match einzelne_abfrage(a_palabra, s):
|
||||
case Resultado.BIEN:
|
||||
status[a_palabra['id']] = s + 1
|
||||
bien+=1
|
||||
case Resultado.MAL:
|
||||
if s > 0:
|
||||
status[a_palabra['id']] = s - 1
|
||||
mal+=1
|
||||
continue
|
||||
case Resultado.ADIOS:
|
||||
print(f'{bcolors.OKGREEN}+{bien}{bcolors.ENDC} / {bcolors.FAIL}-{mal}{bcolors.ENDC}')
|
||||
return
|
||||
with open(STATUS_FILE + '.new', 'w') as f:
|
||||
json.dump(status, f)
|
||||
f.flush()
|
||||
os.fsync(f.fileno())
|
||||
with open(STATUS_FILE + '.new', 'r') as f:
|
||||
status = json.load(f)
|
||||
os.replace(STATUS_FILE + '.new', STATUS_FILE)
|
||||
|
||||
cur_palabras = {0: [], 1: [], 2: [], 3: [], 4: [], 5: []}
|
||||
if unidad != palabra['unidad']:
|
||||
unidad_no += 1
|
||||
unidad = palabra['unidad']
|
||||
paso = palabra['paso']
|
||||
|
||||
cur_palabras[status.get(palabra['id'], 0)].append(palabra)
|
||||
sesion = Sesion(palabras, status)
|
||||
sesion.empezar(quiero_unidad)
|
||||
print(f'{bcolors.OKGREEN}+{sesion.bien}{bcolors.ENDC} / {bcolors.FAIL}-{sesion.mal}{bcolors.ENDC}')
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
default_data_file = os.environ['PWD'] + '/assets/amf/vokabelTrainer147.amf'
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue