Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
4682e44
initial draft
RamonDevPrivate Jun 10, 2025
f21997f
parsing an processing
RamonDevPrivate Jun 11, 2025
f43957c
enforce utf8 encoding for console output in subprocess and clear temp…
RamonDevPrivate Jun 11, 2025
49ad291
added demo
RamonDevPrivate Jun 11, 2025
13f42ce
added codeblock command
RamonDevPrivate Jun 12, 2025
f0f1cd4
removed unused views and skills
RamonDevPrivate Jun 12, 2025
07fc184
Removed Clerk Interface
RamonDevPrivate Jun 12, 2025
99bb367
removed canvas turtle deps
RamonDevPrivate Jun 12, 2025
2d2657d
fixed idgen in Interaction Skill
RamonDevPrivate Jun 12, 2025
635299f
adjusted folder structur for new architecture; added dot target and m…
RamonDevPrivate Jun 12, 2025
c8771ef
added turtle
RamonDevPrivate Jun 12, 2025
a491c28
Merge branch 'development' into feature/protocol_based_communication
RamonDevPrivate Jun 12, 2025
47c900b
remove unused import for IdGen in Turtle.java
RamonDevPrivate Jun 12, 2025
c784ccc
moved logging to skills
RamonDevPrivate Jun 12, 2025
b05bea9
added some pipe examples
RamonDevPrivate Jun 12, 2025
f10d033
Merge branch 'development' into feature/protocol_based_communication
RamonDevPrivate Jun 13, 2025
e048d1a
Interaction Elements
RamonDevPrivate Jun 13, 2025
8badca5
blocking interactions
RamonDevPrivate Jun 13, 2025
bb657cb
register and test
RamonDevPrivate Jun 13, 2025
ecb2ec2
small fixes and adjustments
RamonDevPrivate Jun 16, 2025
eee81dc
updated syntax information
RamonDevPrivate Jun 16, 2025
9e5bd94
trim -> strip
RamonDevPrivate Jun 17, 2025
51314fe
allow register to skip id, to open calls to cli tools
RamonDevPrivate Jun 17, 2025
4f99250
improved handeling of multiple sources, changed args
RamonDevPrivate Jun 18, 2025
7f806ca
added demos for multi source support
RamonDevPrivate Jun 18, 2025
4b5ab66
fixed regex
RamonDevPrivate Jun 18, 2025
19ec728
use sourceId in targets
RamonDevPrivate Jun 18, 2025
3001604
subview system and css events
RamonDevPrivate Jun 18, 2025
7726e3a
fixed read
RamonDevPrivate Jun 18, 2025
1508b5a
limit watch dirs to source dirs in sourceOnly mode
RamonDevPrivate Jun 18, 2025
7c50fe7
refactor: rename Read to Scan in Processor, Server, and InstructionPa…
RamonDevPrivate Jun 18, 2025
27409b6
fix: improve command parsing to handle contentless single-line commands
RamonDevPrivate Jun 18, 2025
e889f54
changed text command behavior
RamonDevPrivate Jun 18, 2025
3043d02
fix: update instruction patterns to use square brackets for parameter…
RamonDevPrivate Jun 18, 2025
b30e43b
server input
RamonDevPrivate Jun 18, 2025
9104abb
server input, error overlay and Text clear per source
RamonDevPrivate Jun 18, 2025
62b89f1
reverted text pipe behavior
RamonDevPrivate Jun 22, 2025
a82623c
multiline tests
RamonDevPrivate Jun 22, 2025
a0f0887
documentation for test, codeblock and text
RamonDevPrivate Jun 22, 2025
6418541
better cutout and added more doku examples
RamonDevPrivate Jun 22, 2025
ab7ebba
update README.md args section
RamonDevPrivate Jun 22, 2025
a1cd309
root dir as watch root and more examples
RamonDevPrivate Jun 23, 2025
9c0bdef
Server as Sink
RamonDevPrivate Jul 6, 2025
46f70ac
Scans
RamonDevPrivate Jul 19, 2025
38d83ee
Merge branch 'development' into feature/protocol_based_communication
RamonDevPrivate Jul 19, 2025
8c37453
Merge branch 'development' into feature/protocol_based_communication
RamonDevPrivate Jul 19, 2025
8d33b79
errors to error channel
RamonDevPrivate Jul 19, 2025
30ae007
fixed gitignore
RamonDevPrivate Jul 19, 2025
57685b7
Removed Commands from Input Shell
RamonDevPrivate Aug 6, 2025
5e10a4e
fixed register demo
RamonDevPrivate Aug 6, 2025
51de72e
Simplified Processor
RamonDevPrivate Aug 6, 2025
35142ac
adjusted naming
RamonDevPrivate Sep 22, 2025
22f8978
Examples and Readme
RamonDevPrivate Sep 22, 2025
abeaa12
fixed gitignore
RamonDevPrivate Sep 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@ target/
build
test.java
Test.java
.vscode
!**/services/Test.java
.vscode
sources.json
38 changes: 21 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# _Live View Programming_ mit Java
# _Live View Programming_ mit jeder Programmiersprache

Das _Live View Programming_ (LVP) bietet Ihnen für die Java-Programmierung _Views_ und _Skills_ an. Views sind dazu da, um mediale Inhalte im Web-Browser darzustellen, also Texte, Bilder, Grafiken, Videos, inteaktive Animationen etc. Skills stellen nützliche Fähigkeiten bereit, die man in Kombination mit Views (z.B. zur Dokumentation von Code) gebrauchen kann.
Das _Live View Programming_ (LVP) bietet Ihnen für die Programmierung ein einfaches Textprotokoll an, um mediale Inhalte im Web-Browser darzustellen, also Texte, Bilder, Grafiken, Videos, inteaktive Animationen etc. Kommandos stellen auch nützliche Fähigkeiten bereit, die man z.B. zur Dokumentation von Code gebrauchen kann.

All diese Views und Skills nutzt man programmierend mit Java. Mit jeder Code-Änderung wird die Ansicht im Browser _live_ aktualisiert. Es ist – ehrlich gesagt – ziemlich cool, wenn man die Veränderungen dann im Browser sieht. Probieren Sie die Demo aus!
**Eine detaillierte Übersicht des Protokolls mit allen Kommandos folgt noch.**

## 🚀 Nutze das _Live View Programming_

Expand Down Expand Up @@ -31,45 +31,49 @@ Sie können die `.jar`-Datei auch selber generieren, wenn Sie zudem die Versions
Passen Sie den Beispielaufruf an die aktuelle Version an:

```
java -jar lvp-<Version>.jar --log --watch=demo.java
java -jar lvp-<Version>.jar --log demo.java
```

Wenn Sie die Version `lvp-0.5.0.jar` heruntergeladen haben, lautet der Aufruf:
Wenn Sie die Version `lvp-1.0.0.jar` heruntergeladen haben, lautet der Aufruf:

```
java -jar lvp-0.5.0.jar --log --watch=demo.java
java -jar lvp-1.0.0.jar --log demo.java
```

#### Übersicht der möglichen Kommandozeilenargumente

| Argument | Alias | Bedeutung | Beispiel |
|------------------|---------|-------------------------------------------|-----------------------------------------------|
| --watch=DATEI | -w | Zu überwachende Datei oder Verzeichnis | --watch=path/to/<br>--watch=demo.java |
| --pattern=PATTERN| -p | Dateinamensmuster (z.B. *.java) | --pattern=*.java |
| --log[=LEVEL] | -l | Log-Level (Error, Info, Debug) | --log=Debug |
| PORT | | Portnummer für den Server | 50001 |
| Argument | Alias | Bedeutung | Beispiel |
|----------------------------|-------|---------------------------------------------------------------------------|------------------------------------------|
| `--cmd=CMD` | | Startbefehl für die Ausführung (z. B. Java mit Optionen) | `--cmd="java --enable-preview"` |
| `--log[=LEVEL]` | `-l` | Log-Level (`Error`, `Info`, `Debug`) | `--log=Debug` |
| `--port` | `-p` | Portnummer für den Server | `--port=50002` |
| `--config` | `-c` | Lädt Konfiguration aus `sources.json` | `--config` |
| `--source-only` | `-s` | Ignoriert alle Nicht-Source-Dateien | `--source-only` |
| `--watch-filter=PATTERN` | `-w` | Filter für Dateien, die ein Neuladen der Inhalte auslösen können | `--watch-filter=./deps/*.java` |
| `SOURCES` | | Quellen, die durch LVP ausgeführt werden | `demo1.java demo2.java` <br> `sources/*.java` |


> Mehrere Argumente können kombiniert werden, z.B.:
> `java -jar lvp-<Version>.jar --watch=src --pattern=*.java --log=Debug 50001`
> `java -jar lvp-<Version>.jar --watch-filter=src/lib/**/*.java --log=Debug --port=50001 --config src/*View.java`

### 3. So nutzt man das _Live View Programming_

Die Datei `demo.java` dient als einfaches Beispiel für den Einstieg in das Live View Programming (LVP).

Damit LVP funktioniert, **muss der Server die Datei beobachten (watchen)** – sobald Änderungen erkannt werden, wird der Code automatisch neu ausgeführt und die Ausgabe aktualisiert.

Innerhalb einer [`void main()`-Methode](https://openjdk.org/jeps/495) lassen sich interaktive Inhalte erzeugen, indem man Methoden des `Clerk`-Interfaces verwendet. Diese Inhalte werden anschließend im Browser angezeigt.
Innerhalb einer [`void main()`-Methode](https://openjdk.org/jeps/495) lassen sich interaktive Inhalte erzeugen, indem man `println`-Ausgaben entsprechend dem Protokoll erzeugt. Diese Inhalte werden anschließend im Browser angezeigt.

**Beispiel:**

```java
import lvp.Clerk;

void main() {
Clerk.markdown("# Hello World");
println("Markdown: # Hello World");
}
```
Dieser einfache Aufruf rendert eine Markdown-Überschrift direkt im Browser. Weitere Ausgaben, Grafiken oder Interaktionen können durch zusätzliche Clerk-Methoden, Views oder Skills ergänzt werden.
Dieser einfache Aufruf rendert eine Markdown-Überschrift direkt im Browser. Weitere Ausgaben, Grafiken oder Interaktionen können durch zusätzliche Kommandos ergänzt werden.

### Troubleshooting

Expand Down Expand Up @@ -102,7 +106,7 @@ kill -9 11840
```
Dabei ist 11840 durch die ermittelte PID zu ersetzen.

## 💟 Motivation: Views bereichern das Programmieren
## 💟 Motivation: Views bereichern das Programmieren (Outdated)

Das _Live View Programming_ versteht sich als ein Angebot, in ein bestehendes Programm _Views_ einzubauen und zu verwenden, die im Web-Browser angezeigt werden. Es macht nicht nur Spaß, wenn man zum Beispiel Grafiken im Browser erzeugen kann -- man sieht auch die Programmierfehler, die einem unterlaufen. Wenn man etwa in der Turtle-View eine Schildkröte mit einem Stift über die Zeichenfläche schickt, zeigt sich unmittelbar, ob man Wiederholungen über Schleifen richtig aufgesetzt oder die Rekursion korrekt umgesetzt hat. Die visuelle Repräsentation gibt über das Auge eine direkte Rückmeldung. Feedback motiviert und hilft beim Verständnis.

Expand Down
195 changes: 43 additions & 152 deletions demo.java
Original file line number Diff line number Diff line change
@@ -1,166 +1,57 @@
import lvp.Clerk;
import lvp.skills.Text;
import lvp.skills.Interaction;
import lvp.views.Dot;
import lvp.views.Turtle;


List<String> obst = List.of("Apfel", "Birne", "Banane");
void main() {
Clerk.clear();
// Markdown 1
Clerk.markdown(Text.fillOut("""
# Interaktive LVP Demo

## Markdown
Die Markdown-View erlaubt es, Markdown-Text direkt im Browser darzustellen. Der folgende Code zeigt ein einfaches Beispiel, wie Text im Markdown-Format
an den Browser gesendet und dort automatisch als HTML gerendert wird:
```java
${0}
```
Der Aufruf `Clerk.markdown(text)` elaubt den einfachen Zugriff auf die Markdown-View.
In diesem Beispiel werden zusätzlich zwei unterstützende Skills verwendet:
- `Text.fillOut(...)`: Zum Befüllen von String-Vorlagen mit dynamischen Inhalten, indem Platzhalter (z.B. ${2}) durch die Auswertung von übergebenen Ausdrücken ersetzt werden.
- `Text.codeBlock(...)`: Zum Einbinden von Codeabschnitten als interaktive Blöcke im Markdown-Text.

## Turtle
Die Turtle-View ermöglicht das Zeichnen und Anzeigen von SVG-Grafiken im Browser. Diese können Schritt für Schritt aufgebaut werden:
```java
${1}
```
""", Text.codeBlock("./demo.java", "// Markdown 1"), Text.codeBlock("./demo.java", "// Turtle 1"), "${0}"));
// Markdown 1

// Label Turtle 1
// Turtle 1
var turtle = new Turtle(0, 200, 0, 25, 50, 0, 0);
turtle.forward(25).right(60).backward(25).right(60).forward(25).write();
// Turtle 1
// Label Turtle 1

Clerk.markdown(Text.fillOut("""

## Interaktionen
Die Live-View ist nicht nur ein Anzeigewerkzeug, sondern dient auch als interaktiver Editor. Änderungen an eingebetteten Code-Blöcken wirken sich direkt auf die zugrunde liegende
Datei aus. Dadurch kann der dokumentierte Code live ausprobiert und bearbeitet werden.
Ein interaktiver Code-Block wird mithilfe von `Text.codeBlock(...)` definiert. Der entsprechende Code im Quelltext muss durch Kommentar-Labels (z.B. `// Turtle 1`) markiert werden:
```java
${0}
```
Dieser markierte Block kann anschließend über `Text.codeBlock("./demo.java", "// Turtle 1")` eingebunden werden. Wird dieser Block in einen Markdown-Abschnitt eingefügt, erscheint
er in der Live-View als editierbarer Code-Bereich.

Zusätzlich können JavaScript-Funktionen eingebunden werden, die gezielt Teile des Quelltexts verändern. Dafür wird `Interaction.eventFunction(...)` verwendet. Dieser Skill liefert
eine Funktion, die anhand des Dateipfads, eines Labels und des neuen Codes eine markierte Zeile ersetzt.

Um solche Funktionen interaktiv nutzbar zu machen, kann `Interaction.button(...)` verwendet werden. Damit lässt sich ein Button erstellen, der bei Klick eine bestimmte Stelle im Code anpasst:
```java
${1}
```

### Color Change
Im folgenden Beispiel wird eine Turtle-Grafik dargestellt:
```java
${2}
```

""", Text.codeBlock("./demo.java", "// Label Turtle 1"), Text.codeBlock("./demo.java", "// Buttons"), Text.codeBlock("./demo.java", "// Turtle triangle")));

// Turtle 2
var turtle2 = new Turtle(0, 200, 0, 50, 100, 12, 0);
drawing(turtle2, 24);
turtle2.write();
// Turtle 2

Clerk.markdown("""
Darunter befinden sich drei Buttons, die jeweils die Farbe der Turtle ändern. Die zu ersetzende Stelle im Quellcode ist durch das Label `// turtle color` markiert. Beim Klick auf einen Button wird
dieser Teil des Codes automatisch angepasst.
println("""
Clear
Markdown: ## Einkaufsliste
Markdown:
""");
println(buildObstListe());
println("~~~");
println("""
Text[template]:
## Beispiel
Irgendein ${0} anzeigen.
~~~
| Markdown

Text: Text
| Text[template] | Markdown

Text[t2]:
## Syntax Überschrift
Das ist die Syntax
${0}
Danach
~~~

// Buttons
Clerk.write(Interaction.button("Red", 200, 50, Interaction.eventFunction("./demo.java", "// turtle color", "turtle.color(255, i * 256 / 37, i * 256 / 37, 1);")));
Clerk.write(Interaction.button("Green", 200, 50, Interaction.eventFunction("./demo.java", "// turtle color", "turtle.color(i * 256 / 37, 255, i * 256 / 37, 1);")));
Clerk.write(Interaction.button("Blue", 200, 50, Interaction.eventFunction("./demo.java", "// turtle color", "turtle.color(i * 256 / 37, i * 256 / 37, 255, 1);")));
// Buttons
Cutout: ./syntax.md
| Text[t2] | Markdown

Clerk.markdown(Text.fillOut("""
### Turtle mit Timeline
Die Turtle-View unterstützt außerdem eine Timeline, über die sich die Zeichenreihenfolge der Grafik Schritt für Schritt nachvollziehen lässt:
Text[t3]:
```java
${0}
```
""", Text.codeBlock("./demo.java", "// Turtle 3")));
~~~

// Turtle 3
var turtle3 = new Turtle(0, 200, 0, 50, 100, 12, 0);
drawing(turtle3, 24);
turtle3.write().timelineSlider();
// Turtle 3
Codeblock:./intro.java;// example
| Text[t3] | Markdown

Clerk.markdown(Text.fillOut("""
### Input
Initialisierung von Variablen über ein Eingabefeld:
```java
${0}
```
Der Skill `Interaction.input(...)` ermöglicht es, Eingabefelder zu erstellen, die genutzt werden können, um Werte in den Quelltext einzufügen.
Dazu wird Pfad und Label angegeben, um die Zeile zu makieren, in der der Wert eingefügt werden soll. Gleichzeitig wird das Label als Beschriftung des Eingabefelds verwendet.
Ein Template wird angegeben, das den Platzhalter `$` enthält, der durch den eingegebenen Wert ersetzt wird. Optional kann ein Platzhaltertext angegeben werden,
der im Eingabefeld angezeigt wird. Zusätzlich kann der Type des Eingabefelds angegeben werden (z.B. `text`, `number`, `email`).

""", Text.codeBlock("./demo.java", "// Input")));

// Input
int exampleValue = 0; // Input Example
Clerk.write(Interaction.input("./demo.java", "// Input Example", "int exampleValue = $;", "Geben Sie eine Zahl ein"));

String exampleString; // Input String Example
Clerk.write(Interaction.input("./demo.java", "// Input String Example", "String exampleString = \"$\";", "Geben Sie einen String ein"));
// Input

Clerk.markdown(Text.fillOut("""
#### Checkbox
Für Checkboxen kann `Interaction.checkbox(...)` verwendet werden. Diese triggern die Änderung des Quelltextes, wenn sie angeklickt werden.
```java
${0}
```
""", Text.codeBlock("./demo.java", "// Checkbox")));

// Checkbox
boolean booleanValue = false; // Boolean Example
Clerk.write(Interaction.checkbox("./demo.java", "// Boolean Example", "boolean booleanValue = $;", booleanValue));
// Checkbox

Clerk.markdown(Text.fillOut("""
## Dot View
Die Dot-View erlaubt das Anzeigen von Graphen, die im [DOT-Format](https://graphviz.org/doc/info/lang.html) beschrieben sind.
```java
${0}
```
""", Text.codeBlock("./demo.java", "// Dot")));
Register[skipId]: Counter wc
Text:
Hello World
~~~
| Counter | Html

// Dot
Dot dot = new Dot();
dot.draw("""
digraph G {
A -> B;
B -> C;
}
""");
// Dot
}


// Turtle triangle
void triangle(Turtle turtle, double size) {
turtle.forward(size).right(60).backward(size).right(60).forward(size).right(60 + 180);
""");

}

void drawing(Turtle turtle, double size) {
for (int i = 1; i <= 18; i++) {
turtle.color(255, i * 256 / 37, i * 256 / 37, 1); // turtle color
turtle.width(1.0 - 1.0 / 36.0 * i);
triangle(turtle, size + 1 - 2 * i);
turtle.left(20).forward(5);
// example
String buildObstListe() {
String out = "";
for (String o : obst) {
out += "**" + o + "**\n";
}
return out;
}
// Turtle triangle
// example
4 changes: 4 additions & 0 deletions demo_sources.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[
{ "path": "demo/**/demo.java", "cmd": "java --enable-preview -Dsun.stdout.encoding=UTF-8" },
{ "path": "demo/sub1/demo.bat", "cmd": "" }
]
Comment on lines +1 to +4
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dokumentation: Wie funktioniert die Überwachung? Welche Dateien müssen wo liegen, um eine Ausführung zu triggern?

Loading