feat: F4.8d the documentation mode's report as a PDF, as Java's

ReportRun reads Java's report back with iText: every piece of text with its
place, font, size and colour. The editor lays the report out by iText's
rules (A4, leading 1.5, loose chunks in the current line, tables 80 % wide
with padding 2, fixed traffic columns, page breaks) and draws it with
pdf-lib in the PDF's own Helvetica, widths without kerning as iText measures.
All device pages of Internet_Komplett, the first page and the data exchange
of einfaches_rechnernetz_komplett match Java piece by piece; Java's iText
reads our PDF with the same text in the same places. The sidebar gains
Java's "Report"; the frames come from the room by a short subscription.
Not adopted: true/false for DHCP (Java's own Ja/Nein), hash table orders,
an image running off the page, the report writing back into the model.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-04 12:35:35 +00:00
co-authored by Claude Opus 5.5
parent 7e68414bb2
commit b8b999fd66
29 changed files with 7726 additions and 23 deletions
+50
View File
@@ -1731,3 +1731,53 @@ Gemessen (04.10.2026):
Falle der Sonde: Das Druckpanel nimmt Javas Geräte-Etiketten aus der
Oberfläche (eine Swing-Komponente hat nur einen Elternteil); erst
`updateViewport` legt sie zurück.
### Dokumentation: „Report“ (F4.8d)
`ReportRun` öffnet ein Projekt wie Javas Menü, lässt es auf Wunsch eine
Weile laufen (alle Knoten `starten`, dann `beenden`; der Lauscher behält die
Rahmen wie nach einer Simulation) und schreibt mit
`ReportGenerator.generateReport` Javas PDF. Das liest es mit iTexts eigenem
Parser zurück: jedes Textstück mit Ort, Schrift, Größe (aus dem privaten
Grafikzustand per Reflection) und Farbe, jedes Bild mit Ort und Größe, Titel
und Ersteller. Drei Projekte (`einfaches_rechnernetz_komplett` nach 3 s
Lauf, `Internet_Komplett_…_DE`, die Fixture `documentation.fls`) und ein
leeres (`packages/editor/test/report.java.json`). Mit `--read` liest es ein
beliebiges PDF allein, mit SHA-256: so liest Javas iText den Bericht des
Editors (`report.ours.java.json`).
Gemessen (04.10.2026):
* A4, 36 Rand; Titel Helvetica-Bold 18 in (30, 50, 120), mittig; darunter
der Pfad in Helvetica 8; „1. Übersicht“ mit Javas Bild in Seitenbreite,
eine halbe Zeile unter der Überschrift; neue Seite „2. Komponenten“; neue
Seite „3. Datenaustausch“, nur wenn der Lauscher Rahmen hat.
* Überschriften Helvetica-Bold 14/12/10 in Dunkelgrau (64), Ebene 1 und 2
nummeriert („2.1. “), Ebene 3 nicht. Zeilenabstand das 1,5-Fache der
Schrift; lose Textstücke (`Chunk`) laufen in derselben Zeile mit dem
Abstand des letzten Absatzes, bis `Chunk.NEWLINE` sie beendet.
* Tabellen: 80 % der Breite, links, Spalten im Verhältnis (180:360,
3 × 180, 180:60:260, 4 × 180); Zellen mit 2 Innenabstand, Zeilen so weit
auseinander wie die Schrift groß ist; eine Zeile, die unter den Rand
reicht, beginnt die nächste Seite (ohne Kopfzeile). Datenaustausch: feste
Spalten 20/60/80/80/40/50/180, mittig, Helvetica 8, Kopf hellblau (230,
240, 255), jede zweite Zeile grau (240).
* Je Gerät mit Karten (nicht Switch, nicht Modem): Gateway, DNS-Server, bei
Rechnern „DHCP zur Konfiguration verwenden“ als `true`/`false`; Karten;
bei Rechnern „Installiert: “ und die Programme (oder „-“), in der
Reihenfolge einer HashMap; mit DNS-Server dessen Einträge;
Weiterleitungstabelle (nur Zeilen mit einer Adresse als Ziel); beim
Heimrouter die Portweiterleitung, wenn eine Zeile ein bekanntes Protokoll
hat. Datenaustausch je Karte mit Rahmen („Name - Adresse“), die Zeilen
von `Lauscher.getDaten(id, true, 0)`, in der Reihenfolge einer HashMap.
* Leeres Projekt: Titel ohne Namen, kein Pfad; das leere 20 × 35-Bild wird
auf Seitenbreite 915 hoch und läuft über den Rand einer eigenen Seite.
* Java-Fehler am Rande: der Bericht schreibt die Protokolle der
Portweiterleitung („6“ → „TCP“) ins Modell zurück und gibt eine
Debug-Zeile auf der Konsole aus.
Fallen der Sonde: iText legt Absätze und Tabellen in eigene Ebenen, die
Zeichenreihenfolge im PDF ist darum nicht die der Seite (der Test vergleicht
nach Ort). Die Uhrzeiten des Datenaustauschs sind Javas Wanduhr; der Test
nimmt Javas Zeilen aus Javas Seiten, damit der Satz verglichen wird, nicht
der Lauf.