====== PXAML-Pipeline ======
Die PXAML-Pipeline transformiert deklaratives UI-Markup in lauffähige Benutzeroberflächen.
===== Überblick =====
PXAML (Markup) → Parser → IR (JSON) → Renderer → GUI/TUI/Web
===== Phasen der Pipeline =====
==== Phase 1: Parsing ====
Der PXAML-Parser liest XML-Markup und erzeugt einen Abstract Syntax Tree (AST).
**Parser-Aufgaben:**
* XML-Validierung
* Namespace-Auflösung
* Element-Erkennung
* Attribut-Parsing
* Event-Bindung-Erkennung
==== Phase 2: IR-Generierung ====
Der AST wird in eine Intermediate Representation (IR) transformiert - ein JSON-basiertes Zwischenformat.
{
"type": "Window",
"properties": {
"Title": { "value": "Demo", "type": "string" },
"Width": { "value": 400, "type": "number" }
},
"children": [
{
"type": "Button",
"properties": {
"Content": { "value": "Click me", "type": "string" }
},
"events": {
"Click": { "handler": "OnClick" }
}
}
]
}
**IR-Eigenschaften:**
* Plattformunabhängig
* Serialisierbar (JSON)
* Diff-fähig für Hot Reload
* Typ-Information erhalten
==== Phase 3: Binding-Auflösung ====
Data-Bindings werden analysiert und in ausführbare Strukturen umgewandelt.
{
"type": "TextBox",
"properties": {
"Text": {
"type": "binding",
"path": "UserName",
"mode": "TwoWay"
}
}
}
==== Phase 4: Rendering ====
Die IR wird vom zielspezifischen Renderer in native UI-Elemente übersetzt.
^ Renderer ^ Ausgabe ^ Technologie ^
| GUI | Native Controls | LCL/WinAPI |
| TUI | Terminal-Zeichen | ANSI/VT100 |
| Web | DOM-Elemente | HTML/CSS |
===== Komponenten =====
==== TWvdSPxamlParser ====
type
TWvdSPxamlParser = class
public
function Parse(const ASource: string): TWvdSIRNode;
function ParseFile(const APath: string): TWvdSIRNode;
end;
==== TWvdSIRNode ====
type
TWvdSIRNode = class
NodeType: string;
Properties: TWvdSPropertyMap;
Children: TWvdSIRNodeList;
Events: TWvdSEventMap;
Bindings: TWvdSBindingList;
end;
==== TWvdSRenderer (Abstrakt) ====
type
TWvdSRenderer = class abstract
public
procedure Render(ARoot: TWvdSIRNode); virtual; abstract;
procedure Update(AOldRoot, ANewRoot: TWvdSIRNode); virtual; abstract;
end;
===== Hot Reload =====
Die Pipeline unterstützt Hot Reload durch IR-Differenzierung:
1. Neue PXAML → Parser → Neue IR
2. Diff(Alte IR, Neue IR) → Patch-Liste
3. Renderer.ApplyPatches(Patch-Liste)
**Vorteile:**
* Nur geänderte Elemente werden aktualisiert
* Zustand bleibt erhalten
* Schnelle Iteration während der Entwicklung
===== Fehlerbehandlung =====
^ Fehlertyp ^ Phase ^ Behandlung ^
| XML-Syntaxfehler | Parsing | Position + Meldung |
| Unbekanntes Element | Parsing | Warnung + Fallback |
| Ungültiger Property-Typ | IR | Type Coercion + Warnung |
| Binding-Fehler | Binding | Fallback-Wert |
===== Siehe auch =====
* [[.:architektur|Architektur-Übersicht]]
* [[.:targets|Build-Targets]]
* [[..:p:designer|UI Designer]]