Media-запросы нативного rich-текста

Нативный XHTML-декодер вычисляет атрибут media элемента style и вложенные группы @media прежде, чем каскадировать поддерживаемые объявления в фактические rich-text-run-ы

Вычисление media использует явный профиль нативного хоста и не осматривает рабочий стол, браузер или устройство отображения

Options := THPDFHeadlessRichTextDecodeOptions.Default;
Options.MediaType := hrmtScreen;
SetLength(Options.MediaFeatures, 2);
Options.MediaFeatures[0].Name := 'width';
Options.MediaFeatures[0].Value := '800px';
Options.MediaFeatures[1].Name := 'resolution';
Options.MediaFeatures[1].Value := '2dppx';
Runs := HPDFDecodeHeadlessRichText(XHTML, Options);
<style media="screen and (width >= 600px)">
  @media (resolution >= 2dppx) {
    span.notice { font-size: 14pt }
  }
</style>

Условия и каскадирование

Запросы поддерживают типы media all, print и screen, модификаторы only и not, альтернативы через запятую и заключённые в скобки условия not, and и or

Числовые features принимают равенство с двоеточием, формы min-/max- и сравнения диапазонов прямые, обращённые или цепочечные с =, <, <=, > и >=

Вложенные группы сохраняют порядок в источнике, importance объявлений, специфичность селектора и унаследованные объявления namespace; атрибут media у style и все обрамляющие media-группы должны совпасть

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

Неизвестные features, неподдерживаемые значения и условия general-enclosed сохраняют неизвестное значение истинности через отрицание и булево вычисление; только финальный запрос true включает свои объявления

Предоставление хостовой записи для будущей feature не делает эту feature частью поддерживаемого словаря запросов

Профиль хоста

Поддерживаемые числовые features — width, height, device-width, device-height, resolution, aspect-ratio, device-aspect-ratio, color, color-index, monochrome и grid

Дискретные features — orientation, scan, update, overflow-block, overflow-inline, color-gamut, pointer, any-pointer, hover и any-hover

Единицы длины — pt, px, in, pc, cm, mm, q, em, rem, vw, vh, vmin и vmax; единицы разрешения — dpi, dpcm, dppx и x, а отношения используют запись через слэш

Media em и rem используют MediaInitialFontSize, а не каскадный размер шрифта элемента; его значение по умолчанию — 12 пунктов, а ноль сохраняет те же 12 пунктов начального значения для обнулённых legacy-записей

Пропущенные orientation или aspect-ratio могут выводиться из предоставленных width и height; нулевая высота оставляет отношение неизвестным, а равные ширина и высота используют ориентацию portrait

any-pointer может содержать и coarse, и fine; none нельзя сочетать с другим значением pointer, а color-gamut включает младшие поддерживаемые ранги gamut

Среда по умолчанию — print, с 8 битами цвета, без индексированного или монохромного цвета, grid 0 и gamut sRGB; её возможности update, overflow-inline, pointer, hover и scan отсутствуют, а overflow-block — paged

У размеров и разрешения нет выдуманных устройствых значений по умолчанию; возможности screen помимо общих цветовых значений по умолчанию требуют явного хостового значения, когда они существенны

MediaFeatures допускает не более 32 различных имён без учёта ASCII-регистра, каждое из 1–64 ASCII-букв, цифр или дефисов, и значение из 1–256 кодовых единиц UTF-16; распознанные записи должны использовать валидное неотрицательное числовое или поддерживаемое дискретное значение

MediaInitialFontSize должен быть конечным и нулём либо между 0.000001 и 1000000 пунктов; недопустимые профили хоста возбуждают EHPDFHeadlessRichTextCodecError до возврата run-ов

Явные предпочтения и доступность

Предпочтения предоставляйте как записи MediaFeatures; они описывают среду rendering вызывающего и не осматривают операционную систему, браузер или активный рабочий стол

FeatureПринимаемые значенияЛожное булево значение
prefers-color-schemelight, darkНи то, ни другое
prefers-reduced-motionno-preference, reduceno-preference
prefers-reduced-transparencyno-preference, reduceno-preference
prefers-contrastno-preference, less, more, customno-preference
prefers-reduced-datano-preference, reduceno-preference
forced-colorsnone, activenone
inverted-colorsnone, invertednone
scriptingnone, initial-only, enablednone
Options := THPDFHeadlessRichTextDecodeOptions.Default;
Options.MediaType := hrmtScreen;
SetLength(Options.MediaFeatures, 2);
Options.MediaFeatures[0].Name := 'prefers-color-scheme';
Options.MediaFeatures[0].Value := 'dark';
Options.MediaFeatures[1].Name := 'prefers-contrast';
Options.MediaFeatures[1].Value := 'more';
Runs := HPDFDecodeHeadlessRichText(XHTML, Options);
@media (prefers-color-scheme: dark) and (prefers-contrast: more) {
  span.notice { font-size: 20pt; font-weight: bold }
}

Все восемь features дискретны: используйте равенство или булево условие и не используйте min-/max- или упорядоченные сравнения диапазонов

Light — активное значение color-scheme в булевом запросе, а less или custom — активное предпочтение контраста; custom не подразумевает more

Пропущенное предпочтение остаётся неизвестным и для print, и для screen, включая под not; декодер не выдумывает no-preference, light, none или другое резервное значение

Недопустимые значения распознанных хостовых features отклоняют профиль до возврата run-ов; экранирования идентификаторов CSS и комментарии используют существующий ограниченный токенизатор, включая комментарии, поглощаемые до конца входа

Feature scripting описывает только доступность, предоставленную вызывающим; вычисление запроса не исполняет JavaScript

Атрибуты media у style, вложенные группы и предоставленные вызывающим внешние листы разделяют эти семантики features и существующие правила каскада

Сохранённые документы и границы

Нативные вызывающие могут настроить собственный профиль хоста через THPDFHeadlessRichTextDecodeOptions и передать его напрямую в HPDFDecodeHeadlessRichText

Вычисленные run-ы сохраняют выбранные стили в сохранённом RV и встроенных внешних видах; обычные импорты FDF/XFDF используют профиль print по умолчанию

Media-токены, вложенные группы, разбор хостовых значений и сопоставление разделяют MaxNodes, MaxTotalCodeUnits, MaxDepth и учёт отмены с существующим парсером стилевых листов

Неудавшееся декодирование не публикует частичные run-ы, а неудавшиеся импорты сохраняют предыдущее состояние документа окружающей транзакции

Слои импорта и условия supports, calc и viewport-единицы, дальнейшие media-features и общая CSS-раскладка остаются отдельной работой

Внутренние стилевые листы · Нативные опции

Внешние условия link и import используют тот же вычислитель media