Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 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
9e5ee6c
Merge pull request #87 from denkspuren/feature/protocol_based_communi…
RamonDevPrivate Sep 22, 2025
8318ede
fixed filewatcher
RamonDevPrivate Oct 17, 2025
e7a8d3b
chore: Dokumentation und Beispiele
RamonDevPrivate Feb 25, 2026
2dd9fcf
chore: adjusted java version for pipelines
RamonDevPrivate Feb 25, 2026
5aa8cbd
chore: demo.java
RamonDevPrivate Feb 26, 2026
02e4e72
chore: Kommandoübersicht
RamonDevPrivate Feb 26, 2026
285fde0
chore: Register und IDs
RamonDevPrivate Feb 26, 2026
1512031
Formatierung angepasst
denkspuren Apr 10, 2026
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
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '24'
java-version: '25'

- name: Build JAR
run: mvn clean package -DskipTests
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '24'
java-version: '25'

- name: Determine version bump
id: bump
Expand Down
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
Binary file removed README.TurtleProgramming.png
Binary file not shown.
278 changes: 252 additions & 26 deletions README.md

Large diffs are not rendered by default.

358 changes: 206 additions & 152 deletions demo.java

Large diffs are not rendered by default.

130 changes: 130 additions & 0 deletions docs/syntax.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
# LVP Syntax
## Grammatik
- `[]` -> Optional
- `::=` -> Definiert als
- `''` -> Literal

```
INSTRUCTION ::= COMMAND | REGISTER | PIPE
```
### Command
```
COMMAND ::= COMMANDNAME['{'ID'}']':' CONTENT
COMMAND ::= COMMANDNAME['{'ID'}']':'
CONTENT
'~~~'

COMMANDNAME ::= STRING
ID ::= STRING
CONTENT ::= STRING
```

Grundidee:
Aufteilung in Service und Target oder Function und Consumer
- **Service:** String -> String
- **Target:** String -> {}
### Register
```
REGISTER ::= 'Register:' COMMANDNAME CALL

CALL ::= STRING
```

### Pipe
```
PIPE ::= '|' COMMAND ['|' COMMAND '|' ...]
```

## Targets

- Markdown
- Html
- JavaScript
- JavaScriptCall
- Clear
- Dot

### Dot
```
Dot:
[width: WIDTH]
[height: HEIGHT]
GRAPH
~~~
```

## Default Services

- Text
- Codeblock
- Turtle
- Button
- Input
- Checkbox
- Test

### Turtle
```
init XFROM XTO YFROM YTO STARTX STARTY STARTANGLE
init WIDTH HEIGHT

penup
pendown
forward DISTANCE
backward DISTANCE
right ANGLE
left ANGLE
color R G B [A]
text TEXT [FONT]
width WIDTH
push
pop
timeline
save
```

### Codeblock
```
Codeblock: PATH;LABEL

Codeblock:
PATH
LABEL
~~~
```

### Test
```
Test:
Send: SNIPPET
Expect: STRING
~~~
```

### Interaction Elements
```
Button:
Text: TEXT
[width: WIDTH]
[height: HEIGHT]
path: PATH
label: "LABEL"
replacement: REPLACEMENT
~~~

Input:
path: PATH
label: "LABEL"
placeholder: PLACEHOLDER
template: TEMPLATE (with Placeholder '$')
type: TYPE (Text, Email, Number, etc)
~~~

Checkbox:
path: PATH
label: "LABEL"
template: TEMPLATE (with Placeholder '$')
checked: BOOLEAN
~~~
```

174 changes: 36 additions & 138 deletions examples/CodeDokuMitMarkdown.java
Original file line number Diff line number Diff line change
@@ -1,24 +1,19 @@
import lvp.Clerk;
import lvp.skills.Text;

void main() {
Clerk.clear();
Clerk.markdown("""
# Die Code-Dokumentation mit Markdown

Für die Code-Dokumentation mit Markdown sind Textblöcke und der Text-Skill entscheidende Hilfsmittel.

* Mit Textblöcken lassen sich String-Literale als Textblöcke über mehrere Zeilen hinweg angeben. Ein solcher Textblock beginnt und endet mit drei Anführungszeichen `\"""`.
println("""
Clear
Markdown:
# Die Code-Dokumentation mit Markdown

* Das LVP bringt einen Text-Skill mit, der hauptsächlich dafür da ist,
- um Text aus einer Datei auszuschneiden (Methode `cutOut`); der Bereich, der ausgeschnitten werden soll, wird durch Textmarken (Labels) ausgewiesen.
- um Text mit Aufüllfeldern zu versehen (Methode `fillOut`), in die Ergebnisse aus Auswertungen als Zeichenkette eingefügt werden.
Für die Code-Dokumentation mit Markdown sind Textblöcke, sowie die Text und Codeblock Kommandos entscheidende Hilfsmittel.

> In den Java-Versionen 21 und 22 gab es [String-Templates](https://docs.oracle.com/en/java/javase/22/language/string-templates.html) als Preview-Feature. Damit ließen sich sehr elegant die Auswertungen von Ausdrücken mitten in einen String einfügen. Das wird in anderen Programmiersprachen auch als String-Interpolation bezeichnet. Leider sind die String-Templates mit Java 23 wieder entfernt worden -- ein einmaliger Vorgang für Preview-Features in der Historie von Java. Als leichtgewichtigen Ersatz gibt es deshalb im Text-Skill die statische Methode `fillOut`.
* Mit Textblöcken lassen sich String-Literale als Textblöcke über mehrere Zeilen hinweg angeben. Ein solcher Textblock beginnt und endet mit drei Anführungszeichen `\"""`.

""");


* Das Kommando 'Codeblock' ist hauptsächlich dafür da, um Text aus einer Datei auszuschneiden und in einem Markdown Codeblock einzufügen, welcher im Browser editiert werden kann; der Bereich, der ausgeschnitten werden soll, wird durch Textmarken (Labels) ausgewiesen.
- Für einen nicht editierbaren Codeblock kann das Kommando `Cutout` verwendet werden.
* Das Kommando 'Text' erlaubt es definierte Strings zu speichern und mit Aufüllfeldern versehene Texte, mit weiteren Inhalten aufzufüllen.
~~~
""");

// Testfälle
assert factorial(0) == 1 && factorial(1) == 1;
assert factorial(2) == 2 && factorial(3) == 6;
Expand All @@ -28,132 +23,35 @@ void main() {
String s = "Die Fakultät von " + (num = 6) + " ist " + factorial(num) + ".";
// Beispiel




Clerk.markdown(Text.fillOut("""
## Dynamische Inhalte in Zeichenketten einbetten

Wenn Inhalte in einer Zeichenkette dynamisch berechnet und eingefügt werden sollen, kann man das beispielsweise wie folgt machen:

```
${Beispiel}
```

Das Ergebnis der Zeichenkette `s` ist

```
${Resultat}
```

Das sieht dann, wenn man die Zeichenkette im Markdown einfügt (mit `Text.fillOut`), so aus: ${Resultat}

Diese Technik der Einbettung von dynamischen Inhalten in eine Zeichenkette lässt sich ausreizen mit der Text-Skill. Damit kann der Java-Quelltext sich zur Laufzeit selbst ausschneiden zur Einbettung in Markdown! Das ist der Schlüssel zu sich selbst dokumentierendem Programmcode.
""", Map.of("Beispiel", Text.cutOut("examples/CodeDokuMitMarkdown.java", "// Beispiel"),
"Resultat", s)));

Clerk.markdown(Text.fillOut(Map.of(
"LabelCff",
Text.cutOut("examples/CodeDokuMitMarkdown.java", "// LabelCff"),
"ResultLabelCff",
// LabelCff
Text.cutOut("examples/CodeDokuMitMarkdown.java", false, false, "// LabelC")
// LabelCff
, "LabelCft",
Text.cutOut("examples/CodeDokuMitMarkdown.java", "// LabelCft"),
"ResultLabelCft",
// LabelCft
Text.cutOut("examples/CodeDokuMitMarkdown.java", false, true, "// LabelC")
// LabelCft
, "LabelAB",
Text.cutOut("examples/CodeDokuMitMarkdown.java", "// LabelAB"),
"ResultLabelAB",
// LabelAB
Text.cutOut("examples/CodeDokuMitMarkdown.java", "// LabelA", "// LabelB")
// LabelAB
, "TextCutOut",
Text.cutOut("src/main/java/lvp/skills/Text.java", "// core method", "// end")
), """
## Texte ausschneiden mit `Text.cut`

Mit dem Skill `Text` kann Text aus einer Datei ausgeschnitten werden. Der Methodenkopf von `cutOut` erwartet einen Dateinamen, zwei boolsche Werte und eine beliebige Anzahl an Labels.

```
static String cutOut(String fileName, boolean includeStartLabel, boolean includeEndLabel, String... labels)
```

Labels sind Zeichenketten, nach denen als vollständige Textzeile in der angegebenen Datei gesucht wird. Mit den boolschen Werten wird angegeben, ob das öffnende bzw. schliessende Label beim Ausschnitt mit inkludiert, d.h. einbezogen werden soll oder nicht.

### Beispiele
println("""
Text[Template]:
## Dynamische Inhalte in Zeichenketten einbetten

Nehmen wir eine Datei mit folgendem Inhalt:
Wenn Inhalte in einer Zeichenkette dynamisch berechnet und eingefügt werden sollen, kann man das beispielsweise wie folgt machen:

```text
// LabelA
1. Textstelle, gerahmt von einem LabelA und einem LabelB
// LabelB
// LabelC
Textstelle, umschlossen von einem LabelC
// LabelC
// LabelA
2. Textstelle, gerahmt von einem LabelA und einem LabelB
// LabelB
```
```
${Beispiel}
```

Der folgende Aufruf
Das Ergebnis der Zeichenkette `s` ist

```
${LabelCff}
```
```
${Resultat}
```

liefert als Zeichenkette diesen Auszug (Snippet) aus der Datei zurück:

```
${ResultLabelCff}
```

> Der Witz an diesem Beispiel ist das, was man hier nicht sieht, aber wichtig für die Idee einer eingebetteten, dynamischen Dokumentation ist: Der obige Aufruf ist tatsächlich ein Snippet von dem Code, der das resultierende Snippet erzeugt. Das klingt ein wenig seltsam, aber das ist genau der Kunstgriff, der garantiert, dass der Aufruf wirklich der ist, der das Ergebnis produziert. Wenn Sie einen Blick in die Java-Datei werfen, die diese View im Browser erzeugt hat, werden Sie das vermutlich verstehen und nachvollziehen können. Vergleichen Sie den Java-Quellcode mit dem Text im Browser.

Setzt man einen der boolschen Werte auf `true`, wird das entsprechende Label mit übernommen.

```
${LabelCft}
```

Das Ergebnis sieht so aus:

```
${ResultLabelCft}
```

Sind mehrere Stellen mit dem gleichen Label belegt, kann man diese Bereiche ausschneiden. Wenn die boolschen Werte beide `false` sind, kann man den Aufruf verkürzen.

```
${LabelAB}
```

Zunächst wird die erste Textstelle zwischen `LabelA` und `LabelB` ausgeschnitten, dann die zweite.

```
${ResultLabelAB}
```

### Der Algorithmus zu `Text.cutOut`

Der Algorithmus zu `Text.cutOut(...)`, um einen Bereich aus einer Textdatei zu schneiden und ein sogenanntes Snippet davon zu erstellen, funktioniert wie folgt:

0. Starte im Modus, die Textzeilen einer Datei zu überspringen: `skipLines = true`.
1. Gehe die Datei Textzeile für Textzeile durch.
2. Wenn die Textzeile einem Label entspricht, dann gehe wie folgt vor: (a) Wenn entweder `skipLines` und `includeStartLabel` wahr sind, oder wenn `!skipLines` und `includeEndLabel` wahr sind, dann ergänze die Labelzeile zum Snippet. (b) Wechsel den Modus `skipLines = !skipLines` und gehe zur nächsten Textzeile (Schritt 1).
3. Entspricht die Textzeile keinem Label, dann: (a) Füge die Zeile nur dann dem Snippet hinzu, wenn `skipLines` nicht wahr ist. (b) Gehe zur nächsten Textzeile (Schritt 1).

Als Java-Methode:

```java
${TextCutOut}
```
"""));
Das sieht dann, wenn man die Zeichenkette im Markdown einfügt, so aus: ${Resultat}

Diese Technik der Einbettung von dynamischen Inhalten in eine Zeichenkette lässt sich ausreizen mit den Kommandos `Codeblock` oder `Cutout`. Damit kann der Java-Quelltext sich zur Laufzeit selbst ausschneiden zur Einbettung in Markdown! Das ist der Schlüssel zu sich selbst dokumentierendem Programmcode.
~~~
""");
println("Text[Resultat]: " + s);
println("""

Codeblock: examples/CodeDokuMitMarkdown.java; // Beispiel
| Text[Template] | Text[TemplateMitBeispiel]
Text[Resultat]
| Text[TemplateMitBeispiel] | Markdown
""");
}

// Fakultätsfunktion
Expand All @@ -162,4 +60,4 @@ long factorial(int n) {
if (n == 1 || n == 0) return 1;
return n * factorial(n - 1);
}
// Ende Fakultätsfunktion
// Fakultätsfunktion
Loading
Loading