-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathdemo.java
More file actions
166 lines (139 loc) · 6.99 KB
/
demo.java
File metadata and controls
166 lines (139 loc) · 6.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
import lvp.Clerk;
import lvp.skills.Text;
import lvp.skills.Interaction;
import lvp.views.Dot;
import lvp.views.Turtle;
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.
""");
// 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
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:
```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
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")));
// 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);
}
}
// Turtle triangle