네이티브 리치 텍스트 외부 스타일시트

네이티브 XHTML 디코더는 XHTML link 요소와 CSS @import 규칙이 참조하는 호출자 공급 CSS 리소스를 실제 리치 텍스트 run, 저장된 리치 값, 필드 appearance에 적용합니다

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>

리소스 identity와 캐스케이드

상대 참조는 RFC 3986 경로 병합과 dot-segment 제거를 씁니다. 쿼리 문자열은 리소스 identity의 일부이고 fragment는 아니며, scheme과 host 문자는 정규화되지만 사용자 정보는 대소문자를 유지하고, percent-escape 16진 문자는 대소문자 없이 비교됩니다

가져온 시트는 자기 URI를 기준으로 추가 가져오기를 해석하고 독립적인 CSS 네임스페이스 환경을 가집니다. 시트를 가져온다고 그 시트의 @namespace 선언이 부모로 새지 않습니다

가져오기는 보통 규칙이나 네임스페이스 선언 앞에서 CSS 이스케이프를 포함한 인용 문자열과 url 토큰을 받습니다. 기존 print/screen 미디어 질의 평가기가 link 미디어와 가져오기 조건을 제어합니다

가져온 선언은 보통 importance와 명시도로 실제 소스 위치에서 캐스케이드에 들어갑니다. 순환 참조는 그 리소스가 활성인 동안만 건너뛰므로, 이후 반복 참조는 다시 기여할 수 있습니다

누락된 리소스, 무효한 작성 참조, 비-CSS 콘텐츠 타입은 선언에 기여하지 않습니다. 무효한 호출자 공급 리소스 컬렉션은 EHPDFHeadlessRichTextCodecError를 일으킵니다

XHTML 참조와 선택 집합

스타일시트 relation 토큰은 ASCII 대소문자 없이 비교됩니다. 비활성 link는 무시되고, media와 type 속성이 참조된 스타일시트의 참여를 결정합니다

인라인 style 요소와 링크된 시트는 같은 대소문자 구분 title 집합을 공유합니다. 제목 없는 persistent 시트는 계속 활성입니다

명시적 StyleSheetTitle이 없으면 첫 번째 적격 titled 인라인 스타일이나 비-alternate link가 선호 집합을 고릅니다. 디코더는 선언을 모으기 전에 그 제목을 정하므로, 선택된 제목을 가진 이른 alternate가 원래 캐스케이드 위치에서 참여합니다

명시적 StyleSheetTitle은 alternate를 포함해 일치하는 titled 인라인과 링크된 시트를 고릅니다. 일치하는 시트가 없는 제목은 persistent 시트만 남깁니다

선호 제목 스캔은 빈 type이나 text/css를 받고 비활성 또는 alternate link를 건너뜁니다. 리소스 가용성과 미디어 조건은 선택된 제목을 바꾸지 않고, 선언은 여전히 자기 미디어, type, 리소스 검사를 따릅니다

HTML과 XML base 해석

XHTML head 안에서 href를 가진 첫 번째 XHTML base 요소는 자기 href를 DocumentURI에 대해 해석해 문서 base를 공급합니다. base 요소나 그 조상의 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 위치를 소비하므로, 이후 base 요소가 그것을 대체하지 않습니다

이 순서가 네이티브 디코더의 결합 HTML/XML 프로파일을 정의합니다. XML Base 자체는 별개의 HTML base 메커니즘을 어떻게 결합해야 하는지 정의하지 않습니다

폼 데이터와 JSON 연산

네이티브 문서 메서드로 FDF RV나 XFDF value-richtext를 가져올 때 THPDFHeadlessFormDataOptions에 RichTextDocumentURI, RichTextStyleSheetTitle, RichTextStyleSheets를 설정하세요

Windows 파일 작업, Windows execute-json-v1, 버전 지정 네이티브 Linux C ABI는 forms.import에서 같은 선택적 richTextResources 객체를 받습니다

{
  "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"}
    ]
  }
}

각 JSON 리소스에는 URI가 필수이고 비어 있으면 안 됩니다. css와 contentType, documentURI, styleSheetTitle은 선택적 문자열입니다. 공급된 문자열은 NUL을 담아서는 안 됩니다

리소스는 호스트가 공급한 Unicode CSS 텍스트입니다. URI 식별자는 파일시스템 접근, 네트워크 접근, 콜백 레코드 레이아웃 변경을 요청하지 않습니다

주변 가져오기 트랜잭션은 malformed 리소스, 취소, 예산 실패, 게시 실패에서 이전 문서를 유지합니다. 정확히 동등한 가져오기는 기존 바이트 동일 no-op 동작을 유지합니다

재사용 가능한 비-GUI acceptance

Tests/Linux/ExternalStyleSheets/Run.py는 실제 디코딩 run, 유계 실패 동작, 저장된 appearance, 독립 PDF 지오메트리와 픽셀을 검사합니다. 그 Callbacks 디렉터리는 실제 FDF/XFDF 가져오기, no-op 바이트, 게시 실패 트랜잭션을 실행합니다

Tests/Linux/ExternalStyleSheets/Supplement/Run.py는 공유 인라인/link title 집합, 결합 HTML/XML base 해석, 측정된 모든 automatic-title 취소 경계, 성공 재시도가 뒤따르는 깊이 실패를 검사합니다

보충 항목은 명시적 소스 디렉터리와 컴파일러 구성을 받고, 실제 소스와 의존성 identity를 기록하며, 실행마다 새 출력 디렉터리를 요구합니다

경계와 남은 작업

리소스 수는 최대 256, 해석된 각 URI는 최대 4096 UTF-16 코드 유닛, 각 제목이나 콘텐츠 타입은 최대 256입니다. 스타일시트 텍스트도 MaxCodeUnits를 따르며, 집계 스캔과 매칭은 기존 노드, 전체 코드 유닛, 깊이, 취소 한계에 청구됩니다

폼 데이터 바인딩은 대응 디코더 한계에 MaxValueCodeUnits, MaxTotalCodeUnits, MaxObjects, MaxDepth와 연산의 취소 토큰을 씁니다

import 레이어, 추가 CSS 레이아웃, 테이블, 이미지, 더 넓은 HTML 리소스 로딩은 별개의 작업입니다

Selector와 내부 스타일시트 · 미디어 프로파일 · 폼 데이터 옵션

네이티브 support 질의는 지원되는 선언과 selector 프로파일로 @supports 그룹과 supports() 가져오기를 인정하며, 공유 경계와 취소 복구를 씁니다