]> EPUB Canonical Fragment Identifier (epubcfi) Specification(日本語訳版)

この文書は「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. 用語に定義されている用語は本文中でも基本的に原文のままとした。

公開日:
2012-07-12
改訂日:
2013-04-05
協力:
イースト株式会社
翻訳:
Hiroshi Takase
編集:
Wataru Yoshimura

EPUB Canonical Fragment Identifier (epubcfi) Specification

2011年10月11日 勧告仕様

この版
http://www.idpf.org/epub/linking/cfi/epub-cfi-20111011.html
最新版
http://www.idpf.org/epub/linking/cfi/epub-cfi.html
前の版
http://www.idpf.org/epub/linking/cfi/epub-cfi-20110908.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

目次

1. 要約
1.1. 目的とスコープ
1.2. 用語
1.3. 適合性
2. EPUB CFI の定義
2.1. 前置き
2.2. 構文
2.3. 文字エスケープ
3. EPUB CFI の処理
3.1. パスの解決
3.1.1. 子ノードへのステップ参照 (/)
3.1.2. XML ID アサーション ([)
3.1.3. ステップ間接指定 (!)
3.1.4. 終了ステップ - 文字オフセット (:)
3.1.5. 終了ステップ - 時間オフセット (~)
3.1.6. 終了ステップ - 空間オフセット (@)
3.1.7. 終了ステップ - 時間-空間オフセット (~ + @)
3.1.8. テキストロケーションアサーション ([)
3.1.9. サイド指定 ([ + ;s=)
3.1.10. 例
3.2. ソート規則
3.3. Intra-Publication CFI
3.4. 単純なレンジ
3.5. ターゲットロケーション補正
4. EPUB CFI の拡張
参考資料

> 1 要約

> 1.1 目的とスコープ

本仕様、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)。

> 1.2 用語

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

Standard EPUB CFI

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

Intra-Publication EPUB CFI

Intra-Publication EPUB CFI は、一つの Content Document が同じ Publication 内の他のドキュメントを参照できるようにする。EPUB CFI に先行するパスはその Publication の Package Document を参照する。

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

> 1.3 適合性

この文書内のキーワードは"MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY"、"OPTIONAL"は [RFC2119] の記述に従って解釈される。

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

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

> 2 EPUB CFI の定義

> 2.1 前置き

このセクションは参考情報である。

フラグメント識別子は、リソース内のロケーションを定義する 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 構文の完全な定義は次のセクションに規定されている。

NOTE

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

> 2.2 構文

(EBNF 記法 ISO/IEC 14977
fragment = "epubcfi(" , ( path | range ) , ")" ;
path = step , local_path ;
range = path , "," , local_path , "," , local_path ;
local_path = { step | "!" } , [ termstep ] ;
step = "/" , integer , [ "[" , assertion , "]" ] ;
termstep = terminus , [ "[" , assertion , "]" ] ;
terminus = ( ":" , integer ) | ( "@" , number , ":" , number ) | ( "~" , number ) | ( "~" , number , "@" , number , ":" , number ) ;
number = ( digit-non-zero , { digit } , [ "." , { digit } , digit-non-zero ] ) | ( zero , "." , { digit } , digit-non-zero ) ;
integer = zero | ( digit-non-zero , { digit } ) ;
assertion = [ csv ] , { 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 } ;
string = character , { character } ;
digit = zero | digit-non-zero ;
digit-non-zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
zero = "0" ;
space = " " ;
circumflex = "^" ;
double-quote = '"' ;
square-brackets = "[" | "]" ;
parentheses = "(" | ")" ;
comma = "," ;
semicolon = ";" ;
equal = "=" ;
character = ? Unicode 文字 ? ;
> 

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)。

> 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 のみのサポートでもよい(may)。その結果、実装者は、[RFC3987] で定義されている IRI から URI 参照の変換処理をさらに必要としてよい(may)。禁止文字は次のようにエスケープする:

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

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

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

  • (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)

> 3 EPUB CFI の処理

> 3.1 パスの解決

EPUB CFI を Publication 内のロケーションへ解決する処理は、Package Document の package ルート要素から開始する。CFI のそれぞれのステップは、次のサブセクションで定める規則を適用しながら、左から右へ1つずつ処理される。

NOTE

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

> 3.1.1 子ノードへのステップ参照(/

斜線(/)とそれに続く整数のステップは次のような方法で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)。

> 3.1.2 XML ID アサーション([

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

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

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

先頭が感嘆符(!)のステップは、参照を追随せねばならず(must)、新しいターゲットノード(または XML ドキュメント全体が参照された場合はルート要素ノード)から始まる次のステップが適用されて続くことを示す。

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

  • Package Document の spine 内の itemref に対しては、参照は manifest 内で該当する(つまり、itemrefidref 属性が参照する)item 要素の href 属性によって定義される。

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

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

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

NOTE

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

> 3.1.4 終了ステップ‐文字オフセット(:

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

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

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

他のステップは終了するステップの文字はオフセットに従わなくてもよい(may)。

> 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])

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

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

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

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

ロケーションのサイド情報を保持するにはs パラメータを使用する。s は、二つの値をとることができ、b はロケーションが、ロケーションの before (前)のコンテンツに属し、aafter (後ろ)のコンテンツに属することを示す。このパラメーターは、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 例

このセクションは参考情報である。

次ような 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)

> 3.2 ソート規則

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

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

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

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

  4. XML の子ノード、文字オフセットや時間位置は、自然順序でソートする。

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

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

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

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

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

> 3.3 Intra-Publication CFI

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>

> 3.4 単純なレンジ

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)。レンジの開始は暗黙的に開始ロケーションンの後ろのコンテンツに属し、終了は暗黙的に終了ロケーションの前のコンテンツに属する。

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

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)。(例えば、新しい itemrefchap01refitemref の前に挿入された場合は、望ましい要素の番号は 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)。

NOTE

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

> 4 EPUB CFI の拡張

拡張仕様(パラメータ名の接頭辞を持ち、セミコロンで区切られた、CSV パラメータリスト)は、Reading System が、例えば、EPUB CFI フラグメントを更新されたドキュメントへ移行させるとき、手助けする新しいまたは実験的なヒューリスティックスを適用することを認めています。

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

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

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

> 文献

引用規定

[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.

[SVG] Scalable Vector Graphics (SVG) 1.1 (Second Edition). Erik Dahlstrom, et al. 09 June 2011.

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

参考