Zurück zur Startseite

Dynamische PlantUML-Diagramme mit Bedingungen

Der Artikel beschreibt das Erstellen dynamischer Sequenzdiagramme in PlantUML mit Preprocessing, Variablen und Bedingungen. Implementierung über HTML/JS-Steuerelemente und PlantUML API ohne Backend. Geeignet zum Dokumentieren komplexer APIs in Confluence.

Interaktive PlantUML-Diagramme: von Variablen bis zur Implementierung
Advertisement 728x90

Dynamische Sequenzdiagramme in PlantUML: Variablen und Bedingungen

PlantUML unterstützt Preprocessing mit Variablen und Bedingungen, wodurch dynamische Sequenzdiagramme möglich werden. Benutzer können Detailstufen mit Schaltern steuern und verschachtelte Logik ein- oder ausblenden, ohne separate Artefakte zu erstellen.

Stellen Sie sich vor, Sie dokumentieren einen API-Endpunkt zum Erstellen von Bestellungen, der Dutzende interner Prüfungen auslöst. Ein vollständiges Diagramm wird unübersichtlich, und das Wechseln zwischen mehreren statischen Versionen ist ineffizient.

Diagrammentwurf vorbereiten

Der Basisdiagrammtext wird mit Variablen und Bedingungen erweitert. Hier ein Beispiel:

Google AdInline article slot
participant Bob as b
participant Alice as a

!$aliceThoughts = "No"
!$bobThoughts = "No"

b -> a: Hi!

!if ($aliceThoughts == "Yes")
activate a
a->a: Oh my god, he messaged me!
a->a: What to do, what to say..
create participant Lisa as l
a -> l: Bob messaged me, what should I do?
activate l
l -> a: Just reply to him, gosh
deactivate l
!endif

a->b: Hi!
deactivate a

!if ($bobThoughts == "Yes")
activate b
b->b: She replied o_O
!endif

b->a: Uh... How are you?
deactivate b

Die Variablen $aliceThoughts und $bobThoughts steuern die Sichtbarkeit von Codeblöcken. Der PlantUML-Preprozessor bewertet Bedingungen während des Renderns.

HTML-Oberfläche für Steuerelemente

Schalter werden mit HTML-Formularen und JavaScript erstellt. Benutzer wählen Detailstufen aus, der Code aktualisiert den Diagrammtext dynamisch und erzeugt das Bild.

<form>
  <label for="aliceThoughts">Alice' Gedanken anzeigen:</label>
  <select id="aliceThoughts" name="aliceThoughts">
    <option value="no">Nein</option>
    <option value="yes">Ja</option>
  </select>
</form>

<form>
  <label for="bobThoughts">Bobs Gedanken anzeigen:</label>
  <select id="bobThoughts" name="bobThoughts">
    <option value="no">Nein</option>
    <option value="yes">Ja</option>
  </select>
</form>

JavaScript lauscht auf Änderungen in den Select-Elementen, injiziert Werte in die PlantUML-Vorlage und ruft den Encoder auf, um eine URL zu generieren.

Google AdInline article slot

Text für PlantUML-API kodieren

PlantUML bietet eine HTTP-API zum Rendern: https://www.plantuml.com/plantuml/png/<encoded_text>. Sie unterstützt PNG- und SVG-Formate.

Einfache Methode (Hex)

Konvertiert UTF-8-Text zu Hex mit ~h-Präfix:

function toHex(uml) {
  const umlFormatted = `@startuml\r\n${uml}\r\n@enduml`;
  const utf8 = unescape(encodeURIComponent(umlFormatted));
  var result = '';
  for (var i=0; i<utf8.length; i++) {
    result += utf8.charCodeAt(i).toString(16).padStart(2, '0');
  }
  return `https://www.plantuml.com/plantuml/png/~h${result}`;
}

Ideal für kurze Diagramme. Einschränkung: URL-Länge (ca. 8 KB).

Google AdInline article slot

Erweiterte Methode (Deflate + Custom Base64)

  • Deflate-Kompression.
  • Kodierung im PlantUML-Base64: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_.

Bewältigt große Diagramme durch Kompression.

function encodePlantUml(data) {
    const base64Map = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_';
    let result = '';
    for (let i = 0; i < data.length; i += 3) {
        const b1 = data[i];
        const b2 = i + 1 < data.length ? data[i + 1] : 0;
        const b3 = i + 2 < data.length ? data[i + 2] : 0;
        result += base64Map[b1 >> 2];
        result += base64Map[((b1 & 3) << 4) | (b2 >> 4)];
        result += base64Map[((b2 & 15) << 2) | (b3 >> 6)];
        result += base64Map[b3 & 63];
    }
    return result;
}

Einbettung in Confluence

HTML+JS über Confluence-Makros einfügen. Keine Backend-Abhängigkeit – Rendering erfolgt im Browser über PlantUMLs öffentlichen Server. Für Enterprise-Setups lokalen PlantUML-Server nutzen.

Wichtige Vorteile:

  • Interaktivität ohne Artefaktwechsel.
  • Komplexe Logik durch Preprocessing.
  • Minimale Ressourcen: HTML, JS, PlantUML-API.
  • Confluence-kompatibel.

Implementierungsbeschränkungen

  • URL-Länge bei Hex-Kodierung.
  • Abhängigkeit von externem PlantUML-Server (durch lokale Bereitstellung lösbar).
  • PlantUML-Preprocessor-Grenzen: Keine komplexen Berechnungen, nur Basisoperationen.

| Methode | Max. Textgröße | Komplexität |

|-----------|---------------------|-------------|

| Hex | ~2000 Zeichen | Niedrig |

| Deflate | ~50.000+ Zeichen | Hoch |

Wichtige Erkenntnisse

  • PlantUML-Preprocessing ermöglicht !if-Bedingungen und Variablen für dynamische Diagramme.
  • HTML+JS-Schalter aktualisieren Diagramme in Echtzeit.
  • PlantUML-API erzeugt PNGs aus kodierten URLs ohne Backend-Code.
  • Hex für einfache Fälle; Deflate für große Diagramme.
  • Lösung läuft in Confluence ohne VPN-Probleme.

— Editorial Team

Advertisement 728x90

Weiterlesen