/** * 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='… 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='