Native rich-text external style sheets

Nativní XHTML dekodér aplikuje CSS resource dodané volajícím, referencované elementy XHTML link i pravidly CSS @import, na skutečné rich-text runy, uložené rich hodnoty i appearance polí

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>

Identita resource a kaskáda

Relativní reference použijí slučování cest a odebírání dot-segmentů podle RFC 3986; query řetězce zůstávají součástí identity resource, fragmenty ne, písmena schématu a hostitele se normalizují, zatímco user informace si uchovává velikost písmen a hexadecimální písmena percent escapování se porovnávají bez rozlišení velikosti

Každý importovaný styl rozřeší další importy vůči vlastnímu URI a má nezávislé prostředí CSS namespace; import stylu nenechá jeho deklarace @namespace uniknout do rodiče

Importy přijmou citované řetězce i url tokeny, tedy i CSS escapování, před běžnými pravidly či deklaracemi namespace; stávající vyhodnocovač media query print/screen řídí link media i import podmínky

Importované deklarace vstoupí do kaskády ve své skutečné zdrojové pozici s běžnou importance a specificitou; cyklická reference se přeskočí, jen dokud je ten resource aktivní, takže pozdější opakované reference mohou přispět znovu

Chybějící resource, neplatné autorské reference i typy obsahu mimo CSS nepřispějí žádnou deklarací; neplatné kolekce resource dodané volajícím vyhodí EHPDFHeadlessRichTextCodecError

XHTML reference a vybrané sady

Tokeny relace stylesheet se porovnávají bez rozlišení ASCII velikosti písmen; vypnuté linky se ignorují a atributy media i type řídí, zda se referencovaný styl účastní

Inline style elementy i napojené styly sdílejí tytéž sady titulků citlivé na velikost písmen; beztitulkové perzistentní styly zůstávají zapnuté

Bez explicitního StyleSheetTitle vybere preferovanou sadu první způsobilý titulkovaný inline style či non-alternate link; dekodér určí ten titulek, dřív než začne sbírat deklarace, takže dřívější alternate se zvoleným titulkem se účastní na své původní kaskádové pozici

Explicitní StyleSheetTitle vybere odpovídající titulkované inline i napojené styly, tedy i alternativy; titulek bez odpovídajícího stylu nechá zapnuté jen perzistentní styly

Sken preferovaného titulku přijme prázdný type či text/css a přeskočí vypnuté či alternate linky; dostupnost resource i media podmínky zvolený titulek nemění a deklarace pořád respektují vlastní kontroly media, type i resource

Rozřešení base v HTML a XML

První XHTML element base s href uvnitř XHTML head dodá dokumentovou základnu rozřešením svého href proti DocumentURI; xml:base na base elementu či jeho předcích to vyhledání nezmění

Dekodér pak aplikuje každý předkův xml:base jednou, počínaje touto dokumentovou základnou, k rozřešení link referencí i inline importů; napojený či importovaný styl rozřeší vlastní importy vůči URI svého resource

Například DocumentURI=https://example.test/docs/form.xhtml, kořenové xml:base="a/", head base href="b/" a link href="main.css" se rozřeší na https://example.test/docs/b/a/main.css

Prázdný první base href použije fallback dokumentové URI; neplatný první base href taky ponechá ten fallback a spotřebuje pozici prvního base, takže pozdější base elementy ho nevymění

Ta posloupnost definuje kombinovaný HTML/XML profil nativního dekodéru; samotné XML Base nedefinuje, jak se má kombinovat se samostatným mechanismem HTML base

Form data a JSON operace

Při importu FDF RV či XFDF value-richtext nativními dokumentovými metodami nastavte RichTextDocumentURI, RichTextStyleSheetTitle a RichTextStyleSheets na THPDFHeadlessFormDataOptions

Windows file joby, Windows execute-json-v1 i verzované nativní Linux C ABI přijmou tentýž volitelný objekt richTextResources u 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 je povinné a neprázdné pro každý JSON resource; css a contentType jsou volitelné řetězce, stejně jako documentURI a styleSheetTitle; dodané řetězce nesmí obsahovat NUL

Resource jsou Unicode CSS text dodaný hostitelem; URI identifikátory nežádají přístup k souborovému systému, síti ani změny rozložení callback záznamů

Obklopující importní transakce zachová svůj předchozí dokument při poškozených resource, zrušení, selhání rozpočtu či publikace; přesně ekvivalentní importy si uchovávají stávající chování bajtově identického no-opu

Opakovaně použitelná non-GUI akceptace

Tests/Linux/ExternalStyleSheets/Run.py kontroluje skutečně dekódované runy, ohraničené chování selhání, uložená appearance i nezávislou geometrii a pixely PDF; její adresář Callbacks zkouší skutečné importy FDF/XFDF, no-op bajty i transakce neúspěšné publikace

Tests/Linux/ExternalStyleSheets/Supplement/Run.py kontroluje sdílené sady titulků inline/link, kombinované rozřešení base HTML/XML, každou naměřenou hranici zrušení automatického titulku i selhání hloubky následované úspěšným retry

Supplement přijme explicitní zdrojový adresář i konfiguraci kompilátoru, zaznamená skutečnou identitu zdrojů a závislostí a vyžaduje nový výstupní adresář pro každé provedení

Meze a zbývající práce

Počet resource je nejvýše 256, každé rozřešené URI nejvýše 4096 UTF-16 code unit a každý titulek či typ obsahu nejvýše 256; text stylů se navíc řídí MaxCodeUnits, s agregátními skeny a párováním účtovanými do stávajících limitů uzlů, celkových code unit, hloubky i zrušení

Form-data bindingy použijí MaxValueCodeUnits, MaxTotalCodeUnits, MaxObjects, MaxDepth i cancellation token operace pro odpovídající limity dekodéru

Vrstvy import a podmínky supports, další CSS layout, tabulky, obrázky i širší načítání HTML resource zůstávají samostatnou prací

Selektory a interní styly · Media profily · Form-data volby

Nativní support dotazy připouštějí skupiny @supports a importy supports() s podporovaným profilem deklarací a selektorů, se sdílenými mezemi i zotavením po zrušení