From dc157e8ef1a754e68c1b60b733771442ac3bd889 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Fri, 11 Sep 2026 21:02:20 +0200 Subject: [PATCH] made the vocab exercise more tolerable to capslock and minor keyboard related BS --- exercise_u1.c | 130 ++++++++++++++++++++++++++++---------------------- util.c | 47 +++++++++++++----- 2 files changed, 109 insertions(+), 68 deletions(-) diff --git a/exercise_u1.c b/exercise_u1.c index 7a5f737..c2e7cc8 100644 --- a/exercise_u1.c +++ b/exercise_u1.c @@ -986,15 +986,18 @@ const TypedQ trans_p10[] = { {"der Abend, -e", "večer|evening", "večer"}, {"Guten Abend!", "dobrý večer|good evening", "Dobrý večer!"}, {"du", "ty|you", "ty"}, - {"(Es) freut mich.", "těší mě|nice to meet you", "Těší mě."}, - {"gut", "dobrý|good", "dobrý"}, + {"(Es) freut mich.", "těší mě|nice to meet you|pleased to meet you", + "Těší mě."}, + {"gut", "dobrý|dobře|good", "dobrý"}, {"Hallo!", "ahoj|hello", "Ahoj!"}, - {"heißen, er heißt", "jmenovat se|to be called|to be named", "jmenovat se"}, - {"Ich heiße Jens.", "jmenuji se jens|my name is jens", "Jmenuji se Jens."}, - {"Hi!", "ahoj|hi", "Ahoj! (neformálně)"}, + {"heißen, er heißt", + "jmenovat se|jmenuje se|to be called|to be named", "jmenovat se"}, + {"Ich heiße Jens.", + "jmenuji se jens|jmenuju se jens|my name is jens", "Jmenuji se Jens."}, + {"Hi!", "ahoj|čau|hi", "Ahoj! (neformálně)"}, {"ich", "já|i", "já"}, {"ihr", "vy|you", "vy"}, - {"ja", "ano|yes", "ano"}, + {"ja", "ano|jo|yes", "ano"}, {"der Morgen", "ráno|morning", "ráno"}, {"Guten Morgen!", "dobré ráno|good morning", "Dobré ráno!"}, {"der Name, -n", "jméno|name", "jméno"}, @@ -1004,23 +1007,28 @@ const TypedQ trans_p10[] = { {"Guten Tag!", "dobrý den|good day", "Dobrý den!"}, {"und", "a|and", "a"}, {"wer", "kdo|who", "kdo"}, - {"Wer bist du?", "kdo jsi|who are you", "Kdo jsi?"}, + {"Wer bist du?", "kdo jsi|kdo jste|who are you", "Kdo jsi?"}, {"wie", "jak|how", "jak"}, - {"Wie heißt du?", "jak se jmenuješ|what is your name", "Jak se jmenuješ?"}, + {"Wie heißt du?", + "jak se jmenuješ|jak se jmenujete|what is your name|what's your name", + "Jak se jmenuješ?"}, {"wir", "my|we", "my"}, }; const TypedQ trans_p11[] = { - {"in", "v|in", "v"}, - {"in der Nähe (von)", "poblíž|v blízkosti|near|nearby", "poblíž, v blízkosti"}, + {"in", "v|ve|in", "v"}, + {"in der Nähe (von)", + "poblíž|v blízkosti|nedaleko|blízko|near|nearby|close to", + "poblíž, v blízkosti"}, {"das Spiel, -e", "hra|game", "hra"}, {"wo", "kde|where", "kde"}, - {"wohnen, er wohnt", "bydlet|to live", "bydlet"}, - {"Wo wohnst du?", "kde bydlíš|where do you live", "Kde bydlíš?"}, + {"wohnen, er wohnt", "bydlet|bydlí|to live", "bydlet"}, + {"Wo wohnst du?", + "kde bydlíš|kde bydlíte|where do you live", "Kde bydlíš?"}, {"Ich wohne in Prag.", "bydlím v praze|i live in prague", "Bydlím v Praze."}, {"null", "nula|zero", "nula"}, - {"eins", "jedna|one", "jedna"}, - {"zwei", "dvě|two", "dvě"}, + {"eins", "jedna|jeden|one", "jedna"}, + {"zwei", "dvě|dva|two", "dvě"}, {"drei", "tři|three", "tři"}, {"vier", "čtyři|four", "čtyři"}, {"fünf", "pět|five", "pět"}, @@ -1045,99 +1053,107 @@ const TypedQ trans_p12[] = { {"alt", "starý|old", "starý"}, {"er", "on|he", "on"}, {"der Monat, -e", "měsíc|month", "měsíc"}, - {"sie", "ona|she", "ona"}, - {"sie", "oni|they", "oni"}, + {"sie (Singular)", "ona|she", "ona"}, + {"sie (Plural)", "oni|they", "oni"}, }; const TypedQ trans_p13[] = { {"aber", "ale|but", "ale"}, {"das Alter", "věk|age", "věk"}, - {"auch", "také|also|too", "také"}, - {"aus", "z|from", "z"}, - {"die Band, -s", "skupina|band", "(hudební) skupina"}, - {"chatten, er chattet", "chatovat|to chat", "chatovat"}, + {"auch", "také|taky|also|too", "také"}, + {"aus", "z|ze|from", "z"}, + {"die Band, -s", "skupina|kapela|band", "(hudební) skupina"}, + {"chatten, er chattet", "chatovat|chatuje|to chat", "chatovat"}, {"das Computerspiel, -e", "počítačová hra|computer game", "počítačová hra"}, {"die/das E-Mail, -s", "e-mail|email", "e-mail"}, {"das Englisch", "angličtina|anglicky|english", "angličtina, anglicky"}, - {"der Fan, -s", "fanoušek|fan", "fanoušek"}, + {"der Fan, -s", "fanoušek|fanda|fan", "fanoušek"}, {"das Französisch", "francouzština|francouzsky|french", "francouzština, francouzsky"}, - {"der Freund, -e", "kamarád|friend", "kamarád"}, - {"die Freundin, -nen", "kamarádka|friend", "kamarádka"}, - {"beste Freundin", "nejlepší kamarádka|best friend", "nejlepší kamarádka"}, - {"der Fußball", "fotbal|football", "fotbal"}, + {"der Freund, -e", "kamarád|přítel|friend", "kamarád"}, + {"die Freundin, -nen", "kamarádka|přítelkyně|friend", "kamarádka"}, + {"beste Freundin", "nejlepší kamarádka|nejlepší přítelkyně|best friend", + "nejlepší kamarádka"}, + {"der Fußball", "fotbal|football|soccer", "fotbal"}, {"Er ist Fußballfanatiker.", "je fotbalový fanatik|he is a football fanatic", "Je fotbalový fanatik."}, - {"gehen, er geht", "jít|to go", "jít"}, + {"gehen, er geht", "jít|jde|chodit|to go", "jít"}, {"Ich gehe gern auf Konzerte.", "rád chodím na koncerty|ráda chodím na koncerty|i like going to concerts", "Rád(a) chodím na koncerty."}, {"gern", "rád|ráda|gladly", "rád/a"}, {"die Gitarre, -n", "kytara|guitar", "kytara"}, - {"das Handy, -s", "mobil|mobile phone", "mobil"}, + {"das Handy, -s", "mobil|mobilní telefon|mobile phone", "mobil"}, {"das Hobby, -s", "koníček|hobby", "koníček"}, - {"hören, er hört", "poslouchat|to listen", "poslouchat"}, + {"hören, er hört", "poslouchat|poslouchá|slyšet|to listen|to hear", + "poslouchat"}, {"Er hört gern Musik.", "rád poslouchá hudbu|he likes listening to music", "Rád poslouchá hudbu."}, {"im Internet surfen, er surft im Internet", "surfovat na internetu|to surf the internet", "surfovat na internetu"}, - {"immer", "pořád|neustále|always", "pořád, neustále"}, + {"immer", "pořád|neustále|vždy|vždycky|always", "pořád, neustále"}, {"das Jahr, -e", "rok|year", "rok"}, {"kein/keine/kein", "žádný|žádná|žádné|no|none", "žádný/žádná/žádné"}, {"das Klavier, -e", "klavír|piano", "klavír"}, - {"kommen (aus), er kommt", "přicházet|pocházet|to come|to come from", + {"kommen (aus), er kommt", + "přicházet|přijít|přichází|pochází|to come|to come from", "přicházet, pocházet (z)"}, - {"Er kommt aus Wien.", "pochází z vídně|he comes from vienna", + {"Er kommt aus Wien.", + "pochází z vídně|he comes from vienna|he is from vienna", "Pochází z Vídně."}, {"das Konzert, -e", "koncert|concert", "koncert"}, - {"lernen, er lernt", "učit se|to learn", "učit se"}, - {"liegen, er liegt", "ležet|to lie", "ležet"}, + {"lernen, er lernt", "učit se|učí se|to learn", "učit se"}, + {"liegen, er liegt", "ležet|leží|to lie|to be located", "ležet"}, {"der Nachname, -n", "příjmení|surname|last name", "příjmení"}, {"nicht weit von", "nedaleko od|not far from", "nedaleko od"}, - {"reisen, er reist", "cestovat|to travel", "cestovat"}, - {"schreiben, er schreibt", "psát|to write", "psát"}, + {"reisen, er reist", "cestovat|cestuje|to travel", "cestovat"}, + {"schreiben, er schreibt", "psát|píše|to write", "psát"}, {"die Schule, -n", "škola|school", "škola"}, - {"spielen, er spielt", "hrát|to play", "hrát"}, + {"spielen, er spielt", "hrát|hraje|to play", "hrát"}, {"Sie spielt Gitarre.", "hraje na kytaru|she plays the guitar", "Hraje na kytaru."}, - {"tanzen, er tanzt", "tancovat|to dance", "tancovat"}, + {"tanzen, er tanzt", "tancovat|tančí|tancuje|to dance", "tancovat"}, {"der Vorname, -n", "křestní jméno|first name", "křestní jméno"}, - {"der Wohnort, -e", "bydliště|place of residence", "bydliště"}, + {"der Wohnort, -e", "bydliště|místo bydliště|place of residence", + "bydliště"}, }; const TypedQ trans_p14[] = { - {"falsch", "nesprávně|chybně|wrong|incorrect", "nesprávně, chybně"}, + {"falsch", "nesprávně|chybně|špatně|wrong|incorrect", "nesprávně, chybně"}, {"die Flöte, -n", "flétna|flute", "flétna"}, - {"haben, er hat", "mít|to have", "mít"}, + {"haben, er hat", "mít|má|to have", "mít"}, {"das Instrument, -e", "nástroj|instrument", "(hudební) nástroj"}, - {"jetzt", "teď|now", "teď"}, - {"machen, er macht", "dělat|to do|to make", "dělat"}, - {"richtig", "správně|correct|right", "správně"}, + {"jetzt", "teď|nyní|now", "teď"}, + {"machen, er macht", "dělat|dělá|to do|to make", "dělat"}, + {"richtig", "správně|správný|correct|right", "správně"}, {"der Sport", "sport", "sport"}, - {"Sport treiben, er treibt Sport", "sportovat|to do sport", "sportovat"}, + {"Sport treiben, er treibt Sport", + "sportovat|sportuje|provozovat sport|to do sport", "sportovat"}, {"das Squash", "squash", "squash"}, {"das/der Yoga", "jóga|yoga", "jóga"}, }; const TypedQ trans_p15[] = { {"bald", "brzy|soon", "brzy"}, - {"Bis bald!", "brzy na shledanou|see you soon", "Brzy na shledanou!"}, - {"bis", "do|until", "do"}, - {"Bis zum nächsten Mal!", "do příštího setkání|until next time", + {"Bis bald!", "brzy na shledanou|brzy se uvidíme|see you soon", + "Brzy na shledanou!"}, + {"bis", "do|až|until", "do"}, + {"Bis zum nächsten Mal!", "do příštího setkání|do příště|until next time", "Do příštího setkání!"}, - {"die Frau, -en", "paní|woman|mrs", "paní"}, - {"der Herr, -en", "pan|man|mr", "pan"}, - {"Mach's gut!", "měj se hezky|take care", "Měj se hezky!"}, + {"die Frau, -en", "paní|žena|woman|mrs", "paní"}, + {"der Herr, -en", "pan|muž|man|mr", "pan"}, + {"Mach's gut!", "měj se hezky|měj se|take care", "Měj se hezky!"}, {"das Museum, Museen", "muzeum|museum", "muzeum"}, - {"Sie gehen ins Museum.", "jdou do muzea|they are going to the museum", + {"Sie gehen ins Museum.", + "jdou do muzea|they are going to the museum|they go to the museum", "Jdou do muzea."}, - {"schön", "hezký|beautiful|nice", "hezký"}, - {"Einen schönen Tag noch!", "hezký zbytek dne|have a nice day", - "Hezký zbytek dne!"}, - {"Servus!", "ahoj|hi", "Ahoj! (servus)"}, - {"Tschüs!", "ahoj|bye", "Ahoj! (při loučení)"}, + {"schön", "hezký|krásný|pěkný|beautiful|nice", "hezký"}, + {"Einen schönen Tag noch!", + "hezký zbytek dne|měj hezký den|have a nice day", "Hezký zbytek dne!"}, + {"Servus!", "ahoj|servus|hi", "Ahoj! (servus)"}, + {"Tschüs!", "ahoj|čau|bye", "Ahoj! (při loučení)"}, {"das Wiedersehen", "shledání|reunion", "shledání"}, - {"Auf Wiedersehen!", "na shledanou|goodbye", "Na shledanou!"}, + {"Auf Wiedersehen!", "na shledanou|na viděnou|goodbye", "Na shledanou!"}, }; typedef struct { diff --git a/util.c b/util.c index 56d941f..0c457d1 100644 --- a/util.c +++ b/util.c @@ -5,34 +5,59 @@ /* ------------------------------------------------------------------ */ char *normalize_answer(const char *input) { + GString *pre = g_string_new(NULL); GString *out = g_string_new(NULL); - const gchar *down = g_utf8_strdown(input, -1); - const gchar *p = down; + const gchar *down = g_utf8_strdown(input ? input : "", -1); + gchar *decomp; + const gchar *p; gboolean prev_space = FALSE; - while (*p) { + /* German special letters first, so ä/ö/ü/ß keep their two-letter + * keyboard fallbacks (ae/oe/ue/ss). */ + for (p = down; *p; p = g_utf8_next_char(p)) { gunichar ch = g_utf8_get_char(p); - p = g_utf8_next_char(p); + + switch (ch) { + case 0x00e4: g_string_append(pre, "ae"); break; /* ä */ + case 0x00f6: g_string_append(pre, "oe"); break; /* ö */ + case 0x00fc: g_string_append(pre, "ue"); break; /* ü */ + case 0x00df: g_string_append(pre, "ss"); break; /* ß */ + default: g_string_append_unichar(pre, ch); break; + } + } + + /* Decompose and drop combining accent marks so Czech letters such as + * é/ě/ř/ů/ž/š/č are treated as their base letters. */ + decomp = g_utf8_normalize(pre->str, -1, G_NORMALIZE_NFD); + if (!decomp) + decomp = g_strdup(pre->str); + + for (p = decomp; *p; p = g_utf8_next_char(p)) { + gunichar ch = g_utf8_get_char(p); + + if (g_unichar_combining_class(ch) != 0) + continue; /* accent mark */ + if (g_unichar_isspace(ch)) { if (out->len > 0 && !prev_space) g_string_append_c(out, ' '); prev_space = TRUE; continue; } + + if (!g_unichar_isalnum(ch)) + continue; /* ignore punctuation and symbols */ + prev_space = FALSE; - switch (ch) { - case 0x00e4: g_string_append(out, "ae"); break; /* ä */ - case 0x00f6: g_string_append(out, "oe"); break; /* ö */ - case 0x00fc: g_string_append(out, "ue"); break; /* ü */ - case 0x00df: g_string_append(out, "ss"); break; /* ß */ - default: g_string_append_unichar(out, ch); break; - } + g_string_append_unichar(out, ch); } if (out->len > 0 && out->str[out->len - 1] == ' ') g_string_truncate(out, out->len - 1); + g_free(decomp); g_free((gpointer)down); + g_string_free(pre, TRUE); return g_string_free(out, FALSE); }