diff --git a/webseite/assets/js/formula.js b/webseite/assets/js/formula.js new file mode 100644 index 0000000..bcb3e30 --- /dev/null +++ b/webseite/assets/js/formula.js @@ -0,0 +1,158 @@ +function createFormula(text = "") { + const formulaInputs = document.querySelector('#formulaInputs'); + + const formulaElement = document.createElement('div'); + formulaElement.classList.add('input-formula', "pb-10"); + formulaElement.id = "f-" + crypto.randomUUID(); + + const textElement = document.createElement('textarea'); + textElement.type = 'text'; + textElement.classList.add('input-text'); + textElement.classList.add("w-full", "px-4", "py-3", "border", "rounded-lg", "focus:outline-none", "focus:ring-2", "focus:ring-blue-500", "text-lg", "enabled:hover:border-gray-400"); + textElement.rows = 3; + textElement.placeholder = "Aufgabentext"; + textElement.innerText = text; + textElement.onchange = updateFormulaText; + + formulaElement.appendChild(textElement); + + const variableSection = document.createElement('div'); + variableSection.classList.add("input-variable-section"); + formulaElement.appendChild(variableSection) + + const buttonRow = document.createElement('div'); + buttonRow.classList.add("flex", "flow-root"); + + const removeFormulaButton = document.createElement('button'); + removeFormulaButton.type = "button"; + removeFormulaButton.innerText = "Aufgabe löschen"; + removeFormulaButton.classList.add("px-4", "py-3", "border", "rounded-lg", "focus:outline-none", "focus:ring-2", "focus:ring-blue-500", "text-lg", "enabled:hover:border-gray-400"); + removeFormulaButton.onclick = () => { + formulaElement.remove(); + }; + buttonRow.appendChild(removeFormulaButton); + + const addVariableButton = document.createElement('button'); + addVariableButton.type = "button"; + addVariableButton.innerText = "+"; + addVariableButton.classList.add("w-2/12", "md:w-1/12", "float-right", "px-4", "py-3", "border", "rounded-lg", "focus:outline-none", "focus:ring-2", "focus:ring-blue-500", "text-lg", "enabled:hover:border-gray-400"); + addVariableButton.onclick = () => { + createVariable(formulaElement.id); + }; + buttonRow.appendChild(addVariableButton); + + formulaElement.appendChild(buttonRow); + + formulaInputs.appendChild(formulaElement); + + return formulaElement.id; +} + +function createVariable(formulaUID, variableText = "", valueText = "") { + const element = document.querySelector("#" + formulaUID).querySelector(".input-variable-section"); + + const variableValueElement = document.createElement('div'); + variableValueElement.classList.add('input-variables'); + + const variableElement = document.createElement('input'); + variableElement.type = 'text'; + variableElement.classList.add('input-variable'); + variableElement.classList.add("w-5/12", "md:w-6/12", "px-4", "py-3", "border", "rounded-lg", "focus:outline-none", "focus:ring-2", "focus:ring-blue-500", "text-lg", "enabled:hover:border-gray-400") + variableElement.value = variableText; + variableElement.placeholder = "Variable"; + variableElement.onchange = updateFormulaText; + variableValueElement.appendChild(variableElement); + + const valueElement = document.createElement('input'); + valueElement.type = 'text'; + valueElement.classList.add('input-value'); + valueElement.classList.add("w-5/12", "md:w-5/12", "px-4", "py-3", "border", "rounded-lg", "focus:outline-none", "focus:ring-2", "focus:ring-blue-500", "text-lg", "enabled:hover:border-gray-400") + valueElement.value = valueText; + valueElement.placeholder = "Richtiger Wert"; + valueElement.onchange = updateFormulaText; + variableValueElement.appendChild(valueElement); + + const removeButton = document.createElement('button'); + removeButton.type = "button"; + removeButton.innerText = "-" + removeButton.classList.add("w-2/12", "md:w-1/12", "px-4", "py-3", "border", "rounded-lg", "focus:outline-none", "focus:ring-2", "focus:ring-blue-500", "text-lg", "enabled:hover:border-gray-400"); + removeButton.onclick = () => { + variableValueElement.remove(); + updateFormulaText(); + }; + variableValueElement.appendChild(removeButton); + + element.appendChild(variableValueElement); +} + +function createFormulaWithVariable() { + const uuid = createFormula(); + createVariable(uuid); +} + +function createFormulasFromString(string) { + const taskStrings = string.split(";;;;"); + taskStrings.forEach((taskString) => { + const elements = taskString.split(";;"); + if(elements.length < 2) { + return; + } + + const text = elements[0]; + const variables = elements.slice(1, elements.length); + + const uid = createFormula(text); + + variables.forEach((variableValuePair) => { + const arr = variableValuePair.split("::"); + if(arr.length !== 2) { + return; + } + createVariable(uid, arr[0], arr[1]); + }); + }); +} + +function getFormulasAsString() { + const formulaInputs = document.querySelector('#formulaInputs'); + + let formulas = []; + formulaInputs.querySelectorAll('.input-formula').forEach((formulaElement) => { + const text = formulaElement.querySelector(".input-text").value; + if(text.includes(";;")) { + return; + } + + let variables = []; + formulaElement.querySelectorAll(".input-variables").forEach((variableValueElement) => { + const variable = variableValueElement.querySelector(".input-variable"); + const value = variableValueElement.querySelector(".input-value"); + + if(variable == null || value == null) { + return; + } + + if(variable.value.trim() === "" || value.value.trim() === "") { + return; + } + + if(variable.value.includes(";;") || variable.value.includes("::")) { + return; + } + + if(value.value.includes(";;") || value.value.includes("::")) { + return; + } + + variables.push(variable.value + "::" + value.value); + }); + + formulas.push(text + ";;" + variables.join(";;")); + }); + + return formulas.join(';;;;'); +} + +function updateFormulaText() { + document.querySelector('#formulas').value = getFormulasAsString(); +} \ No newline at end of file diff --git a/webseite/config/subjects/mathe/topics/geometrie/tasks.json b/webseite/config/subjects/mathe/topics/geometrie/tasks.json index 67ed857..63218c2 100644 --- a/webseite/config/subjects/mathe/topics/geometrie/tasks.json +++ b/webseite/config/subjects/mathe/topics/geometrie/tasks.json @@ -1,62 +1,56 @@ [ - { - "text": "Ein Quadrat mit Seitenlänge $$a = 4 cm$$ berechne die Fläche", - "vars": { - "Fläche in cm^2": "16" + { + "text": "Ein Quadrat mit Seitenlänge \\(a = 4 cm\\) berechne die Fläche", + "vars": { + "Fläche in cm^2": "16" + } + }, + { + "text": "Ein Rechteck mit \\(l = 7 cm\\) und \\(b = 2 cm\\) berechne die Fläche", + "vars": { + "Fläche in cm^2": "14" + } + }, + { + "text": "Berechne den Umfang \\(U\\) eines Quadrats mit \\(a = 6 cm\\)", + "vars": { + "U in cm": "24" + } + }, + { + "text": "Berechne den Umfang \\(U\\) eines Rechteck mit \\(l = 8 cm\\) und \\(b = 4 cm\\)", + "vars": { + "?": "24" + } + }, + { + "text": "Ein Dreieck mit der Grundlinie \\(G = 8cm\\) und einer Höhe \\(h= 5cm\\) berechne die Fläche", + "vars": { + "Fläche in cm^2": "20" + } + }, + { + "text": "Ein Dreieck mit der Grundlinie \\(G = 10cm\\) und einer Höhe \\(h= 7cm\\) berechne die Fläche", + "vars": { + "Fläche in cm^2": "35" + } + }, + { + "text": "Ein Kreis hat den Radius \\(r = 5cm\\) Berechne den Umfang. Runde auf eine NkSt", + "vars": { + "Umfang in cm": "31,4" + } + }, + { + "text": "Ein Quader hat den die Länge \\(l = 4cm\\) Breite \\(b = 3cm\\) und Höhe \\(h=2cm\\) Berechne das Volumen \\(V\\)", + "vars": { + "Volumen in cm^3": "24" + } + }, + { + "text": "Ein Quader hat den die Länge \\(l = 6cm\\) Breite \\(b = 4cm\\) und Höhe \\(h=3cm\\) Berechne das Volumen \\(V\\)", + "vars": { + "Volumen in cm^3": "72" + } } - }, - { - "text": "Ein Rechteck mit $$l = 7 cm$$ und $$b = 2 cm$$ berechne die Fläche", - "vars": { - "Fläche in cm^2": "14" - } - }, - { - "text": "Berechne den Umfang $$U$$ eines Quadrats mit $$a = 6 cm$$", - "vars": { - "Umfang in cm": "24" - } - }, - { - "text": "Berechne den Umfang $$U$$ eines Rechteck mit $$l = 8 cm$$ und $$b = 4 cm$$", - "vars": { - "U in cm": "5/15" - } - }, - { - "text": "Ein Dreieck mit der Grundlinie $$G = 8cm$$ und einer Höhe $$h= 5cm$$ berechne die Fläche", - "vars": { - "Fläche in cm^2": "20" - } - }, - { - "text": "Ein Dreieck mit der Grundlinie $$G = 10cm$$ und einer Höhe $$h= 7cm$$ berechne die Fläche", - "vars": { - "Fläche in cm^2": "35" - } - }, - { - "text": "Ein Kreis hat den Radius $$r = 4cm$$ Berechne den Umfang. Runde auf eine NkSt", - "vars": { - "Umfang in cm": "25,1" - } - }, - { - "text": "Ein Kreis hat den Radius $$r = 5cm$$ Berechne den Umfang. Runde auf eine NkSt", - "vars": { - "Umfang in cm": "31,4" - } - }, - { - "text": "Ein Quader hat den die Länge $$l = 4cm$$ Breite $$b = 3cm$$ und Höhe $$h=2cm$$ Berechne das Volumen $$V$$", - "vars": { - "Volumen in cm^3": "24" - } - }, - { - "text": "Ein Quader hat den die Länge $$l = 6cm$$ Breite $$b = 4cm$$ und Höhe $$h=3cm$$ Berechne das Volumen $$V$$", - "vars": { - "Volumen in cm^3": "72" - } - } ] \ No newline at end of file diff --git a/webseite/config/subjects/mathe/topics/wahrscheinlichkeitsrechnung/tasks.json b/webseite/config/subjects/mathe/topics/wahrscheinlichkeitsrechnung/tasks.json index dff688b..5035096 100644 --- a/webseite/config/subjects/mathe/topics/wahrscheinlichkeitsrechnung/tasks.json +++ b/webseite/config/subjects/mathe/topics/wahrscheinlichkeitsrechnung/tasks.json @@ -1,14 +1,14 @@ [ { - "text": "Was ist die Wahrscheinlichkeit $$W$$, bei einem Würfel eine gerade Zahl zu würfeln?", + "text": "Was ist die Wahrscheinlichkeit \\(W\\), bei einem Würfel eine gerade Zahl zu würfeln?", "vars": { - "W": "1/2" + "W": "1\/2" } }, { - "text": "Was ist die Wahrscheinlichkeit $$W$$ für eine rote Karte aus einem Kartenspiel (52 Karten, 26 rot)", + "text": "Was ist die Wahrscheinlichkeit \\(W\\) für eine rote Karte aus einem Kartenspiel (52 Karten, 26 rot)", "vars": { - "W": "26/52" + "W": "26\/52" } } ] \ No newline at end of file diff --git a/webseite/index.php b/webseite/index.php index e764484..cf74112 100644 --- a/webseite/index.php +++ b/webseite/index.php @@ -69,7 +69,7 @@ session_start();
-
+

displayName); ?>

description); ?>

diff --git a/webseite/subject.php b/webseite/subject.php index 668e3c6..8009e95 100644 --- a/webseite/subject.php +++ b/webseite/subject.php @@ -47,13 +47,13 @@ $topics = $subjectData->topics; Startseite - + displayName); ?> Übersicht @@ -69,7 +69,7 @@ $topics = $subjectData->topics;
-
+

displayName); ?>

@@ -102,6 +102,10 @@ $topics = $subjectData->topics;
-->
+ + files) > 0) { + ?>

Übungen herunterladen:

+ +
-
+
- @@ -82,10 +81,10 @@ if (!isset($topicData)) { Startseite - + displayName); ?> Übersicht - + displayName); ?> @@ -95,6 +94,10 @@ if (!isset($topicData)) {
+ relatedTopics) > 0) { + ?> + + +

displayName); ?>

@@ -129,6 +136,9 @@ if (!isset($topicData)) { getFinishedArticle()); ?>
+ files) > 0) { + ?>

Übungen herunterladen:

@@ -148,6 +158,10 @@ if (!isset($topicData)) { ?>
+ +
@@ -206,6 +220,9 @@ if (!isset($topicData)) { ?> + relatedTopics) > 0) { + ?> + +
diff --git a/webseite/topicEditor.php b/webseite/topicEditor.php index a3b7655..51a69ac 100644 --- a/webseite/topicEditor.php +++ b/webseite/topicEditor.php @@ -52,8 +52,8 @@ if (isset($_GET['subject']) && isset($_GET['topic'])) { $defaultValues['formulas'] = implode(";;;;", $tasks); $defaultValues['article'] = $editingTopic->getFinishedArticle(); } -} else if (isset($_GET['subject'])) { - $defaultValues['subjectId'] = $_GET['subject']; +} else if (isset($_GET['subjectId'])) { + $defaultValues['subjectId'] = $_GET['subjectId']; } if ($_SERVER['REQUEST_METHOD'] == 'POST') { @@ -189,6 +189,8 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') { // extension=mbstring in php.ini muss aktiviert sein! $article = mb_convert_encoding($dom->saveHTML(), 'UTF-8', 'HTML-ENTITIES'); + $article = preg_replace("/^[ \r\n\t]*

/", "

", $article); + $article = preg_replace("#

[ \r\n\t]*$#", "

", $article); if (isset($allSubjects[$_POST['subjectId']]->getTopics()[$_POST['id']])) { $newTopic = $allSubjects[$_POST['subjectId']]->getTopics()[$_POST['id']]; @@ -261,6 +263,7 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') { integrity="sha384-RdymN7NRJ+XoyeRY4185zXaxq9QWOOx3O7beyyrRK4KQZrPlCDQQpCu95FoCGPAE" crossorigin="anonymous"> + @@ -322,7 +325,7 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-
+
+
+ + + + +
- + + +
+ +
+ +
@@ -400,7 +438,7 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-
+ +