原生富文本媒体查询
原生 XHTML 解码器在把受支持的声明级联进真实富文本 run 之前,先求值 style 元素的 media 属性和嵌套 @media 组
media 求值使用显式的原生宿主 profile,不检查桌面、浏览器或显示设备
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>
条件与级联
查询支持 all、print、screen 媒体类型,only 与 not 修饰符,逗号分隔的备选项,以及带括号的 not、and、or 条件
数值特性接受冒号等式、min-/max- 形式,以及用 =、<、<=、>、>= 的正向、反向或链式范围比较
嵌套组保留源顺序、声明 importance、选择器 specificity 和继承的命名空间声明;style 的 media 属性与所有外层 media 组都必须匹配
CSS 标识符转义、注释、指数记法和配对的函数 token 都在同一个设界解析器内扫描
未知特性、不支持的值和 general-enclosed 条件在取反与布尔求值中保持未知真值;只有最终为 true 的查询才启用其声明
为未来特性提供宿主条目并不会让它进入受支持的查询词汇表
宿主 profile
受支持的数值特性为 width、height、device-width、device-height、resolution、aspect-ratio、device-aspect-ratio、color、color-index、monochrome 和 grid
离散特性为 orientation、scan、update、overflow-block、overflow-inline、color-gamut、pointer、any-pointer、hover 和 any-hover
长度单位为 pt、px(96 dpi)、pc、in、cm、mm、q、em 和 rem;分辨率单位为 dpi、dpcm、dppx 和 x,比率使用斜线记法
media 的 em 和 rem 使用 MediaInitialFontSize 而不是级联的元素字号;默认 12 point,零值对零初始化的 legacy 记录保留同样的 12 point 初始值
省略 orientation 或 aspect-ratio 时可以由提供的 width 和 height 推导;height 为零时比率未知,宽高相等时使用 portrait
any-pointer 可以同时包含 coarse 和 fine;none 不能与其他 pointer 值组合,color-gamut 包含较低的受支持色域等级
默认 medium 为 print:8 个颜色位、无 indexed 或 monochrome 颜色、grid 0、sRGB 色域;其 update、overflow-inline、pointer、hover 和 scan 能力缺失,overflow-block 为分页
尺寸和分辨率没有虚构的设备默认值;除共享的颜色默认值之外的 screen 能力,在相关时需要显式的宿主值
MediaFeatures 至多 32 个 ASCII 大小写不敏感的不同名称,每个名称 1 到 64 个 ASCII 字母、数字或连字符,值 1 到 256 个 UTF-16 code unit;被识别的条目必须使用合法的非负数值或受支持的离散值
MediaInitialFontSize 必须是有限值,为零或在 0.000001 到 1000000 point 之间;非法宿主 profile 在返回 run 之前抛出 EHPDFHeadlessRichTextCodecError
显式偏好与可访问性
偏好作为 MediaFeatures 条目提供;它们描述调用方的渲染环境,不检查操作系统、浏览器或活动桌面
| 特性 | 接受的值 | False 布尔值 |
|---|---|---|
| prefers-color-scheme | light、dark | 两者都不是 |
| prefers-reduced-motion | no-preference、reduce | no-preference |
| prefers-reduced-transparency | no-preference、reduce | no-preference |
| prefers-contrast | no-preference、less、more、custom | no-preference |
| prefers-reduced-data | no-preference、reduce | no-preference |
| forced-colors | none、active | none |
| inverted-colors | none、inverted | none |
| scripting | none、initial-only、enabled | none |
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 }
}
这八个特性都是离散的:请用等式或布尔条件,不要用 min-/max- 或有序范围比较
在布尔查询中 light 是活动的 color-scheme 值,less 或 custom 是活动的 contrast 偏好;custom 不蕴含 more
省略的偏好对 print 和 screen 都保持未知,not 之下也不例外;解码器不会虚构 no-preference、light、none 或其他回退值
被识别的宿主特性取非法值会在返回 run 之前拒绝 profile;CSS 标识符转义和注释使用既有的设界 tokenizer,包括被消费到输入末尾的注释
scripting 特性只描述调用方提供的可用性;求值查询不会执行 JavaScript
style 的 media 属性、嵌套组和调用方提供的外部样式表共享这些特性语义与既有级联规则
保存文档与边界
原生调用方可以通过 THPDFHeadlessRichTextDecodeOptions 配置自定义宿主 profile,并直接传给 HPDFDecodeHeadlessRichText
计算出的 run 把选中的样式保留进保存的 RV 和内嵌外观;普通 FDF/XFDF 导入使用默认 print profile
media token、嵌套组、宿主值解析和匹配与既有样式表解析器共享 MaxNodes、MaxTotalCodeUnits、MaxDepth 和取消核算
解码失败不发布部分 run,导入失败保留外围事务先前的文档状态
导入层与 supports 条件、calc 与视口单位、更多 media 特性和通用 CSS 布局仍是独立工作
外部 link 与 import 条件使用同一个 media 求值器