From 94c5dbd06ea1f662ceaafede992d1f931420e70c Mon Sep 17 00:00:00 2001 From: jsteuer <jan.steuer.htw@gmail.com> Date: Wed, 11 Dec 2019 10:04:56 +0100 Subject: [PATCH] ... --- README.md | 254 -------------------------------------------------- 1 files changed, 0 insertions(+), 254 deletions(-) diff --git a/README.md b/README.md index ff902fb..8d1c8b6 100644 --- a/README.md +++ b/README.md @@ -1,255 +1 @@ - -# MathCoach IDE API - -In diesem Paket ([Das Gitblit Repository findet sich hier](https://newton.htwsaar.de/gitblit/summary/mathcoach!mathcoach-ide-api.git)) -ist die öffentliche Schnittstelle zur MathCoach Entwicklungsumgebung (IDE) definiert. Mithilfe -dieser Schnittstelle können externe Werkzeuge (z.B. Editoren) erstellt werden. Ziel ist, dass -diese Werkzeuge für den Anwender komfortable - in die IDE integriert -zur Verfügung gestellt werden -können. Darüber hinaus werden als Ergänzung einige Hilfsfunktionen zum Bau von Werkzeugen angeboten. - - -*Beispielhafte Anwendung: Eine Datei wird angelegt und einem Demo-Editor geöffnet. Dieser generiert eine -Groovy-Aufgabe* - - -## Idee -TODO: Grafik (IDE, Werkzeug, Dateien, JSON, usw) - -## Entwicklung externer Werkzeuge - -- Externe Werkzeuge müssen unter der Domain von MathCoach erreichbar sein. Zur Entwicklungszeit legt - man das Werkzeug dazu im www-Verzeichnis ab. -- Die von der IDE bereitgestellte Bibliothek muss eingebunden werden - - <script src="/mathcoach/ui/ide/ide-lib.js"/> - -- Von nun an steht die IDE API durch die globale Variable `MC` zur Verfügung. -- **Hinweis**: Erst, wenn das Werkzeug in die IDE integriert und aus dieser heraus - gestartet wurde, kann die API verwendet werden! Durch nachbilden der API kann - eine Nutzung ohne IDE ermöglicht werden, siehe `enableOfflineUsageIfNecessary`. - - -### Empfohlenes Vorgehen -Damit externe Werkzeuge ein einheitliches Verhalten aufweisen, sollte wie folgt vorgegangen werden. - -Als erstes muss sichergestellt werden, dass die MathCoach IDE API auch verfügbar ist. Dies ist beispielsweise -nicht der Fall, wenn das Werkzeug ohne die IDE gestartet wurde (und nicht offline-fähig ist) oder die IDE (aus -welchen Gründen auch immer) nicht einsatzbereit ist. - - if(typeof MC !== "undefined"){ - throw new Error("IDE Lib nicht eingebunden"); // TODO: show error to user - } - const isReady = await MC.isReady(); - if(!isReady){ - throw new Error("Die MathCoach-API ist nicht einsatzbereit."); // TODO: show error to user - } - -Von nun an kann die IDE API vollständig genutzt werden. Zunächst sollte die Kontext-Datei (die Datei, -mit der das Werkzeug gestartet wurde) geladen werden. - -Ist der Inhalt der Kontext-Datei leer, wurde das Werkzeug vermutlich zum ersten mal gestartet das Werkzeug: -- Sich initialisieren (z.B. mit einem leeren oder beispielhaften internem Datenmodell) -- Das interne Datenmodell in die Kontext-Datei schreiben -- Die zugehörige Aufgabe generieren. Siehe auch `contextFileToExerciseFile` weiter unten. - -Andernfalls kann das zuvor gespeichertes Datenmodell in den Editor geladen werden. - -Anschließend sollte die generierten Aufgaben in der Vorschau gestartet werden, sodass der Benutzer besser -abschätzen kann, wie sich Änderungen im Werkzeug auf die Aufgabe auswirken. - - - let contextFile = await MC.ide.getContextFile(); // Datei, mit der der Editor gestartet wurde - let contextFileContent = await MC.ide.fs.readFile(contextFile); - let contextFileIsEmpty = contextFileContent === ""; - - let exerciseFile = contextFileToExerciseFile(contextFile); - - if(contextFileIsEmpty){ - // TODO: init application with new data model (maybe with example contents) - // write serialized model to context file, e.g. using JSON.stringify(...) - let dataModelAsString = JSON.stringify({/* TODO */}); - await MC.ide.fs.writeFile(contextFile, dataModelAsString); - // generate exercise - let generatedExerciseCode = "startup { print('Hallo Welt!') }"; // TODO - await MC.ide.fs.writeFile(exerciseFile, generatedExerciseCode); - }else{ - // TODO: load data model, e.g. using JSON.parse(contextFileContent) - // TODO: (overwrite context file and generated exercise file) - // TODO: init application based on your data model - } - - // show preview - await MC.ide.navigator.navigateToExercise(exerciseFile); - -Jedes Werkzeug sollte über eine "Speichern"-Funktion verfügen, mit der der Benutzer: -- Das interne Datenmodell in die Kontext-Datei speichert (sodass es später wieder geladen werden kann) -- Die zugehörige Aufgabe wird generiert und die Vorschau zu dieser navigiert - - - -### Hilfunktionen für Werkzeug-Entwickler -Dieses Paket beinhaltet zusätzlich Hilfsfunktionen für Werkzeug-Entwickler. - - -- **Aufgaben-Datei ableiten**: Die generierte Aufgabe soll wie die Kontext-Datei benannt sein, - sodass diese vom Benutzer schnell zugeordnet werden können. Beispielsweise soll ein Werkzeug, - welches mit der Kontext-Datei `/path/to/myExercise.mcq.json` gestartet wird, die - Aufgabe `/path/to/myExercise.groovy` erzeugen. - - import { contextFileToExerciseFile } from "@mathcoach/ide-api"; - let contextFile = await MC.ide.getContextFile() - let exerciseFile = contextFileToExerciseFile(contextFile); - - -- **Standalone-Werkzeuge**: Werkzeuge können ohne IDE-Anbindung entwickelt und getestet - werden. Dazu wird die IDE API nachgebildet - aktuell auf Basis des `LocalStorage` des - Browsers. - - import { enableOfflineUsageIfNecessary } from "@mathcoach/ide-api"; - let offline: boolean = enableOfflineUsageIfNecessary(); - - // now use the IDE API - -### Beispiele -Im Verzeichnis `./examples/` finden sich Beispiele für externe Werkzeuge. - -### Kleinere Werkzeuge -Für kleiner Werkzeuge bietet es sich an im WWW-Verzeichnis zu entwickeln (z.B. -`myTool/tool.html` und `myTool/tool.js`). Die MathCoach-IDE stellt Autovervollständigung beim -Editieren der `tool.js`-Datei zur Verfügung. Da es sich um eine JavaScript-Datei handelt, -ist keine Typsicherheit gegeben. Das Werkzeug muss lokal in die IDE integriert werden, siehe -weiter unten. - - - -### Größere Werkzeuge -Für größere Werkzeuge sollte ein Build-System wie [webpack](https://webpack.js.org/) -oder [PARCEL](https://parceljs.org/) in Kombination mit -[TypeScript](https://www.typescriptlang.org/) verwendet werden. Das Werkzeug muss nach dem -Build-Prozess in das WWW-Verzeichnis kopiert und ebenfalls lokal in die IDE integriert werden, siehe -weiter unten. - - -Die MathCoach-API kann auch als npm-Package eingebunden werden, sodass eine typsichere -und komfortable Entwicklung (z.B. mit Visual Studio Code) möglich ist. Hierzu muss -die `package.json` des Werkzeug-Projektes wie folgt ergänzt werden: - - { - ... - "devDependencies": { - "@mathcoach/ide-api": "git+https://newton.htwsaar.de/gitblit/r/mathcoach/mathcoach-ide-api.git#1.1.0" - }, - ... - } - - -Wie man der Git-Repo URL ansieht, werden Git-Tags verwendet um eine -Versionierung [(Semantic Versioning)](https://semver.org/lang/de/) -der API zu erreichen. Lässt man die Versionierung weg, wird die -aktuellste Version verwendet. (Siehe Gitblit um verfügbare Versionen -einzusehen) - -Bei Verwendung einer Entwicklungsumgebung wie Visual Studio Code kann die Typdefinition der -API auch für JavaScript eingebunden werden. Hierfür ist ggf. ein spezielles Kommentar am Anfang -der Datei notwendig (Pfad falls nötig anpassen): - - /// <reference path="../node_modules/@mathcoach/ide-api/mathcoach-api.d.ts"/> - - -Zertifikat von Newton hinzufügen, damit npm auf das Repository zugreifen kann. - - cd /usr/local/share/ca-certificates/ - sudo mkdir newton.htwsaar.de - - sudo cp path/to/newton.htwsaar.de.crt /usr/local/share/ca-certificates/newton.htwsaar.de/ - - sudo chown 755 /usr/local/share/ca-certificates/newton.htwsaar.de - sudo chown 644 /usr/local/share/ca-certificates/newton.htwsaar.de/newton.htwsaar.de.crt - sudo update-ca-certificates - - - -## Werkzeuge in die IDE integrieren -Damit die IDE das Werkzeug integrieren kann, muss eine Werkzeug-Deklaration registriert werden. Zur -Entwicklungszeit kann der Werkzeug-Entwickler dies lokal vornehmen. Anschließend können verknüpfte -Dateien mit dem Werkzeug geöffnet werden und erstellt werden (siehe Kontext-Menüs im IDE-Explorer). -Eine Freischaltung des Werkzeugs für alle Autoren erfolgt durch einen Administrator. - -### Lokal (Nur für den Entwickler des Werkzeugs) -In der IDE muss eine Werkzeug-Deklaration angelegt werden, dazu muss die Datei `ide-settings.json` editiert werden: - - { - ... - "editor.external.declarations": [ - { - "displayName": "Dummy", - "entry": "/mathcoach/www/YOURNAME/tool.html", - "description": "...", - "developer": "...", - "extension": "ext" - } - ... - ], - ... - } - -| Schlüssel | Beschreibung | Beispiel | -|---------------|---|---| -| displayName | Der Name des Werkzeugs | `"Fill-In-Blank-Editor"` | -| entry | Der Einstiegspunkt für das Werkzeugs muss sich auf dem selben Server wie die IDE befinden. | `"/mathcoach/www/YOURNAME/tool.html"` | -| description | Eine kurze Beschreibung | | -| developer | Name des Werkzeug-Entwicklers | | -| extension | Dateien anhand der Datei-Erweiterung mit dem Werkzeug verknüpfen. Hier sollte etwas eindeutiges gewählt werden | `"fib.json"` für Dateien wie `someExercise.fib.json` | - - - -### Global (Für alle Autoren) -- Das Werkzeug samt Werkzeug-Deklaration muss als `.zip`-Datei an einen Administrator übergeben werden -- Der Administrator schaltet das Werkzeug nach einer kurzen Prüfung (Keine Konflikte mit anderen - Dateierweiterung, usw) frei. Beim nächsten Release von MathCoach ist das Werkzeug dann für alle - Autoren verfügbar. - - - - -## Infos zu diesem Repository - - . - ├── CHANGELOG.md // Dokumentation von Änderungen der API - ├── examples // Beispiele - │ ├── ... - │ └── ... - ├── src // Hilfsfunktionen für Werkzeugentwickler - │ ├── index.ts // Einstiegspunkt - │ └── ... - ├── mathcoach-api.d.ts // Definition der API - ├── package.json - ├── package-lock.json - ├── README.md - └── tsconfig.json - - -### Dokumentation erzeugen - - npm install && npm run build - -### Release einer neuen Version -- Version der API in der `package.json` eintragen -- Beispiele aktualisieren -- Release Tag setzen `git tag -a VERSION -m '...'` und pushen -- IDE-Projekt prüfen: `package.json`, `ide-lib.js`, ... - - - - - - - - - - - - - - -- Gitblit v1.10.0-SNAPSHOT