原生富文本 CSS supports 查询

原生 XHTML 解码器对照其受支持的富文本声明与选择器语法,求值 @supports 组和 supports() 导入条件

<body xmlns="http://www.w3.org/1999/xhtml">
  <style><![CDATA[
    @supports (font-size: calc(10pt + 5pt)) and selector(span.notice) {
      span.notice { font-size: 15pt }
    }
    @supports not (display: grid) {
      span.notice { font-weight: bold }
    }
  ]]></style>
  <p><span class="notice">Conditional text</span></p>
</body>

在原生 profile 下两个组都生效,用调用方指定的字体产出 15 point 粗体文本

声明与选择器接纳

声明查询使用既有的接纳助手:font-size、font-weight、font-style、text-decoration、color、text-align、font-family、line-height、font 简写、letter-spacing 和 word-spacing

数值查询共享有限的 CSS 数学 profile、默认字体度量和显式 media 尺寸;不受支持的属性或不被接纳的值求值为 false

font-family 查询要求配置的 FontFamilyNames 集合,不可用但合法的 family 可以走既有的指定 family 回退

声明查询中合法的 !important 标注被接受,但不改变条件组的级联优先级;多余的声明、尾随分号或非法优先级会被拒绝

selector() 检查既有的原生选择器语法和当前样式表的命名空间声明,不匹配文档元素

每个选择器分支都必须受支持,包括常规宽容的 is() 与 where() 列表内部的分支;未定义的命名空间前缀和未知伪类求值为 false

根 :scope 以及静态 :hover、:active、:focus、:focus-visible 和 :focus-within 语法受支持。特性查询成功只说明解析器支持;用户操作类选择器仍不会匹配 PDF 外观,:hover() 之类的函数形式非法

选择器探测会恢复临时的匹配器存储,不影响后续样式表匹配;其工作量仍计入共享的节点与取消预算

布尔语法与向前兼容条件

条件接受 not、同质的 and 或 or 链以及嵌套括号;and 与 or 混用需要显式分组

注释和 CSS 标识符转义遵循解码器既有的 tokenizer,not 必须是与后续项分隔的关键字,而不是 not() 函数 token

配对的未知函数和带括号的 general-enclosed 条件求值为 false,因此外层 not 可以提供回退

畸形字符串、畸形的不带引号 URL token 和不匹配的定界符会在取反之前使外围条件失效;数值维度和带引号的函数 token 保留各自独立的 token 边界

组、导入与输出

条件组保留真实源位置、选择器 specificity 和 important 优先级,可以与受支持的 media 组嵌套

@import "metrics.css" supports(line-height: 18pt) print;
@import "fallback.css" supports(not selector(span:future));

导入的可选 supports() 条件跟在资源 URI 之后、可选 media 条件之前;两者都必须接纳该资源,它才能贡献声明

相对 URI 解析、循环处理、命名空间隔离和既有的导入顺序要求仍与 调用方样式表相同

被接纳的声明经同一个解码器进入真实解码 run、计算出的规范富值、保存的字段外观和默认 profile 的富 FDF/XFDF 导入

边界与验收

条件解析和选择器探测消耗既有的 MaxNodes 与 MaxTotalCodeUnits 限制;嵌套条件、块和组共享 MaxDepth

取消传播 EHPDFOperationCancelled 且不返回部分 run,查询或预算失败保留全新与复用解码的恢复能力

Tests/Linux/RichTextSupports/Run.py 验证声明、选择器、布尔和 URL token 行为、嵌套级联与导入、实测取消,以及真实保存的 plain 与 AES 加密 PDF 输出

本原生 profile 不在上述受支持的声明与选择器查询之外增加浏览器布局、导入层、自定义属性、额外选择器语法或 CSS 条件特性

条件语法遵循 CSS Conditional Rules Level 3 和 Level 4 的受支持部分;原生接纳 profile 定义哪些查询会成功

原生解码器 · 解码选项 · media profile