Внешние стилевые листы нативного rich-текста

Нативный XHTML-декодер применяет ресурсы CSS, предоставленные вызывающим и упомянутые элементами link XHTML и правилами @import CSS, к фактическим rich-text-run-ам, сохранённым rich-значениям и внешним видам полей

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>

Идентичность ресурсов и каскад

Относительные ссылки используют слияние путей RFC 3986 и удаление dot-сегментов; строки запроса являются частью идентичности ресурса, фрагменты — нет, буквы scheme и host нормализуются, тогда как пользовательская информация сохраняет регистр, а hex-буквы percent-escape сравниваются без регистра

Каждый импортированный лист разрешает дальнейшие импорты относительно собственного URI и имеет независимую среду namespace CSS; импорт листа не просачивает его объявления @namespace в родителя

Импорты принимают строки в кавычках и токены url, включая экранирования CSS, до обычных правил или объявлений namespace; существующий вычислитель media-запросов print/screen управляет media у link и условиями импорта

Импортированные объявления входят в каскад в своей фактической позиции в источнике с обычными importance и специфичностью; циклическая ссылка пропускается, только пока этот ресурс активен, поэтому поздние повторные ссылки могут внести вклад снова

Отсутствующие ресурсы, недействительные авторские ссылки и типы содержимого не-CSS не вносят объявлений; недействительная коллекция ресурсов от вызывающего возбуждает EHPDFHeadlessRichTextCodecError

Ссылки XHTML и выбранные множества

Токены отношения stylesheet сравниваются без ASCII-регистра; отключённые link игнорируются, а атрибуты media и type решают, участвует ли упомянутый stylesheet

Встроенные style-элементы и связные листы разделяют одни и те же множества заголовков с учётом регистра; постоянные листы без заголовка остаются включёнными

Без явного StyleSheetTitle первый подходящий титулованный встроенный стиль или не-alternate link выбирает предпочтительное множество; декодер определяет этот заголовок до сбора объявлений, поэтому более ранний alternate с выбранным заголовком участвует в своей исходной каскадной позиции

Явный StyleSheetTitle выбирает совпадающие титулованные встроенные и связные листы, включая alternate; заголовок без совпавшего листа оставляет включёнными только постоянные листы

Сканирование предпочтительного заголовка принимает пустой type или text/css и пропускает отключённые или alternate link; доступность ресурсов и media-условия не меняют выбранный заголовок, а объявления по-прежнему подчиняются собственным проверкам media, type и ресурса

Разрешение базы HTML и XML

Первый элемент base XHTML с href внутри XHTML head поставляет базу документа, разрешая свой href относительно DocumentURI; xml:base на элементе base или его предках не меняет эту выборку

Затем декодер применяет каждый предковый xml:base один раз, начиная с этой базы документа, для разрешения ссылок link и встроенных импортов; связный или импортированный лист разрешает собственные импорты относительно своего URI ресурса

Например, DocumentURI=https://example.test/docs/form.xhtml, корневой xml:base="a/", head base href="b/" и link href="main.css" разрешаются в https://example.test/docs/b/a/main.css

Пустой первый base href использует резервный URI документа; недействительный первый base href также сохраняет этот резерв и занимает позицию первой базы, поэтому более поздние элементы base её не замещают

Этот порядок определяет комбинированный профиль HTML/XML нативного декодера; XML Base сам по себе не определяет, как отдельный механизм HTML-базы должен с ним сочетаться

Данные форм и JSON-операции

Устанавливайте RichTextDocumentURI, RichTextStyleSheetTitle и RichTextStyleSheets в THPDFHeadlessFormDataOptions при импорте FDF RV или value-richtext XFDF через нативные методы документов

Файловые задания Windows, execute-json-v1 Windows и версионированный нативный C ABI Linux принимают тот же необязательный объект richTextResources в 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 обязателен и непуст для каждого JSON-ресурса; css и contentType — необязательные строки, как и documentURI и styleSheetTitle; предоставленные строки не должны содержать NUL

Ресурсы — это Unicode-текст CSS, предоставляемый хостом; идентификаторы URI не запрашивают доступ к файловой системе, сети или изменения раскладок колбэк-записей

Окружающая транзакция импорта сохраняет предыдущий документ при malformed ресурсах, отмене, сбое бюджета или публикации; точно эквивалентные импорты сохраняют существующее поведение байт-идентичного no-op

Переиспользуемая не-GUI приёмка

Tests/Linux/ExternalStyleSheets/Run.py проверяет фактические декодированные run-ы, ограниченное поведение сбоев, сохранённые внешние виды и независимую геометрию и пиксели PDF; его каталог Callbacks упражняет фактические импорты FDF/XFDF, no-op-байты и транзакции неудавшейся публикации

Tests/Linux/ExternalStyleSheets/Supplement/Run.py проверяет общие множества заголовков inline/link, комбинированное разрешение базы HTML/XML, каждую измеренную границу отмены automatic-title и сбой глубины с последующим успешным повтором

Дополнение принимает явный исходный каталог и конфигурацию компилятора, записывает фактические идентичности источника и зависимостей и требует нового выходного каталога на каждый запуск

Границы и оставшаяся работа

Число ресурсов не более 256, каждый разрешённый URI не более 4096 кодовых единиц UTF-16, каждый заголовок или тип содержимого не более 256; текст stylesheet также подчиняется MaxCodeUnits, причём агрегированные сканирования и сопоставление списываются на существующие пределы узлов, полных кодовых единиц, глубины и отмены

Привязки данных форм используют MaxValueCodeUnits, MaxTotalCodeUnits, MaxObjects, MaxDepth и токен отмены операции для соответствующих пределов декодера

Слои импорта, дополнительная CSS-раскладка, таблицы, изображения и более широкая загрузка HTML-ресурсов остаются отдельной работой

Селекторы и внутренние стилевые листы · Media-профили · Опции данных форм

Нативные запросы поддержки допускают группы @supports и импорты supports(), используя поддерживаемый профиль объявлений и селекторов, с общими границами и восстановлением отмены