Browse Source

Update

main
Adrian Heine 9 months ago
parent
commit
4311dc7be8
  1. 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…
Cancel
Save