네이티브 rich-text 스타일 시트
네이티브 XHTML 디코더는 rich-text 필드와 FDF/XFDF import에 내부 style 요소를 적용하고, 실제 계산된 스타일을 저장 RV와 임베딩 위젯 appearance에 유지합니다
<body xmlns="http://www.w3.org/1999/xhtml">
<style>
.notice { color: #204080; font-size: 14pt }
p > span.urgent { font-weight: bold !important }
</style>
<p class="notice">Review <span class="urgent">today</span></p>
</body>
style 요소는 XHTML 네임스페이스를 쓰며 type을 생략하거나 text/css로 지정합니다. media 속성과 중첩 @media 그룹은 명시적인 네이티브 print/screen 프로파일을 씁니다
규칙은 전체와 타입 selector, 대소문자를 구분하는 클래스와 ID 이름, 복합 selector, 자손·자식·인접 형제·뒤따르는 형제 combinator, 쉼표로 구분된 selector 그룹을 지원합니다
네임스페이스 selector
CSS 네임스페이스 선언과 qualified selector는 이름 있는 네임스페이스 URI와 기본 네임스페이스 URI, 와일드카드 또는 빈 qualifier, 독립적인 XML 접두사 범위, 상한이 적용된 상속 속성 조회를 지원합니다
속성·구조 selector
속성 selector는 존재, 동등, 공백 분리 단어, 하이픈 접두사, 일반 접두사, 접미사, 부분 문자열을 지원합니다. [name], [name="value"], [name~="word"], [name|="en"], [name^="pre"], [name$="end"], [name*="part"]
속성 값은 따옴표 문자열이나 CSS 식별자와 그 이스케이프를 받습니다. 선택적 i 플래그는 ASCII 문자만 대소문자를 묶고, s와 생략된 플래그는 대소문자를 구분해 비교합니다
접두사 없는 속성과 [|name]은 네임스페이스 URI가 없는 속성에 매칭됩니다. [*|name]은 네임스페이스 선언을 제외하고 그 로컬 이름을 가진 접두사 속성도 매칭합니다
형제 combinator는 요소가 아닌 노드를 건너뛰고 연쇄 selector를 통해 조상 매칭을 유지합니다
구조 pseudo class에는 :root, :empty, :first-child, :last-child, :only-child, :first-of-type, :last-of-type, :only-of-type가 있습니다
:scope는 루트 rich-text 요소를 고릅니다. 이 디코더에는 호출자가 지정한 별도 scoping 루트가 없으므로 :root와 같습니다
정적 프로파일은 :hover, :active, :focus, :focus-visible, :focus-within을 PDF appearance 생성 중 절대 매칭되지 않는 유효한 selector로 받아들입니다. 부정과 논리·관계 조합은 정상 selector 의미론을 유지하므로 p:not(:hover)는 스타일을 적용할 수 있지만 p:hover는 적용할 수 없습니다
@supports selector(:hover)와 동등한 조건부 import는 selector 문법 지원을 시험하고 true로 평가합니다. 이것이 포인터, 활성화, 키보드 포커스 상태를 만들지는 않습니다. 이 여섯 pseudo class는 인수를 받지 않으므로 :focus() 같은 형태는 여전히 유효하지 않습니다
네 위치 selector :nth-child(), :nth-last-child(), :nth-of-type(), :nth-last-of-type()는 odd, even, 정수 위치와 기계 정수 범위를 넘는 부호 있는 10진 계수가 있는 An+B 식을 설정된 스캔 예산 안에서 받습니다
타입 위치는 요소 로컬 이름과 네임스페이스 URI를 둘 다 비교합니다. :empty 규칙은 Selectors3를 따르므로 공백 텍스트 노드는 요소를 비어 있지 않게 만들지만 주석과 processing instruction은 그렇지 않습니다
:lang()은 가장 가까운 명시적 xml:lang이나 lang 값을 따르고, 정확한 값이나 하이픈 접두사로 ASCII 대소문자 무시 매칭을 하며, 명시적 빈 값은 상속을 끊는 것으로 취급합니다
논리·관계 selector 목록
:is()와 :where()는 자손·형제 combinator를 포함한 쉼표 구분 complex selector를 받습니다. 지원되지 않는 분기는 무시되고, 빈 유효 목록은 어떤 요소도 매칭하지 않습니다
:is()는 현재 요소에 매칭되지 않는 유효 인수를 포함해 가장 큰 인수 specificity를 씁니다. :where()는 specificity를 0으로 둡니다
:not()은 비어 있지 않은 complex selector 목록을 받고 어떤 인수도 매칭되지 않을 때 매칭됩니다. 유효하지 않은 인수 하나가 selector 목록 전체를 무효로 만듭니다
:has()는 상대 selector를 현재 요소에 고정하고 실제 자식, 자손, 뒤따르는 형제를 시험합니다. 각 상대 인수는 >, +, ~로 시작할 수 있고 그 뒤에 더 지원되는 combinator가 올 수 있습니다
중첩 :has()와 pseudo element는 지원되지 않습니다. 유효하지 않은 상대 인수는 :has() 목록 전체를 무효로 만들지만, 감싸는 forgiving :is()나 :where() 목록은 나머지 유효 인수를 유지할 수 있습니다
:not()과 :has()는 가장 큰 유효 인수 specificity를 쓰며 ID 수, 클래스/속성/pseudo 수, 타입 수로 비교합니다
:nth-child(An+B of selector-list)와 :nth-last-child(An+B of selector-list)는 비어 있지 않은 complex selector 목록의 합집합에 매칭되는 요소 형제만 셉니다. 타깃 자신도 그 합집합에 속해야 합니다
필터링된 위치 selector는 자체 pseudo-class specificity에 가장 큰 필터 specificity를 더해 냅니다. of 키워드는 CSS 식별자 이스케이프와 주석 경계를 받고, :nth-of-type()과 :nth-last-of-type()은 필터 없는 문법을 유지합니다
p:has(> span.urgent) { color: red }
span:is(.notice, p > .urgent) { font-weight: bold }
span:nth-child(2 of .included, [data-status="ready"]) { color: blue }
CSS 주석과 식별자 이스케이프는 매칭 전에 파싱됩니다. 1~6자리 16진수, 선택적 후행 CSS 공백, 보충 Unicode scalar가 포함됩니다. 0, surrogate, 범위 밖 16진수 이스케이프는 U+FFFD로 해석됩니다
선언은 importance, selector specificity, 문서 소스 순서로 cascade되고, 그다음 대응하는 importance의 인라인 스타일이 적용됩니다. 요소는 기존 property별 규칙을 통해 계산된 부모 값을 상속합니다
모든 내부 style 요소는 텍스트가 소비되기 전에 참여하므로, 대상 뒤에 나타나는 style 요소도 적용됩니다. style 텍스트는 보이는 필드 텍스트가 되지 않습니다
선언 프로필은 폰트 크기, 굵기, 스타일, shorthand, 설정된 패밀리 목록, 색, 텍스트 장식, 정렬, 줄 높이, 문자/단어 간격을 유지합니다. 길이 변환, 부모 메트릭 strut, 공급 폰트 수용은 기존 네이티브 rich-text API를 따릅니다
저장 RV는 계산된 인라인 스타일을 담고 원본 style 요소에 의존하지 않습니다. 공개할 대기 그래프 변경이 없으면 반복되는 동등 FDF/XFDF import는 정확히 커밋된 바이트를 유지합니다
네이티브 Pascal 소비자, Windows 파일 작업과 원본 V1 콜백, Linux JSON/V1 콜백이 디코더를 공유합니다. 공개 콜백 레코드 레이아웃 변경은 필요 없습니다
MaxTotalCodeUnits는 스타일 시트 스캔, 추출된 style 텍스트, 집계 확장 선언을 제한합니다. MaxNodes는 규칙 수, selector 이름, 집계 속성/pseudo 조건, 함수형 selector 목록, 상대 순회와 필터링된 형제 스캔을 포함한 매칭·정렬 작업을 제한합니다. MaxDepth는 XML 수집, selector 파트, 중첩 함수, 재귀 매칭을 제한합니다
cancellation과 한도 실패는 디코더의 이전 출력과 import 트랜잭션의 커밋된 문서 상태를 유지합니다. 재시도는 같은 원본 옵션과 예산을 씁니다
잘못되었거나 지원되지 않는 최상위 selector 그룹은 통째로 무시되고, forgiving is/where 인수 목록은 유효 분기를 유지하며, 잘못된 선언은 디코더의 기존 무시 동작을 유지하고 지원되지 않는 at-rule은 건너뜁니다
import 계층, 추가 media feature, pseudo element, 추가 상태 pseudo class, 호출자 지정 scoping 루트, 테이블, 이미지, 일반 CSS 레이아웃은 진행 중인 작업입니다
네이티브 form-data 교환 · Linux rich 콜백 · Windows form-data 교환 · Rich run 간격
호출자 제공 외부 스타일 시트는 리소스 URI 해석, media 조건, 선택된 스타일 시트 집합과 함께 linked 및 재귀 import CSS를 더합니다
네이티브 support 질의는 지원되는 declaration·selector 프로파일, 공유 한도, cancellation 복구로 @supports 그룹과 supports() import를 받아들입니다