##############################################################################
#                  Musterloesung zur CMU-Aufgabe                             #
#              (Aufgabenstellung: Foliensatz 5, S. 8)                        #
#                27.05.2015           Esther Seyffarth                       #
##############################################################################

import re

def read_cmu_file(cmu_path):
    """
    string -> dictionary
    Erzeuge aus einer cmudict-Datei ein Python-Dictionary mit orthographischen
    Wörtern als Keys und ihren phonetischen Transkriptionen als Values.
    """
    data = open(cmu_path, "r", encoding="utf8")
    my_cmu_dict = {}
    for line in data:
        # Nur Zeilen behandeln, die nicht leer sind
        if line.strip() != "":
            # Nur Zeilen behandeln, die keine Kommentarzeilen sind
            if not line.startswith(";;;"):
                # Zeilen in orthographische Form und phonetische Form aufteilen
                line = line.split("  ", 1)
                orth = line[0].strip()
                phon = line[1].strip()
                # Setze den Wert für den Key "orth" im Dictionary auf "phon"
                my_cmu_dict[orth] = phon
    return my_cmu_dict


def get_any_transcription(input_word, my_cmu_dict):
    """
    string, dictionary -> string
    Ermittle aus dem übergebenen Dictionary den Transkriptionswert des
    übergebenen Wortes. Wenn das Wort nicht gefunden wird, ist der Wert "None".
    >>> get_any_transcription("apple", my_cmu_dict)
    AE1 P AH0 L
    >>> get_any_transcription("zqx", my_cmu_dict)
    Dieses Wort kann nicht nachgeschlagen werden.
    None
    """
    # Nur großgeschriebene Wörter sind im Dictionary enthalten
    input_word = input_word.upper()
    if input_word in my_cmu_dict.keys():
        return my_cmu_dict[input_word]
    else:
        print("Dieses Wort kann nicht nachgeschlagen werden.")
        return None

# TODO
def get_stress_pattern(phon):
    """
    string -> string
    Ermittle aus einer phonetischen Transkription eines Wortes das
    Betonungsmuster.
    get_stress_pattern("EY1 B AH0 L") --> "1 0"
    """
    # Definiere regulären Ausdruck für die Betonung
    # (0 = unbetont, 1 = betont, 2 = secondary stress)

    # Weise "pattern" den entsprechenden Wert zu
    pattern = "NOT IMPLEMENTED"
    return pattern

# TODO (Fortgeschritten)
def get_rhime(phon):
    """
    string -> string
    Ermittle aus einer phonetischen Transkription eines Wortes den Reim des Wortes.
    Der Reim eines Wortes ist der Teilstring, der mit dem letzten betonten Vokal
    beginnt (egal ob primary [1] oder secondary [2] stress) und bis zum Wortende geht.
    get_rhime("AH0 N EY1 B AH0 L") --> "EY B AH L"
    """
    rhime = "NOT IMPLEMENTED"
    return rhime

    
""" PROGRAMMSTART """

# Rufe die Lesefunktion mit dem Pfad zur Originaldatei auf (ggf. anpassen)
my_cmu_dict = read_cmu_file("D:/Korpora/cmudict.0.7a")

# Nutzerinput: Solange ein Wort eingegeben wird, wird die Nachschlagefunktion
# aufgerufen
input_word = input("Wort nachschlagen (Enter zum Beenden): ")
while input_word != "":
    phon = get_any_transcription(input_word, my_cmu_dict)
    print("Transkription: ", phon)
    print("Betonung: ", get_stress_pattern(phon))
    print("Reim: ", get_rhime(phon))
    input_word = input_word = input("Wort nachschlagen (Enter zum Beenden): ")
