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í