diff --git a/data/lessons.json b/data/lessons.json index 4ab3dd9..4820af9 100644 --- a/data/lessons.json +++ b/data/lessons.json @@ -98,6 +98,11 @@ "lesson": 20, "title": "JSON Parsing", "text": "{\n\"user\": \"dev\",\n\"skills\": [\"Python\", \"C++\", \"JSON\"],\n\"active\": true,\n\"projects\": [{\n \"title\": \"Tipptrainer\",\n \"completed\": false\n }]\n} // Beachte Anführungszeichen und Doppelpunkte" + }, + { + "lesson": 21, + "title": "Kurze Test Lektion", + "text": "Dies ist nur ein kurzer Text." } ] diff --git a/static/css/style.css b/static/css/style.css index 7f655a0..a8bbc68 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -130,6 +130,10 @@ body { font-weight: 500; line-height: 1.6; letter-spacing: 0.5px; + user-select: none; /* Verhindert Textauswahl */ + -webkit-user-select: none; /* Für Safari */ + -moz-user-select: none; /* Für Firefox */ + -ms-user-select: none; /* Für Internet Explorer/Edge */ } #user-input { diff --git a/static/js/script.js b/static/js/script.js index cad2116..7885604 100644 --- a/static/js/script.js +++ b/static/js/script.js @@ -32,7 +32,7 @@ document.addEventListener('DOMContentLoaded', function() { document.getElementById('theme-toggle').addEventListener('click', toggleTheme); const userInput = document.getElementById('user-input'); - const targetText = document.getElementById('target-text'); + const targetTextElement = document.getElementById('target-text'); const nextBtn = document.getElementById('next-btn'); const endBtn = document.getElementById('end-btn'); @@ -57,9 +57,90 @@ document.addEventListener('DOMContentLoaded', function() { // Zeige die erste Zeile an updateLineDisplay(); + // Verhindere Copy & Paste für das Vorlagenfeld + targetTextElement.addEventListener('copy', function(event) { + event.preventDefault(); + alert('Kopieren aus der Vorlage ist nicht erlaubt! Bitte tippen Sie den Text manuell.'); + }); + + targetTextElement.addEventListener('cut', function(event) { + event.preventDefault(); + alert('Ausschneiden aus der Vorlage ist nicht erlaubt!'); + }); + + targetTextElement.addEventListener('contextmenu', function(event) { + event.preventDefault(); + return false; + }); + // Fokus auf das Eingabefeld setzen userInput.focus(); + // Verhindere Copy & Paste für das Eingabefeld + userInput.addEventListener('paste', function(event) { + event.preventDefault(); + alert('Einfügen (Paste) ist nicht erlaubt! Bitte tippen Sie den Text manuell.'); + }); + + userInput.addEventListener('copy', function(event) { + event.preventDefault(); + alert('Kopieren (Copy) ist nicht erlaubt!'); + }); + + userInput.addEventListener('cut', function(event) { + event.preventDefault(); + alert('Ausschneiden (Cut) ist nicht erlaubt!'); + }); + + // Verhindere Drag & Drop + userInput.addEventListener('drop', function(event) { + event.preventDefault(); + alert('Drag & Drop ist nicht erlaubt! Bitte tippen Sie den Text manuell.'); + }); + + // Verhindere das Einfügen über das Kontextmenü (rechte Maustaste) + userInput.addEventListener('contextmenu', function(event) { + event.preventDefault(); + return false; + }); + + // Verhindere das Einfügen über Tastenkombinationen (Strg+V, Cmd+V, etc.) + userInput.addEventListener('keydown', function(event) { + // Strg+V oder Cmd+V + if ((event.ctrlKey || event.metaKey) && event.key === 'v') { + event.preventDefault(); + alert('Einfügen (Strg+V / Cmd+V) ist nicht erlaubt! Bitte tippen Sie den Text manuell.'); + return false; + } + + // Strg+C oder Cmd+C + if ((event.ctrlKey || event.metaKey) && event.key === 'c') { + event.preventDefault(); + alert('Kopieren (Strg+C / Cmd+C) ist nicht erlaubt!'); + return false; + } + + // Strg+X oder Cmd+X + if ((event.ctrlKey || event.metaKey) && event.key === 'x') { + event.preventDefault(); + alert('Ausschneiden (Strg+X / Cmd+X) ist nicht erlaubt!'); + return false; + } + + // Strg+A oder Cmd+A (Selektion verhindern) + if ((event.ctrlKey || event.metaKey) && event.key === 'a') { + event.preventDefault(); + alert('Selektion (Strg+A / Cmd+A) ist nicht erlaubt!'); + return false; + } + + // Rechtsklick-Menü-Tasten (Context Menu key) + if (event.key === 'ContextMenu') { + event.preventDefault(); + return false; + } + }); + // Starte die Zeitmessung beim ersten Tastendruck und zähle Tastaturanschläge userInput.addEventListener('keydown', function(event) { const cursorPosition = userInput.selectionStart; @@ -186,11 +267,11 @@ document.addEventListener('DOMContentLoaded', function() { if (data.error) { alert('Fehler: ' + data.error); } else { - lines = data.text.split('\n'); + lines = data.text.split(/\r?\n/); currentLineIndex = 0; completedLines = []; currentLineInput = ''; - fullText = lines.join('\n'); + fullText = data.text; startTime = null; keyStrokeCount = 0; // Zurücksetzen des Tastaturanschlagszählers updateLineDisplay(); @@ -223,11 +304,11 @@ document.addEventListener('DOMContentLoaded', function() { }) .then(response => response.json()) .then(data => { - lines = data.text.split('\n'); + lines = data.text.split(/\r?\n/); currentLineIndex = 0; completedLines = []; currentLineInput = ''; - fullText = lines.join('\n'); + fullText = data.text; startTime = null; keyStrokeCount = 0; // Zurücksetzen des Tastaturanschlagszählers updateLineDisplay(); @@ -308,7 +389,6 @@ document.addEventListener('DOMContentLoaded', function() { // Text hervorheben function updateTextHighlighting(userInput, currentText) { - const targetElement = document.getElementById('target-text'); let highlightedText = ''; // Verwende den ursprünglichen Text für die Anzeige @@ -354,12 +434,11 @@ document.addEventListener('DOMContentLoaded', function() { } } - targetElement.innerHTML = highlightedText; + targetTextElement.innerHTML = highlightedText; } // Hilfsfunktion zum Aktualisieren der Zeilenanzeige function updateLineDisplay() { - const targetElement = document.getElementById('target-text'); // Setze nur die aktuelle Zeile mit Hervorhebung updateTextHighlighting('', lines[currentLineIndex]); }