This specification, EPUB Canonical Fragment Identifier (epubcfi), defines a standardized method for referencing arbitrary content within an EPUB® Publication through the use of fragment identifiers.
The web has proven that the concept of hyperlinking is tremendously powerful, but EPUB publications have been denied much of the benefit that hyperlinking makes possible because of the lack of a standardized scheme to link into them. Although proprietary schemes have been developed and implemented for individual reading systems, without a commonly-understood syntax there has been no way to achieve cross-platform interoperability. The functionality that can see significant benefit from breaking down this barrier, however, is varied: from reading location maintenance to annotation attachment to navigation, the ability to point into any Publication opens a whole new dimension not previously available to developers and Authors.
This specification attempts to rectify this situation by defining an arbitrary structural reference that can uniquely identify any location, or simple range of locations, in an EPUB publication: the EPUB CFI. The following considerations have strongly influenced the design and scope of this scheme:
The mechanism used to reference content should be interoperable: references to a reading position created by one reading system should be usable by another.
Document references to EPUB content should be enabled in the same way that existing hyperlinks enable references throughout the web.
Each location in an EPUB file should be able to be identified without the need to modify the document.
All fragment identifiers that reference the same logical location should be equal when compared.
Comparison operations, including tests for sorting and comparison, should be able to be performed without accessing the referenced files.
Simple manipulations should be possible without access to the original files (e.g., given a reference deep in a file, it should be possible to generate a reference to the start of the file).
Identifier resolution should be reasonably efficient (e.g., processing of the first chapter is not necessary to resolve a fragment identifier that points to the last chapter).
References should be able to recover their target locations through parser variations and document revisions.
Expression of simple, contiguous ranges should be supported.
An extensible mechanism to accommodate future reference recovery heuristics should be provided.
In the case of both [=standard EPUB CFIs=] and [=intra-publication EPUB CFI=], this specification conforms with the guidelines expressed by W3C in Section 6. Best Practices for Fragid Structures [[fragid-best-practices]].
In other words, both standard CFI URIs (e.g., "book.epub#epubcfi(…)
", referred media type
"application/epub+zip
") and intra-publication CFI URIs (e.g.,
"package.opf#epubcfi(…)
", referred media type
"application/oebps-package+xml
") make use of a fragment identifier syntax that does not
overlap with existing schemes in the context of the aforementioned media types' suffix registrations
(i.e., "-xml
" and "-zip
").
This specification uses terminology defined in EPUB 3.3 [[epub-33]].
It also defines the following terms:
A publication-level EPUB CFI links into an EPUB publication. The path preceding the EPUB CFI references the location of the EPUB publication.
An intra-publication EPUB CFI allows one EPUB content document to reference another within the same Rendition of an EPUB publication. The path preceding the EPUB CFI references the current Rendition's package document.
Refer to Intra-Publication CFIs for more information.
Only the first instance of a term in a section links to its definition.
A fragment identifier is the part of an IRI [[rfc3987]] that defines a location within a resource.
Syntactically, it is the segment attached to the end of the resource IRI starting with a hash
(#
). For HTML documents, IDs and named anchors are used as fragment identifiers,
while for XML documents the Shorthand XPointer [[xptr-framework]] notation is used to refer to a
given ID.
A Canonical Fragment Identifier (CFI) is a similar construct to these, but expresses a location within an EPUB publication. For example:
The function-like string immediately following the hash (epubcfi(…)
) indicates that this
fragment identifier conforms to the scheme defined by this specification, and the value contained in
the parentheses is the syntax used to reference the location within the specified EPUB publication
(book.epub
). Using the processing rules defined in Path
Resolution, any reading system can parse this syntax, open the corresponding EPUB content
document in the EPUB publication and load the specified location for the user.
A complete definition of the EPUB CFI syntax is provided in the next section.
epub
has been prepended to the name of the scheme, as a more generic CFI-like scheme
might be defined in the future for all XML+ZIP-based file formats.
A Canonical Fragment Identifier (CFI) consists of an initial sequence epubcfi
that
identifies this particular reference method, and a parenthesized path or range. A path is built up
as a sequence of structural steps to reference a location. A range is a path followed by two local
(or relative) paths that identify the start and end of the range.
Steps are denoted by the forward slash character (/
), and are used to traverse XML
content. The last step in a CFI path represents a location within a document, either structural (XML
element), textual (character data), or aural-visual (image, audio, or video media). Such terminating
steps MAY be complemented by an OPTIONAL "offset", which denotes a particular character position,
temporal or spatial fragment.
Substrings in brackets are extensible assertions that improve the robustness of traversing paths and migrating them from one revision of the document to another. These assertions preserve additional information about traversed elements of the document, which makes it possible to recover intended location even after some modifications are made to the EPUB publication.
Although the value definition in the syntax above allows any a sequence of
characters, a circumflex (^
) MUST be used to escape the following characters to ensure
their presence does not interfere with parsing:
brackets ([
,]
)
circumflex (^
)
comma (,
)
parentheses ((
,)
)
semicolon (;
)
The following rules apply to the use of numbers and integers within the path or range:
leading zeros are not allowed for numbers or integers (to ensure uniqueness);
trailing zeros are not allowed in the fractional part of a number;
zero MUST be represented as the integer 0
;
numbers in the range 1 > N > 0
MUST have a leading 0.
;
integral numbers MUST be represented as integers.
As described in Syntax, the EPUB CFI grammar contains characters
that have a special purpose as delimiters within a fragment identifier expression. These characters
MUST be escaped using the circumflex '^
' character when not intended for use as
delimiters, so that they can appear within the EPUB CFI data without being mistaken for delimiters.
Depending on the usage context of such EPUB CFI, further character escaping MAY be necessary in
order to ensure that all potentially-conflicting text tokens are encoded correctly.
IRI and URI references:
The EPUB CFI (fragment identifier) scheme is designed to be used within URI and IRI
references. The [[rfc3986]] specification defines a number of "reserved" characters
that have a specific purpose as delimiters, and which MAY need to be escaped in
cases when they would otherwise conflict with the syntactical structure of the
URI/IRI reference. The character used for escaping is the percent sign
'%
', and escapable characters get percent-encoded. For example, the
percent character itself becomes "%25
" when it gets escaped (note the
difference with EPUB CFI's circumflex '^
', which gets escaped using a
double character '^^
').
Unlike IRI references, URI references require unicode characters to be ASCII-encoded. Although the EPUB specification itself is based on IRIs (i.e. authors and production tools are expected to use IRIs), some systems or APIs might only support URIs. As a result, implementors MAY still need too handle the conversion of IRI to URI references, as defined in [[rfc3987]]. Disallowed characters are escaped as follows:
Each disallowed character is converted to UTF-8 [[rfc2279]] as one or more
bytes. The disallowed characters in URI references include all non-ASCII
characters, plus the excluded characters listed in Section 2.4 of
[[rfc2396]], except for the number sign '#
' and percent sign
'%
' and the square bracket characters re-allowed in
[[rfc2732]].
The resulting bytes are escaped with the URI escaping mechanism (that is,
converted to '%HH
', where HH is the hexadecimal notation of the
byte value).
The original character is replaced by the resulting character sequence.
(X)HTML context:
IRI references are designed to be used in the various types of documents that EPUB
publications comprise. XML and (X)HTML represent yet another insertion context that requires
specific character escaping rules. For example, double quote characters or angle brackets
conflict with significant delimiters in the markup syntax, and MUST therefore be escaped
using the &xxx;
special sequence (character reference).
When multiple layers of character escaping are applied to escape or unescape an EPUB CFI, they MUST be applied in reverse order to revert back to the original form. For example, [ EPUB-CFI -> IRI -> (X)HTML ] becomes [ (X)HTML -> IRI -> EPUB-CFI ]
The process of resolving an EPUB CFI to a location within an EPUB publication begins with the root
package
element of the package document. Each step in the CFI is then processed one
by one, left to right, applying the rules defined in the following subsections.
The EPUB CFI examples in the following subsections are based on the sample documents in Examples.
/
)A step with a slash (/
) followed by a positive integer refers to either a child
element or a chunk of character data, as per the rules defined herein:
[[xml]] content other than element and character data is ignored. Note that as per the [[xml]] specification, character data inside CDATA sections is included, and conversely, XML comments are ignored.
[[xml]] character data that corresponds to insignificant whitespace (typically used for markup formatting/indenting) is preserved. Character and entity references are considered expanded, and character data is obtained from the "included replacement text" (as per the terminology defined in the [[xml]] specification).
[[xml]] character data that is interspersed amongst sibling child elements (i.e., "mixed content" context) is logically organised into (potentially-empty) chunks of contiguous character data: the first chunk is located before the first child element (left sibling), the last chunk is located after the last child element (right sibling), and there is one chunk between each pair of child elements. When there are no child elements, there is one (potentially-empty) chunk of character data. Consecutive (potentially-empty) chunks of character data are each assigned odd indices (i.e., starting at 1, followed by 3, etc.).
Child [[xml]] elements are assigned even indices (i.e., starting at 2, followed by 4,
etc.). Additionally, 0 is a valid index that refers to a non-existing element which
virtually precedes the first potentially-empty chunk of character data within the parent
element's content. Similarly, n+2
is a valid index that refers to a
non-existing element which virtually follows the last potentially-empty chunk of
character data, where n
is the even index of the last child element, or 0
if there are no child elements. CFI processors (e.g., reading systems) MUST be capable
of consuming (e.g., parsing and interpreting) CFI expressions containing references to
the 0 and n+2
"virtual" elements, even when the first (or last,
respectively) chunk of character data is empty. Conversely, the *production* of such CFI
expressions is governed by the following conformance requirement: if the first chunk of
character data is empty, a CFI expression SHOULD NOT be constructed using a reference to
the "virtual" element at index 0, instead the "real" first child element (at index 2)
SHOULD be referred to. Similarly, if the last chunk of character data is empty, a CFI
expression SHOULD NOT be constructed using a reference to the "virtual" element at index
n+2
, instead the "real" last child element (at index n
)
SHOULD be referred to.
The "virtual" first / last elements mechanism might facilitate interoperability with certain instances of DOM Ranges, whereby non-existing elements are used to span across textual content without relying on character offsets at the start/end boundaries.
For a [=standard EPUB CFI=], the leading step in the CFI MUST start with a slash (/
)
followed by an even number that references the spine
child element of the package
document's root package
element. The package document traversed by the CFI MUST be
the one specified as the Default Rendition in the EPUB publication's
META-INF/container.xml
file (i.e., the package document referenced by the first
rootfile
element in container.xml
).
For an [=intra-publication EPUB CFI=], the first step MUST start with a slash followed by a node
number that references a position in package document starting from the root
package
element.
[
)When an EPUB CFI references an element that contains an ID [[xml]], the corresponding path step
MUST include that ID in square brackets (i.e., after the slash (/
) and even number
that identifies the element).
Specification of identifiers adds robustness to the CFI scheme: a reading system can determine that the location referenced by the CFI is not the original intended location, and can use the identifier to compute the set of steps that reach the desired destination in the content (see Intended Target Location Correction). The cost of this added robustness is that comparison (and sorting) of CFI strings can be performed only after logically stripping all bracketed substrings (see Sorting Rules).
!
)If a step, or a sequence of steps, points to an element that references another document, the
exclamation mark (!
) MUST be used whenever that step is immediately followed by an
expression that applies to the referenced document ("indirection"). The following expression is
then resolved from the root element of the referenced XML document, or from the targeted XML
fragment (when specified).
Only the following references are honored:
For itemref
in the package document spine
, the reference is
defined by the href
attribute of the corresponding item
element in the manifest
(i.e., that the itemref
's
idref
attribute references).
For [[html]] iframes
and embed
elements, references are defined by the src
attribute
For the [[html]] object
element, the reference is defined by the data
attribute
For [[svg]] image
and use
elements,
references are defined by the xlink:href
attribute
This scheme does not take into account hyperlinks, only embedding references. Consequently,
it is illegal to follow links from the [[html]] (or [[svg]]) a
element.
:
)A path terminating with a leading colon (:
) followed by an integer refers to a
character offset. The given character offset MAY apply to an element only if this element is the
[[html]] img
element with an alt
attribute containing the text to which
the character offset applies.
For XML character data, the offset is zero-based and always refers to a position between
characters, so 0
means before the first character and a number equal to the total
UTF-16 length means after the last character. A character offset value greater than the UTF-16
length of the available text MUST NOT be specified.
In this specification, the definition of an "offset" within XML character data is based on the UTF-16 text encoding, whereby each "character" (Unicode code point) MAY be represented using a single 16-bit code unit, or two units (surrogate pairs, for Unicode characters outside of BMP / Basic Multilingual Plane) [[unicode]]. A CFI "character offset" is a zero-based number that refers to a position between UTF-16 code units. Here, the "length" of the text is the total count of 16-bit units. Offset zero therefore means before the first 16-bit unit, and a number equal to the "length" of the text means after the last 16-bit unit. An offset value greater than the "length" of the text MUST NOT be specified.
Counting the number of text "characters" based on UTF-16 code units (instead of Unicode code points) is compatible with the DOM Range model [[dom]], and with the String API [[ecma-262]]
A character offset MAY follow a /N
step. For XHTML content documents, N
would be an even number when referencing the alt
text of an img
element, and N
would be odd when referencing XML character data within
elements.
CFI expressions that terminate with an odd numbered /N
step SHOULD include an
explicit character offset. However, CFI processors (e.g., reading systems) MUST be capable of
consuming (i.e., parse + interpret / render) such CFI expressions, by assuming the implicit
/N:0
character offset.
~
)A path terminating with a leading tilde (~
) followed by a number indicates a
temporal position for audio or video measured in seconds.
@
)A path terminating with a leading at sign (@
) followed by two colon-separated
numbers indicates a 2D spatial position within an image or video. The two numbers represent
scaled locations in the x
and y
axes, and MUST be in the range
0
to 100
regardless of the image's native or display dimensions
(i.e., the upper left is 0:0
and the lower right is 100:100
).
~
+ @
)A temporal and a spatial position MAY be used together. In this case, the temporal specification
MUST precede the spatial one syntactically (e.g., ~23.5@5.75:97.6
refers to a point
23.5 seconds into a video in the lower left of the frame).
[
)An EPUB CFI MAY specify a substring that is expected to precede and/or follow the encountered point, but such assertions MUST occur only after a character offset.
For example, the following expression asserts that yyy
is expected immediately
before the encountered point using the sample content
below:
An additional substring that follows the encountered point can be given after a comma. For example:
refers to the position marked by the asterisk:
If there is no preceding text, or only trailing text is specified, a comma MUST immediately precede the text assertion:
There is no restriction on the amount of the preceding and following text that can be included in the match. Text is taken from the document ignoring element boundaries and whitespace is always collapsed (i.e., a non-empty sequence of contiguous whitespace characters is always replaced with a single space character).
A reading system can determine that the location referenced by the CFI is not the original intended location (due to non-matching text), and can use the preceding/trailing text to compute the set of steps that reach the desired destination in the content (see Intended Target Location Correction). The cost of this added robustness is that comparison (and sorting) of CFI strings can be performed only after logically stripping all bracketed substrings (see Sorting Rules).
[
+ ;s=
)In some situations, it is important to preserve which side of a location a reference points to. For example, when resolving a location in a dynamically paginated environment, it would make a difference if a location is attached to the content before or after it (e.g., to determine whether to display the verso or recto side at a page break).
The s
parameter is used to preserve this sided-ness aspect of a location. It can
take two values: 'b
' ("before") means that the location is attached to the content
that precedes (according to the XML serialization document order), 'a
' ("after")
refers to the content that follows. This parameter MUST always be used inside square brackets at
the end of the CFI, even if the ID [[xml]] or text location assertion is empty.
The location just after yyy
in the sample content
below can be expressed as belonging with the content before it as follows:
Equally, it can be expressed including a text location assertion as:
The location at the start of em
element can be attached to the content preceding the
em
element as follows:
If the side bias in the preceding example was set to a
rather than b
,
the location would be attached to the child content of the em
element, not the
content following the em
element.
Since side bias is expressed as a parameter, it does not participate in CFI comparison (see Sorting Rules).
Side is not defined for locations with spatial offset.
Side bias is only meaningful when some type of break falls at the location (e.g., a page break or line break).
Given the following package document:
and the XHTML content document chapter01.xhtml
:
Then the EPUB CFI:
refers to the position right after the digit 9
in the paragraph with the ID
para05
. When producing CFIs for text locations, unless the text is defined by
an img
element's alt
tag, one SHOULD always start with the reference
to the (possibly-empty) chunk of XML character data that corresponds to the location and then
trace the ancestor and reference chain to the package document root.
The following examples show how EPUB CFIs can be constructed to reference additional content locations.
In order to sort or compute relative locations of multiple EPUB CFIs referencing the same EPUB publication, the following rules MUST be applied:
The EPUB CFI scheme data MUST be in unescaped form, as per the rules described in Character Escaping.
all bracketed assertions are removed (ignored) entirely;
steps that come earlier in the sequence are more important;
XML elements, references to chunks of XML character data, character offsets and temporal positions are sorted in natural order;
the y
position is more important than x
;
omitted spatial position precedes all other spatial positions;
omitted temporal position precedes all other temporal positions;
temporal position is more important than spatial;
different step types come in the following order from least important to most important:
character offset (:
), child (/
), temporal-spatial (~
or @
), reference/indirect (!
).
An EPUB CFI can be used to reference content inside the container. This kind of referencing can be
achieved by specifying a reference to the package document followed by a CFI, which MUST be resolved
starting from the root package
element.
For example, using the package document in the previous example, a
reference to the last location in chapter01.xhtml
might be written as follows:
EPUB CFIs allow the expression of simple ranges extending from a start location to an end location. A
range MUST be expressed as a triple of parent path (P
), start subpath
(S
) and end subpath (E
), or of the form:
The parent path MUST not be empty, and MUST end at a step that is common for resolving both the path of the start and end locations of the range, and each start and end subpath MUST resolve to a location in non-decreasing order in the document.
To determine the start and end locations of the range, the start and end subpaths MUST be
concatenated to the parent path to create the start location path (PS
) and end location
path (PE
). The parent path SHOULD include the deepest possible common path leading to
both the start and end path (in other words, the start and end location SHOULD NOT contain a common
path). The start location MAY be empty, to avoid repetition of a common path in cases where the end
location is situated within the subtree rooted at the start location.
Using the sample documents above, the following range would
represents the text from the second y
in yyy
up to (and including) digit
3
:
Ranges MUST be compared according to their PS
, then PE
, components. The
start and end locations SHOULD reference points in the document that have the same "nature", that is
to say elements and character offsets (document structure), temporal offsets (timed media), spatial
offsets (visual media), or the combined temporal-spatial offsets. In the case of temporal offsets,
the start and end locations SHOULD reference the same timed media. In the case of spatial offsets,
the start and end locations SHOULD reference the same visual media. This specification does not
define expected behaviors, such as how the combination of two spatial offsets (i.e., start and end
locations within a visual media) is to be interpreted by processing agents, including production
tools and reading systems.
It is not valid to use a path to an element as a shorthand for the range from the beginning to the end of the element. Single path notation always denotes a location point, and range is represented by the notation described above. There is no special step to produce a reference to the end of an element, as that would make sorting impossible without consulting the content of the document.
If range is used where single location is expected by the context, the start location MUST be used.
Side-bias parameters MUST NOT be used for ranges; the start of a range is implicitly attached to the content after the start location and the end is implicitly attached to the content before the end location.
As an EPUB publication can be updated, corrected or otherwise altered over time, it is useful to be able to derive an EPUB CFI for the modified document from one that targeted a previous version. This specification provides two mechanisms to detect and adapt to content changes that impact CFIs: IDs [[xml]] and text location assertions.
When a reading system is processing a CFI, it SHOULD check the correctness of any encountered
assertions. For example, given the path /6/4[chap01ref]!…
, the reading system SHOULD
verify that the element has the ID matching chap01ref
when processing element
4
(for this example, an itemref
in the spine
). If not,
the reading system SHOULD locate the ID chap01ref
within the document and correct the
CFI (e.g., if a new itemref
was inserted before the chap01ref
itemref
, the desired element number would now be 6
and the corrected CFI
would be /6/6[chap01ref]!…
). Likewise, text location assertions SHOULD be used to check
referenced target locations, and used to derive a corrected CFI that targets the desired text
location.
If one of the assertions fails during processing, and a corrected CFI can not be derived (the ID is not found in the document, or text matches could not be found), the CFI MUST be considered an invalid reference. In cases where a reading system cannot check for correctness (e.g., document-resident XML IDs are not available at CFI processing time), a reading system MUST ignore the CFI assertions.
This notion of correcting CFIs can lead to circumstances where two different CFIs point to the same location (i.e., the "stale" CFI, pre-correction, and the corrected CFI). The corrected CFI SHOULD be used where possible. A reading system and any surrounding content management system SHOULD attempt to replace stale CFIs with their corrected versions where possible.
This specification encourages the development of custom functions to assist with CFI correction where the intrinsic functionality is insufficient. Refer to Extending EPUB CFIs for more information on how to develop such functionality.
The provision for extensions (CSV parameter lists, prefixed by a parameter name, and separated by semicolons) allow reading systems to apply new or experimental heuristics to assist, for example, in migrating EPUB CFI fragments to updated documents.
It is RECOMMENDED that any vendor-specific parameter names start with vnd.
followed by the
vendor name.
Implementations MUST ignore all parameters that they do not understand or cannot parse.