From 6f8bd7e98be91c60386f2e2291a41cfc1004c8b0 Mon Sep 17 00:00:00 2001
From: jsteuer <jan.niklas.steuer@gmail.com>
Date: Sat, 06 Jul 2019 16:33:47 +0200
Subject: [PATCH] add example
---
examples/example-ide/code_completion.png | 0
examples/README.md | 6 ++
examples/example-ide/MyEditor/editor.js | 68 ++++++++++++++++++++++
examples/example-ide/README.md | 42 ++++++++++++++
examples/example-ide/MyEditor/editor.html | 29 +++++++++
5 files changed, 145 insertions(+), 0 deletions(-)
diff --git a/examples/README.md b/examples/README.md
new file mode 100644
index 0000000..1eaaf85
--- /dev/null
+++ b/examples/README.md
@@ -0,0 +1,6 @@
+# Beispiele
+- `example-ide`:
+ Entwickeln eines externen Werkzeuges in der MathCoach-IDE
+- `example-vscode-advanced`:
+ Entwickeln eines externen Werkzeuges mit VSCode, Typescript und
+ Parcel als Build-System
\ No newline at end of file
diff --git a/examples/example-ide/MyEditor/editor.html b/examples/example-ide/MyEditor/editor.html
new file mode 100644
index 0000000..e7c7ed7
--- /dev/null
+++ b/examples/example-ide/MyEditor/editor.html
@@ -0,0 +1,29 @@
+<html>
+
+<head>
+ <title></title>
+ <meta content="">
+ <style>
+ </style>
+</head>
+
+<body>
+ <h1>Demo Editor!!!</h1>
+ <p>
+ Der Editor beschreibt die Kontext-Datei (Datei, mit dem der
+ Editor gestartet wurde) beispielhaft. Er kann eine Aufgabe generieren
+ und die Vorschau zu der generieren Datei navigieren.
+ </p>
+ <ul>
+ <li>
+ <button id="btn_write">Kontext-Datei schreiben</button>
+ </li>
+ <li>
+ <button id="btn_generateExercise">Aufgabe generieren und anzeigen</button>
+ </li>
+ </ul>
+
+ <script src="/mathcoach/ui/ide/api/ide-lib.js"></script>
+ <script src="./editor.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/examples/example-ide/MyEditor/editor.js b/examples/example-ide/MyEditor/editor.js
new file mode 100644
index 0000000..fe8c570
--- /dev/null
+++ b/examples/example-ide/MyEditor/editor.js
@@ -0,0 +1,68 @@
+(async function () {
+ const isReady = typeof MC !== "undefined" ? await MC.isReady() : false;
+ if(!isReady){
+ alert("Die MathCoach-API ist nicht einsatzbereit. Wurde das Werkzeug nicht durch die IDE gestartet?");
+ throw new Error("mc api not ready");
+ }
+
+ const btnWrite = document.getElementById("btn_write");
+ const btnGenerateExercise = document.getElementById("btn_generateExercise");
+
+ const user = await MC.ide.getUserName(); // Angemeldeter Benutzer
+ const contextFile = await MC.ide.getContextFile(); // Datei, mit der der Editor gestartet wurde
+
+ /**
+ * Internes Datenmodell des Werkzeuges. Die grafische Oberfläche soll an
+ * dieses Datenmodell gebunden sein:
+ * - Änderungen in der grafischen Oberfläche ändern das Modell
+ * - Änderungen des Modell aktualisieren die grafische Oberfläche
+ */
+ let data = {
+ user: user,
+ timestamp: new Date().toTimeString()
+ }
+
+ /**
+ * Schreibt das Datenmodell in die die Kontext-Datei (Datei, mit der das Werkzeug gestartet wurde).
+ * Diese Datei fungiert somit als reiner Datencontainer.
+ */
+ async function saveDataModel() {
+ let text = JSON.stringify(data); // convert the data model to string
+ await MC.ide.fs.writeFile(contextFile,text); // write the model to the file that starts the tool
+ }
+ btnWrite.addEventListener("click", saveDataModel);
+
+ /**
+ * Läd das Datenmodell aus der Kontext-Datei
+ */
+ // async function restoreDataModel(){ /* ... TODO ... */}
+
+
+ /**
+ * Generiert aus dem Datenmodell eine MathCoach-Aufgabe
+ */
+ async function generateExercise() {
+ let text = `
+ startup {
+ print("""
+ Hallo ${data.user}! Diese Aufgabe wurde
+ um <b>${data.timestamp}</b> Uhr erstellt.
+ """)
+ }
+ `;
+ /**
+ * Die generierte Aufgabe soll so heißen, wie die Kontext-Datei.
+ * Der Pfad wird also wie folgt umgeformt: "/path/to/myExercise.xxx.yyy"
+ * wird zu "path/to/myExercise.groovy"
+ */
+ let path = contextFile.path.substring(0,contextFile.path.indexOf(".")) + ".groovy"
+ let file = { owner: contextFile.owner, part: contextFile.part, path: path }
+ await MC.ide.fs.writeFile(file, text);
+ await MC.ide.navigator.navigateToExercise(file)
+ }
+ btnGenerateExercise.addEventListener("click", generateExercise);
+
+}())
+
+
+
diff --git a/examples/example-ide/README.md b/examples/example-ide/README.md
new file mode 100644
index 0000000..8c3a3de
--- /dev/null
+++ b/examples/example-ide/README.md
@@ -0,0 +1,42 @@
+# Beispiel: Externes Werkzeug in der MathCoach-IDE entwickeln
+Dieses Beispiel zeigt, wie man ein externes Werkzeug innerhalb der MathCoach-IDE
+entwickeln kann. Dabei stellt die IDE Autovervollständigung für JavaScript-Dateien,
+in denen die MathCoach-API verwendet wird, bereit.
+
+
+
+### Vorteile
+- Einfach (auf die Schnelle etwas ausprobieren)
+- Die MathCoach-IDE stellt Autovervollständigung bereit
+
+### Nachteile
+- Keine Typsicherheit, da JavaScript verwendet wird (hier bringt die
+ Autovervollständigung nicht viel)
+- Für größere und komplexere Werkzeuge eher ungeeignet
+
+
+## Setup
+- Lade das Verzeichnis `MyEditor` in dein www-Verzeichnis von MathCoach hoch
+- Registriere das Werkzeug bei der IDE. Ergänze dazu die `ide-settings.json` in
+ deinem vfs-Verzeichnis (passe die `entry`-Konfiguration entsprechend an!):
+
+ {
+ ...
+ "editor.external.definitions": [
+ ...
+ {
+ "displayName": "MyEditor",
+ "entry": "/mathcoach/www/<YOUR_USER_NAME>/MyEditor/editor.html",
+ "description": "...",
+ "developer": "Max Mustermann",
+ "extension": "demo.json"
+ }
+ ...
+ ],
+ ...
+ }
+
+
+- Lade die IDE neu (Seite neu laden, z.B. mit F5)
+- Im Kontextmenü des Explorers können nun MyEditor-Dateien angelegt und anschließend
+ mit dem MyEditor geöffnet werden.
\ No newline at end of file
diff --git a/examples/example-ide/code_completion.png b/examples/example-ide/code_completion.png
new file mode 100644
index 0000000..818bd78
--- /dev/null
+++ b/examples/example-ide/code_completion.png
Binary files differ
--
Gitblit v1.10.0