====== std.svg.parser ======
SVG-Leser: eine vorhandene ''.svg''-Datei öffnen, den Baum durchlaufen, Elemente nach ''id'' oder Tag finden und Attribute auslesen. Schreiben kann der Parser nicht.
Knoten und Dokument sind ''int64''-Handles; ein nicht vorhandener Knoten ist ''0'', nicht ''null''. Eigene Typen (''SvgDoc'', ''SvgNode'', ''SvgNodeList'') gibt es nicht.
→ [[lyx_-_programmiersprache:units:svg|std.svg]] · [[lyx_-_programmiersprache:units:svg:builder|std.svg.builder]] · [[lyx_-_programmiersprache:units:svg:xml|std.svg.xml]]
----
===== Verwendung =====
import std.io;
import std.svg.parser;
fn main(): int64 {
var doc: int64 := SvgOpen("in.svg");
if (doc == 0) { PrintLn("nicht lesbar"); return 1; }
var vb: pchar := SvgReadViewBox(doc);
Print("viewBox: "); Print(vb); Print("\n");
// Kinder der Wurzel durchlaufen
var root: int64 := SvgRootElement(doc);
var child: int64 := SvgFirstChild(root);
while (child != 0) {
var tag: pchar := SvgElementTag(child);
var fill: pchar := SvgAttrStr(child, "fill");
Print(" <"); Print(tag); Print("> fill="); Print(fill); Print("\n");
child := SvgNextSibling(child);
}
Print("Kreise: "); PrintLn(IntToStr(SvgCountByTag(doc, "circle")));
SvgParserFree(doc);
return 0;
}
Eingabe:
Ausgabe:
viewBox: 0 0 400 300
fill=red
fill=blue
fill=
Kreise: 2
Ein Attribut, das es nicht gibt, liefert ''0'' als ''pchar'' — ''Print'' gibt dafür nichts aus (siehe die ''rect''-Zeile).
> **Die Zahlenseite des Parsers ist derzeit unbrauchbar** ([[https://github.com/SEOLizer/LyX-Compiler/issues/1687|#1687]]): ''SvgReadWidth'', ''SvgReadHeight'' und ''SvgAttrF64'' liefern das IEEE-Bitmuster als Zahl (''400.0'' kommt als ''4645744490609377280'' zurück). Bis zur Behebung hilft nur der Umweg über ''SvgAttrStr'' und eigenes Umwandeln.
>
> Die Zeichenkettenseite — ''SvgAttrStr'', ''SvgElementTag'', ''SvgElementId'', ''SvgReadViewBox'', ''SvgFindId'', ''SvgCountByTag'' — arbeitet korrekt; das obige Beispiel ist damit gemessen.
----
===== Funktionen =====
^ Signatur ^ Sichtbarkeit ^ Beschreibung ^
| ''SvgOpen(path: pchar): int64'' | pub | Datei einlesen und Baum bauen; ''0'' bei Fehler |
| ''SvgGetError(doc: int64): pchar'' | pub | Fehlertext des letzten Öffnens |
| ''SvgReadWidth(doc: int64): f64'' | pub | Breite (siehe Kasten) |
| ''SvgReadHeight(doc: int64): f64'' | pub | Höhe (siehe Kasten) |
| ''SvgReadViewBox(doc: int64): pchar'' | pub | ''viewBox'' als Zeichenkette |
| ''SvgRootElement(doc: int64): int64'' | pub | Wurzelknoten |
| ''SvgFirstChild(elem: int64): int64'' | pub | Erstes Kind, sonst ''0'' |
| ''SvgNextSibling(elem: int64): int64'' | pub | Nächstes Geschwister, sonst ''0'' |
| ''SvgElementTag(elem: int64): pchar'' | pub | Tag-Name |
| ''SvgElementId(elem: int64): pchar'' | pub | ''id'' des Knotens |
| ''SvgAttrStr(elem: int64, name: pchar): pchar'' | pub | Attributwert als Zeichenkette, sonst ''0'' |
| ''SvgAttrF64(elem: int64, name: pchar, defaultVal: f64): f64'' | pub | Attributwert als Zahl mit Vorgabe (siehe Kasten) |
| ''SvgPathData(elem: int64): pchar'' | pub | Das ''d''-Attribut eines Pfads |
| ''SvgFindId(doc: int64, id: pchar): int64'' | pub | Knoten mit dieser ''id'' |
| ''SvgCountByTag(doc: int64, tag: pchar): int64'' | pub | Anzahl der Knoten mit diesem Tag |
| ''SvgParserFree(doc: int64): void'' | pub | Baum freigeben |
Nicht vorhanden: ''SvgDocRoot'', ''SvgDocWidth'', ''SvgDocHeight'', ''SvgNodeFirstChild'', ''SvgNodeNext'', ''SvgNodeTag'', ''SvgFindById'', ''SvgFindByTag'' und die ganze ''SvgNodeList''-Familie — frühere Fassungen dieser Seite führten sie auf.
Letzte Aktualisierung: 2026-08-19 — Seite gegen die echten Signaturen neu geschrieben; Beispiel mit ''lyxc 1.1.3I'' übersetzt und gegen die oben gezeigte Eingabedatei ausgeführt, Ausgabe übernommen. Befund zur Zahlenseite als #1687 gemeldet.