この文書は「EPUB Canonical Fragment Identifiers 1.1」の日本語訳である。最新の文書は http://idpf.org/epub/linking/cfi/epub-cfi.html である。原文もしくは完全な情報は、EPUB Canonical Fragment Identifiers 1.1 を参照されたい。

この日本語訳は参考である。公式な文書ではなく、翻訳・解釈の正確性を保証していない。

公開日:
2017年2月23日
翻訳者:
Wataru Yoshimura

EPUB Canonical Fragment Identifiers 1.1

2017年1月5日 Recommended Specification

この版
http://www.idpf.org/epub/linking/cfi/epub-cfi-20170105.html
最新版
http://www.idpf.org/epub/linking/cfi/epub-cfi.html
前の版
http://www.idpf.org/epub/linking/cfi/epub-cfi-20161130.html
以前の勧告
http://www.idpf.org/epub/linking/cfi/epub-cfi-20140628.html
履歴

Editors

Peter Sorotokin, Adobe

Garth Conboy, Google Inc.

Brady Duga, Google Inc.

John Rivlin, Google Inc.

Don Beaver, Apple Inc.

Kevin Ballard, Apple Inc.

Alastair Fettes, Apple Inc.

Daniel Weck, DAISY Consortium

Copyright © 2010, 2011 International Digital Publishing Forum

無断複写・転載を禁止する。本作品は合衆国法典第17編の下に保護されている。変更を伴うこの著作物の複製と頒布は、International Digital Publishing Forum (IDPF)の書面による許可を得ない限り禁止されている。

EPUBは International Digital Publishing Forum の登録商標である。

このドキュメントのステータス

このセクションは、公開時点におけるこのドキュメントのステータスを説明する。他のドキュメントはこのドキュメントに取って代わるかもしれない。

このドキュメントは、2015年7月8日に承認された EPUB ワーキング グループ憲章の下で EPUB ワーキング グループによって作成された。

このドキュメントは IDPF 会員によってレビューされ、勧告仕様として IDPF 理事会によって承認された。このドキュメントは安定しているとみなされ、他の仕様や文書から参照できる。

このドキュメントに関するフィードバックは、EPUB ワーキング グループのメーリングリストイシュートラッカーに提供できる。

このドキュメントは、IDPF の方針と手順によって管理される。

1 要約

1.1 目的とスコープ

このセクションは有益な情報である。

この仕様、EPUB Canonical Fragment Identifier(epubcfi)は、フラグメント識別子を使って EPUB® Publication の任意のコンテンツを参照する標準方式を定める。

Web は、ハイパーリンクのコンセプトが非常に効果的であることを証明しているが、EPUB 出版物は、内部へリンクする標準化された方法がないためハイパーリンクの多くの恩恵を利用できないでいる。個々のリーディングシステムは独自の方法を開発・実装しているが、共通に理解できる構文がなくてはクロスプラットフォームの相互運用性を実現することはできない。しかし、この障壁を取り除くことによって恩恵を受けることのできる機能は様々である。読書中の位置の保持からナビゲーションへの注釈付けなど、どんな出版物の内部を指すことのできる機能は、開発者と製作者にこれまで利用できなかった全く新しい次元を開く。

この仕様は、EPUB 出版物内のどのようなロケーションあるいはロケーションの単純な範囲でも一意に特定できる任意の構造参照(即ち、EPUB CFI)を定義してこの状況の改善を試みる。以下の配慮がこのスキームの設計と適応範囲に著しく影響する:

  • コンテンツ参照に使用するメカニズムは相互運用可能にするべきで、ひとつのリーディングシステムで作成された読書中の位置は他のシステムでも利用できるようにするべきである。

  • EPUB コンテンツへのドキュメント参照は、既存のハイパーリンクが Web 全般で参照できるのと同じ方法で使用できるべきである。

  • EPUB ファイル内のそれぞれのロケーションは、ドキュメントを変更する必要なく特定できるべきである。

  • 同じ論理ロケーションを参照するすべてのフラグメント識別子は比較したとき等しくなるべきである。

  • ソートおよび比較の検証を含む比較演算は、参照先ファイルへのアクセスなしに行えるべきである。

  • 簡単な処理は元ファイルへのアクセスなしにできるべきである。(例えば、ファイル内部への深層参照がある場合、ファイルの先頭への参照は簡単な処理で生成できるべきである。)

  • 識別子の解決は合理的に効率化されているべきである。(例えば、最終章をポイントするフラグメント識別子の解決に第一章の処理は必要ない)

  • 参照のターゲットロケーションはパーサーの変化やドキュメントの改版を経て修復できるべきである。

  • 簡潔で切れ目のない表現をサポートするべきである。

  • 将来の参照を修復する発見的解決法に適応できる拡張可能なメカニズムを提供すべきである。

Standard EPUB CFIsIntra-Publication EPUB CFI の両方の場合、この仕様は、セクション6 Best Practices for Fragid Structures [FragIDBestPractices] で W3C によって示されているガイドラインに準拠する。

言い換えれば、standard CFI URI (例えば、メディアタイプ "application/epub+zip" を参照する "book.epub#epubcfi(…)") と intra-publication CFI URI (例えば、メディアタイプ "application/oebps-package+xml"を参照する "package.opf#epubcfi(…)")の両方が、前述のメディアタイプ接頭辞登録(すなわち、"-xml" と "-zip")のコンテクスト内の既存スキーマと重複しないフラグメント識別子の構文を利用する。

1.2 用語

この仕様で使われる EPUB 固有の用語の定義については [EPUB 3.1] を参照されたい。

Standard EPUB CFI

出版物レベルの EPUB CFI は、EPUB 出版物の内部へリンクする。EPUB CFI に先行するパスは EPUB 出版物のロケーションを参照する。

Intra-Publication EPUB CFI

Intra-Publication EPUB CFI は、一つのコンテンツ ドキュメントが同じ EPUB 出版物のレンディション内の他のドキュメントを参照できるようにする。EPUB CFI に先行するパスはそのレンディションのパッケージ ドキュメントを参照する。

詳しくは Intra-Publication CFI を参照されたい。

1.3 表記上の規則

次の表記上の規則は、この仕様に用いられる:

markup

全てのマークアップ(要素、属性、プロパティ)、コード(JavaScript、擬似コード)、機械可読可能な値(文字列、文字、メディアタイプ)とファイル名は、赤色の等幅フォントで示している。

markup link

マークアップとコードの定義へのリンクは、赤色の下線の等幅フォントで示している。

http://www.idpf.org/

URI は紺色の等幅フォントで示している。

hyperlink

ハイパーリンクは、青色と下線で示している。

[reference]

規範的で参考情報は、角括弧で囲まれている。

Term

用語集で定義されている用語は、キャピタルケースで示している。

Term Link

用語の定義へのリンクは、点線の青い下線である。

規範的な要素、属性とプロパティの定義は、青いボックスにある。

有益なマークアップ例は、ライトグレーのボックス内にある。

note

有益な注記は、"Note"の見出しがある緑色のボックス内にある。

caution

有益な警告は、"Caution"の見出しがある赤いボックス内にある。

1.4 適合性宣言

この文書内のキーワード、mustmust notREQUIREDSHALLSHALL NOTshouldshould notRECOMMENDEDmayOPTIONAL は、[RFC2119] の記述に従って解釈される。

この仕様のすべてのセクションと付録は規定ある。但し"このセクションは有益な情報である"という参考情報状態ラベルで識別される箇所を除く。セクションと付録への参考情報状態の適用は、含まれるすべての子コンテンツおよびサブセクションに適用される。

この仕様のすべての例は有益な参考情報である。

2 EPUB CFI の定義

2.1 前置き

このセクションは有益な情報である。

フラグメント識別子は、リソース内のロケーションを定義する IRI [RFC3987] の一部である。構文的には、リソース IRI の終わりに付属するハッシュ(#)で始まるセグメントである。HTML ドキュメントには、ID および名前付きアンカーがフラグメント識別子として使用されている。XML ドキュメントには、ID を参照するために Shorthand XPointer [XPTRSH] の表記が用いられている。

Canonical Fragment Identifier(CFI)は、これらと似たような構成であるが EPUB 出版物内部のロケーションを表現する。例えば、

book.epub#epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/3:10)

ハッシュの直後に続く関数のような文字列(epubcfi(…))は、このフラグメント識別子がこの仕様の定義するスキームに従っていることを示し、括弧で囲まれた値は特定の EPUB 出版物(book.epub)内部のロケーションを参照するのに使われる構文である。パスの解決によって定義された処理ルールを使って、リーディングシステムは構文を解析し、EPUB 出版物の中の該当するコンテンツ ドキュメントを開いて、指定されたロケーションをユーザーのために読み込むことができる。

EPUB CFI 構文の完全な定義は次のセクションに規定されている。

NOTE

あらゆる XML+ZIP ベースのファイルフォーマットのための、より汎用的な CFI のようなスキームが将来定義されるかもしれないため、スキーム名の先頭に epub を付加している。

2.2 構文

(EBNF 記法 ISO/IEC 14977
すべての終端記号は、Unicode ブロック'基本ラテン文字'(U+0000 から U+007Fまで)である。
fragment = "epubcfi(" , ( path , [ range ] ) , ")" ;
path = step , local_path;
range = "," , local_path , "," , local_path;
local_path = { step } , ( redirected_path | [ offset ] );
redirected_path = "!" , ( offset | path );
step = "/" , integer , [ "[" , assertion , "]" ] ;
offset = ( ( ":" , integer ) | ( "@" , number , ":" , number ) | ( "~" , number , [ "@" , number , ":" , number ] ) ) , [ "[" , assertion , "]" ] ;
number = ( digit-non-zero , { digit } , [ "." , { digit } , digit-non-zero ] ) | ( zero , [ "." , { digit } , digit-non-zero ] ) ;
integer = zero | ( digit-non-zero , { digit } ) ;
assertion = ( ( value , [ "," , value ] ) | ( "," , value ) | ( parameter ) ) { parameter } ;
parameter = ";" , value-no-space , "=" , csv ;
csv = value , { "," , value } ;
value = string-escaped-special-chars;
value-no-space = value - ( [ value ] , space , [ value ] ) ;
special-chars = circumflex | square-brackets | parentheses | comma | semicolon | equal ;
escaped-special-chars = ( circumflex , circumflex ) | ( circumflex , square-brackets ) | ( circumflex , parentheses ) | ( circumflex , comma ) | ( circumflex , semicolon ) | ( circumflex , equal ) ;
character-escaped-special = ( character - special-chars ) | escaped-special-chars ;
string-escaped-special-chars = character-escaped-special , { character-escaped-special } ;
digit = zero | digit-non-zero ;
digit-non-zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
zero = "0" ;
space = " " ;
circumflex = "^" ;
square-brackets = "[" | "]" ;
parentheses = "(" | ")" ;
comma = "," ;
semicolon = ";" ;
equal = "=" ;
character = ? Unicode 文字 ? ;

Unicode 文字

利用できる Unicode 文字の定義は [XML] と同じである。これには、サロゲートブロック、FFFE、および FFFF を除く:

#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

ドキュメントの製作者は、[Unicode] のセクション 2.3 で定義される「互換文字」を避けることを推奨する。次の範囲で定義される文字も使用しないことを推奨する。これらは、制御文字または恒久的に未定義な Unicode 文字である。

[#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDEF],
[#x1FFFE-#x1FFFF], [#x2FFFE-#x2FFFF], [#x3FFFE-#x3FFFF],
[#x4FFFE-#x4FFFF], [#x5FFFE-#x5FFFF], [#x6FFFE-#x6FFFF],
[#x7FFFE-#x7FFFF], [#x8FFFE-#x8FFFF], [#x9FFFE-#x9FFFF],
[#xAFFFE-#xAFFFF], [#xBFFFE-#xBFFFF], [#xCFFFE-#xCFFFF],
[#xDFFFE-#xDFFFF], [#xEFFFE-#xEFFFF], [#xFFFFE-#xFFFFF],
[#x10FFFE-#x10FFFF].

Canonical Fragment Identifier(CFI)は、この特殊な参照方法を示す初期シーケンス epubcfi と括弧に囲まれたパスまたはレンジによって構成される。パスは、ロケーションを参照する構造化されたステップのシーケンスとして組み立てられる。レンジは、開始と終了を指定する2つのローカル(または相対)パスを後ろに持ったパスである。

ステップは、スラッシュ文字 (/) によって示され、XML コンテンツの横断に使用される。CFI パス内の最後のステップは、構造(XML 要素)、テキスト(文字データ)または聴覚・視覚(画像または音声、動画メディア)どちらかの文書内の位置を表現する。そのような終端のステップは、特定の文字位置、時間的または空間的な断片を示す省略可能(optional)な「オフセット」によって補完されてもよい(may)。

括弧内の従属文字列は、伸長可能なアサーションであり、パスの移動や、同じ文書の異なる版へのパスの移行の精度を向上させる。これらのアサーションは、ドキュメント内でたどる要素に関する付加情報を保持しており、EPUB 出版物が変更されても目的のロケーションを修復することが可能になる。

上記の構文で定義される value はどのような文字のシーケンスでも許可するが、次に示す文字には曲折アクセント記号(^)を使ってエスケープし、解析を妨げぬようにしなければならない。

  • 角括弧 ([,])

  • 曲折アクセント記号 (^)

  • コンマ (,)

  • 丸括弧 ((,))

  • セミコロン (;)

テキスト "2[1]" の後ろのロケーションを指す EPUB CFI の例。

epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])

パスとレンジの中での数字と整数の利用には次のルールが適用される:

  • 数字または整数の前に来るゼロは利用できない(一意性を保証するため)。

  • 数字の小数部分の末尾のゼロは利用できない。

  • ゼロは整数 0 で表現しなければならない(must)。

  • 1 > N > 0 のレンジの数字は 0. で始めなければならない(must)。

  • 整数(integral numbers)は整数(integers)で表さなければならない(must)。

2.3 文字エスケープ

構文で説明されているように、EPUB CFI の文法にはフラグメント識別子の表記の中の区切り文字となる特殊用途を持つ文字がある。これらの文字は、区切り文字として使用する意図がないとき、区切り文字に誤読されることなく EPUB CFI データの中で使用できるように、曲折アクセント記号 '^' 文字でエスケープしなければならない(must)。そのような EPUB CFI の使用コンテクストに応じて、さらなる文字エスケープを、すべての潜在的に矛盾するテキストトークンが正しくエンコードされるのを保証するために求めてもよい(may)。

  • IRI と URI 参照:

    • EPUB CFI(フラグメント識別子)スキームは URI および IRI 参照内で使用されるように設計されている。[RFC3986] の仕様では区切り文字として特殊用途を持つ多数の“予約”文字を定義しており、もしそれらが URI/IRI 参照の構文構造と衝突する場合にはエスケープしてもよい(may)。エスケープにはパーセント記号 '%' を使用し、エスケープ可能な文字はパーセントエンコーディングされる。例えば、パーセント記号はエスケープエンコードされると "%25" となる(EPUB CFI の曲折アクセント記号 '^' と、二重文字 '^^' を使用してエスケープするところの違いに注意されたい)。

    • IRI 参照とは異なり、URI 参照は Unicode 文字を ASCII エンコードする必要がある。EPUB 仕様自体は IRI に基づいている(つまり、著者や制作ツールは IRI を使用することを想定している)が、いくつかのシステムや API は URI のみのサポートするかもしれない。その結果、実装者は、[RFC3987] で定義されている IRI から URI 参照の変換処理をさらに必要としてもよい(may)。禁止文字は次のようにエスケープする:

      • それぞれの禁止文字を1バイトまたは複数バイトの UTF-8 [RFC2279] へ変換する。URI 参照での禁止文字は、すべての非 ASCII 文字および [RFC2396] の 2.4 節にリストされた除外文字だが、ナンバー記号 '#'、パーセント記号 '%'、および [RFC2732] で再び許可された角括弧文字は除く。

        その結果として得られたバイトを URI エスケープメカニズムによってエスケープする。(つまり、 '%HH' へ変換する。この HH はバイト値の 16 進法表示である。)

        元の文字は変換結果の文字シーケンスで置き換える。

  • (X)HTML コンテキスト:

    IRI 参照は、EPUB 出版物を構成するさまざまな種類のドキュメントで使用されるように設計されている。XML および (X)HTML は、独自の文字エスケープ規則を必要とする別の挿入コンテキストを意味する。例えば、二重引用文字または山括弧は、マークアップ構文内で重要な区切り文字と競合するので、 &xxx; 特殊シーケンス(文字参照)を使ってエスケープしなければならない(must)。

文字エスケープを複数回適用して、EPUB CFI をエスケープまたはエスケープの解除をする場合、元の形式に戻すにはその逆の順序で適用しなければならない(must)。例えば、[ EPUB-CFI -> IRI -> (X)HTML ] ならば、 [ (X)HTML -> IRI -> EPUB-CFI ] の適用順序となる。

次の例は、(曲折アクセント記号 '^' によるエスケープだけの)EPUB CFI の「未加工」の形を示している。最後部のアサーションテキスト、およびエスケープされた左右角括弧と曲折アクセント記号に注目されたい(エスケープされていないテキストは 'Ф-"spa ce"-99%-aa[bb]^'である):

epubcfi(/6/4!/4/10/2/1:3[Ф-"spa ce"-99%-aa^[bb^]^^])

IRI で使用される場合、アサーション内の空白文字はパーセントエスケープ ('%20') するかもしれず、パーセント文字自体はエスケープ('%25')しなければならない(must)。角括弧 '[' ']' とセミコロン ':' は(URI の仕様によれば)「予約」文字となっているが、IRI プロセッサーがフラグメント識別子を抽出する際の区切り文字としては意味も持たないため、エスケープする必要はない。(つまり、IRI のフラグメン構成部品は、 '#' 文字以降のテキストすべて処理して曖昧さなく解析できる。)曲折アクセント記号 '^' もまた “賢明はでない”(または “安全ではない”)文字の部類に属するが、EPUB フラグメント識別子のスキームではエスケープする必要はない。次は IRI のエスケープされた EPUB CFI である:

#epubcfi(/6/4!/4/10/2/1:3[Ф-"spa%20ce"-99%25-aa^[bb^]^^])

XML 属性の中に IRI を指定する場合、二重引用文字(引用符)は属性値の区切り文字として重要であるため '"' にエスケープする。 キリルの “EF” 文字('Ф')は EPUB XML ドキュメントでそのままサポートされていることに注目されたい。EPUB XML ドキュメントは(UTF-8 エンコーディングを使って Unicode 文字のレパートリーを表現するため)エンコードする必要はない:

#epubcfi(/6/4!/4/10/2/1:3[Ф-"spa%20ce"-99%25-aa^[bb^]^^])

IRI を URI に変換する必要がある場合、非 ASCII のキリルの “EF” 文字 ('Ф') は2バイト (16 進数で、'0xd0 0xa4') へパーセントエスケープする。結果として次のような URI となる:

#epubcfi(/6/4!/4/10/2/1:3[%d0%a4-%22spa%20ce%22-99%25-aa^[bb^]^^])

URI エンコード/デコード API は、次の例に示すとおり、通常「強引に」パーセントエンコードを行う。曲折アクセント記号 '^'(%5E)、角括弧 '['(%5B)']'(%5D)、二重引用符 '"'(%22)が、(URI の中では “安全ではない”/“賢明はでない” 性質を持つため)どのようにパーセントエンコードされるかにも注意する必要がある:

#epubcfi(/6/4!/4/10/2/1:3%5B%D0%A4-%22spa%20ce%22-99%25-aa%5E%5Bbb%5E%5D%5E%5E%5D)

3 EPUB CFI の処理

3.1 パスの解決

EPUB CFI を EPUB 出版物内のロケーションへ解決する処理は、パッケージ ドキュメントの package ルート要素から開始する。CFI のそれぞれのステップは、次のサブセクションで定める規則を適用しながら、左から右へひとつずつ処理される。

NOTE

以下のサブセクションでの EPUB CFI の例は、用例のサンプルドキュメントに基づく。

3.1.1 子要素と文字データへのステップ参照 (/)

正の整数が続くスラッシュ (/) のステップは、ここに定義してある規則ごとに、子要素や文字データのチャンクを参照する:

  • 要素と文字データ以外の [XML] コンテンツは、無視される。[XML] 仕様に従って、CDATA セクション内に文字データは包含され、逆に言えば、XML コメントは無視されることに注意されたい。

  • (一般的に、マークアップのフォーマットやインデントのために使用された)無意味な空白に対応する [XML] 文字データは、保持される。文字とエンティティの参照は、拡張とみなされ、文字データは、([XML] 仕様に定義された用語に従って)"包含された代替えテキスト"から得られる。

  • 兄弟子要素(すなわち、"混在したコンテンツ"のコンテクスト)の間に散りばめられた [XML] 文字データは、論理的に連続した文字データの(潜在的に空の)チャンクに構成されており、最初のチャンクは、最初の子要素(左の兄弟)の前に配置され、最後のチャンクは、最後の子要素(右の兄弟)の後に配置され、子要素の各ペアの間のひとつのチャンクがある。子要素が存在しないとき、文字データのいずれか(潜在的に空の)チャンクがある。文字データの連続した(潜在的に空の)チャンクは、それぞれ割り当てられた奇数のインデックス(すなわち、1 から始まり、3…と続く)である。

  • [XML] 要素は、それぞれ割り当てられた数のインデックス(つまり、2 から始まり、4…と続くである。さらに、0 は、親要素のコンテンツ内の文字データの最初の潜在的に空のチャンクの実質的に前に来る存在しない要素を参照する妥当なインデックスである。同様に、n+2 は、文字データの最後の潜在的に空のチャンクに実質的に続く存在しない要素を参照る妥当なインデックスであり、これらが子要素を持たないとき、n は、最後の子要素または 0 の偶数のインデックスである。CFI プロセッサ(例えば、リーディングシステム)は、文字データの最初(もしくはそれぞれ最後)のチャンクが空のときでさえ、0 と n+2 の"仮想"要素への参照を含んでいる CFI 表現を消費する(例えば、構文解析と解釈)ことができなければならない(must)。逆に言えば、そのような CFI 表現の*生産物*は、次の適合性要件によって制御されなければならない:文字データの最初のチャンクが空のとき、CFI 表現は、インデックス 0 の"仮想"要素への参照を使用して構成されるべきではなく(shouled not)、代わりに"実在の"最初の子要素(インデックス 2 のとき)は、参照するべきである(should)。同様に、文字データの最後のチャックが空のとき、CFI 表現は、インデックス n+2 のとき"仮想"要素への参照を使用して構成されるべきではなく(shouled not)、代わりに、"実在の"最後の子要素(インデックス n のとき)は、参照するべきである(should)。

note

"仮想"の最初/最後の要素のメカニズムは、存在しない要素が、最初と最後の境界で文字オフセットに依存することなくテキストコンテンツを横断して使用される DOM 範囲のいくつかのインスタンスの相互互換性を容易にするかもしれない。

Standard EPUB CFI では、CFI の先頭のステップは斜線(/)とそれに続く(パッケージ ドキュメントの package ルート要素の spine 子要素を参照する)偶数の番号で始まらなければならない(must)。CFI がたどるパッケージ ドキュメントは、EPUB 出版物の META-INF/container.xml ファイルの中の初期設定のレンディションとして指定されていなければならない(must)。(つまり、 container.xml の最初の rootfile 要素で参照されるパッケージ ドキュメントであること。)

Intra-Publication EPUB CFIでは、最初のステップは斜線とそれに続く(package 要素から始まるパッケージ ドキュメント内の位置を参照する)ノード番号で始まらなければならない(must)。

3.1.2 XML ID アサーション([

EPUB CFI が、ID [XML] を含んだ要素を参照する場合、該当するパスのステップは、(斜線(/)と要素を特定する偶数の後ろに)角括弧で囲んだその ID を含めなければならない(must)。

識別子の仕様は、CFI のスキームを堅牢にする。リーディングシステムは CFI で参照された位置が最初に目的とした位置でないと判断でき、コンテンツ内の求められる目的の箇所に到達するステップのセットを計算するために識別子を使用できる(ターゲットロケーション補正を参照されたい)。この追加された堅牢性のコストは、CFI 文字列の比較(とソート)はすべての括弧で囲まれた文字列を論理的に除去した後でのみ実行できる(ソート規則を参照されたい)。

3.1.3 ステップ間接指定 (!)

ステップまたはステップの連続が、他のドキュメントを参照する要素への点であるとき、感嘆符 (!) は、そのステップが参照した文書("間接")に適用される表現がすぐに続くときはいつでも、使用されなければならない(must)。次の表現は、参照した XML ドキュメントのルート要素または(特定の)ターゲットしたXMLフラグメントから解決される。

次の参照のみが有効である:

  • パッケージ ドキュメントの spine 内の itemref に対しては、参照は manifest 内で該当する(つまり、itemrefidref 属性が参照する)item 要素の href 属性によって定義される。

  • [HTML] iframes 要素と embed 要素に対しては、参照は src 属性によって定義される。

  • [HTML] object 要素に対しては、参照は data 属性によって定義される。

  • [SVG] imageuse 要素に対しては、参照は xlink:href 属性によって定義される。

NOTE

このスキームは、単に埋め込み参照のみを対象としておりハイパーリンクは考慮していない。そのため、[HTML](または [SVG])の a 要素のリンクをたどるのは違反となる。

3.1.4 文字オフセット (:)

先頭のコロン(:)とそれに続く整数のパスの終端は文字オフセットを参照する。指定された文字オフセットの要素ノードへの適用は、その要素が [HTML] img 要素であり、文字オフセットを適用できるテキストを含んだ alt 属性を持つ場合のみ行なってもよい(may)。

XML 文字データでは、オフセットはゼロベースで常に文字の間の位置を参照する。従って、0 は最初の文字の前を意味し、UTF-16での全長の数は最後の文字の後ろを意味する。使用できるテキストの UTF-16 の長さよりも大きな文字オフセット値を指定してはならない(must not)

この仕様において、XML 文字データ内の「オフセット」の定義は、UTF-16 テキスト エンコーディングに基づいており、各「文字」(Unicode コード ポイント)は、単一の 16ビット コード単位、または二つの単位(BMP / 基本多言語面外の Unicode 文字の場合、サロゲート ペア) [Unicode] を使用して表現してもよい(may)。 CFI の「文字オフセット」は、UtF-16 コード単位間の位置を参照するゼロベースの数である。ここで、テキストの「長さ」は、16ビット単位の合計数である。したがって、オフセットゼロは、最初の16ビット単位の前を意味し、テキストの「長さ」に等しい数は、最後の16ビット単位の後を意味する。テキストの「長さ」より大きいオフセット値を指定してはならない(must not)。

note

(Unicode のコード ポイントの代わりに)UTF-8 のコード単位に基づくテキスト「文字」の数を数えることは、DOM レンジ モデル [DOM2 Traversal Range] および String API [ECMA-262] と互換性がある。

文字オフセット終了ステップは /N ステップに続く場合のみ指定してもよい(may)。XHTML コンテンツ ドキュメントでは、Nimg 要素の alt のテキストを参照している時は偶数で、要素内の XML 文字データを参照している時は奇数となる。

奇数番号の /N ステップを持つ終端の CFI 表現は、明示的な文字オフセットを包含するべきである(should)。なぜならば、CFI プロセッサ(例えば、リーディングシステム)は、オフセットの暗黙的な /N:0 文字と仮定すれば、そのような CFI 表現を消費(つまり、構文解析と解釈またはレンダリング)ができなければならない(must)。

3.1.5 時間オフセット (~)

先頭のチルダ (~) とそれに続く数字のパスの終端は、オーディオまたはビデオの秒単位の時間位置を示している。

3.1.6 空間オフセット (@)

コロン区切りの二つの数字に従う先頭のアットマーク(@)から続くパスの終端は、画像またはビデオの二次元空間位置を示す。二つの数字は x 軸と y 軸のスケーリングされた位置を表し、画像のネイティブまたは表示サイズに関わらず 0 から 100 の範囲でなければならない(must)。(つまり、左上は 0:0 で右下は 100:100 となる。)

3.1.7 時間-空間オフセット (~ + @)

時間位置と空間位置は同時に使用してもよい(may)。この場合、時間指定は空間指定よりも構文的に前に置かなければならない(must)。(例えば、~23.5@5.75:97.6 は、ビデオの 23.5 秒のフレームの左下を参照する。)

3.1.8 テキストロケーションアサーション([

EPUB CFI は、一致箇所の前および/または後ろに予期されるサブストリングを指定してもよい(may)が、そのようなアサーションの指定は文字オフセットの後ろのみでなければならない(must)。

例えば、後述するサンプルコンテンツを使った次のアサーションは、一致箇所の直前に yyy が必要であることを表している。

epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[yyy])

一致箇所に続くサブストリングをコンマの後ろに追加することができる。例えば:

epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[xx,y])

これは、アスタリスクの付いた箇所を参照している:

x x x y y y 0 1 2 3 4 5 6 7 8 9
| | | * | | | | | | | | | | | |

先行するテキストがない場合、または後続のテキストだけが指定される場合、テキストアサーションの直前にコンマを付けなければならない(must):

epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[,y])

マッチさせるために含むことのできる、先行または後続のテキストの長さに制約はない。テキストは、ドキュメントから要素の境界を無視して取り出され、空白文字は常にまとめられる。(つまり、空でない連続する空白文字列は常に単一の空白文字に置換される。)

リーディングシステムは、(テキストがマッチしないために)CFI で参照されるロケーションが本来の目的のロケーションではない、と判断でき、コンテンツ内の目的となる宛先に到達する一連のステップを計算するために、先行/後続のテキストを利用できる(ターゲットロケーション補正を見よ)。この追加された堅牢性のコストは、CFI 文字列の比較(とソート)はすべての括弧で囲まれた文字列を論理的に除去した後でのみ実行できる(ソート規則を見よ)。

3.1.9 サイド指定([ + ;s=

状況によっては、参照がロケーションのどちらの側を指しているのか、という情報の保持が重要となる。例えば、動的にページを作成する環境でロケーションを解決する場合、ロケーションが前のコンテンツに属している場合と後のコンテンツに属している場合では違いがある。(例えば、改ページに際して、ページの表を表示するのか裏を表示するのか判断する場合。)

ロケーションのサイド情報を保持するには s パラメータを使用する。s は、二つの値をとることができ、'b'(「前」)は、ロケーションは、(XML シリアライゼーション文書の順番に従い)先にあるコンテンツに接続されることを意味し、'a'(「後」)は、次のコンテンツを参照する。このパラメーターは、ID [XML] またはテキストロケーションのアサーションが空の場合でも、常に CFI の最後部で角括弧で囲んで使用しなければならない(must)。

後述のサンプルコンテンツにおける yyy の直後のロケーションが前のコンテンツに属することを、次のように表すことができる:

epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[;s=b])

同様に、次のようにテキストロケーションアサーションを含めて指定することもできる:

epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[yyy;s=b])

em 要素の先頭のロケーションを、その em 要素に先行するコンテンツに付加することは、次のように表すことができる:

epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2[;s=b])

前述の例において、サイド指定に b ではなく a を指定していた場合、ロケーションは、em 要素の次のコンテンツではなく、em 要素の子コンテンツに付加される。

サイド指定はパラメータとして表現されるため、CFI の比較には関与しない(ソート規則を見よ)。

サイドは空間のオフセットへのロケーションには定義されない。

NOTE

サイド指定は、(例えば、改ページや改行など)ロケーションで何らかのブレークが起こる場合にのみ意味を持つ。

3.1.10 例

このセクションは有益な情報である。

次ようなパッケージ ドキュメントがあるとする:

<?xml version="1.0"?>

<package version="2.0" 
         unique-identifier="bookid" 
         xmlns="http://www.idpf.org/2007/opf"
         xmlns:dc="http://purl.org/dc/elements/1.1/" 
         xmlns:opf="http://www.idpf.org/2007/opf">
    
    <metadata>
    	<dc:title>…</dc:title>
    	<dc:identifier id="bookid">…</dc:identifier>
    	<dc:creator>…</dc:creator>
        <dc:language>en</dc:language>
    </metadata>
    
    <manifest>
        <item id="toc"
              properties="nav"
              href="toc.xhtml" 
              media-type="application/xhtml+xml"/>
        <item id="titlepage" 
              href="titlepage.xhtml" 
              media-type="application/xhtml+xml"/>
        <item id="chapter01" 
              href="chapter01.xhtml" 
              media-type="application/xhtml+xml"/>
        <item id="chapter02" 
              href="chapter02.xhtml" 
              media-type="application/xhtml+xml"/>
        <item id="chapter03" 
              href="chapter03.xhtml" 
              media-type="application/xhtml+xml"/>
        <item id="chapter04" 
              href="chapter04.xhtml" 
              media-type="application/xhtml+xml"/>
    </manifest>
    
    <spine>
        <itemref id="titleref"  idref="titlepage"/>
        <itemref id="chap01ref" idref="chapter01"/>
        <itemref id="chap02ref" idref="chapter02"/>
        <itemref id="chap03ref" idref="chapter03"/>
        <itemref id="chap04ref" idref="chapter04"/>
    </spine>
    
</package>

また、XHTML コンテンツ ドキュメントの chapter01.xhtml はこのような内容となっている:

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    	<title>…</title>
    </head>
    
    <body id="body01">
    	<p>…</p>
    	<p>…</p>
    	<p>…</p>
    	<p>…</p>
        <p id="para05">xxx<em>yyy</em>0123456789</p>
    	<p>…</p>
    	<p>…</p>
    	<img id="svgimg" src="foo.svg" alt="…"/>
    	<p>…</p>
    	<p>…</p>
    </body>
</html>

この場合、次のEPUB CFIは

epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/3:10)

ID が para05 の段落の 9 の数字の直後の位置を参照する。テキストのロケーションの CFI を作成する時、テキストが img 要素の alt タグに定義されていなければ、常にロケーションに該当するXML 文字データの(おそらく空である)チャンクへの参照から開始し、パッケージ ドキュメントのルートまで祖先と参照チェーンをたどるべきである(should)。

次の例は、更なるコンテンツロケーションを参照する EPUB CFI の構成を示す:

img 要素のへ参照

epubcfi(/6/4[chap01ref]!/4[body01]/16[svgimg])

xxx の直前の位置への参照

epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/1:0)

yyy の直前の位置への参照

epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:0)

yyy の直後の位置への参照

epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3)

3.2 ソート規則

同じ EPUB 出版物を参照する複数の EPUB CFI の相対的なロケーションを、ソートしたり計算したりするには、次のルールに従わなければならない(must):

  1. EPUB CFI スキームデータは、文字エスケープで説明されているルールの通りに、アンエスケープされた形式でなければならない(must)。

  2. すべての角括弧で囲まれたアサーションは完全に除去(無視)される。

  3. シーケンスの中では、先に来るステップの方が重要である。

  4. XML 要素は、XML 文字データ、文字オフセットや時間位置のチャンクへの参照は、自然順序でソートする。

  5. y 位置は x 位置よりも重要である。

  6. 省略された空間位置は他のすべての空間位置に先行する。

  7. 省略された時間位置は他のすべての時間位置に先行する。

  8. 時間位置は空間位置よりも重要である。

  9. ステップの種類は、重要度の低いものから高いものへと、次のような順番となる:
    文字オフセット(:)、子(/)、時間-空間(~ または @)、参照/間接指定(!).

3.3 Intra-Publication CFI

EPUB CFI は、コンテナ内部のコンテンツの参照に使用することができる。このような参照は、パッケージ ドキュメントへの参照とそれに続く CFI を指定して実現されるが、CFI の解決は package ルート要素から開始しなければならない(must)。

例えば、上記の例のパッケージ ドキュメントを使って、chapter01.xhtml の最後のロケーションへの参照は次のように記述できるだろう:

../pub.opf#epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[;s=b])

3.4 単純なレンジ

EPUB CFI は、開始ロケーションから終了ロケーションまでの簡潔なレンジを表すことができる。レンジは parent パス(P)、start サブパス(S)、そして end サブパス(E)の3つによって、次の形式で表さなければならない(must):

epubcfi(P,S,E)

parent パスは、空であってはならず(must)、レンジの開始と終了のロケーションの両方のパスを解決するための共通のステップで終わらなければならず(must)、start と end のそれぞれのサブパスはドキュメント内で減少しない順序でロケーションへと解決しければならない(must)。

レンジの開始と終了ロケーションを決めるには、parent パスを start と end サブパスに連結して開始ロケーションパス(PS)と終了ロケーションパス(PE)を生成しなければならない(must)。 parent パスは、開始と終了パス(言い換えれば、開始と終了位置は、共通パスに含むべではない(should not))の両方に通じる可能な限り深い共通パスを包含するべきである(should)。 開始位置は、終了位置が開始位置に根付いたサブツリー内に位置している場合には、共通パスの繰り返しを避けるために空でもよい(may)。

上記のサンプルドキュメントを使った次のレンジは yyy の2番目の y から数字 3 まで(含めた)テキストを表す:

epubcfi(/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4)

レンジの比較は、それぞれの PS、次にそれぞれの PE の構成部品によって行わなければならない(must)。開始と終了位置は、要素と文字オフセット(ドキュメント構造)や時間的オフセット(時間メディア)、空間的オフセット(視覚メディア)、一体化した時空間的オフセットと呼ばれる同じ"特定"を持つドキュメント内の点を参照するべきである(should)。時間的オフセットの場合、開始と終了の位置は、同じ時間メディアを参照するべきである(should)。空間的オフセットの場合、開始と終了の位置は、同じ視覚メディアを参照するべきである(should)。この仕様は、このような二つの時空間的オフセット(すなわち、視覚メディア内の開始と終了位置)の組み合わせが、制作ツールやリーディングシステムを含め、処理エージェントによってどのように解釈されるかの、期待する挙動を定義しない。

要素の最初から最後までのレンジを表すショートハンドとして要素へのパスを使用するのは適切ではない。単独で表記されたパスは常にロケーションの位置(ポイント)を表し、レンジは上記で解説した表記で表す。要素の終わりへの参照を示す特殊なステップが存在しないのは、それによってドキュメントのコンテンツを調べることなくソートするのが不可能になるためである。

コンテキストで単独のロケーションが指定されるべきところにレンジが使用された場合、その開始ロケーションを使用しなければならない(must)。

サイド指定パラメータをレンジに使用してはならない(must not)。レンジの開始は暗黙的に開始ロケーションンの後ろのコンテンツに属し、終了は暗黙的に終了ロケーションの前のコンテンツに属する。

3.5 ターゲットロケーション補正

EPUB 出版物は時間とともに改訂、修正、或いは変更ができ、以前のバージョンの CFI から変更されたドキュメントの EPUB CFI を導き出すことは有用である。この仕様は、CFI に影響するコンテンツの変更を発見し補正する二つのメカニズムを提供している。それは、ID [XML]テキストロケーションアサーションである。

リーディングシステムが CFI を処理する際には、遭遇するすべてのアサーションの正確さをチェックするべきである(should)。例えば、/6/4[chap01ref]!…のパスを例にすると、リーディングシステムは、要素 4 の処理中にその要素は chap01ref に一致する ID を持っていることを確認するべきである(should)。(この例では、spine 内の itemref が該当する)。もし確認できなければ、リーディングシステムはドキュメント内で chap01ref の ID を見つけて CFI を修正するべきである(should)。(例えば、新しい itemrefchap01refitemref の前に挿入された場合は、望ましい要素の番号は 6 となり、CFI は /6/6[chap01ref]!... に修正される)。同様に、テキストロケーションアサーションは、参照されるターゲットロケーションを確認し、望ましいテキストロケーションを指す正しい CFI を得るために使用するべきである(should)。

もし処理中にアサーションの一つが失敗し、CFI を修正できない(ドキュメント内に ID が存在しない、または一致するテキストが見つからない)場合には、その CFI は無効な参照と見なさなければならない(must)。リーディングシステムが正確性を検証できない(例えば、CFI の処理中にドキュメントに内在する XML ID が利用できない)場合には、リーディングシステムは CFI アサーションを無視しなければならない(must)。

CFI 補正という観念からは、二つの異なる CFI(修正前の “陳腐化した” CFI と修正された CFI)が、同じロケーションを指す状況が生まれることがある。可能であれば修正された CFI を使用するべきである(should)。リーディングシステムやそれに関係するコンテンツ管理システムは、可能であれば陳腐化した CFI を修正された CFI に置き換えることを試みるべきである(should)。

NOTE

この仕様は、本来の機能が不十分である場合、CFI補正を支援するカスタム機能を開発することを推奨する。このような機能の開発方法の詳細はEPUB CFI の拡張を参照されたい。

4 EPUB CFI の拡張

拡張機能(パラメータ名の接頭辞を持ち、セミコロンで区切られた、CSV パラメータリスト)の提供によって、リーディングシステムは、例えば EPUB CFI フラグメントを更新されたドキュメントへ移行する際に、新規または実験的なヒューリスティックを適用することができる。

ベンダー固有のパラメータ名は、vnd. とそれに続くベンダー名で始めることを推奨(recommended)する。

実装は、解釈や構文解析できないあらゆるパラメーターを無視しなければならない(must)。

文献

引用規定

[EPUB 3.1] EPUB 3.1 .

[HTML] HTML .

[RFC2279] UTF-8, a transformation format of ISO 10646 (RFC 2279) . F. Yergeau, et al. January 1998.

[RFC2396] Uniform Resource Identifiers (URI): Generic Syntax (RFC 2396) . T. Berners-Lee, et al. August 1998.

[RFC2732] Format for Literal IPv6 Addresses in URL's (RFC 2732) . R. Hinden, et al. December 1999.

[RFC3986] Uniform Resource Identifier (URI): Generic Syntax (RFC 3986) . Berners-Lee, et al. January 2005.

[RFC3987] Internationalized Resource Identifiers (IRIs) (RFC 3987) . M Duerst, et al. January 2005.

[Unicode] The Unicode Consortium. The Unicode Standard..

[XML] Extensible Markup Language (XML) 1.0 (Fifth Edition) . T. Bray, et al. 26 November 2008.

参考

[DOM2 Traversal Range] Document Object Model (DOM) Level 2 Traversal and Range Specification. Joe Kesselman, et al. 13 November, 2000.

[XPTRSH] XPointer Shorthand Notation . 25 March 2003.