Parnaso | Declinador

DECLINADOR


Algoritmo para declinar palabras en latín. Escribe el lema de una palabra y se declinará automáticamente, siempre y cuando sea gramaticalmente posible ¡Incluso si es inventada!





NOTA: Tenga en cuenta que debe seguir esta estructura: Nominativo - Genitivo, Género. Ejemplo:
Rosa -ae, f

En las palabras de la tercera declinación es necesario poner el genitivo completo. Ejemplo:
Rex - regis, m

Enunciado:

Género:

Declinación:

Singular Plural
Nominativo
Vocativo
Acusativo
Genitivo
Dativo
Ablativo


from js import document # Importar el acceso a los elementos del DOM # Define las declinaciones declinaciones = { "prim": ["a", "a", "am", "ae", "ae", "a", "ae", "ae", "as", "arum", "is", "is"], "segunMasc": ["us", "e", "um", "i", "o", "o", "i", "i", "os", "orum", "is", "is"], "segunNeut": ["um", "um", "um", "i", "o", "o", "a", "a", "a", "orum", "is", "is"], "terceraMasc": ["", "", "em", "is", "i", "e", "es", "es", "es", "um", "ibus", "ibus"], "terceraNeut": ["", "", "", "is", "i", "e", "a", "a", "a", "um", "ibus", "ibus"], "terceraMascI": ["", "", "em", "is", "i", "e", "es", "es", "es", "ium", "ibus", "ibus"], "terceraNeutI": ["", "", "", "is", "i", "i", "ia", "ia", "ia", "ium", "ibus", "ibus"], "cuartaMasc": ["us", "us", "um", "us", "ui", "u", "us", "us", "us", "uum", "ibus", "ibus"], "cuartaNeut": ["u", "u", "u", "us", "ui", "u", "ua", "ua", "ua", "uum", "ibus", "ibus"], "quinta": ["es", "es", "em", "ei", "ei", "e", "es", "es", "es", "erum", "ebus", "ebus"] } # Método para contar vocales def contar_vocales(palabra): vocales = "aeiouAEIOU" return sum(1 for letra in palabra if letra in vocales) def declinar(entrada, boolean): # Dividir la entrada manualmente numeroGuion = entrada.index("-") numeroComa = entrada.index(",") organizacion = [entrada[0:numeroGuion].strip(), entrada[numeroGuion+1:numeroComa].strip(), entrada[numeroComa+1:].strip()] genero = str(organizacion[2][-1]) nominativo = str(organizacion[0].strip()).lower() genitivoLargo = str(organizacion[1][-2:].strip()).lower() genitivoCorto = str(organizacion[1][-1:].strip()).lower() genitivoSinDesinencia = str(organizacion[1][0:-2].strip()).lower() genitivoConDesinencia = str(organizacion[1][0:].strip()).lower() lema = [] declinadoFinal = [] numero_declinacion = 0 checkbox = document.getElementById("opcion1") # Obtener checkbox del DOM marcaSeparacion = checkbox.checked separacion = "-" if marcaSeparacion else "" numSilabasNom = contar_vocales(nominativo) numSilabasGen = contar_vocales(genitivoConDesinencia) consonantesDobles = ['rb', 'rt', 'rc', 'nt', 'ct', 'br'] checkFalsoImpar = genitivoSinDesinencia[-2:] in consonantesDobles # Identificación básica de la declinación identificacion = [ (genitivoLargo == declinaciones['prim'][3], 'prim', 1, 1), (genitivoCorto == declinaciones['segunMasc'][3] and nominativo[-2:] != declinaciones['quinta'][0], 'segunMasc' if genero != 'n' else 'segunNeut', 2, 2), (genitivoLargo == declinaciones['terceraMasc'][3] and numSilabasNom != numSilabasGen and checkFalsoImpar == False, 'terceraMasc' if genero != 'n' else 'terceraNeut', 3, 2), (genitivoLargo == declinaciones['terceraMascI'][3] and numSilabasNom == numSilabasGen or checkFalsoImpar == True, 'terceraMascI' if genero != 'n' else 'terceraNeutI', 3, 2), (genitivoLargo == declinaciones['cuartaMasc'][3] and genero != 'n', 'cuartaMasc', 4, 2), (genitivoLargo == declinaciones['cuartaNeut'][3], 'cuartaNeut', 4, 1), (genitivoLargo == declinaciones['quinta'][3], 'quinta', 5, 2) ] for declination_case in identificacion: if declination_case[0]: numero_declinacion = declination_case[2] if numero_declinacion == 2 and nominativo[-2:] in ['er', 'ir']: if nominativo[-3:] != 'ter': declinadoFinal = [nominativo+separacion+n for n in declinaciones[declination_case[1]]] declinadoFinal[0] = declinadoFinal[1] = nominativo break else: nominativoApocopado = nominativo[:-2] + nominativo[-1] declinadoFinal = [nominativoApocopado+separacion+n for n in declinaciones[declination_case[1]]] declinadoFinal[0] = declinadoFinal[1] = nominativo break elif numero_declinacion == 3: declinadoFinal = [genitivoSinDesinencia+separacion+n for n in declinaciones[declination_case[1]]] declinadoFinal[0] = declinadoFinal[1] = nominativo if genero == 'n': declinadoFinal[2] = nominativo break else: declinadoFinal = [nominativo[:-declination_case[3]]+separacion+n for n in declinaciones[declination_case[1]]] break lema.append(declinadoFinal[0]) lema.append(declinadoFinal[3]) lema.append(genero) document.getElementById("enunciado-resultado").innerHTML = f"Enunciado: {lema[0]} - {lema[1]}" document.getElementById("genero-resultado").innerHTML = f"Género: {lema[2]}" document.getElementById("declinacion-resultado").innerHTML = f"Declinación: {numero_declinacion}" return declinadoFinal, lema, numero_declinacion def procesar_declinacion(event=None): entrada = document.getElementById("entrada").value resultado, lema, num_declinacion = declinar(entrada, False) # Actualizar las celdas de la tabla document.getElementById("nominativo-sg").innerText = resultado[0] document.getElementById("vocativo-sg").innerText = resultado[1] document.getElementById("acusativo-sg").innerText = resultado[2] document.getElementById("genitivo-sg").innerText = resultado[3] document.getElementById("dativo-sg").innerText = resultado[4] document.getElementById("ablativo-sg").innerText = resultado[5] document.getElementById("nominativo-pl").innerText = resultado[6] document.getElementById("vocativo-pl").innerText = resultado[7] document.getElementById("acusativo-pl").innerText = resultado[8] document.getElementById("genitivo-pl").innerText = resultado[9] document.getElementById("dativo-pl").innerText = resultado[10] document.getElementById("ablativo-pl").innerText = resultado[11] # Vincular el botón con la función procesar_declinacion document.getElementById("declinar-btn").onclick = procesar_declinacion