]>
この文書は「EPUB Canonical Fragment Identifier (epubcfi) Specification」を日本語訳したものです。最新の文書は http://idpf.org/epub/linking/cfi/epub-cfi.html です。原文もしくは最新の情報を参照したい場合は、 EPUB Canonical Fragment Identifier (epubcfi) Specification を参照ください。
この日本語訳は参考です。公式な文書ではありません。翻訳・解釈の正確性を保証しておりません。
また本文内の訳注は翻訳者の主観による補足です。
1.3. 用語と EPUB Publications 3.0 - 1.2. 用語に定義されている用語は本文中でも基本的に原文のままとした。
2011年10月11日 勧告仕様
前回のドラフトからの変更点の差分は、このリンクで入手可能である。
この文書(いくらかの規範的な訂正を含むかもしれない)のために、正誤表を参照されたい。
Copyright © 2010, 2011 International Digital Publishing Forum™
無断複写・転載を禁止する。本作品は合衆国法典第17編の下に保護されている。変更を伴うこの著作物の複製と頒布は、International Digital Publishing Forum (IDPF)の書面による許可を得ない限り禁止されている。
EPUBは International Digital Publishing Forum の登録商標である。
目次
本仕様、EPUB Canonical Fragment Identifier(epubcfi)は、フラグメント識別子を使って EPUB® Publication の任意のコンテンツを参照する標準方式を定める。
Web は、ハイパーリンクのコンセプトが非常に効果的であることを証明しているが、EPUB Publication は、内部へリンクする標準化された方法がないためハイパーリンクの多くの恩恵を利用できないでいる。個々の Reading System は独自の方法を開発・実装しているが、共通に理解できる構文がなくてはクロスプラットフォームの相互運用性を実現することはできない。しかし、この障壁を取り除くことによって恩恵を受けることのできる機能は様々である。読書中の位置の保持からナビゲーションへの注釈付けなど、どんな Publication の内部を指すことのできる機能は、開発者と Author にこれまで利用できなかった全く新しい次元を開く。
本仕様は、Publication 内のどのようなロケーションあるいはロケーションの単純な範囲でも一意に特定できる任意の構造参照(即ち、EPUB CFI)を定義してこの状況の改善を試みる。以下の配慮がこのスキームの設計と適応範囲に著しく影響する:
コンテンツ参照に使用するメカニズムは相互運用可能にするべきで(should)、一つの Reading System で作成された読書中の位置は他のシステムでも利用できるようにするべきである(should)
EPUB コンテンツへのドキュメント参照は、既存のハイパーリンクが Web 全般で参照できるのと同じ方法で使用できるべきである(should)。
EPUB ファイル内のそれぞれのロケーションは、ドキュメントを変更する必要なく特定できるべきである(should)。
同じ論理ロケーションを参照するすべてのフラグメント識別子は比較したとき等しくなるべきである(should)。
ソートおよび比較の検証を含む比較演算は、参照先ファイルへのアクセスなしに行えるべきである(should)。
簡単な処理は元ファイルへのアクセスなしにできるべきである(should)。(例えば、ファイル内部への深層参照がある場合、ファイルの先頭への参照は簡単な処理で生成できるべきである(should)。)
識別子の解決は合理的に効率化されているべきである(should)。(例えば、最終章をポイントするフラグメント識別子の解決に第一章の処理は要求されない。)
参照のターゲットロケーションはパーサーの変化やドキュメントの改版を経て修復できるべきである(should)。
簡潔で切れ目のない表現をサポートするべきである(should)。
将来の参照を修復する発見的解決法に適応できる拡張可能なメカニズムを提供すべきである(should)。
この仕様で使われる EPUB 固有の用語の定義については EPUB 仕様書を参照されたい。
出版物レベルの EPUB CFI は、EPUB Publication の内部へリンクする。EPUB CFI に先行するパスは Publication のロケーションを参照する。
Intra-Publication EPUB CFI は、一つの Content Document が同じ Publication 内の他のドキュメントを参照できるようにする。EPUB CFI に先行するパスはその Publication の Package Document を参照する。
詳しくは Intra-Publication CFI を参照されたい。
このセクションは参考情報である。
フラグメント識別子は、リソース内のロケーションを定義する IRI [RFC3987] の一部である。構文的には、リソース IRI の終わりに付属するハッシュ(#
)で始まるセグメントである。HTML ドキュメントには、ID および名前付きアンカーがフラグメント識別子として使用されている。XML ドキュメントには、ID を参照するために Shorthand XPointer [XPTRSH] の表記が用いられている。
Canonical Fragment Identifier(CFI)は、これらと似たような構成であるが EPUB Publication 内部のロケーションを表現する。例えば:
book.epub#epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/3:10)
ハッシュの直後に続く関数のような文字列(epubcfi(…)
)は、このフラグメント識別子がこの仕様の定義するスキームに従っていることを示し、括弧で囲まれた値は特定の Publication(book.epub
)内部のロケーションを参照するのに使われる構文である。パスの解決によって定義された処理ルールを使って、Reading System は構文を解析し、Publication の中の該当する Content Document を開いて、指定されたロケーションを User のために読み込むことができる。
EPUB CFI 構文の完全な定義は次のセクションに規定されている。
あらゆる XML+ZIP ベースのファイルフォーマットのための、より汎用的な CFI のようなスキームが将来定義されるかもしれないため、スキーム名の先頭に epub
を付加している。
Unicode 文字
利用できる Unicode 文字の定義は [XML 1.0] と同じである。これには、サロゲートブロック、FFFE、および FFFF を除く:
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
ドキュメントの著者は、[Unicode] の section 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つのローカル(または相対)パスを後ろに持ったパスである。
ステップは、ナビゲーションステップまたは終了ステップのいずれかである。ナビゲーションステップは、必要に応じて(例えば、要素を数える、子要素を処理する、あるいは参照をたどるために)繰り返してもよい(may)。終了ステップはただ一度だけ出現してもよい(may)。その場合、それはシーケンスの最後のステップでなければならない(must)。
括弧内の従属文字列は、伸長可能なアサーションであり、パスの移動や、同じ文書の異なる版へのパスの移行の精度を向上させる。これらのアサーションは、ドキュメント内でたどる要素に関する付加情報を保持しており、Publication が変更されても目的のロケーションを修復することが可能になる。
上記の構文で定義される value
はどのような文字のシーケンスでも許可するが、次に示す文字には曲折アクセント記号(^
)を使ってエスケープし、解析を妨げぬようにしなければならない(must):
角括弧 ([
,]
)
曲折アクセント記号 (^
)
コンマ (,
)
丸括弧 ((
,)
)
セミコロン (;
)
テキスト 2[1]
の後ろのロケーションを指す EPUB CFI の例。
epubcfi(/6/7[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])
パスとレンジの中での数字と整数の利用には次のルールが適用される:
数字または整数の前に来るゼロは利用できない(一意性を保証するため)。
数字の小数部分の末尾のゼロは利用できない。
ゼロは整数 0
で表現しなければならない(must)。
1 > N > 0
のレンジの数字は 0.
で始めなければならない(must)。
整数(integral numbers)は整数(integers)で表さなければならない(must)。
構文で説明されているように、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 のみのサポートでもよい(may)。その結果、実装者は、[RFC3987] で定義されている IRI から URI 参照の変換処理をさらに必要としてよい(may)。禁止文字は次のようにエスケープする:
(X)HTML コンテキスト:
IRI 参照は、EPUB Publication を構成するさまざまな種類のドキュメントで使用されるように設計されている。XML および XHTML は、独自の文字エスケープ規則を必要とする別の挿入コンテキストを意味する。例えば、二重引用文字または山括弧は、マークアップ構文内で重要な区切り文字と競合するので、 &xxx;
特殊シーケンス(文字参照)を使ってエスケープしなければならない(must)。
文字エスケープを複数回適用して、EPUB CFI をエスケープまたはエスケープの解除をする場合、元の形式に戻すにはその逆の順序で適用しなければならない(must)。例えば、[ EPUB-CFI -> IRI -> XHTML ] ならば、 [ XHTML -> IRI -> EPUB-CFI ] の適用順序となる。
次の例は、(曲折アクセント記号 '^
' によるエスケープだけの)EPUB CFI の「未加工」の形を示している。最後部のアサーションテキスト、およびエスケープされた左右角括弧と曲折アクセント記号に注目されたい(エスケープされていないテキストは 'Ф-"spa ce"-99%-aa[bb]^'である):
epubcfi(/6/7!/4/10/2/1:3[Ф-"spa ce"-99%-aa^[bb^]^^])
IRI で使用される場合、アサーション内の空白文字はパーセントエスケープ ('%20
') してもよい(may)。また、パーセント文字自体はエスケープ('%25
')しなければならない(must)。角括弧 '[
' ']
' とセミコロン ':
' は(URI の仕様によれば)「予約」文字となっているが、IRI プロセッサーがフラグメント識別子を抽出する際の区切り文字としては意味も持たないため、エスケープする必要はない。(つまり、IRI のフラグメン構成部品は、 '#
' 文字以降のテキストをコピーして曖昧さなく解析できる。)曲折アクセント記号 '^
' もまた “賢明はでない”(または “安全ではない”)文字の部類に属するが、EPUB フラグメント識別子のスキームではエスケープする必要はない。次は IRI のエスケープされた EPUB CFI である:
book.epub#epubcfi(/6/7!/4/10/2/1:3[Ф-"spa%20ce"-99%25-aa^[bb^]^^])
XML 属性の中に IRI を指定する場合、二重引用文字(引用符)は属性値の区切り文字として重要であるため '"
' にエスケープする。 キリルの “EF” 文字('Ф')は EPUB XML ドキュメントでそのままサポートされていることに注目されたい。EPUB XML ドキュメントは(UTF-8 エンコーディングを使って Unicode 文字のレパートリーを表現するため)エンコードする必要はない:
book.epub#epubcfi(/6/7!/4/10/2/1:3[Ф-"spa%20ce-99%25"-aa^[bb^]^^])
IRI を URI に変換する必要がある場合、非 ASCII のキリルの “EF” 文字 ('Ф') は2バイト (16 進数で、'0xd0 0xa4
') へパーセントエスケープする。結果として次のような URI となる:
book.epub#epubcfi(/6/7!/4/10/2/1:3[%d0%a4-"spa%20ce"-99%25-aa^[bb^]^^])
URI エンコード/デコード API は、次の例に示すとおり、通常「強引に」パーセントエンコードを行う。曲折アクセント記号 '^
'(%5E)、角括弧 '[
'(%5B)']
'(%5D)、二重引用符 '"
'(%22)が、(URI の中では “安全ではない”/“賢明はでない” 性質を持つため)どのようにパーセントエンコードされるかにも注意する必要がある:
book.epub#epubcfi(/6/7!/4/10/2/1:3%5B%D0%A4-%22spa%20ce%22-99%25-aa%5E%5Bbb%5E%5D%5E%5E%5D)
EPUB CFI を Publication 内のロケーションへ解決する処理は、Package Document の package
ルート要素から開始する。CFI のそれぞれのステップは、次のサブセクションで定める規則を適用しながら、左から右へ1つずつ処理される。
以下のサブセクションでの EPUB CFI の例は、用例のサンプルドキュメントに基づく。
/
)斜線(/
)とそれに続く整数のステップは次のような方法で1つまたは複数の子ノードを参照する:
それぞれの要素は正の偶数のインデックスが割り当てられる。最初の要素のインデックスは 2
が割り当てられる。2番目は 4
など。
最初の要素の前や、要素の間や、最後の要素の後ろに位置する非要素ノードのそれぞれの(空かもしれない)コレクションは、その位置に応じて奇数のインデックスが与えられる。(これらは通常、Publication のテキストを参照する。)
テキストノード以外の非要素ノードは常に無視される。(この仕様では、テキストノードは、テキスト、CDATA セクション、そして実体参照を含む。)
このインデックス方法は、XML パーサーが行う空白テキストノード、CDATA セクション、および実体参照の処理にノード識別が影響を受けないようにする。(例えば、パーサーは、空白だけのテキストノードを空白1文字にまとめるのかどうか、テキスト、CDATA セクション、そして実体参照を異なったノードとして保つかどうか、または複数ノード内のテキストを改行するかどうかによって起こりうる曖昧さを避けるためである。)
Standard EPUB CFI では、CFI の先頭のステップは斜線(/
)とそれに続く(Package Document の package
ルート要素の spine
子要素を参照する)偶数の番号で始まらなければならない(must)。CFI がたどる Package Document は、Publication の META-INF/container.xml
ファイルの中のデフォルトのレンディションとして指定されていなければならない(must)。(つまり、 container.xml
の最初の rootfile
要素で参照される Package Document であること。)
Intra-Publication EPUB CFIでは、最初のステップは斜線とそれに続く(package
要素から始まる Package Document 内の位置を参照する)ノード番号で始まらなければならない(must)。
[
)EPUB CFI が、ID [XML] を含んだ要素を参照する場合、該当するパスのステップは、(斜線(/
)と要素を特定する偶数の後ろに)角括弧で囲んだその ID を含めなければならない(must)。
識別子の仕様は、CFI のスキームを堅牢にする。Reading System は CFI で参照された位置が最初に目的とした位置でないと判断してもよく(may)、コンテンツ内の求められる目的の箇所に到達するステップのセットを計算するために識別子を使用してもよい(may)(ターゲットロケーション補正を参照されたい)。この追加された堅牢性のコストは、CFI 文字列の比較(とソート)はすべての括弧で囲まれた文字列を論理的に除去した後でのみ実行してもよい(may)(ソート規則を参照されたい)。
!
)先頭が感嘆符(!
)のステップは、参照を追随せねばならず(must)、新しいターゲットノード(または XML ドキュメント全体が参照された場合はルート要素ノード)から始まる次のステップが適用されて続くことを示す。
次の参照のみが有効である:
:
)先頭のコロン(:
)とそれに続く整数の終了ステップは文字オフセットを参照する。指定された文字オフセットの要素ノードへの適用は、その要素が [HTML5] img
要素であり、文字オフセットを適用できるテキストを含んだ alt
属性を持つ場合のみ行なってもよい(may)。
テキストノードでは、オフセットはゼロベースで常に文字の間の位置を参照する。従って、0
は最初の文字の前を意味し、UTF-16での全長の数は最後の文字の後ろを意味する。使用できるテキストの UTF-16 の長さよりも大きな文字オフセット値を指定してはならない(must not)。
文字オフセット終了ステップは /N
ステップに続く場合のみ指定してもよい(may)。XHTML Content Document では、N
は img
要素の alt
のテキストを参照している時は偶数で、テキストノードのテキストを参照している時は奇数となる。
他のステップは終了するステップの文字はオフセットに従わなくてもよい(may)。
~
)先頭のチルダ (~
) とそれに続く数字の終了ステップは、オーディオまたはビデオの秒単位の時間位置を示している。
時間オフセット終了ステップの後ろに他のステップを続けることはできない。
@
)先頭のアットマーク(@
)とそれに続くコロン区切りの二つの数字は、画像またはビデオの二次元空間位置を示す。二つの数字は x
軸と y
軸のスケーリングされた位置を表し、画像のネイティブまたは表示サイズに関わらず 0
から 100
の範囲でなければならない(must)。(つまり、左上は 0:0
で右下は 100:100
となる。)
空間オフセット終了ステップの後ろに他のステップを続けることはできない。
~
+ @
)時間位置と空間位置は同時に使用してもよい(may)。この場合、時間指定は空間指定よりも構文的に前に置かなければならない(must)。(例えば、~23.5@5.75:97.6
は、ビデオの 23.5 秒のフレームの左下を参照する。)
時間-空間オフセット終了ステップの後ろに他のステップを続けることはできない。
[
)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])
マッチさせるために含むことのできる、先行または後続のテキストの長さに制約はない。テキストは、ドキュメントから要素の境界を無視して取り出され、空白文字は常にまとめられる。(つまり、空でない連続する空白文字列は常に単一の空白文字に置換される。)
Reading System は、(テキストがマッチしないために)CFIで参照されるロケーションが本来の目的のロケーションではない、と判断してもよく(may)、コンテンツ内の目的となる宛先に到達する一連のステップを計算するために、先行/後続のテキストを利用してもよい(may)(ターゲットロケーション補正を参照されたい。)。この追加された堅牢性のコストは、CFI 文字列の比較(とソート)はすべての括弧で囲まれた文字列を論理的に除去した後でのみ実行してもよい(may)(ソート規則を参照されたい)。
[
+ ;s=
)状況によっては、参照がロケーションのどちらの側を指しているのか、という情報の保持が重要となる。例えば、動的にページを作成する環境でロケーションを解決する場合、ロケーションが前のコンテンツに属している場合と後のコンテンツに属している場合では違いがある。(例えば、改ページに際して、ページの表を表示するのか裏を表示するのか判断する場合。)
ロケーションのサイド情報を保持するにはs
パラメータを使用する。s は、二つの値をとることができ、b
はロケーションが、ロケーションの before (前)のコンテンツに属し、a
は after (後ろ)のコンテンツに属することを示す。このパラメーターは、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 の比較には関与しない(ソート規則を参照されたい。)
サイドは空間の終了へのロケーションには定義されない。
サイド指定は、ロケーションで何らかのブレークが起こる場合にのみ意味を持つ(例えば、改ページや改行。)
このセクションは参考情報である。
次ような Package Document があるとする:
<?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 Content Document の 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
タグに定義されていなければ、常にロケーションに該当するテキストノードまたはテキストノードのコレクション(例え空の場合であっても)から開始し、Package Document のルートまで祖先と参照チェーンをたどるべきである(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)
同じ EPUB Publication を参照する複数の EPUB CFI の相対的なロケーションを、ソートしたり計算したりするには、次のルールに従わなければならない(must):
EPUB CFI スキームデータは、文字エスケープで説明されているルールの通りに、アンエスケープされた形式でなければならない(must)。
すべての角括弧で囲まれたアサーションは完全に除去(無視)される。
シーケンスの中では、先に来るステップの方が重要である。
XML の子ノード、文字オフセットや時間位置は、自然順序でソートする。
y
位置は x
位置よりも重要である。
省略された空間位置は他のすべての空間位置に先行する。
省略された時間位置は他のすべての時間位置に先行する。
時間位置は空間位置よりも重要である。
ステップの種類は、重要度の低いものから高いものへと、次のような順番となる:
文字オフセット(:
)、子(/
)、時間-空間(~
または @
)、参照/間接指定(!
).
EPUB CFI は、コンテナ内部のコンテンツの参照に使用することができる。このような参照は、Package Document への参照とそれに続く CFI を指定して実現されるが、CFI の解決は package
ルート要素から開始しなければならない(must)。
例えば、上記の例のPackage Document を使って、chapter02.xhtml
の最後のロケーションへの参照は次のように記述できるだろう:
<a href="../pub.opf#epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[;s=b])">location</a>
EPUB CFI は、開始ロケーションから終了ロケーションまでの簡潔なレンジを表すことができる。レンジは parent パス(P
)、start サブパス(S
)、そしてend サブパス(E
)の3つによって、次の形式で表さなければならない(must):
epubcfi(P,S,E)
parent パスは、レンジの開始と終了のロケーションの両方のパスを解決するための共通のステップで終わらなければならず(must)、start と end のそれぞれのサブパスはドキュメント内で減少しない順序でロケーションへと解決しければならない(must)。
レンジの開始と終了ロケーションを決めるには、parent パスを start と end サブパスに連結して開始ロケーションパス(PS
)と終了ロケーションパス(PE
)を生成しなければならない(must)。
上記のサンプルドキュメントを使った次のレンジは yyy
の2番目の y
から数字 3
まで(含めた)テキストを表す:
epubcfi(/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4)
レンジの比較は、それぞれの PS
、次にそれぞれの PE
の構成部品によって行わなければならない(must)。
要素の最初から最後までのレンジを表すショートハンドとして要素へのパスを使用するのは適切ではない。単独で表記されたパスは常にロケーションの位置(ポイント)を表し、レンジは上記で解説した表記で表す。要素の終わりへの参照を示す特殊なステップが存在しないのは、それによってドキュメントのコンテンツを調べることなくソートするのが不可能になるためである。
コンテキストで単独のロケーションが指定されるべきところにレンジが使用された場合、その開始ロケーションを使用しなければならない(must)。
サイド指定パラメータをレンジに使用してはならない(must not)。レンジの開始は暗黙的に開始ロケーションンの後ろのコンテンツに属し、終了は暗黙的に終了ロケーションの前のコンテンツに属する。
EPUB Publication は時間とともに改訂、修正、或いは変更されてもよく(may)、以前のバージョンの CFI から変更されたドキュメントの EPUB CFI を導き出すことは有用である。この仕様は、CFI に影響するコンテンツの変更を発見し補正する二つのメカニズムを提供している。それは、ID [XML] とテキストロケーションアサーションである。
Reading System が CFI を処理する際には、遭遇するすべてのアサーションの正確さをチェックすべきである(should)。例えば、/6/4[chap01ref]!...
のパスを例にすると、Reading System は、要素 4
の処理中にその要素は chap01ref
に一致する ID を持っていることを確認するべきである(should)。(この例では、spine
内の itemref
が該当する。) もし確認できなければ、Reading System はドキュメント内で chap01ref
の ID を見つけて CFI を修正するべきである(should)。(例えば、新しい itemref
が chap01ref
の itemref
の前に挿入された場合は、望ましい要素の番号は 6
となり、CFI は /6/6[chap01ref]!...
に修正される。) 同様に、テキストロケーションアサーションは、参照されるターゲットロケーションを確認し、望ましいテキストロケーションを指す正しい CFI を得るために使用するべきである(should)。
もし処理中にアサーションの一つが失敗し、CFI を修正できない(ドキュメント内に ID が存在しない、または一致するテキストが見つからない)場合には、その CFI は無効な参照と見なさなければならない(must)。Reading System が正確性を検証できない(例えば、CFI の処理中にドキュメントに内在する XML ID が利用できない)場合には、Reading System は CFI アサーションを無視しなければならない(must)。
CFI 補正という観念からは、二つの異なる CFI(修正前の “陳腐化した” CFI と修正された CFI)が、同じロケーションを指す状況が生まれることがある。可能であれば修正された CFI を使用するべきである(should)。Reading System やそれに関係するコンテンツ管理システムは、可能であれば陳腐化した CFI を修正された CFI に置き換えることを試みるべきである(should)。
この仕様は、本来の機能が不十分である場合、CFI補正を支援するカスタム機能を開発することを推奨する。このような機能の開発方法の詳細はEPUB CFI の拡張を参照されたい。
拡張仕様(パラメータ名の接頭辞を持ち、セミコロンで区切られた、CSV パラメータリスト)は、Reading System が、例えば、EPUB CFI フラグメントを更新されたドキュメントへ移行させるとき、手助けする新しいまたは実験的なヒューリスティックスを適用することを認めています。
拡張機能(パラメータ名の接頭辞を持ち、セミコロンで区切られた、CSV パラメータリスト)の提供によって、Reading System は、例えば EPUB CFI フラグメントを更新されたドキュメントへ移行する際に、新規または実験的なヒューリスティックを適用することができる。
ベンダー固有のパラメータ名は、vnd.
とそれに続くベンダー名で始めることを推奨する。
実装は、解釈や構文解析できないあらゆるパラメーターを無視しなければならない(must)。
[RFC2119] Key words for use in RFCs to Indicate Requirement Levels (RFC 2119) . March 1997.
[RFC2279] UTF-8, a transformation format of ISO 10646 (RFC 2279) . January 1998.
[RFC2396] Uniform Resource Identifiers (URI): Generic Syntax (RFC 2396) . August 1998.
[RFC2732] Format for Literal IPv6 Addresses in URL's (RFC 2732) . December 1999.
[RFC3986] Uniform Resource Identifier (URI): Generic Syntax (RFC 3986) . January 2005.
[RFC3987] Internationalized Resource Identifiers (IRIs) (RFC 3987) . January 2005.
[SVG] Scalable Vector Graphics (SVG) 1.1 (Second Edition). 09 June 2011.
[XML] Extensible Markup Language (XML) 1.0 (Fifth Edition). 26 November 2008.
[XPTRSH] XPointer Shorthand Notation.