/** * Textanalyse - Analysiert Texte und zeigt Statistiken * David & Karo - EIS Projekt */ /** * Analysiert einen Text und gibt Statistiken zurück * @param {string} text - Der zu analysierende Text * @returns {object} - Enthält Analyseresultate und Details */ function analyseText(text) { // Eingabe validieren if (text === null) { return { valid: false, fehler: 'Eingabe abgebrochen!', nachricht: '❌ Die Textanalyse wurde abgebrochen.' }; } // Text trimmen (führende und nachfolgende Leerzeichen entfernen) const textTrimmed = text.trim(); if (textTrimmed === '') { return { valid: false, fehler: 'Text ist leer!', nachricht: '❌ Bitte geben Sie einen Text ein, der analysiert werden soll!' }; } // Zeichen zählen const anzahlZeichen = text.length; const anzahlZeichenOhneLeerzeichen = text.replace(/\s/g, '').length; // Wörter zählen const woerter = textTrimmed.split(/\s+/).filter(wort => wort.length > 0); const anzahlWoerter = woerter.length; // Sätze zählen (vereinfacht: Punkt, Frage- und Ausrufezeichen) const anzahlSaetze = (text.match(/[.!?]/g) || []).length || 1; // Text in Großbuchstaben const textGross = text.toUpperCase(); // Text in Kleinbuchstaben const textKlein = text.toLowerCase(); // Durchschnittliche Wortlänge const durchschnittlicheWortlaenge = anzahlWoerter > 0 ? (anzahlZeichenOhneLeerzeichen / anzahlWoerter).toFixed(2) : 0; // Vokale zählen const vokale = (text.match(/[aeiouäöüAEIOUÄÖÜ]/g) || []).length; // Konsonanten zählen const konsonanten = (text.match(/[bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ]/g) || []).length; // Zahlen zählen const zahlen = (text.match(/[0-9]/g) || []).length; // Längster und kürzester Satz const saetze = text.split(/[.!?]/).map(s => s.trim()).filter(s => s.length > 0); const laengsterSatz = saetze.length > 0 ? saetze.reduce((prev, current) => (prev.length > current.length) ? prev : current, '') : ''; const kuerzeesterSatz = saetze.length > 0 ? saetze.reduce((prev, current) => (prev.length < current.length) ? prev : current, '') : ''; // Formatierte Ausgabe mit Template Literals const formatiertesErgebnis = ` 📊 TEXTANALYSE-ERGEBNISSE: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 📝 Zeichen & Wörter: • Gesamte Zeichen: ${anzahlZeichen} • Zeichen ohne Leerzeichen: ${anzahlZeichenOhneLeerzeichen} • Anzahl der Wörter: ${anzahlWoerter} • Anzahl der Sätze: ${anzahlSaetze} • Durchschn. Wortlänge: ${durchschnittlicheWortlaenge} Zeichen 🔤 Buchstaben & Laute: • Vokale: ${vokale} • Konsonanten: ${konsonanten} • Zahlen: ${zahlen} 🔤 ORIGINAL TEXT: ${text} 🔤 GROSSBUCHSTABEN: ${textGross} 🔤 KLEINBUCHSTABEN: ${textKlein} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`; return { valid: true, originalText: text, anzahlZeichen: anzahlZeichen, anzahlZeichenOhneLeerzeichen: anzahlZeichenOhneLeerzeichen, anzahlWoerter: anzahlWoerter, anzahlSaetze: anzahlSaetze, durchschnittlicheWortlaenge: durchschnittlicheWortlaenge, vokale: vokale, konsonanten: konsonanten, zahlen: zahlen, textGross: textGross, textKlein: textKlein, saetze: saetze, laengsterSatz: laengsterSatz, kuerzeesterSatz: kuerzeesterSatz, formatiertesErgebnis: formatiertesErgebnis, nachricht: `✅ Text erfolgreich analysiert! ${anzahlWoerter} Wörter, ${anzahlZeichen} Zeichen.` }; } /** * Vergleicht zwei Texte * @param {string} text1 - Erster Text * @param {string} text2 - Zweiter Text * @returns {object} - Vergleichsergebnisse */ function vergleicheTexte(text1, text2) { const analyse1 = analyseText(text1); const analyse2 = analyseText(text2); if (!analyse1.valid || !analyse2.valid) { return { valid: false, fehler: 'Mindestens einer der Texte ist leer!', nachricht: '❌ Bitte geben Sie zwei nicht-leere Texte ein!' }; } const unterschied = Math.abs(analyse1.anzahlZeichen - analyse2.anzahlZeichen); const laenger = analyse1.anzahlZeichen > analyse2.anzahlZeichen ? 'Text 1' : 'Text 2'; const vergleichsErgebnis = ` 📊 TEXTVERGLEICH: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Text 1 Statistik: • Zeichen: ${analyse1.anzahlZeichen} • Wörter: ${analyse1.anzahlWoerter} Text 2 Statistik: • Zeichen: ${analyse2.anzahlZeichen} • Wörter: ${analyse2.anzahlWoerter} Vergleich: • Unterschied: ${unterschied} Zeichen • Längerer Text: ${laenger} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`; return { valid: true, vergleichsErgebnis: vergleichsErgebnis, unterschied: unterschied, laenger: laenger, nachricht: `✅ Vergleich abgeschlossen! Unterschied: ${unterschied} Zeichen` }; } /** * Sucht nach Wörtern in einem Text * @param {string} text - Der Text zum Durchsuchen * @param {string} suchbegriff - Das Wort zum Suchen * @returns {object} - Suchergebnisse */ function sucheWort(text, suchbegriff) { if (!text.trim() || !suchbegriff.trim()) { return { valid: false, fehler: 'Eingabe unvollständig!', nachricht: '❌ Bitte geben Sie Text und Suchbegriff ein!' }; } const regex = new RegExp(suchbegriff, 'gi'); const treffer = (text.match(regex) || []).length; const indexTreffer = []; let match; while ((match = regex.exec(text)) !== null) { indexTreffer.push(match.index); } const suchergebnis = ` 🔍 SUCHE: "${suchbegriff}" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Treffer gefunden: ${treffer} • Positionen: ${indexTreffer.join(', ') || 'Keine'} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`; return { valid: true, suchbegriff: suchbegriff, treffer: treffer, positionen: indexTreffer, suchergebnis: suchergebnis, nachricht: `✅ ${treffer} Treffer für "${suchbegriff}" gefunden!` }; } // DOM-Manipulation und Event-Listener document.addEventListener('DOMContentLoaded', function() { const analyzeBtn = document.getElementById('analyze-btn'); const compareBtn = document.getElementById('compare-btn'); const searchBtn = document.getElementById('search-btn'); const resetBtn = document.getElementById('reset-btn'); if (analyzeBtn) { analyzeBtn.addEventListener('click', performTextAnalysis); } if (compareBtn) { compareBtn.addEventListener('click', performTextComparison); } if (searchBtn) { searchBtn.addEventListener('click', performTextSearch); } if (resetBtn) { resetBtn.addEventListener('click', resetAnalyzer); } // Live-Zeichenzähler const textInput = document.getElementById('text-input'); const charCount = document.getElementById('char-count'); if (textInput && charCount) { textInput.addEventListener('input', function() { charCount.textContent = this.value.length; }); } }); /** * Führt Textanalyse durch */ function performTextAnalysis() { const textInput = document.getElementById('text-input'); const resultDiv = document.getElementById('result'); if (!textInput) return; const text = textInput.value; const result = analyseText(text); if (!result.valid) { resultDiv.innerHTML = `
`; alert(result.nachricht); console.error(result.fehler, result); return; } // HTML-Ergebnis formatieren let resultHTML = `Zeichen: ${result.vergleichsErgebnis.match(/Zeichen: (\d+)/)[1] || '0'}
Wörter: ${result.vergleichsErgebnis.match(/Wörter: (\d+)/)[1] || '0'}
Zeichen: ${result.vergleichsErgebnis.match(/Zeichen: (\d+)[\s\S]*?Wörter: (\d+)[\s\S]*?Text 2 Statistik[\s\S]*?Zeichen: (\d+)/)[3] || '0'}
Wörter: ${result.vergleichsErgebnis.match(/Text 2[\s\S]*?Wörter: (\d+)/)[1] || '0'}
Längerer Text: ${result.laenger}
Unterschied: ${result.unterschied} Zeichen
Suchbegriff: "${escapeHtml(result.suchbegriff)}"
Treffer gefunden: ${result.treffer}
${result.treffer > 0 ? `Positionen: ${result.positionen.join(', ')}
` : ''}