Beim Reanimieren des INTERLIS Benutzerhandbuches wollte ich zu Beginn gleich die ganze Sache auf INTERLIS 2.4 migrieren. Aber wenn ich mehr als bloss ein Soft-Update gemacht hätte (also in der ersten Zeile 2.3 mit 2.4 ausgetauscht), wäre der Aufwand doch beträchtlich gewesen und lieber eine Sache nach der anderen erledigen. Und je mehr ich vom Benuterhandbuch migrierte, desto weniger wollte ich einfach die Modelle und Transferdateien updaten. Es müsste alles viel interaktiver sein. Und nochmals ein wenig später, kam mir wieder ein interessantes Projekt in den Sinn: CheerpJ. Mit CheerpJ kann man Java-Anwendungen im Browser laufen lassen.

Ich habe es vor geraumer Zeit bereits ausprobiert und eine Browser-only-ilivalidator-Lösung gemacht. Die Herausforderung ist/war meines Erachtens die Performance bei grösseren Transferdateien. Wenn es aber nur um das Kompilieren von Modellen geht, ist das wurscht. Die JavaScript-WebAssembly-JVM darf für Open Source Projekte gratis verwendet werden. Einziger Nachteil ist, dass man sie nicht selber hosten kann.

Die Idee war, dass wir eine Web Component programmieren und diese in Thoth Biblios verwenden können. Somit haben wir einerseits die Dynamik, die wir brauchen, verbunden mit einer angenehmen Redaktion des restlichen Inhaltes und das Deployment einer statischen Webseite.

In einem ersten Wurf sieht die Komponente wie folgt aus:

INTERLIS Lab

Wenn ich die Aufgabe vermeintlich gelöst habe und «Compile» klicke, wird die JavaScript-WebAssembly-JVM heruntergeladen und mein Modell wird geprüft:

INTERLIS Lab

Wenn ich nicht mehr weiter weiss, kann ich mir die Musterlösung anzeigen lassen:

INTERLIS Lab

Wie definiere und steuere ich das? In purem HTML so:

  <body>
    <main>
      <h1>INTERLIS Lab Demo</h1>
      <interlis-lab
        src="./lessons/erste-klasse.json"
        runner="cheerpj"
        storage-key="interlis-lab-demo-erste-klasse"
      ></interlis-lab>
    </main>
  </body>

Wobei vieles auch in der erste-klasse.json-Datei steckt:

{
  "id": "erste-klasse",
  "title": "Deine erste Klasse",
  "type": "guided",
  "level": "beginner",
  "goal": "Du kannst in einem TOPIC eine CLASS mit einem einfachen Attribut definieren.",
  "explanation": "Eine CLASS beschreibt gleichartige Objekte. Attribute beschreiben Eigenschaften dieser Objekte.",
  "task": "Ergänze in der Klasse Building ein Attribut Name vom Typ TEXT*100.",
  "initialCode": "INTERLIS 2.3;\n\nMODEL Simple (de) AT \"https://example.com\" VERSION \"2026-05-11\" =\n  TOPIC Data =\n    CLASS Building =\n      !! TODO: Attribut ergänzen\n    END Building;\n  END Data;\nEND Simple.\n",
  "hints": [
    { "text": "Attribute stehen innerhalb einer CLASS." },
    { "text": "Die Syntax ist: Attributname : Typ;" },
    { "text": "Der gesuchte Typ ist TEXT*100." }
  ],
  "solution": "INTERLIS 2.3;\n\nMODEL Simple (de) AT \"https://example.com\" VERSION \"2026-05-11\" =\n  TOPIC Data =\n    CLASS Building =\n      Name : TEXT*100;\n    END Building;\n  END Data;\nEND Simple.\n",
  "checks": [
    { "type": "ili2c-compiles" },
    {
      "type": "contains-text",
      "text": "Name : TEXT*100",
      "message": "Das Attribut Name vom Typ TEXT*100 sollte vorhanden sein."
    }
  ],
  "reflection": {
    "question": "Ist das Attribut Name in diesem Modell obligatorisch oder optional?"
  }
}

Es gibt in der JSON-Datei mehr Informationen als in der Webkomponente gerendert werden, z.B. Hinweise, Zusatztests oder Reflexionen. Das fehlt, weil ich noch nicht weiss, wie ich das sinnvoll im GUI anordne.

Der Java-INTERLIS-Compiler wird als Fat Jar in die Web Component gepackt.

In Thoth-Biblios will ich Asciidoc schreiben und nicht HTML pur. Damit ich die Webkomponente einsetzen kann, gibt es ein Makro:

= Übung 1: Deine erste Klasse
:doctype: book

Der Einstieg beginnt bewusst klein: eine einzelne Klasse mit genau einem Attribut.

interlis-lab::labs/01-erste-klasse.json[storage-key=demo-ili-lab-01-erste-klasse,title="Übung 1: Deine erste Klasse"]

Das wäre es eigentlich auch schon. Viel mehr Magie ist nicht. Der Appetit kommt bekanntlich mit dem Essen: Spannend wäre, wenn wir das mit ili2db kombinieren könnten. Einiges davon könnte z.B. mit duckdb-wasm funktionieren, anderes wahrscheinlich nicht. JDBC wird nicht funktionieren im Browser. Somit weiss ich nicht wie z.B. eine ganze Transferdatei importiert werden könnte.

Links:

geoständärds.ch do something