====== PXAML cevovod ======
PXAML cevovod pretvarja deklarativno UI označevanje v delujoče uporabniške vmesnike.
===== Pregled =====
PXAML (označevanje) → Razčlenjevalnik → IR (JSON) → Upodabljalnik → GUI/TUI/Web
===== Faze cevovoda =====
==== Faza 1: Razčlenjevanje ====
PXAML razčlenjevalnik bere XML označevanje in ustvari abstraktno sintaksno drevo (AST).
**Naloge razčlenjevalnika:**
* XML validacija
* Razreševanje imenskih prostorov
* Prepoznavanje elementov
* Razčlenjevanje atributov
* Prepoznavanje povezav dogodkov
==== Faza 2: Generiranje IR ====
AST se pretvori v vmesno predstavitev (IR) - vmesni format na osnovi JSON.
{
"type": "Window",
"properties": {
"Title": { "value": "Demo", "type": "string" },
"Width": { "value": 400, "type": "number" }
},
"children": [
{
"type": "Button",
"properties": {
"Content": { "value": "Klikni me", "type": "string" }
},
"events": {
"Click": { "handler": "OnClick" }
}
}
]
}
**Lastnosti IR:**
* Platformno neodvisna
* Serializabilna (JSON)
* Primerna za razlike pri vročem ponovnem nalaganju
* Ohranjene informacije o tipih
==== Faza 3: Razreševanje povezav ====
Podatkovne povezave se analizirajo in pretvorijo v izvršljive strukture.
{
"type": "TextBox",
"properties": {
"Text": {
"type": "binding",
"path": "UserName",
"mode": "TwoWay"
}
}
}
==== Faza 4: Upodabljanje ====
IR se s ciljno specifičnim upodabljalnikom prevede v naravne UI elemente.
^ Upodabljalnik ^ Izhod ^ Tehnologija ^
| GUI | Naravni kontrolniki | LCL/WinAPI |
| TUI | Terminalski znaki | ANSI/VT100 |
| Web | DOM elementi | HTML/CSS |
===== Komponente =====
==== 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 (abstraktni) ====
type
TWvdSRenderer = class abstract
public
procedure Render(ARoot: TWvdSIRNode); virtual; abstract;
procedure Update(AOldRoot, ANewRoot: TWvdSIRNode); virtual; abstract;
end;
===== Vroče ponovno nalaganje =====
Cevovod podpira vroče ponovno nalaganje z razlikovanje IR:
1. Nova PXAML → Razčlenjevalnik → Nova IR
2. Diff(Stara IR, Nova IR) → Seznam popravkov
3. Renderer.ApplyPatches(Seznam popravkov)
**Prednosti:**
* Posodobijo se samo spremenjeni elementi
* Stanje ostane ohranjeno
* Hiter cikel med razvojem
===== Obravnavanje napak =====
^ Tip napake ^ Faza ^ Obravnava ^
| XML sintaksna napaka | Razčlenjevanje | Pozicija + sporočilo |
| Neznan element | Razčlenjevanje | Opozorilo + nadomestek |
| Neveljaven tip lastnosti | IR | Prisilna pretvorba tipa + opozorilo |
| Napaka povezave | Povezovanje | Nadomestna vrednost |
===== Glejte tudi =====
* [[.:architektur|Pregled arhitekture]]
* [[.:targets|Cilji gradnje]]
* [[..:p:designer|UI oblikovalnik]]