152 lines
5.1 KiB
JavaScript
152 lines
5.1 KiB
JavaScript
const canvas = document.getElementById('drawingCanvas');
|
|
const ctx = canvas.getContext('2d');
|
|
const textElement = document.getElementById('text');
|
|
const wordDisplay = document.getElementById('wordDisplay');
|
|
const textInput = document.getElementById('textInput');
|
|
const submitAnswer = document.getElementById('submitAnswer');
|
|
const toggleInput = document.getElementById('toggleInput');
|
|
const clearCanvas = document.getElementById('clearCanvas');
|
|
const previewDrawing = document.getElementById('previewDrawing');
|
|
const recognizedText = document.getElementById('recognizedText');
|
|
|
|
let currentWord = null;
|
|
let currentInputMode = 'text'; // 'text' or 'drawing'
|
|
let isDrawing = false;
|
|
|
|
// Initialize input mode
|
|
function initializeInputMode() {
|
|
textInput.style.display = 'block';
|
|
canvas.style.display = 'none';
|
|
clearCanvas.style.display = 'none';
|
|
previewDrawing.style.display = 'none';
|
|
toggleInput.textContent = 'Zu Zeichnen wechseln';
|
|
recognizedText.textContent = '';
|
|
}
|
|
|
|
// Load a new word
|
|
function loadWord() {
|
|
fetch('/get_random_vocab')
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if (data.error) {
|
|
wordDisplay.textContent = 'Keine Vokabeln gefunden.';
|
|
} else {
|
|
currentWord = data;
|
|
const isEnglish = Math.random() < 0.5;
|
|
wordDisplay.textContent = isEnglish ? `English: ${currentWord.english}` : `Deutsch: ${currentWord.german}`;
|
|
textElement.textContent = '';
|
|
textInput.value = '';
|
|
recognizedText.textContent = '';
|
|
if (currentInputMode === 'drawing') {
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
}
|
|
}
|
|
})
|
|
.catch(error => console.error('Fehler beim Laden der Vokabel:', error));
|
|
}
|
|
|
|
// Switch between input modes
|
|
toggleInput.addEventListener('click', () => {
|
|
if (currentInputMode === 'text') {
|
|
textInput.style.display = 'none';
|
|
canvas.style.display = 'block';
|
|
clearCanvas.style.display = 'inline-block';
|
|
previewDrawing.style.display = 'inline-block';
|
|
toggleInput.textContent = 'Zu Texteingabe wechseln';
|
|
currentInputMode = 'drawing';
|
|
} else {
|
|
textInput.style.display = 'block';
|
|
canvas.style.display = 'none';
|
|
clearCanvas.style.display = 'none';
|
|
previewDrawing.style.display = 'none';
|
|
toggleInput.textContent = 'Zu Zeichnen wechseln';
|
|
currentInputMode = 'text';
|
|
}
|
|
});
|
|
|
|
// Clear the canvas
|
|
clearCanvas.addEventListener('click', () => {
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
recognizedText.textContent = ''; // Clear the recognized text as well
|
|
});
|
|
|
|
// Drawing functionality
|
|
canvas.addEventListener('mousedown', () => {
|
|
isDrawing = true;
|
|
});
|
|
|
|
canvas.addEventListener('mouseup', () => {
|
|
isDrawing = false;
|
|
ctx.beginPath();
|
|
});
|
|
|
|
canvas.addEventListener('mousemove', draw);
|
|
|
|
function draw(event) {
|
|
if (!isDrawing) return;
|
|
ctx.lineWidth = 5;
|
|
ctx.lineCap = 'round';
|
|
ctx.strokeStyle = 'black';
|
|
|
|
ctx.lineTo(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);
|
|
ctx.stroke();
|
|
ctx.beginPath();
|
|
ctx.moveTo(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);
|
|
}
|
|
|
|
// Preview the drawing recognition
|
|
previewDrawing.addEventListener('click', () => {
|
|
const dataURL = canvas.toDataURL('image/png');
|
|
|
|
fetch(dataURL)
|
|
.then(res => res.blob())
|
|
.then(blob => {
|
|
Tesseract.recognize(
|
|
blob,
|
|
'eng',
|
|
{ logger: info => console.log(info) }
|
|
).then(({ data: { text } }) => {
|
|
recognizedText.textContent = `Erkannter Text: ${text.trim()}`;
|
|
});
|
|
})
|
|
.catch(error => {
|
|
console.error('Fehler beim Erkennen des Textes:', error);
|
|
});
|
|
});
|
|
|
|
// Submit answer
|
|
submitAnswer.addEventListener('click', () => {
|
|
let answer = '';
|
|
|
|
if (currentInputMode === 'text') {
|
|
answer = textInput.value.trim();
|
|
} else {
|
|
answer = recognizedText.textContent.replace('Erkannter Text:', '').trim();
|
|
}
|
|
|
|
checkAnswer(answer);
|
|
});
|
|
|
|
// Check if the answer is correct
|
|
function checkAnswer(answer) {
|
|
const correctAnswer = (wordDisplay.textContent.startsWith('English:') ? currentWord.german : currentWord.english).trim().toLowerCase();
|
|
if (answer.toLowerCase() === correctAnswer) {
|
|
textElement.textContent = 'Richtig!';
|
|
textElement.style.color = 'green';
|
|
// Update the vocabulary level
|
|
fetch(`/update_vocab_level/${currentWord.id}`, { method: 'POST' })
|
|
.then(() => {
|
|
setTimeout(loadWord, 2000); // Show the result for 2 seconds before loading the next word
|
|
});
|
|
} else {
|
|
textElement.textContent = `Falsch! Die richtige Antwort ist: ${correctAnswer}`;
|
|
textElement.style.color = 'red';
|
|
setTimeout(loadWord, 3000); // Show the result for 3 seconds before loading the next word
|
|
}
|
|
}
|
|
|
|
// Initialize the input mode and load the first word
|
|
initializeInputMode();
|
|
loadWord();
|
|
|