/** * woerterbuch.js — LATEINOMAT Wörterbuch-Seite und Topbar-Schnellsuche * Version: 1.1.0 (2026-08-15) * * CHANGELOG (neueste zuerst): * - 1.1.0 (2026-08-15): Zeile 2 der Trefferkarte (Stammformen) zeigt bei * Verben jetzt nicht mehr das rohe "s"-Feld, sondern das Ergebnis von * stammformenAnzeige(e) (neu in index.html, siehe dort für Details). * Hintergrund (Sebastians Wunsch): Bislang erschienen bei der Suche z. B. * nach "legere" die vier Bestandteile "lego, legis, legi, lectum" — * inklusive 2. Sg. Ind. Präs. Akt. ("legis"). Sebastian möchte hier * ausschließlich die vier klassischen Stammformen im engeren Sinn sehen * (Inf. Präs. Akt. = Lemma, das schon separat als Überschrift steht, * plus 1. Sg. Ind. Präs. Akt., 1. Sg. Ind. Perf. Akt. und PPP) — die * 2. Sg. Ind. Präs. Akt. entfällt daher in der Anzeige. Betrifft alle * Verb-Einträge im Wörterbuch. Das zugrunde liegende "s"-Datenfeld in * legito-data.js/legito-data-extended.js bleibt unverändert (wird u. a. * von identifyVerb() für die Formbestimmung gebraucht) — reine * Anzeigeänderung. Die Topbar-Schnellsuche (tbWbSearch() unten) zeigt das * "s"-Feld ohnehin nicht an und ist von dieser Änderung nicht betroffen. * - 1.0.0 (2026-07-24): Datei neu angelegt — reine Verschiebung ohne * Verhaltensänderung, neunter und (vorerst) letzter Schritt des * laufenden Struktur-Refactorings Richtung Version 4.0 (siehe * Arbeitsnotiz in index.html). Verschoben: wbSearch() (Haupt-Suche/ * -Darstellung auf der Wörterbuch-Seite) sowie der komplette * "TOPBAR-WÖRTERBUCH"-Abschnitt (tbWbSearch(), tbWbSelect(), * tbWbSelectIdx(), tbWbGo(), tbWbShowDrop(), tbWbHideDrop() — die * Schnellsuche im Topbar, auf den meisten Seiten sichtbar). Diese beiden * Teile lagen im Original NICHT zusammenhängend, sondern durch die * komplette Formbestimmungs-Engine getrennt (siehe unten). * WICHTIG, was NICHT mitverschoben wurde, weil es geteilte * Infrastruktur ist, die auch außerhalb des Wörterbuchs gebraucht wird: * - WB_IDX/buildWBIdx() — der Such-Index selbst; wird auch von * originaltexte.js (wortTippen()/texteZuLernkarten()) genutzt. * - identifyForm() und seine Helfer (identifyPronomen(), reorderForm(), * identifyNoun(), identifyAdj(), identifyVerb()) — die komplette * Formbestimmungs-Engine; wird ebenfalls von originaltexte.js * (wortTippen()) genutzt, nicht nur von wbSearch()/tbWbSearch() hier. * - showToast() — universelle Toast-Benachrichtigung, von praktisch * jeder ausgelagerten Datei genutzt (avatar.js, einstufungstest.js, * kettenuebungen.js, originaltexte.js, premium.js, profil.js, quiz.js, * uebungen.js) — stand im Original direkt im Anschluss an den * Topbar-Wörterbuch-Abschnitt, bleibt aber eindeutig geteilte * Kern-Infrastruktur in index.html. * Alle drei bleiben unverändert in index.html. Wie bisher klassisches * Script (kein type="module"), teilt sich weiterhin denselben globalen * Scope — kein import/export nötig; WB_IDX/buildWBIdx()/identifyForm()/ * DICT/go()/showToast() bleiben von hier aus ganz normal erreichbar. */ function wbSearch(q){ const clear=document.getElementById('wbClear'); if(clear)clear.style.display=q?'block':'none'; const el=document.getElementById('wbResults'); if(!q||q.length<2){el.innerHTML='

Mindestens 2 Zeichen eingeben …

';return;} if(!WB_IDX)buildWBIdx(); const qk=q.toLowerCase().trim(); // Find matches: exact first, then prefix, then partial let exact=WB_IDX[qk]||[]; let prefix=[]; let partial=[]; Object.keys(WB_IDX).forEach(function(k){ if(k===qk)return; if(k.startsWith(qk))prefix=prefix.concat(WB_IDX[k]); else if(k.includes(qk)&&q.length>=3)partial=partial.concat(WB_IDX[k]); }); // Deduplicate and merge let seen=new Set(); let hits=[]; exact.concat(prefix).concat(partial).forEach(function(i){ if(!seen.has(i)){seen.add(i);hits.push(i);} }); if(!hits.length){ el.innerHTML='

Keine Einträge gefunden für '+q+'

'; return; } // Render results (max 30) var html='
'+hits.length+' Treffer
'; hits.slice(0,30).forEach(function(i){ var e=DICT[i]; // Check which forms matched var matchedForms=e.f.filter(function(f){return f.toLowerCase().includes(qk);}); var detectedForm=null; var searchedForm=matchedForms.length?matchedForms[0]:null; var formIsLemma=searchedForm&&searchedForm.toLowerCase()===e.l.toLowerCase(); if(searchedForm&&!formIsLemma){ detectedForm=identifyForm(searchedForm,e); } // Karte aufbauen html+='
'; // Zeile 1: Lemma + Wortklassen-Badge html+='
'; html+=''+e.l+''; html+=''+e.w+''; html+='
'; // Zeile 2: Stammformen (nur die klassischen 4 Stammformen — 2. Sg. Präs. // wird für Verben ausgeblendet, siehe stammformenAnzeige() in index.html) html+='
'+stammformenAnzeige(e)+'
'; // Zeile 3: Gefundene Form + Formbestimmung (nur wenn anders als Lemma) if(searchedForm&&!formIsLemma){ html+='
'; html+=''+searchedForm+''; if(detectedForm){ html+=''+detectedForm+''; } html+='
'; } // Zeile 4: Bedeutung html+='
'+e.d+'
'; html+='
'; }); if(hits.length>30)html+='

… und '+(hits.length-30)+' weitere Treffer. Suche verfeinern.

'; el.innerHTML=html; } // ═══ TOPBAR-WÖRTERBUCH ════════════════════════════════════════════════ function tbWbSearch(q){ var drop=document.getElementById('tbWbDrop'); if(!q||q.length<2){drop.style.display='none';return;} if(!WB_IDX)buildWBIdx(); var qk=q.toLowerCase().trim(); var exact=WB_IDX[qk]||[]; var prefix=[]; Object.keys(WB_IDX).forEach(function(k){ if(k!==qk&&k.startsWith(qk))prefix=prefix.concat(WB_IDX[k]); }); var seen=new Set(),hits=[]; exact.concat(prefix).forEach(function(i){if(!seen.has(i)){seen.add(i);hits.push(i);}}); if(!hits.length){drop.innerHTML='
Nichts gefunden
';drop.style.display='block';return;} var html=''; hits.slice(0,6).forEach(function(idx){ var e=DICT[idx]; var matchedForms=e.f.filter(function(f){return f.toLowerCase().includes(qk);}); var tbDetected=matchedForms.length&&matchedForms[0].toLowerCase()!==e.l.toLowerCase() ?identifyForm(matchedForms[0],e):null; var hint=matchedForms.length&&matchedForms[0].toLowerCase()!==e.l.toLowerCase() ?'' +matchedForms[0]+(tbDetected?' ('+tbDetected+')':'') +'':''; html+='
' +''+e.l+''+hint +''+e.d+'
'; }); if(hits.length>6)html+='
'+hits.length+' Treffer — alle anzeigen →
'; drop.innerHTML=html; drop.style.display='block'; } function tbWbSelect(lemma){ document.getElementById('tbWbIn').value=lemma; document.getElementById('tbWbDrop').style.display='none'; go('wb'); document.getElementById('wbInput').value=lemma; wbSearch(lemma); } function tbWbSelectIdx(idxStr){ var e=DICT[parseInt(idxStr)]; if(!e)return; tbWbSelect(e.l); } function tbWbGo(){ var q=document.getElementById('tbWbIn').value; if(!q)return; go('wb'); document.getElementById('wbInput').value=q; wbSearch(q); document.getElementById('tbWbDrop').style.display='none'; } function tbWbShowDrop(){ var q=document.getElementById('tbWbIn').value; if(q&&q.length>=2)tbWbSearch(q); } function tbWbHideDrop(){ document.getElementById('tbWbDrop').style.display='none'; }