Native Rich-Text-externe Style-Sheets

Der native XHTML-Decoder wendet vom Aufrufer gelieferte CSS-Ressourcen, auf die XHTML-link-Elemente und CSS-@import-Regeln verweisen, auf echte Rich-Text-Runs, gespeicherte Rich-Werte und Field-Appearances an

Options := THPDFHeadlessRichTextDecodeOptions.Default;
Options.DocumentURI := 'https://example.test/forms/order.xhtml';
SetLength(Options.StyleSheets, 2);
Options.StyleSheets[0].URI := 'css/main.css';
Options.StyleSheets[0].CSS := '@import "colors.css"; span.total { font-weight: bold }';
Options.StyleSheets[0].ContentType := 'text/css';
Options.StyleSheets[1].URI := 'css/colors.css';
Options.StyleSheets[1].CSS := 'span.total { color: #a02030 }';
Runs := HPDFDecodeHeadlessRichText(XHTML, Options);
<body xmlns="http://www.w3.org/1999/xhtml">
  <link rel="stylesheet" href="css/main.css" />
  <span class="total">Total</span>
</body>

Ressourcen-Identität und Kaskade

Relative Referenzen nutzen RFC-3986-Pfad-Merging und Dot-Segment-Entfernung; Query-Strings bleiben Teil der Ressourcen-Identität, Fragmente nicht, Scheme- und Host-Buchstaben werden normalisiert, während User-Informationen ihre Schreibweise behalten, und Prozent-Escape-Hex-Buchstaben vergleichen ohne Groß-/Kleinschreibung

Jedes importierte Sheet löst weitere Imports gegen seinen eigenen URI auf und hat eine unabhängige CSS-Namespace-Umgebung; das Importieren eines Sheets leakt die @namespace-Deklarationen dieses Sheets nicht in sein Parent

Imports akzeptieren quoted Strings und url-Tokens, einschließlich CSS-Escapes, vor gewöhnlichen Regeln oder Namespace-Deklarationen; der bestehende Print/Screen-Media-Query-Evaluator steuert Link-Media- und Import-Bedingungen

Importierte Deklarationen treten an ihrer tatsächlichen Quellposition mit normaler Importance und Specificity in die Kaskade ein; eine zyklische Referenz wird nur übersprungen, während diese Ressource aktiv ist, sodass spätere wiederholte Referenzen erneut beitragen können

Fehlende Ressourcen, ungültige authored Referenzen und Nicht-CSS-Content-Types tragen keine Deklarationen bei; ungültige vom Aufrufer gelieferte Ressourcen-Collections werfen EHPDFHeadlessRichTextCodecError

XHTML-Referenzen und Selected Sets

Stylesheet-Relation-Tokens vergleichen ohne ASCII-Groß-/Kleinschreibung; deaktivierte Links werden ignoriert, und Media- und Type-Attribute steuern, ob ein referenziertes Stylesheet teilnimmt

Inline-Style-Elemente und verlinkte Sheets teilen dieselben case-sensitiven Title-Sets; unbenannte persistente Sheets bleiben aktiviert

Ohne explizites StyleSheetTitle wählt das erste geeignete betitelte Inline-Style oder Nicht-Alternate-Link das bevorzugte Set; der Decoder bestimmt diesen Titel, bevor er Deklarationen sammelt, sodass ein früherer Alternate mit dem gewählten Titel an seiner ursprünglichen Kaskadenposition teilnimmt

Ein explizites StyleSheetTitle wählt passende betitelte Inline- und verlinkte Sheets, einschließlich Alternates; ein Titel ohne passendes Sheet lässt nur persistente Sheets aktiviert

Der Preferred-Title-Scan akzeptiert einen leeren Type oder text/css und überspringt deaktivierte oder Alternate-Links; Ressourcenverfügbarkeit und Media-Bedingungen ändern den gewählten Titel nicht, und Deklarationen gehorchen weiterhin ihren eigenen Media-, Type- und Ressourcenprüfungen

HTML- und XML-Base-Auflösung

Das erste XHTML-base-Element mit href innerhalb eines XHTML-head liefert die Dokumentbasis, indem sein href gegen DocumentURI aufgelöst wird; xml:base auf dem Base-Element oder dessen Vorfahren ändert diesen Lookup nicht

Der Decoder wendet dann jedes Ancestor-xml:base einmal an, beginnend an dieser Dokumentbasis, um Link-Referenzen und Inline-Imports aufzulösen; ein verlinktes oder importiertes Sheet löst seine eigenen Imports gegen seine Ressourcen-URI auf

Beispielsweise lösen DocumentURI=https://example.test/docs/form.xhtml, root xml:base="a/", head base href="b/" und link href="main.css" zu https://example.test/docs/b/a/main.css auf

Ein leerer erster base-href nutzt die Fallback-Dokument-URI; ein ungültiger erster base-href behält ebenfalls diesen Fallback und verbraucht die First-Base-Position, sodass spätere base-Elemente sie nicht ersetzen

Diese Ordnung definiert das kombinierte HTML/XML-Profil des nativen Decoders; XML Base definiert selbst nicht, wie ein separater HTML-Base-Mechanismus damit kombiniert werden soll

Form-Data- und JSON-Operationen

RichTextDocumentURI, RichTextStyleSheetTitle und RichTextStyleSheets an THPDFHeadlessFormDataOptions setzen, wenn FDF-RV oder XFDF-value-richtext über native Dokumentmethoden importiert wird

Windows-Dateijobs, Windows execute-json-v1 und die versionierte native Linux-C-ABI akzeptieren dasselbe optionale richTextResources-Objekt bei forms.import

{
  "schemaVersion": 1,
  "type": "forms.import",
  "format": "xfdf",
  "richTextResources": {
    "documentURI": "https://example.test/forms/order.xhtml",
    "styleSheetTitle": "Print",
    "styleSheets": [
      {"uri": "css/main.css", "css": "span.total { color: red }", "contentType": "text/css"}
    ]
  }
}

URI ist für jede JSON-Ressource erforderlich und nichtleer; css und contentType sind optionale Strings, ebenso documentURI und styleSheetTitle; gelieferte Strings dürfen kein NUL enthalten

Ressourcen sind vom Host gelieferter Unicode-CSS-Text; URI-Identifier fordern keinen Dateisystemzugriff, keinen Netzwerkzugriff und keine Änderungen an Callback-Record-Layouts an

Die umgebende Import-Transaktion bewahrt ihr früheres Dokument bei fehlerhaften Ressourcen, Abbruch, Budget-Fehler oder Veröffentlichungs-Fehler; exakt äquivalente Importe behalten das bestehende byteidentische No-op-Verhalten

Wiederverwendbare Nicht-GUI-Abnahme

Tests/Linux/ExternalStyleSheets/Run.py prüft echte dekodierte Runs, begrenztes Fehlerverhalten, gespeicherte Appearances und unabhängige PDF-Geometrie und -Pixel; sein Callbacks-Verzeichnis übt echte FDF/XFDF-Importe, No-op-Bytes und Failed-Publication-Transaktionen

Tests/Linux/ExternalStyleSheets/Supplement/Run.py prüft geteilte Inline/Link-Title-Sets, kombinierte HTML/XML-Base-Auflösung, jede gemessene Automatic-Title-Abbruch-Grenze und Tiefen-Fehler gefolgt von erfolgreichem Retry

Das Supplement akzeptiert ein explizites Quellverzeichnis und eine Compiler-Konfiguration, hält die tatsächliche Quell- und Dependency-Identität fest und verlangt ein neues Output-Verzeichnis je Ausführung

Grenzen und verbleibende Arbeiten

Die Ressourcenanzahl beträgt höchstens 256, jede aufgelöste URI höchstens 4096 UTF-16-Code-Einheiten, und jeder Titel oder Content-Type höchstens 256; Stylesheet-Text gehorcht außerdem MaxCodeUnits, mit aggregierten Scans und Matching, belastet auf die bestehenden Node-, Total-Code-Unit-, Tiefen- und Abbruchlimits

Form-Data-Bindings nutzen MaxValueCodeUnits, MaxTotalCodeUnits, MaxObjects, MaxDepth und das Cancellation-Token der Operation für die entsprechenden Decoder-Limits

Import-Layer, zusätzliches CSS-Layout, Tabellen, Bilder und breiteres HTML-Ressourcen-Laden bleiben separate Arbeiten

Selektoren und interne Style-Sheets · Media-Profile · Form-Data-Optionen

Native Support-Queries nehmen @supports-Gruppen und supports()-Imports an, mit dem unterstützten Deklarations- und Selektor-Profil, gemeinsamen Grenzen und Abbruch-Recovery