Web Publications

Manifest and Structure

W3C Working Draft

This version:
https://www.w3.org/TR/2019/WD-wpub-20190130/
Latest published version:
https://www.w3.org/TR/wpub/
Latest editor's draft:
https://w3c.github.io/wpub/
Previous version:
https://www.w3.org/TR/2018/WD-wpub-20181212/
Editors:
Matt Garrish (DAISY Consortium)
Ivan Herman (W3C) orcid logo
Participate:
GitHub w3c/wpub
File a bug
Commit history
Pull requests

Abstract

This specification defines a collection of information that describes the structure of Web Publications so that user agents can provide user experiences specially tailored to reading publications, such as sequential navigation and offline reading. This information includes the default reading order, a list of resources, and publication-wide metadata.

Status of This Document

This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at https://www.w3.org/TR/.

This draft provides a draft version of a Web Publication. Many details are under active consideration within the Publishing Working Group and are subject to change. The most prominent known issues have been identified in this document and links provided to comment on them.

The most significant change to this draft is the tightening of its focus on the Web Publication manifest and structure. Removed are the sections on affordances and Web Publication locators. Rendering details are instead described in [PWP-UCR].

This document was published by the Publishing Working Group as a Working Draft. This document is intended to become a W3C Recommendation.

GitHub Issues are preferred for discussion of this specification. Alternatively, you can send comments to our mailing list. Please send them to public-publ-wg@w3.org (archives).

Publication as a Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.

This document was produced by a group operating under the W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.

This document is governed by the 1 February 2018 W3C Process Document.

1. Introduction

1.1 What is a Web Publication

This section is non-normative.

A Web Publication is a discoverable and identifiable collection of resources. Information about the Web Publication is expressed in a machine-readable document called a manifest, which is what enables user agents to understand the bounds of the Web Publication and the connection between its resources.

The manifest includes metadata that describe the Web Publication, as a publication has an identity and nature beyond its constituent resources. The manifest also provides a list of all the resources that belong to the Web Publication and a default reading order, which is how it connects resources into a single contiguous work.

A Web Publication is discoverable in one of two ways: resources either include a link to the manifest (via an HTTP Link header or an HTML link element [html]), or the manifest can be loaded directly by a compatible user agent.

With the establishment of Web Publications, user agents can build new experiences tailored specifically for their unique reading needs.

Flowchart depicts the resources of a Web Publication and their attachment to a manifest.

Figure 1 Simplified Diagram of the Structure of Web Publications.
A description of the structure diagram is available in the Appendix. Image available in SVG and PNG formats.

1.2 Scope

This section is non-normative.

This specification defines requirements for the production of Web Publications. It does not attempt to constrain the nature of a Web Publication—any type of work that can be represented on the Web constitutes a potential Web Publication. It is also designed to be adaptable to the needs of specific areas of published, such as audiobook production, and encourages a modular approach for creating specializations.

As much as possible, this specification leverages existing Open Web Platform technologies to achieve its goal—that being to allow for a measure of boundedness on the Web without changing the way that the Web itself operates.

Moreover, the specification is designed to adapt automatically to updates to Open Web Platform technologies in order to ensure that Web Publications continue to interoperate seamlessly as the Web evolves (e.g., by referencing the latest published versions instead of specific dated versions).

The specification is also intended to facilitate different user agent architectures for the consumption of Web Publications. While a primary goal is that traditional Web user agents (browsers) will be able to consume Web Publications, this should not limit the capabilities of any other possible type of user agent (e.g., applications, whether standalone or running within a user agent, or even Web Publications that include their own user interface). As a result, the specification does not attempt to architect required solutions for situations whose expected outcome will vary depending on the nature of the user agent and the expectations of the user (e.g., how to prompt to initiate a Web Publication, or at what point or how much of a Web Publication to cache for offline use).

This specification does not define how user agents are expected to render Web Publications. Details about the types of afforances that user agents can provide to enhance the reading experience for users are instead defined in [PWP-UCR].

1.3 Terminology

This document uses terminology defined by the W3C Note "Publishing and Linking on the Web" [publishing-linking], including, in particular, user, user agent, browser, and address.

Identifier

An identifier is metadata that can be used to refer to Web Content in a persistent and unambiguous manner. URLs, URNs, DOIs, ISBNs, and PURLs are all examples of persistent identifiers frequently used in publishing.

Manifest

A manifest represents structured information about a Web Publication, such as informative metadata, a list of all resources, and a default reading order.

Non-empty

For the purposes of this specification, non-empty is used to refer to an element, attribute or property whose text content or value consists of one or more characters after whitespace normalization, where whitespace normalization rules are defined per the host format.

URL

The general term URL is defined by the URL Standard [url]. It is used as in other W3C specifications, like HTML [html]. In particular, a URL allows for the usage of characters from Unicode following [rfc3987]. See the note in the HTML5 specification for further details.

Web Publication

A Web Publication is a collection of one or more resources, organized together through a manifest into a single logical work with a default reading order. The Web Publication is uniquely identifiable and presentable using Open Web Platform technologies.

2. Conformance

As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.

The key words MAY, MUST, MUST NOT, OPTIONAL, RECOMMENDED, REQUIRED, SHOULD, and SHOULD NOT are to be interpreted as described in [RFC2119].

2.1 Conformance Classes

This specification defines two conformance classes: one for Web Publications and one for user agents that process them.

A Web Publication conforms to this specification if it meets the following criteria:

A user agent conforms to this specification if it meets the following criteria:

3. Web Publication Construction

3.1 Manifest

3.1.1 Authored and Canonical Manifests

A Web Publication is described by its manifest, which provides a set of properties expressed using the JSON-LD [json-ld] format (a variant of JSON [ecma-404] for linked data).

The manifest is expressed in one of two forms depending on the state of the Web Publication:

Authored Manifest

The Authored Web Publication Manifest, as its name suggests, is the serialization of the manifest that the author provides with the Web Publication (note that the author does not have to be human).

Canonical Manifest

The Canonical Web Publication Manifest is a version of the Web Publication Manifest created by user agents when they obtain the authored manifest and remove all possible ambiguities and incorporate any missing values that can be inferred from another source.

It is possible that an authored manifest is the equivalent of the canonical manifest if there are no ambiguities or missing information, but a canonical manifest only exists after a user agent has inspected the authored manifest as part of the process of obtaining it.

This specification describes the requirements for creating both authored and canonical manifests. This section, in particular, details how to create the authored manifest, while 4. Web Publication Properties provides the various property definitions. These definitions include the rules user agents uses to supplement the canonical manifest. The algorithm for transforming an Authored Manifest into a Canonical Manifest is described in the separate section 5.2 Generating a Canonical Manifest.

3.1.2 WebIDL

3.1.2.1 Explanation

This section is non-normative.

Although a Web Publication manifest is authored as [json-ld], a user agent processes this information into an internal data structure in order to utilize the properties. The exact manner in which this processing occurs, and how the data is used internally, is user agent-dependent.

To ensure interoperability when exposing the items, this specification defines an abstract representation of the data structures using the Web Interface Definition Language (WebIDL) [webidl-1]. The WebIDL definitions express the expected names, datatypes, and possible restrictions for each member of the manifest. (A WebIDL representation can be mapped onto ECMAScript, C, or other programming languages.)

Note

Authors of Web Publications are encouraged to review these definitions, but they are not necessary to understand.

3.1.2.2 The WebPublicationManifest Dictionary
dictionary WebPublicationManifest {

};

The WebPublicationManifest dictionary is the [webidl-1] representation of the collection of Web Publication manifest properties. WebIDL definitions are also provided at the end of each property that belongs to the dictionary — these represent the members of the WebPublicationManifest dictionary.

Note

Refer to E. IDL Index for a complete listing of the WebPublicationManifest dictionary.

3.1.3 Manifest Contexts

A Web Publication Manifest MUST start by setting the JSON-LD context [json-ld]. The context has the following two major components:

  • the [schema.org] context: https://schema.org
  • the Web Publication context: https://www.w3.org/ns/wp-context
Example 1 : The context declaration.
{
    "@context" : ["https://schema.org", "https://www.w3.org/ns/wp-context"],
    …
}

The Web Publication context document adds features to the properties defined in Schema.org (e.g., the requirement for the creator property to be order preserving).

Editor's note

As part of the continuous contacts with Schema.org the additional features defined in the Web Publication context file could migrate to the core Schema.org vocabulary.

Note

Although Schema.org is often referenced using the http URI scheme, the vocabulary is being migrated to use the secure https scheme as its default. This specification requires the use https when referencing Schema.org in the manifest.

3.1.4 Values

3.1.4.1 Arrays and Single Values

Various manifest properties can have one or more values. As a general rule, these values can be expressed as [json] arrays. When the property value is an array with a single element, however, the array syntax MAY be omitted.

3.1.4.2 Text Values or Objects

Various manifest properties are expected to be expressed as [json] objects. Although the use of objects is usually RECOMMENDED, it is also acceptable to use string values that are interpreted as objects depending on the context. The exact mapping of text values to objects is part of the property or object definitions.

3.1.5 Publication Types

The Web Publication Manifest MUST include a Publication Type using the type term [json-ld]. The type MAY be mapped onto CreativeWork [schema.org].

Example 5 : Setting a Web Publication's type to CreativeWork.
{
    "@context" : ["https://schema.org", "https://www.w3.org/ns/wp-context"],
    "type"     : "CreativeWork"
    …
}

Schema.org also includes a number of more specific subtypes of CreativeWork, such as Article, Book, TechArticle, and Course. These MAY be used instead of, or in addition to, CreativeWork.

Example 6 : Setting a Web Publication's type to Book.
{
    "@context" : ["https://schema.org", "https://www.w3.org/ns/wp-context"],
    "type"     : "Book"
    …
}

Each Schema.org type defines a set of properties that are valid for use with it. To ensure that the manifest can be validated and processed by Schema.org aware processors, the manifest SHOULD contain only the properties associated with the selected type.

If properties from more than one type are needed, the manifest MAY include multiple type declarations.

Example 7 : A Web Publication that combines properties from both Book and VisualArtwork.
{
    "@context" : ["https://schema.org", "https://www.w3.org/ns/wp-context"],
    "type"     : ["Book", "VisualArtwork"],
    …
}

User agents SHOULD NOT fail to process manifests that are not valid to their declared Schema.org type(s).

Note

Refer to the Schema.org site for the complete list of CreativeWork subtypes.

partial dictionary WebPublicationManifest {
    required sequence<DOMString> type;
};

3.1.6 Properties

The naming, syntax, and requirements for manifest properties are defined in 4. Web Publication Properties.

Note

Although authors only have to understand the serialization requirements for manifest terms, they are encouraged to read through the full definitions for each property. The definitions describe, in some cases, how items are compiled into the Canonical Manifest in the absence of explicit information.

3.1.7 Relative URLs

Relative URL strings MAY be used in the manifest. These URLs are resolved to absolute URL strings using a base URL [url].

The base URL for relative URLs is determined as follows:

By consequence, relative URLs in embedded manifests are resolved against the URL of the primary entry page unless the page declares a base direction (i.e., in a <base> element in its header).

Issue

The usage (or not) of the <base> element for embedded manifests is currently the subject of several issues in the JSON-LD Working Group: JSON-LD #22, JSON-LD #57, and, ultimately, TAG #312.

3.1.8 Embedding

A manifest MAY be embedded only in the primary entry page. In this case, the manifest MUST be included in a script element [html] whose type attribute is set to application/ld+json.

Additionally, the script element MUST include a unique identifier in an id attribute [html]. This identifier ensures that the manifest can be referenced.

Example 8 : A Web Publication Manifest included in an HTML document
<script id="example_manifest" type="application/ld+json">
   {
      …
   }
</script>

3.1.9 Linking To a Manifest

With the exception of the primary entry page, linking a resource to its Web Publication manifest is OPTIONAL. Including a link is encouraged whenever possible, however, as it allows user agents to immediately ascertain that a resource belongs to a Web Publication regardless of how the user reaches the resource.

Links to a Web Publication manifest MUST take one or both of the following forms:

  • An HTTP Link header field [rfc5988] with its rel parameter set to the value "publication".

  • A link element [html] with its rel attribute set to the value "publication".

When a manifest is embedded within an HTML document, the link MUST include a fragment identifier that references the script element that contains the manifest (see 3.1.8 Embedding).

Issue 132 : Using rel="publication" topic:manifest

The exact value of rel is still to be agreed upon and should be registered by IANA.

Editor's note

The following details might be moved to the lifecycle section in a future draft.

When a resource links to multiple manifests, a user agent MAY choose to present one or more alternatives to the end user, or choose a single alternative on its own. The user agent MAY choose to present any manifest based upon information that it possesses, even one that is not explicitly listed as a parent (e.g., based upon information it calculates or acquires out of band). In the absence of a preference by user agent implementers, selection of the first manifest listed is suggested as a default.

3.2 Web Publication Bounds

A Web Publication consists of a finite set of resources that represent its content. This extent is known as its bounds and is defined within its manifest — it is obtained from the union of resources listed in the default reading order and resource list.

To determine whether a resource is within the bounds of a Web Publication, user agents MUST compare the absolute URL of a resource to the absolute URLs of the resources obtained from the union. If the resource is identified in the enumeration, it is within the bounds of the Web Publication. All other resources are external to the Web Publication.

Resources within the bounds of a Web Publication do not have to share the same domain.

3.3 Resources

A Web Publication MUST include at least one HTML document [html]—the primary entry page.

There are no restrictions on a Web Publication beyond this requirement. The Web Publication MAY include references to resources of any media type, both in the default reading order and as dependencies of other resources.

Note

When adding resources to a Web Publication, consider support in user agents. The use of progressive enhancement techniques and the provision of fallback content, as appropriate, will ensure a more consistent reading experience for users regardless of their preferred user agent.

3.4 Primary Entry Page

The primary entry page represents the preferred starting resource for a Web Publication and enables discovery of its manifest. It is the resource that is returned when accessing the Web Publication's address, and MUST be included in either the default reading order or the resource list.

Although any resource can link to the Web Publication manifest, the primary entry page typically introduces the publication and provides access to the content. It might contain all the content, in the case of a single-page Web Publication, or provide navigational aids to begin reading a multi-document Web Publication. To facilitate the user ease of consumption, the primary entry page SHOULD contain the table of contents.

It is not required that the primary entry page be included in the default reading order, nor that it be the first document listed when it is included. This specification leaves the exact nature of the document intentionally underspecified to provide flexibility for different approaches. If a default reading order is not provided, however, user agents will create one using the primary entry page.

The primary entry page is the only resource in which a manifest can be embedded. To ensure discovery of the manifest, the primary entry page MUST provide a link to the manifest, regardless of whether the manifest is embedded within the page or external to it.

The address of the primary entry page is also the canonical identifier for the Web Publication (i.e., it serves as the unique identifier for the Web Publication).

In certain cases where information has been omitted from the manifest, user agents will sometimes use the primary entry page as a fallback source of information (see language and base direction and title).

3.5 Table of Contents

The table of contents provides a hierarchical list of links that reflects the structural outline of the major sections of the Web Publication.

The table of contents is expressed via an [html] element (typically a nav element) in one of the resources. This element MUST be identified by the role attribute [html] value "doc-toc" [dpub-aria-1.0], and MUST be the first element in the document — in document tree order [dom] — with that role value.

If the table of contents is not located in the primary entry page, the manifest SHOULD identify the resource that contains the structure.

When specified, the table of content MUST include a link to at least one resource, and all links SHOULD refer to resources within publication bounds.

Refer to the table of contents property definition for more information on how to identify which resource contains the table of contents.

3.6 Page List

The page list is a list of links that provides navigation to static page demarcation points within the content. These locations allow users to coordinate access into the content, for example. The exact nature of these locations is left to content creators to define. They usually correspond to pages of a print document which is the source of the digital publication, but might be a purely digital creation added to ease navigation.

The page list is expressed via an [html] element (typically a nav element) in one of the resources. This element MUST be identified by the role attribute [html] value "doc-pagelist" [dpub-aria-1.0], and MUST be the first element in the document — in document tree order [dom] — with that role value.

If the page list is not located in the primary entry page, the manifest SHOULD identify the resource that contains the structure.

There are no requirements on the page list itself, except that, when specified, it MUST include a link to at least one resource.

Refer to the pagelist property definition for more information on how to identify which resource contains the page list.

4. Web Publication Properties

4.1 Introduction

This section is non-normative.

The Web Publication manifest is defined by a set of properties that describe the basic information a user agent requires to process and render a Web Publication. These properties are categorized as followed:

descriptive properties

Descriptive properties describe aspects of a Web Publication, such as its title, creator, and language. These properties are primarily drawn from Schema.org and its hosted extensions [schema.org], so they map to one or several Schema.org properties and inherit their syntax and semantics. (The following property categories typically do not have Schema.org equivalents, so are defined specifically for Web Publications.)

resource categorization

Resource categorization properties describe or identify common sets of resources, such as the resource list and default reading order. These properties refer to one or more resources, such as HTML documents, images, script files, and separate metadata files.

informative properties

Informative properties identify resources that contain additional information about the Web Publication, such as its privacy policy or accessibility report.

structural properties

Structural properties identify key meta structures of the Web Publication, such as the cover image, table of contents, and page list.

Note

The categorization of properties is done to simplify comprehension of their purpose; the groupings have no relevance outside this specification (i.e., the groupings do not exist in the manifest).

Note

Each manifest item drawn from schema.org identifies the property it maps to and includes its defining type in parentheses. Properties are often available in many types, however, as a result of the schema.org inheritance model. Refer to each property definition for more detailed information about where it is valid to use.

Schema.org additionally includes a large number of properties that, though relevant for publishing, are not mentioned in this specification — Web Publication authors can use any of these properties. This document defines only the minimal set of manifest items.

Editor's note

There are discussion on whether a best practices document would be created, referring to more schema.org terms. If so, it should be linked from here.

4.2 Requirements

The requirements for the expression of Web Publication properties are defined as follows:

REQUIRED:
RECOMMENDED:

These properties do not all have to be serialized in the authored manifest. Refer to each property's definition to determine whether it is required in the manifest or can be compiled into the canonical manifest from other information.

4.3 Quick Reference

This section is non-normative.

The way that properties are expressed in the manifest often differs from how they are referred to using natural language. The following table provides a mapping between property names and the sections where they are explained to help clarify the differing nomenclature:

Property Name Defined In
accessMode Accessibility
accessModeSufficient Accessibility
accessibilityAPI Accessibility
accessibilityControl Accessibility
accessibilityFeature Accessibility
accessibilityHazard Accessibility
accessibilitySummary Accessibility
artist Creators
author Creators
contents Table of Contents
contributor Creators
creator Creators
dateModified Last Modification Date
datePublished Publication Date
editor Creators
https://www.w3.org/ns/wp#accessibility-report Accessibility Report
https://www.w3.org/ns/wp#cover Cover
https://www.w3.org/ns/wp#pagelist Pagelist
id Canonical Identifier
illustrator Creators
inDirection Direction
inker Creators
inLanguage Language
letterer Creators
link Links
name Title
penciler Creators
privacy-policy Privacy Policy
publisher Creators
readBy Creators
readingOrder Default Reading Order
readingProgression Reading Progression Direction
resources Resource List
translator Creators
url Address

4.4 Descriptive Properties

4.4.1 Accessibility

The accessibility properties provides information about the suitability of a Web Publication for consumption by users with varying preferred reading modalities. These properties typically supplement an evaluation against established accessibility criteria, such as those provided in [WCAG20]. (For linking to a detailed accessibility report, see 4.6.1 Accessibility Report.)

The following properties are categorized as accessibility properties:

Term Description Required Value [schema.org] Mapping
accessMode The human sensory perceptual system or cognitive faculty through which a person may process or perceive information. One or more text(s). Expected values. accessMode (CreativeWork)
accessModeSufficient A list of single or combined accessModes that are sufficient to understand all the intellectual content of a resource. One or more ItemList. Expected values. accessModeSufficient (CreativeWork)
accessibilityAPI Indicates that the resource is compatible with the referenced accessibility APIs. One or more text(s).Expected values. accessibilityAPI (CreativeWork)
accessibilityControl Identifies input methods that are sufficient to fully control the described resource. One or more text(s). Expected values. accessibilityControl (CreativeWork)
accessibilityFeature Content features of the resource, such as accessible media, alternatives and supported enhancements for accessibility. One or more text(s). Expected values. accessibilityFeature (CreativeWork)
accessibilityHazard A characteristic of the described resource that is physiologically dangerous to some users. One or more text(s).Expected values. accessibilityHazard (CreativeWork)
accessibilitySummary A human-readable summary of specific accessibility features or deficiencies, consistent with the other accessibility metadata but expressing subtleties such as “short descriptions are present but long descriptions will be needed for non-visual users” or “short descriptions are present and no long descriptions are needed.” Text. accessibilitySummary (CreativeWork)

Detailed descriptions of these properties are available on the WebSchemas Wiki site.

Values SHOULD be drawn from the preferred vocabulary for each accessibility property, but user agents MUST NOT omit values from that are not included in the lists when generating the canonical manifest.

Note

The author can also provide a reference to a detailed Accessibility Report if more information is needed than can be expressed by these properties.

partial dictionary WebPublicationManifest {
    sequence<DOMString> accessMode;
    sequence<DOMString> accessModeSufficient;
    sequence<DOMString> accessibilityAPI;
    sequence<DOMString> accessibilityControl;
    sequence<DOMString> accessibilityFeature;
    sequence<DOMString> accessibilityHazard;
    LocalizableString      accessibilitySummary;
};
Example 12 : Example accessiblity metadata for a document with text and images. The publication provides alternative text and long descriptions appropriate for each image, so can also be read in purely textual form.
{
    "@context" : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"     : "CreativeWork",
    …
    "accessibilityAPI"      : "ARIA",
    "accessMode"            : ["textual", "visual"],
    "accessModeSufficient"  : [
        {
            "type"           : "ItemList",
            "itemListElement": ["textual", "visual"]
        },
        {
            "type"           : "ItemList",
            "itemListElement": ["textual"]
        }
    ],
    …
}

4.4.2 Address

A Web Publication's address is a URL [url] that represents the primary entry page for the Web Publication. It is expressed using the url property.

Term Description Required Value [schema.org] Mapping
url URL of the primary entry page. A URL [url]. url (Thing)

If the address does not resolve to an HTML document [html], user agents SHOULD NOT provide access to the resource to users. A Web Publication MAY have more than one address, but all the addresses MUST resolve to the same document.

The referenced document SHOULD be a resource of the Web Publication. It can be any resource, including one that is not listed in the default reading order. This document MUST include a link to the manifest to ensure a bidirectional linking relationship (i.e., that user agents can also locate the manifest from the document at the address).

If the document is not a Web Publication resource, user agents SHOULD load the first document in the default reading order when initiating the Web Publication.

Note

To improve the usability of Web Publications, particularly in user agents that do not support Web Publications, authors are encouraged to include navigation aids in the referenced document that facilitate consumption of the content, (e.g., provide a table of contents or a link to one).

Note
The Web Publication's address can also be used as value for an identifier link relation [link-relation].
partial dictionary WebPublicationManifest {
    required DOMString url;
};
Example 13 : Setting the address of the main entry page
{
    "@context" : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"     : "Book",
    …
    "url"      : "https://publisher.example.org/mobydick",
    …
}

4.4.3 Canonical Identifier

A Web Publication's canonical identifier is a unique identifier that resolves to the preferred version of the Web Publication. It is expressed using the id property.

Term Description Required Value [schema.org] Mapping
id Preferred version of the Web Publication. A URL [url]. (None)
Note

Ensuring uniqueness of canonical identifiers is outside the scope of this specification. The actual achievable uniqueness depends on such factors as the conventions of the identifier scheme used and the degree of control over assignment of identifiers.

The canonical identifier is intended to provide a measure of permanence above and beyond the Web Publication's address(es). If a Web Publication is permanently relocated to a new URL, for example, the canonical identifier provides a way of discovering the new location (e.g., a DOI registry could be updated with the new URL, or a redirect could be added to the URL of the canonical identifier). It is also intended to provide a means of identifying instances of the same Web Publication hosted at different URLs.

If a URL is not provided in the manifest, or the value is an invalid URL, the Web Publication does not have a canonical identifier. User agents MUST NOT attempt to construct a canonical identifier from any other identifiers provided in the manifest for the canonical manifest.

The specification of the canonical identifier MAY be complemented by the inclusion of additional types of identifiers for the Web Publication using the identifier property [schema.org] and/or its subtypes.

partial dictionary WebPublicationManifest {
    DOMString id;
};
Example 14 : Example for setting both the canonical identifier as URL and the address of the same document
{
    "@context" : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"     : "TechArticle",
    …
    "id"       : "http://www.w3.org/TR/tabular-data-model/",
    "url"      : "http://www.w3.org/TR/2015/REC-tabular-data-model-20151217/",
    …
}
Example 15 : Example for setting both the ISBN and the address of the same document
{
    "@context" : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"     : "Book",
    …
    "isbn"     : "9780123456789",
    "url"      : "https://publisher.example.org/mobydick",
    …
}

4.4.4 Creators

A creator is an individual or entity responsible for the creation of the Web Publication.

The following properties are categorized as creators:

Term Description Required Value [schema.org] Mapping
artist The primary artist for the publication, in a medium other than pencils or digital line art. One or more Person. artist (VisualArtwork)
author The author of the publication. One or more Person and/or Organization. author (CreativeWork)
colorist The individual who adds color to inked drawings. One or more Person. colorist (VisualArtwork)
contributor Contributor whose role does not fit to one of the other roles in this table. One or more Person and/or Organization. contributor (CreativeWork)
creator The creator of the publication. One or more Person and/or Organization. creator (CreativeWork)
editor The editor of the publication. One or more Person. editor (CreativeWork)
illustrator The illustrator of the publication. One or more Person. illustrator (Book)
inker The individual who traces over the pencil drawings in ink. One or more Person. inker (VisualArtwork)
letterer The individual who adds lettering, including speech balloons and sound effects, to artwork. One or more Person. letterer (VisualArtwork)
penciler The individual who draws the primary narrative artwork. One or more Person. penciler (VisualArtwork)
publisher The publisher of the publication. One or more Person and/or Organization. publisher (CreativeWork)
readBy A person who reads (performs) the publication (for audiobooks). One or more Person. readBy (Audiobook)
translator The translator of the publication. One or more Person and/or Organization. translator (CreativeWork)

Creators are represented in one of the following two ways:

  1. as a string encoding the name of a Person [schema.org]; or
  2. as an instance of a Person or Organization [schema.org].

In other words, a single string value is a shorthand for a [schema.org] Person whose name property is set to that string value. (See also 3.1.4.2 Text Values or Objects.)

When compiling each set of creator information from a [schema.org] Person or Organization type, user agents MUST retain the following information when available:

type
One or more strings that identifies the type of creator. This sequence SHOULD include "Person" or "Organization".
name
One or more localizable strings for the name of the creator.
id
A canonical identifier of the creator as a URL. [url]
url
An address for the creator in the form of a URL. [url]

Note that user agents MAY interpret a wider range of creator properties defined by Schema.org than the ones in the preceding list.

The manifest MAY include more than one of each type of creator.

partial dictionary WebPublicationManifest {
    sequence<CreatorInfo> artist;
    sequence<CreatorInfo> author;
    sequence<CreatorInfo> colorist;
    sequence<CreatorInfo> contributor;
    sequence<CreatorInfo> creator;
    sequence<CreatorInfo> editor;
    sequence<CreatorInfo> illustrator;
    sequence<CreatorInfo> inker;
    sequence<CreatorInfo> letterer;
    sequence<CreatorInfo> penciler;
    sequence<CreatorInfo> publisher;
    sequence<CreatorInfo> readBy;
    sequence<CreatorInfo> translator;
};


dictionary CreatorInfo {
             sequence<DOMString>         type;
    required sequence<LocalizableString> name;
             DOMString                      id;
             DOMString                      url;
};
Example 16 : Author of a book
{
    "@context" : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"     : "Book",
    …
    "url"      : "https://publisher.example.org/mobydick",
    "author"   : {
        "type"  : "Person",
        "name"  : "Herman Melville"
    }
}
Example 17 : Separate listing of editors, authors, and publisher, with some persons expressed as simple strings
{
    "@context"   : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"       : "TechArticle",
    …
    "id"         : "http://www.w3.org/TR/tabular-data-model/",
    "url"        : "http://www.w3.org/TR/2015/REC-tabular-data-model-20151217/",
    "author"     : [
        "Jeni Tennison",
        {
            "type"  : "Person",
            "name" : "Gregg Kellogg",
        },{
            "type"  : "Person",
            "name" : "Ivan Herman",
            "id"   : "https://www.w3.org/People/Ivan/"
        }
    ],
    "editor"    : [
        "Jeni Tennison",
        {
            "type"  : "Person",
            "name" : "Gregg Kellogg",
        }
    ],
    "publisher" : {
        "type"  : "Organization",
        "name" : "World Wide Web Consortium",
        "id"   : "https://www.w3.org/"
    }
    …
}

4.4.5 Language and Base Direction

The Web Publication has a natural language value (e.g., English, French, Chinese), as well as a natural base writing direction (the display direction, either left-to-right or right-to-left). The manifest has entries to set these values, which can influence, for example, the behavior of a user agent (e.g., it might place a pop-up for a table of contents on the right hand side for publications whose natural base direction is right-to-left).

Similarly, each natural language property value in the Web Publication's manifest (e.g., title, creators) is localizable [string-meta], meaning that the same information is available for each.

As a result, the manifest has entries to set:

  • the natural language, and
  • the base direction

of both the Web Publication and the natural language properties values of the manifest.

If a user agent requires the language and one is not available in the authored manifest (either globally or specifically for that property), or the obtained value is invalid, the user agent MAY attempt to determine the language when generating the canonical manifest. This specification does not mandate how such a language tag is created. The user agent might:

  • use the non-empty language declaration of the manifest;
  • use the first non-empty language declaration found in a resource in the default reading order;
  • calculate the language using its own algorithm.

No default values are specified for the language or the default base direction.

Issue 354 : Proposal for handling localizable texts (writeup of the F2F discussions) topic:internationalization

Proposal for handling localizable texts (writeup of the F2F discussions)

4.4.5.1 Global Language and Direction

The manifest MAY include global language and base direction declarations for the Web Publication using the following properties.

Term Description Required Value [schema.org] Mapping
inLanguage Default language for the Web Publication as well as the textual manifest values language code as defined in [bcp47] inLanguage (Property)
inDirection Default base direction for the Web Publication as well as the textual manifest values ltr, rtl, or auto (None)

The natural language MUST be a tag that conforms to [bcp47], while the base language direction MUST have one of the following values:

  • ltr: indicates that the textual values are explicitly directionally set to left-to-right text;
  • rtl: indicates that the textual values are explicitly directionally set to right-to-left text;
  • auto: indicates that the textual values are explicitly directionally set to the direction of the first character with a strong directionality.

When specified, these properties are also used as defaults for textual values in the manifest.

Note

It is important to differentiate the language of the publication from the language and the base direction of the individual resources that compose it. If such resources are, for example, in HTML, the language and direction need to be set in those resources, too. The language and base direction of the publication are not inherited.

The global language information MAY be overridden by individual values.

If the manifest is embedded in the primary entry page via a script element, and the manifest does not set the global language and/or the base direction (see 4.4.5.1 Global Language and Direction), the lang and the dir attributes of the script element are used as the global language and base direction, respectively (see the details on handling the lang and dir attributes in [html]).

Issue

It is to be discussed whether this last paragraph, i.e., inheriting values from script, should be kept.

Note

If authors intend to use a manifest, or a manifest template, both as embedded manifest and as a separate resource, they are strongly encouraged to set these properties explicitly to avoid interference of the containing script element in case of embedding.

partial dictionary WebPublicationManifest {
    DOMString     inLanguage;
    TextDirection inDirection;
};

enum TextDirection {
    "ltr",
    "rtl",
    "auto"
};
4.4.5.2 Item-specific Language

It is possible to set the language for any textual value in the manifest. This information MUST be set as a localizable string, i.e., using the value and language terms (instead of a simple string) [json-ld]:

Example 18 : Setting the author name to French using a localizable string
{
    "@context" : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"     : "Book",
    …
    "author" : {
        "type"  : "Person",
        "name" : {
            "value"    : "Marcel Proust",
            "language" : "fr"
        }
    }
}

The value of the language MUST be set to a language code as defined in [bcp47].

When used in a context of localizable texts, a simple string value is a shorthand for a localizable string, with the value set to the string value, and the language set to the value of the inLanguage property, if applicable, and unset otherwise. In other words, the previous example is equivalent to:

Example 19 : Setting the default language of an author name to French
{
    "@context"   : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"       : "Book",
    "inLanguage" : "fr",
    …
    "author"     : "Marcel Proust",
}

(See also 3.1.4.2 Text Values or Objects.)

It is not possible to set the direction explicitly for a value.

Note

Setting the direction for a natural text value is currently not possible in JSON-LD [json-ld]. In case the JSON-LD community, as well as the schema.org community, introduces such a feature, future versions of this specification may extend the ability of Web Publication Manifests to include this.

When using Web Publication manifests with bidirectional text, user agents SHOULD identify the base direction of any given natural language value by scanning the text for the first strong directional character. Once the base direction has been identified, user agents MUST determine the appropriate rendering and display of natural language values according to the Unicode Bidirectional Algorithm [bidi]. This could require wrapping additional control characters or markup around the string prior to display, in order to apply the base direction. (See C. Examples for bidirectional texts.)

dictionary LocalizableString {
    required DOMString value;
             DOMString language;
};

4.4.6 Last Modification Date

The last modification date is the date when the Web Publication was last updated (i.e., whenever changes were last made to any of the resources of the Web Publication, including the manifest). It is expressed using the dateModified property.

Term Description Required Value [schema.org] Mapping
dateModified Last modification date of the publication. A Date or DateTime value [schema.org], both expressed in ISO 8601 Date, or Date Time formats, respectively [iso8601]. dateModified (CreativeWork)

The last modification date does not necessarily reflect all changes to the Web Publication (e.g., third-party content could change without the author being aware). User agents SHOULD check the last modification date of individual resources to determine if they have changed and need updating.

partial dictionary WebPublicationManifest {
    DOMString dateModified;
};
Example 20 : Last modification date of the publication
{
    "@context"     : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"         : "TechArticle",
    …
    "id"           : "http://www.w3.org/TR/tabular-data-model/",
    "url"          : "http://www.w3.org/TR/2015/REC-tabular-data-model-20151217/",
    "dateModified" : "2015-12-17",
    …
}

4.4.7 Publication Date

The publication date is the date on which the Web Publication was originally published. It represents a static event in the lifecycle of a Web Publication and allows subsequent revisions to be identified and compared. It is expressed using the datePublished property.

Term Description Required Value [schema.org] Mapping
datePublished Creation date of the publication. A Date or DateTime, both expressed in ISO 8601 Date, or Date Time formats, respectively [iso8601]. datePublished (CreativeWork)

The exact moment of publication is intentionally left open to interpretation: it could be when the Web Publication is first made available online or could be a point in time before publication when the Web Publication is considered final.

partial dictionary WebPublicationManifest {
    DOMString datePublished;
};
Example 21 : Creation and modification date of the publication
{
    "@context"      : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"          : "TechArticle",
    …
    "id"            : "http://www.w3.org/TR/tabular-data-model/",
    "url"           : "http://www.w3.org/TR/2015/REC-tabular-data-model-20151217/",
    "datePublished" : "2015-12-17",
    "dateModified"  : "2016-01-30",
    …
}

4.4.8 Reading Progression Direction

The reading progression establishes the reading direction from one resource to the next within a Web Publication. It is expressed using the readingDirection property.

Term Description Required Value [schema.org] Mapping
readingProgression Reading direction from one resource to the other. ltr or rtl (None)

The value of this property MUST be either:

  • ltr: left-to-right;
  • rtl: right-to-left.

The default value is ltr.

This property has no effect on the rendering of the individual primary resources; it is only relevant for the progression direction from one resource to the other.

Note

The reading progression of a Web Publication is used to adapt such publication level interactions as menu position, swap direction, defining tap zones to lead the user to the next and previous pages, touch gestures, etc.

If the readingProgression is not set, user agents MUST use the default value ltr when generating the canonical manifest.

partial dictionary WebPublicationManifest {
    ProgressionDirection readingProgression = "ltr";
};

enum ProgressionDirection {
	"ltr",
	"rtl"
};
Example 22 : Reading progression set explicitl to ltr
{
    "@context"           : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"               : "Book",
    …
    "url"                : "https://publisher.example.org/mobydick",
    "readingProgression" : "ltr"
}

4.4.9 Title

The title provides the human-readable name of the Web Publication. It is expressed using the name property.

Term Description Required Value [schema.org] Mapping
name Human-readable title of the Web Publication. One or more text items for the title. name (Thing)

The title is specified by the manifest expression, when present. If not included in the authored manifest, the user agent MUST use the value of the title element [html] of the Web Publication’s primary entry page, if present, when generating the canonical manifest.

If the title is not available either in the authored manifest or as a non empty title element in the primary entry page, the user agent MUST create one. This specification does not specify what heuristics the user agent should use; it can, for example, use a language-specific placeholder title, use the URL of the manifest or the primary entry page, or use the value of the address in the authored manifest.

Note

Relying on the title element could be semantically problematic if the Web Publication consists of several HTML resources (e.g., one per chapter of a book), because the HTML definition defines this element as "metadata" for the enclosing HTML document, not for a collection of resources. Using this element is, on the other hand, preferred in the case of a publication consisting of a single HTML document (e.g., a scholarly journal article).

Note

A user agent is not expected to produce a meaningful title [wcag20] for a Web Publication when one is not specified.

partial dictionary WebPublicationManifest {
    required sequence<LocalizableString> name;
};
Example 23 : Title of the book set explicitly
{
    "@context" : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"     : "Book",
    …
    "url"      : "https://publisher.example.org/mobydick",
    "name"     : "Moby Dick"
}

4.5 Resource Categorization Properties

Web Publication resources are specified via the default reading order, the resource list, and the links, as defined in this section. These lists contain references to informative properties like the privacy policy, and structural properties like the table of contents.

Note that a particular resource's URL MUST NOT appear in more than one of these lists, and a URL MUST NOT be repeated within a list.

The manifest itself MUST NOT include a reference to itself, i.e., the reference to the manifest MUST NOT appear within these lists.

4.5.1 Default Reading Order

The default reading order is a specific progression through a set of Web Publication resources. A user might follow alternative pathways through the content, but in the absence of such interaction the default reading order defines the expected progression from one resource to the next.

The default reading order is expressed using the readingOrder property.

Term Description Required Value [schema.org] Mapping
readingOrder

An array of:

  • a string, representing the URL [url] of the resource; or
  • an instance of a LinkedResource object

The order in the array is significant. The URLs MUST NOT include fragment identifiers. Non-HTML resources SHOULD be expressed as LinkedResource objects with their encodingFormat values set.

(None)

The default reading order MUST include at least one resource.

The default reading order is specified directly in the manifest, but MAY be omitted when it only consists of the primary entry page. When the default reading order is absent, user agents MUST include an entry for the primary entry page when compiling the canonical manifest.

If present in the Web Publication Manifest, this item MUST be mapped on the readingOrder term, defined specifically for Web Publications.

partial dictionary WebPublicationManifest {
   required sequence<LinkedResource> readingOrder;
};
Example 24 : Reading order expressed as a simple list of URLs
{
    "@context" : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"     : "Book",
    …
    "url"      : "https://publisher.example.org/mobydick",
    "name"     : "Moby Dick",
    "readingOrder" : [
        "html/title.html",
        "html/copyright.html",
        "html/introduction.html",
        "html/epigraph.html",
        "html/c001.html",
        …
    ]
}
Example 25 : Reading order expressed as objects providing more information on items
{
    "@context" : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"     : "Book",
    …
    "url"      : "https://publisher.example.org/mobydick",
    "name"     : "Moby Dick",
    "readingOrder" : [{
        "type"           : "LinkedResource",
        "url"            : "html/title.html",
        "encodingFormat" : "text/html",
        "name"           : "Title page"
    },{
        "type"           : "LinkedResource",
        "url"            : "html/copyright.html",
        "encodingFormat" : "text/html",
        "name"           : "Copyright page"
    },{
        …
    }]
}

4.5.2 Resource List

The resource list enumerates any additional resources used in the processing and rendering of a Web Publication that are not already listed in the default reading order. It is expressed using the resources property.

Term Description Required Value [schema.org] Mapping
resources

An array of:

  • a string, representing the URL [url] of the resource; or
  • an instance of a LinkedResource object

The order in the array is not significant. The URLs MUST NOT include fragment identifiers. It is RECOMMENDED to use LinkedResource objects with their encodingFormat values set.

(None)

The completeness of the resource list will affect the usability of the Web Publication in certain reading scenarios (e.g., the ability to read the Web Publication offline). For this reason, it is strongly RECOMMENDED to provide a comprehensive list of all of the Web Publication's constituent resources beyond those listed in the default reading order.

In some cases, a comprehensive list of these resources might not be easily achieved (e.g., third-party scripts that reference resources from deep within their source), but a user agent SHOULD still be able to render a Web Publication even if some of these resources are not identified as belonging to the Web Publication (e.g., when it is taken offline without them).

partial dictionary WebPublicationManifest {
    sequence<LinkedResource> resources = [];
};
Example 26 : Listing resources, some via a simple URL, some with more details
{
    "@context"   : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"       : "TechArticle",
    …
    "id"         : "http://www.w3.org/TR/tabular-data-model/",
    "url"        : "http://www.w3.org/TR/2015/REC-tabular-data-model-20151217/",
    …
    "resources"  : [
        "datatypes.html",
        "datatypes.svg",
        "datatypes.png",
        "diff.html",
        {
            "type"              : "LinkedResource",
            "url"               : "test-utf8.csv",
            "encodingFormat"    : "text/csv"
        },{
            "type"              : "LinkedResource",
            "url"               : "test-utf8-bom.csv",
            "encodingFormat"    : "text/csv"
        },{
            …
        }
    ],
    …
}

4.6 Informative Properties

4.6.1 Accessibility Report

An accessibility report provides information about the suitability of a Web Publication for consumption by users with varying preferred reading modalities. These reports typically identify the result of an evaluation against established accessibility criteria, such as those provided in [WCAG21], and are an important source of information in determining the usability of a Web Publication.

An accessibility report is identified using the https://www.w3.org/ns/wp#accessibility-report link relationship.

The manifest SHOULD include a link to an accessibility report when one is available for a Web Publication. It is RECOMMENDED that the report be included as a resource of the Web Publication.

It is also RECOMMENDED that the accessibility report be provided in a human-readable format, such as [html]. Augmenting these reports with machine-processable metadata, such as provided in Schema.org [schema.org], is also RECOMMENDED.

If present in the manifest, the accessibility report MUST be expressed as a LinkedResource. The rel value of the LinkedResource MUST include the https://www.w3.org/ns/wp#accessibility-report identifier.

Editor's note

The Working Group will attempt to define the accessibility-report term with IANA, to avoid using a URL.

4.6.2 Privacy Policy

Users often have the legal right to know and control what information is collected about them, how such information is stored and for how long, whether it is personally identifiable, and how it can be expunged. Including a statement that addresses such privacy concerns is consequently an important part of publishing Web Publications. Even if no information is collected, such a declaration increases the trust users have in the content.

A privacy policy is identified using the privacy-policy link relationship.

A link to a privacy policy can be included in the manifest. It is RECOMMENDED that the privacy policy be included as a resource of the Web Publication.

It is RECOMMENDED that the privacy policy be provided in a human-readable format, such as HTML [html].

Refer to 7. Privacy for more information about privacy considerations in Web Publications.

If present in the manifest, the privacy policy MUST be expressed as a LinkedResource. The rel value of the LinkedResource MUST include the privacy-policy identifier [iana-link-relations].

4.7 Structural Properties

4.7.1 Cover

The cover is a resource that user agents can use to present the Web Publication (e.g., in a library or bookshelf, or when initially loading the Web Publication).

The cover is identified by the https://www.w3.org/ns/wp#cover link relationship.

The manfiest SHOULD include a reference to a cover.

More than one cover MAY be referenced from the manifest (e.g., to provide alternative formats and sizes for different device screens). If multiple covers are specified, each instance MUST define at least one unique property to allow user agents to determine its usability (e.g., a different format, height, width or relationship).

If present in the manifest, the cover MUST be expressed as a LinkedResource. The URL expressed in the url term MUST NOT include a fragment identifier.

The rel value of the LinkedResource MUST include the https://www.w3.org/ns/wp#cover identifier.

If the cover is in an image format, a title and description SHOULD be provided. User agents can use these properties to provide alternative text and descriptions when necessary for accessibility.

Editor's note

The Working Group will attempt to define the cover term by IANA, to avoid using a URL.

Example 29 : Cover HTML page
{
    "@context"   : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"       : "Book",
    …
    "url"        : "https://publisher.example.org/donquixote",
    "name"       : "Don Quixote",
    "resources"  : [{
        "type"           : "LinkedResource",
        "url"            : "cover.html",
        "encodingFormat" : "text/html"
        "rel"            : "https://www.w3.org/ns/wp#cover"
    },{
        …
    }],
    …
}
Example 30 : Cover image with title and description
{
    "@context"   : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"       : "Book",
    …
    "url"        : "https://publisher.example.org/mobydick",
    "name"       : "Moby Dick",
    "resources"  : [{
        "type"           : "LinkedResource",
        "url"            : "whale-image.jpg",
        "encodingFormat" : "image/jpeg",
        "rel"            : "https://www.w3.org/ns/wp#cover",
        "name"           : "Moby Dick attacking hunters",
        "description"    : "A white whale is seen surfacing from the water to attack a small whaling boat"
    },{
        …
    }],
    …
}
Example 31 : Cover image in JPEG and SVG formats
{
    "@context"   : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"       : "Book",
    …
    "url"        : "https://publisher.example.org/donquixote",
    "name"       : "Gulliver's Travels",
    "resources"  : [{
        "type"           : "LinkedResource",
        "url"            : "lilliput.jpg",
        "encodingFormat" : "image/jpeg",
        "rel"            : "https://www.w3.org/ns/wp#cover"
    },{
        "type"           : "LinkedResource",
        "url"            : "lilliput.svg",
        "encodingFormat" : "image/svg+xml",
        "rel"            : "https://www.w3.org/ns/wp#cover"
    },{
        …
    }],
    …
}

4.7.2 Page List

The pagelist property identifies the resource that contains the Web Publication's page list.

The page list is identified by the https://www.w3.org/ns/wp#pagelist link relationship.

User agents MUST compute the pagelist as follows:

  1. Identify the page list resource:
  2. If the page list resource contains an HTML element with the role [html] value doc-pagelist [dpub-aria-1.0], the user agent MUST use that element as the page list. If there are several such HTML elements the user agent MUST use the first in document tree order [dom].

If this process does not result in a link to the page list, the Web Publication does not have a page list and this property MUST NOT be included in the canonical manifest.

Editor's note

The Working Group will attempt to define the pagelist term by IANA, to avoid using a URL.

If present in the manifest, the page list MUST be expressed as a LinkedResource. The URL expressed in the url term MUST NOT include a fragment identifier.

The rel value of the LinkedResource MUST include the https://www.w3.org/ns/wp#pagelist identifier.

The link to the page list MAY be specified in either the default reading order or resource-list, but MUST NOT be specified in both.

Example 32 : Pagelist identified in another resource of the Web Publication
{
"@context"   : ["https://schema.org","https://www.w3.org/ns/wp-context"],
"type"       : "Book",
…
"url"        : "https://publisher.example.org/mobydick",
"name"       : "Moby Dick",
"resources"  : [{
	"type"       : "LinkedResource",
	"url"        : "toc_file.html",
	"rel"        : "https://www.w3.org/ns/wp#pagelist"
},{
	…
}],
…
}

4.7.3 Table of Contents

The table of contents property identifies the resource that contains the Web Publication's table of contents.

The table of contents is identified by the contents link relationship.

User agents MUST compute the toc as follows:

  1. Identify the table of contents resource:
  2. If the table of contents resource contains an HTML element with the role [html] value doc-toc [dpub-aria-1.0], the user agent MUST use that element as the table of contents. If there are several such HTML elements the user agent MUST use the first in document tree order [dom].

If this process does not result in a link to the table of contents, the Web Publication does not have a table of contents and this property MUST NOT be included in the canonical manifest.

See the separate section A. Machine-Processable Table of Contents for the HTML structure that the table of content SHOULD adhere to.

If present in the manifest, the table of contents MUST be expressed as a LinkedResource. The URL expressed in the url term MUST NOT include a fragment identifier.

The rel value of the LinkedResource MUST include the contents identifier [iana-link-relations].

The link to the table of contents MAY be specified in either the default reading order or resource-list, but MUST NOT be specified in both.

Example 33 : Table of content identified in another resource of the Web Publication
{
    "@context"   : ["https://schema.org","https://www.w3.org/ns/wp-context"],
    "type"       : "Book",
    …
    "url"        : "https://publisher.example.org/mobydick",
    "name"       : "Moby Dick",
    "resources"  : [{
        "type"       : "LinkedResource",
        "url"        : "toc_file.html",
        "rel"        : "contents"
    },{
        …
    }],
    …
}
Example 34 : If the primary entry page includes the TOC, no reference in the manifest is necessary
<head><script type="application/ld+json">
    {
        "@context"        : ["https://schema.org","https://www.w3.org/ns/wp-context"],
        "type"            : "TechArticle",
        …
        "id"              : "http://www.w3.org/TR/tabular-data-model/",
        "url"             : "http://www.w3.org/TR/2015/REC-tabular-data-model-20151217/",
        …
    }
    </script></head>
<body><section role="doc-toc"></section></body>

4.8 Extensibility

The manifest is designed to provide a basic set of properties for use by user agents in presenting and rendering a Web Publication, but MAY be extended in the following ways:

  1. by the provision of linked metadata records.
  2. through the inclusion of additional properties in the manifest;

Although both methods are valid, the use of linked records is RECOMMENDED.

This specification does not define how such additional properties are compiled, stored or exposed by user agents in their internal representation of the manifest. A user agent MAY ignore some or all extended properties.

4.8.1 Linked records

Extending the manifest through links to a record, such as an ONIX [onix] or BibTeX [bibtex] file, MUST be expressed using a LinkedResource object, where:

  • the rel value of the LinkedResource SHOULD include a relevant identifier defined by IANA or by other organizations; if the link record contains descriptive metadata it MUST include the describedby (IANA) identifier;
  • the value of the encodingFormat in the link MUST use the MIME media type [rfc2046] defined for that particular type of record, if applicable.

Linked records MUST be included in the resource list when they are part of the Web Publication (i.e., are needed for more than just manifest extensibility). Otherwise, they MUST be included in the links list.

Editor's note

The application/onix+xml MIME type has not yet been registered by IANA at the time of writing this document, and is included in the example for illustrative purposes only.

4.8.2 Additional Properties in the Manifest

Additional properties can be included directly in the manifest. It is RECOMMENDED that these properties be taken from public schemes like [schema.org] or [dcterms] and use values from controlled vocabularies whenever possible. Proprietary terms MAY be used, but it is RECOMMENDED that such terms be included using Compact IRIs [json-ld], with prefixes defined as part of the context.

Example 36 : Usage of the schema.org 'copyrightYear' and 'copyrightHolder' terms, as an extension to the basic data
{
"@context"        : ["https://schema.org","https://www.w3.org/ns/wp-context"],
"type"            : "TechArticle",
…
"id"              : "http://www.w3.org/TR/tabular-data-model/",
"url"             : "http://www.w3.org/TR/2015/REC-tabular-data-model-20151217/",
"copyrightYear"   : "2015",
"copyrightHolder" : "World Wide Web Consortium",
…
}
Example 37 : Usage of the Dublin Core 'subject' with the 2012 ACM Classification terms, as an extension to the basic data
{
"@context"   : ["https://schema.org","https://www.w3.org/ns/wp-context"],
"type"       : "CreativeWork",
…
"id"         : "http://www.w3.org/TR/tabular-data-model/",
"url"        : "http://www.w3.org/TR/2015/REC-tabular-data-model-20151217/",
"dc:subject" : ["Web data description languages","Data integration","Data Exchange"]
…
}
Note

A prefix definition dc for [dcterms] is included in the context file of [schema.org]. This means that it is not necessary to add the prefix explicitly. The same is true for a number of other public vocabularies; see the schema.org context file for further details.

5. Web Publication Lifecycle

Note

See the diagrams in the appendix for a visual representation of the lifecycle algorithm.

5.1 Obtaining a manifest

The steps for obtaining a manifest, starting from the primary entry page, are given by the following algorithm. The algorithm, if successful, returns a processed manifest; otherwise, it terminates prematurely and returns nothing. In the case of nothing being returned, the user agent MUST ignore the manifest declaration.

  1. From the Document of the top-level browsing context of the primary entry page, let origin be the Document's origin, and manifest link be the first link element in tree order in Document whose rel attribute contains the publication token.
  2. If origin is an [html] opaque origin, terminate this algorithm.
  3. If manifest link is null, terminate this algorithm.
  4. If manifest link's href attribute's value is the empty string, terminate this algorithm.
  5. If manifest link's href attribute's value is a relative URL, i.e., it points to origin and it has a non-null fragment identifying an identifier id in Document:
    1. Let embedded manifest script be the first script element in tree order, whose id attribute is equal to id and whose type attribute is equal to application/ld+json.
    2. If embedded manifest script is null, terminate this algorithm.
    3. Let text be the child text content of embedded manifest script
    4. Let base be the value of baseURI of the script element.
    Explanation

    This branch is in use when the manifest is embedded in the primary entry page. The algorithm locates the script element and extract the manifest itself. The document's URL or, if set by the author, the value of a possible base element will be used to turn relative URLs into absolute ones.

  6. Otherwise:
    1. Let manifest URL be the result of parsing the value of the href attribute, relative to the element's base URL. If parsing fails, then abort these steps.
    2. Let request be a new [fetch] request, whose URL is manifest URL, and whose context is the same as the browsing context of the Document.
    3. If the manifest link's crossOrigin attribute's value is 'use-credentials', then set request's credentials to 'include'.
    4. Await the result of performing a fetch with request, letting response be the result.
    5. If response is a network error, terminate this algorithm.
    6. Let text be the result of UTF-8 decoding response's body.
    7. Let base be the value of manifest URL.
    Explanation

    This branch is in use when the manifest is in a separate file. It performs the standard operations to retrieve the manifest from the Web; the URL of the manifest file will be used to turn relative URLs into absolute ones.

  7. Let json be the result of parsing text. If parsing throws an error, terminate this algorithm.
  8. If Type(json) is not Object, terminate this algorithm.
  9. Let canonical manifest be the canonical manifest derived from json, using the values of json, base, and Document as input to the algorithm described in 5.2 Generating a Canonical Manifest.
  10. Check whether the canonical manifest fulfills the minimal requirements for a Web Publication Manifest, namely: If any of these requirements is not fulfilled, terminate the algorithm.
  11. Let processed manifest be the result of running processing a manifest given canonical manifest.
  12. Return processed manifest.
Note

The algorithm does not describes how error and warning messages should be reported. This is implementation dependent.

5.2 Generating a Canonical Manifest

The steps to convert a Web Publication Manifest into a Canonical Manifest are given by the following algorithm. The algorithm takes the following arguments:

The steps of the algorithm are described below. As an abuse of notation, P["term"] refers to the value in the object P for the label "term", where P is either manifest, or an object appearing within manifest (e.g., a Person). The algorithm replaces or adds some terms to manifest; the replacement terms are expressed in JSON syntax as {"term":"value"}.

  1. let lang string represent the default language, set to:
    Explanation

    This value is used in the step on language below.

  2. let dir string represents the base direction, set to:
    Explanation

    This value is used in the step on base direction below.

  3. (4.4.9 Title) if manifest["name"] is undefined, then locate the title HTML element using document. If that element exists and is non-empty, let t be its text content, and add to manifest:
    • if the language of title is explicitly set to the value of l, then add
      "name": [{"value": t, "language": l}]
    • or
      "name": [t]
      otherwise
    Explanation

    This step ensures that the title element's content in the primary entry page can be used, as a default, as the title of the publication. For example,

    <html>
    <head>
        <title>Moby Dick</title><script type="application/ld+json">
        {
            "@context" : ["https://schema.org","https://www.w3.org/ns/wp-context"],
            …
        }
        </script>

    yields (unless the name is set explicitly in the manifest):

    {
        "@context" : ["https://schema.org","https://www.w3.org/ns/wp-context"],
        "name"     : ["Moby Dick"],
        …
    }
  4. (4.4.5 Language and Base Direction) if manifest["inLanguage"] is undefined and the value of lang is not undefined, add
    "inLanguage": lang
    to manifest
    Explanation

    This step ensures that the language explicitly set in the primary entry page is valid for an embedded manifest content. For example,

    <html>
    <head><script type="application/ld+json" lang=ur>
        {
            "@context" : ["https://schema.org","https://www.w3.org/ns/wp-context"],
            …
        }
        </script>

    yields (unless the language and the direction are set explicitly in the manifest):

    {
        "@context"    : ["https://schema.org","https://www.w3.org/ns/wp-context"],
        "inLanguage"  : "ur",
        …
    }
  5. (4.4.5 Language and Base Direction) if manifest["inDirection"] is undefined and the value of dir is not undefined, add
    "inDirection": dir
    to manifest
    Explanation

    This step ensures that the base direction explicitly set in the primary entry page is valid for an embedded manifest content. For example,

    <html>
    <head><script type="application/ld+json" dir=rtl lang=ur>
        {
            "@context" : ["https://schema.org","https://www.w3.org/ns/wp-context"],
            "inLanguage"  : "ur",
            …
        }
        </script>

    yields (unless the language and the direction are set explicitly in the manifest):

    {
        "@context"    : ["https://schema.org","https://www.w3.org/ns/wp-context"],
        "inLanguage"  : "ur",
        "inDirection" : "rtl"
        …
    }
  6. (4.5.1 Default Reading Order) if manifest["readingOrder"] is undefined, let u be the value of document.URL, and add
    "readingOrder": [{"type": ["LinkedResource"], "url": u}]
    to the manifest
    Explanation

    If the publication consists only of the primary entry page, the default reading order can be omitted; it will consist, automatically, of that single resource.

  7. (3.1.4.1 Arrays and Single Values) consider P["term"], where P is any object in manifest (including itself) and term is If P["term"] is a single string or object v, then change the relevant term/value to
    "term": [v]
    Repeat this step for all possible values of P["term"].
    Explanation

    A number of terms require their values to be arrays but, for the sake of convenience, authors are allowed to use a single value instead of a one element array. For example,

    {
        "@context"  : ["https://schema.org","https://www.w3.org/ns/wp-context"],
        "name"      : "Moby Dick",
        "author"    : "Herman Melville",
        "resources" : [{
            "type"           : "LinkedResource",
            "rel"            : "https://www.w3.org/ns/wp#cover-page",
            "url"            : "images/cover.jpg"
            "encodingFormat" : "image/jpeg"
        },
            …
        }],
        …
    }

    yields:

    {
        "@context"  : ["https://schema.org","https://www.w3.org/ns/wp-context"],
        "name"      : ["Moby Dick"],
        "author"    : ["Herman Melville"],
        "resources" : [{
            "type"           : ["LinkedResource"],
            "rel"            : ["https://www.w3.org/ns/wp#cover-page"],
            "url"            : "images/cover.jpg"
            "encodingFormat" : "image/jpeg"
        },
            …
        }],
        …
    }
  8. (4.4.4 Creators) if the value v in a manifest["term"] array, where term is one of the creator terms, is a simple string or localizable string, exchange that element in the array to
    {"type": ["Person"], "name": [v]}
    Repeat this step for all possible values of v.
    Explanation

    An author, editor, etc., should be explicitly designed as an object of type Person but, for the sake of convenience, authors are allowed to just give their name. For example,

    {
        "@context"  : ["https://schema.org","https://www.w3.org/ns/wp-context"],
        "name"      : ["Moby Dick"],
        "author"    : ["Herman Melville"],
        …
    }

    yields:

    {
        "@context"  : ["https://schema.org","https://www.w3.org/ns/wp-context"],
        "name"      : ["Moby Dick"],
        "author"    : [{
            "type" : ["Person"],
            "name" : "Herman Melville"
        }],
        …
    }
  9. (3.1.4.3 Link Values) if the value v in a manifest["term"] array, where term is one of the resource categorization properties, is a simple string, exchange that element in the array to
    {"type": ["LinkedResource"], "url": v}
    Repeat this step for all possible values of v.
    Explanation

    Resource links should be explicitly designed as an object of type LinkedResource but, for the sake of convenience, authors are allowed to just give their absolute or relative URL. For example,

    {
        "@context"  : ["https://schema.org","https://www.w3.org/ns/wp-context"],
        …
        "resources" : [
            "css/mobydick.css",
            …
        ],
        …
    }

    yields:

    {
        "@context"  : ["https://schema.org","https://www.w3.org/ns/wp-context"],
        …
        "resources" : [{
            "type" : ["LinkedResource"],
            "url"  : "css/mobydick.css"
        },
            …
        ],
        …
    }
  10. (3.1.4.2 Text Values or Objects) let v be the value, or one of the values in case of an array, of P["term"], where P is any object in manifest (including itself) and term is:
    • accessibilitySummary; or
    • name; or
    • description.
    If v is a single string, then change the relevant term/value to:
    • if manifest[inLanguage] is set to the value of l then
      "term": {"value": v,"language": l}
    • otherwise
      "term": {"value": v}
    Repeat this step for all possible values of v.
    Explanation

    Natural language text values should be explicitly designed as localizable string objects but, for the sake of convenience, authors are allowed to just use a simple string. I.e., if no language information has been provided (via inLanguage) in the manifest then, for example,

    {
        "@context"  : ["https://schema.org","https://www.w3.org/ns/wp-context"],
        "name"      : ["Moby Dick"],
        "author"    : ["Herman Melville"],
        …
    }

    yields:

    {
        "@context"  : ["https://schema.org","https://www.w3.org/ns/wp-context"],
        "name"      : [{
            "value" : "Moby Dick"
        }],
        "author"    : [{
            "value" : "Herman Melville"
        }],
        …
    }

    If an explicit language has also been provided in the manifest, that language is also added to the localizable string object. For example,

    {
        "@context"   : ["https://schema.org","https://www.w3.org/ns/wp-context"],
        "inLanguage" : "en",
        "name"       : ["Moby Dick"],
        "author"     : ["Herman Melville"],
        …
    }

    yields:

    {
        "@context"  : ["https://schema.org","https://www.w3.org/ns/wp-context"],
        "inLanguage": "en",
        "name"      : [{
            "value"    : "Moby Dick",
            "language" : "en"
        }],
        "author"    : [{
            "value"    : "Herman Melville"
            "language" : "en"
        }],
        …
    }
  11. (3.1.7 Relative URLs) if the value of P["term"], where P is any object in manifest (including itself) and term is:
    • url; or
    • id
    is a single string u which is not an absolute URL string, then resolve this value (considered to be a relative URL) using the value of base, yielding the value of au, and replace the term/value pair by
    "term": au
    Explanation

    All relative URLs in the publication manifest must be resolved against the base value to yield absolute URLs.

  12. Return the (transformed) manifest.
Note

See the diagram in the appendix for a visual representation of the algorithm. Also, to help understanding the result of the algorithm, there is a link to the corresponding canonical manifests for all the examples in B. Manifest Examples.

5.3 Processing the manifest

The steps for processing a manifest are given by the following algorithm. The algorithm takes a json object representing a canonical manifest. The output from inputting a JSON object into this algorithm is a processed manifest. The goal of the algorithm is to ensure that the data represented in json abides to the minimal requirements on the data, removing, if applicable, non-conformant data.

  1. Let manifest object be the result of converting json to a WebPublicationManifest dictionary.
  2. Extension point: process any proprietary and/or other supported members at this point in the algorithm.
  3. Perform data cleanup operations on manifest object, possibly removing data, as well as raising warnings.
    1. Check whether the value of manifest object["url"] is a valid URL [url]. If not, issue a warning.
    2. For all the terms defined in 4.4.1 Accessibility, except for accessModeSufficient and accessibilitySummary, check whether all tokens listed in manifest[term] are defined in the preferred vocabulary (see the list of expected values for each). Issue a warning for each unrecognized value.
    3. For all values in manifest object["accessModeSufficient"], check whether each token in each ItemList [schema.org] is defined in the preferred vocabulary (see the list of expected values). Issue a warning for each unrecognized value.
    4. For all the terms defined in 4.4.4 Creators, check whether every object Obj in manifest object[term] has Obj["name"] set. If not, remove Obj from manifest object[term] array and issue a warning.
    5. Check whether the value of manifest object["name"] is not empty. If it is, generate a value (see the separate note for details) and issue a warning.
    6. For all the terms defined in 4.5 Resource Categorization Properties, check whether every object Obj in manifest object[term] has Obj["url"] set. If not, remove Obj from manifest object[term] array and issue a warning. If yes, check whether Obj["url"] is a valid URL [url] and, if not, issue a warning.
    7. Check whether manifest object["datePublished"] is a valid date or date-time, per [iso8601]. If the check fails, issue a warning.
    8. Check whether manifest object["dateModified"] is a valid date or date-time, per [iso8601]. If the check fails, issue a warning.
  4. Return manifest object.

6. Security

Editor's note
Placeholder for security issues.

7. Privacy

Editor's note
Placeholder for privacy issues.

A. Machine-Processable Table of Contents

A.1 Introduction

This section is non-normative.

To facilitate navigation within pages and across sites, HTML uses the nav element [html] to express lists of links. Although generic in nature by default, the purpose of a nav element can be more specifically identified by use of the role attribute [html]. In particular, the doc-toc role from the [dpub-aria-1.0] vocabulary identifies the nav element as the Web Publications’s table of contents.

Including an identifiable table of contents is an accessible way to produce any publication, but due to the flexibility of HTML markup, it also presents challenges for user agents trying to extract a meaningful hierarchy of links (e.g., to provide a custom view available from any page). To avoid duplicating the tables of contents for different uses, this section defines a syntax that is both human friendly and commonly used while still providing enough structure for user agent extraction.

Authors have a choice of lists (ordered or unordered) to construct their table of contents. By tagging each link within these lists in anchor tags (a elements), user agents can easily differentiate the information they need from any peripheral content (asides) or stylistic tagging that has also been added. The table of contents can consist of both active links (with an href attribute) and inactive links (excluding the href attribute), providing additional flexibility in how the table of contents is constructed (e.g., to omit links to certain headings or only link to certain content in a preview).

A.2 HTML Structure

This section is non-normative.

The machine-readable table of contents is defined within an [html] nav element. As described in 3.5 Table of Contents, this nav element has to be both the first element in the document and identifiable by a role attribute with the value doc-toc.

Although the content model of the nav element is not restricted, user agents will only be able to extract a usable table of contents when the following markup guidelines are followed:

Table of Contents Title

Although a title for the table of contents is optional, to avoid having a user agent generate a placeholder title when one is needed, it is advised to add one. Titles are specified using any of the [html] h1 through h6 elements. Note that only the first such element is recognized as the title. If a heading element is not found before the list of links, user agents will assume that one has not been specified.

The first [html] ol or ul list element encountered in the nav element is assumed to contain the list that defines the links into the content. This list will be found even if it is nested inside of div elements, for example, as the algorithm ignores elements that are not relevant to its processing. The list cannot occur inside of any skipped elements, however, since their internal contents are not evaluated.

If the nav element does not contain one of these elements, then user agents will not register the Web Publication as containing a usable table of contents (e.g., a machine-rendered option will not be available).

Branches

If the table of contents is considered as a tree of links, then each list item (li element) inside of the list of links represents one branch. Each of these branches has to have a name and optional destination in order to be presented to users, and this information is obtained from the first a element found within the list item, wherever it is nested (again, excluding any a elements inside of skipped elements.)

The link destination for the branch is obtained from the a element's href attribute, when specified. This attribute can be omitted if a link is not available (e.g., in a preview) or not relevant (e.g., a grouping header). When providing a link into the content, it is also possible to specify the relationship of the linked document (in a rel attribute) and the media type of the linked resource (in a type attribute).

After finding the a element that labels the branch, user agents will continue to inspect the markup for another list element (i.e., sub-branches). If a list is found, it is similarly processed to extract its links, and so on, until there are no more nested branches left to process.

Skipped Elements

A small set of elements are ignored when the parsing table of contents to avoid misinterpretation. These are the [html] sectioning content elements and sectioning root elements. The reason they are ignored is because they can defined their own outlines (i.e., they can represent embedded content that is self-contained and not necessarily related to the structure of content links).

Any element that has its hidden attribute set is also skipped, since hidden elements are not intended to be directly accessed by users.

Although these elements can be included in the nav element, care has to be taken not to embed important content within them (e.g., do not wrap a section element around the list item that contains all the links into the content).

Ignored Elements

All elements that are not relevant to extracting the table of contents, and are not skipped, are ignored. Unlike skipped elements, ignoring means that user agents will continue to search inside them for relevant content, allowing greater flexibility in terms of the tagging that can be used.

A.2.1 Examples

This section is non-normative.

A.3 User Agent Processing

This section defines an algorithm for extracting a table of contents from a nav element. It is defined in terms of a walk over the nodes of a DOM tree, in tree order, with each node being visited when it is entered and when it is exited during the walk. Each time a node is visited, it can be seen as triggering an enter or exit event.

Note

For illustrative purposes, the examples in this section show the structure of the table of contents as JavaScript objects. User agents can process and internalize the resulting structure in whatever language and form is appropriate.

For the purposes of this algorithm, a list element is defined as either an [html] ol or ul element.

The following algorithm MUST be applied to a walk of a DOM subtree rooted at the first nav element in document order with the role attribute value doc-toc. All explanations are informative.

  1. Let toc be a object that represents the table of contents and initialize it as follows:

    1. Create a name property for toc that represents the title of the table of contents and set to an empty string.
    2. Create an entries property for toc that represents all the branches of the table of contents and set to an empty array.
    Explanation

    This step initializes the toc object that will store the title and the branches of the table of contents.

  2. Initialize a stack.

    Explanation

    The stack is used to hold branches that are not yet complete. As a new sub-branch is encountered, the parent gets pushed onto the stack so it can be retrieved later.

  3. Let current toc branch be a variable set to null.

    Explanation

    current toc branch is used to hold the object that represents the branch of the table of contents that is currently being processed.

  4. Walk over the DOM in tree order, starting with the nav element the table of contents is being built from, and trigger the first relevant step below for each element as the walk enters and exits it.

    1. When entering a heading content element:

      Run these steps:

      1. If the stack is empty, and the name property of toc is an empty string, calculate the accessible name [accname-1.1] of the element. If the resulting value is not an empty string after trimming all leading and trailing whitespace, set the name property of toc to the value. Otherwise, set the name property either to a placeholder value or to null.
      2. Exit the element and continue processing with the next element.
      Explanation

      This step identifies the heading for the table of contents. A heading is only processed if the value of the toc name property is an empty string (i.e., no headings have yet been encountered).

      If the name is not an empty string, or is null, then a previous heading has already been encountered or content has been encountered that indicates the nav element does not have a heading (e.g., a list has already been processed, since the heading would not follow the list of links).

    2. When entering a list element:

      Run these steps:

      1. If the name property of toc is an empty string, set name to null.

      2. If current toc branch is not null:

        1. If the entries property of current toc branch is null or a non-empty array, exit the element and continue processing with the next element.
        2. Otherwise, push the object in current toc branch onto the stack and set current toc branch to null.
      3. Otherwise, if the stack is empty:

        1. If the entries property of toc is null or a non-empty array, exit the element and continue processing with the next element.
        2. Otherwise, do nothing.
      Explanation

      This algorithm does not process multiple lists in a single branch or at the root of the nav element, so if a list has already been encountered (the entries property contains one or more branches or is set to null), this list is skipped.

      If a list is encountered and the table of contents (toc) still does not have a name (i.e., no heading element has been encountered), the table of contents is assumed to not have a heading (i.e., the heading for the table of contents cannot appear after the first list of entries). The value of the name property is changed from an empty string to null as no further headings encountered apply, either.

    3. When exiting a list element:

      If the stack is not empty, pop the top object off the stack and set current toc branch to it.

      Explanation

      This resets current toc branch back to the parent object after all of its child branches have been processed.

    4. When entering a list item element:

      Run these steps:

      1. Set current toc branch to a new object.
      2. Create name, url, type, and rel properties for the object and set them to empty strings.
      3. Create an entries property for the object and set it to an empty array.
      Explanation

      Each list item represents a possible new branch in the table of contents, so whenever one is encountered a new blank object is created in current toc branch.

      This object gets populated with information as a descendant a element and list are encountered.

    5. When exiting a list item element:

      Run these steps:

      1. If entries property of current toc branch contains an empty array, set its value to null.

      2. If the stack contains one or more entries:

        1. If the entries property of current toc branch contains a non-empty array, and its name property is an empty string, set its name to a placeholder value or null;
        2. If the entries property of current toc branch contains an empty array, and its name property is an empty string, set current toc branch to null and exit this processing step.

        Add current toc branch to the array in the entries property of the object at the top of the stack.

      3. Otherwise, add the object in current toc branch to the entries array of toc.

      4. Set current toc branch to null.

      Explanation

      Exiting a list item indicates that processing of the current branch is complete. Before adding this branch to its parent's entries array, the branch needs to be tested to see if it has a name and/or any sub-branches. If it does not have a name but has sub-branches, the branch is kept. The user agent can either supply a placeholder value of its own creation or set the value to null. If it does not have a name or any branches, it is invalid and is discarded.

      To determine where to merge the branch, the stack is checked. If there are no objects in the stack, it is added into the entries property of the root toc object (i.e., it is a top-level branch). Otherwise, it gets added into the entries property of the object immediately preceding it in the stack.

      As a final step, current toc branch is reset back to null.

    6. When entering an anchor element and current toc branch is not null:

      Run these steps:

      1. If the name property of current toc branch is not an empty string, do nothing.

      2. Otherwise:

        1. Calculate the accessible name [accname-1.1] for the element. If the resulting value is a non-empty string after trimming leading and trailing white space, set the name property of current toc branch to the resulting value. Otherwise, set the property to null.
        2. If the element has an href attribute and the IRI in the attribute resolves to a resource in the default reading order or resource list, set the url property of current toc branch to the value. Otherwise, set the property to null.
        3. If the element has a type attribute, and the value of the attribute is not an empty string after trimming leading and trailing white space, set the type property of current toc branch to its value. Otherwise, set the property to null.
        4. If the element has a rel attribute, and the value of the attribute is not an empty string after trimming leading and trailing white space, set the rel property of current toc branch to its value. Otherwise, set the property to null.

        Exit the element and continue processing with the next element.

      Explanation

      This step processes anchor tags to obtain values for the name and url properties of a branch.

      If the name of the current branch is already defined, then processing of this element is terminated (i.e., to avoid processing multiple links for a single branch).

      In addition to having an href attribute specified, it is necessary that it resolve to a resource that belongs to the publication to meet the requirements of this specification. If not, the branch is retained but the entry will not be linkable.

      Additional information about the target of the link — the type of resource and its relationship — is also retained.

    7. When entering a sectioning content element, a sectioning root element, or an element with a hidden attribute:

      Exit the element and continue processing with the next element.

      Explanation

      As sectioning and sectioning root elements can define their own outlines, descending into them poses problems for generating the table of contents (i.e., they may contain content that is not directly related). As a result, they are skipped over when encountered to prevent their child content from being processed.

    8. Otherwise: do nothing.

      Explanation

      For all other elements, this steps allows their descendant elements to continue to be processed.

  5. After completing the DOM walk, if the entries property of toc contains a non-empty array, toc represents the machine-processed table of contents.

    Otherwise, the Web Publication does not have a table of contents that can be used for machine rendering purposes.

    Explanation

    If the entries array in the root toc object does not contain any branches (either because no list was found in the nav element or the list did not contain any conforming list items), then the algorithm did not produce a usable table of contents.

B. Manifest Examples

This section is non-normative.

B.1 Simple Book

A manifest for a simple book. The canonical version of this manifest is also available.

B.2 Single-Document Publication

Example for an embedded manifest example. The canonical version of the manifest is, as well as a more elaborate version for the same document are also available.

B.3 Audiobook

A manifest for an audiobook. The canonical version of this manifest is also available.

{
  "@context": ["https://schema.org", "https://www.w3.org/ns/wp-context"],
  "type": "Audiobook",
  "id": "https://librivox.org/flatland-a-romance-of-many-dimensions-by-edwin-abbott-abbott/",
  "url": "https://w3c.github.io/wpub/experiments/audiobook/",
  "name": "Flatland: A Romance of Many Dimensions",
  "author": "Edwin Abbott Abbott",
  "readBy": "Ruth Golding",
  "publisher": "Librivox",
  "inLanguage": "en",
  "dateModified": "2018-06-14T19:32:18Z",
  "datePublished": "2008-10-12",
  "license": "https://creativecommons.org/publicdomain/zero/1.0/",

  "resources": [
    {"rel": "cover", "url": "http://ia800704.us.archive.org/9/items/LibrivoxCdCoverArt12/Flatland_1109.jpg", "encodingFormat": "image/jpeg"},
    {"rel": "contents", "url": "toc.html", "encodingFormat": "text/html"}
  ],

  "readingOrder": [
    {"url": "http://www.archive.org/download/flatland_rg_librivox/flatland_1_abbott.mp3", "encodingFormat": "audio/mpeg", "name": "Part 1, Sections 1 - 3"},
    {"url": "http://www.archive.org/download/flatland_rg_librivox/flatland_2_abbott.mp3", "encodingFormat": "audio/mpeg", "name": "Part 1, Sections 4 - 5"}, 
    {"url": "http://www.archive.org/download/flatland_rg_librivox/flatland_3_abbott.mp3", "encodingFormat": "audio/mpeg", "name": "Part 1, Sections 6 - 7"}, 
    {"url": "http://www.archive.org/download/flatland_rg_librivox/flatland_4_abbott.mp3", "encodingFormat": "audio/mpeg", "name": "Part 1, Sections 8 - 10"}, 
    {"url": "http://www.archive.org/download/flatland_rg_librivox/flatland_5_abbott.mp3", "encodingFormat": "audio/mpeg", "name": "Part 1, Sections 11 - 12"}, 
    {"url": "http://www.archive.org/download/flatland_rg_librivox/flatland_6_abbott.mp3", "encodingFormat": "audio/mpeg", "name": "Part 2, Sections 13 - 14"}, 
    {"url": "http://www.archive.org/download/flatland_rg_librivox/flatland_7_abbott.mp3", "encodingFormat": "audio/mpeg", "name": "Part 2, Sections 15 - 17"}, 
    {"url": "http://www.archive.org/download/flatland_rg_librivox/flatland_8_abbott.mp3", "encodingFormat": "audio/mpeg", "name": "Part 2, Sections 18 - 20"}, 
    {"url": "http://www.archive.org/download/flatland_rg_librivox/flatland_9_abbott.mp3", "encodingFormat": "audio/mpeg", "name": "Part 2, Sections 21 - 22"}
  ]
}

C. Examples for bidirectional texts

This section is non-normative.

(These examples were originally published in the Activity Streams Recommendation [activitystreams-core].)

Character order in memory Direction Method Expected display
פעילות הבינאום, W3C rtl First strong directional character פעילות הבינאום, W3C
The document is titled, "&#x2067;פעילות הבינאום, W3C&#x2069;" ltr First strong directional character The document is titled, "פעילות הבינאום, W3C"
&#x200F;HTML היא שפת סימון rtl Bidi Control Character HTML היא שפת סימון
&#x200E;'سلام' is hello in Persian ltr Bidi Control Character 'سلام' is hello in Persian

D. Lifecycle diagrams

This section is non-normative.

These diagrams provide a visual view of the lifecycle steps, as specified in 5. Web Publication Lifecycle.

D.1 Overview of the lifecyle algorithm

Overview of the lifecyle algorithm, depicting the main building blocks

Figure 2 Overview of the lifecyle algorithm, depicting the main building blocks.
See the normative description of the algorithm in 5. Web Publication Lifecycle. Image available in SVG and PNG formats.

D.2 Finding the manifest

First major block in the lifecyle algorithm: find the manifest, either through an HTTP request or as part of a script elements

Figure 3 First major block in the lifecyle algorithm: find the manifest, either through an HTTP request or as part of a script elements.
See the normative description of the algorithm in 5.1 Obtaining a manifest. Image available in SVG and PNG formats.

D.3 Manifest canonicalization

Second major block in the lifecyle algorithm: create a canonical manifest

Figure 4 Second major block in the lifecyle algorithm: create a canonical manifest.
See the normative description of the algorithm in 5.2 Generating a Canonical Manifest. Image available in SVG and PNG formats.

D.4 Converting the manifest into a data structure

Third major block in the lifecyle algorithm: convert the manifest into a programming language dependent data structure that implements the WebIDL specification of the manifest.

Figure 5 Third major block in the lifecyle algorithm: convert the manifest into a programming language dependent data structure that implements the WebIDL specification of the manifest.
See the normative description of the algorithm in 5.3 Processing the manifest. Image available in SVG and PNG formats.

D.5 Cleaning up the data

Fourth major block in the lifecyle algorithm: check and clean up data by possibly removing data that cannot be interpreted.

Figure 6 Fourth major block in the lifecyle algorithm: check and clean up data by possibly removing data that cannot be interpreted.
See the normative description of the algorithm in 5.3 Processing the manifest. Image available in SVG and PNG formats.

E. IDL Index

dictionary WebPublicationManifest {

};

dictionary LinkedResource {
    required DOMString           url;
             DOMString           encodingFormat;
             sequence<LocalizableString>   name;
             LocalizableString   description;
             sequence<DOMString> rel;
};

partial dictionary WebPublicationManifest {
    required sequence<DOMString> type;
};

partial dictionary WebPublicationManifest {
    sequence<DOMString> accessMode;
    sequence<DOMString> accessModeSufficient;
    sequence<DOMString> accessibilityAPI;
    sequence<DOMString> accessibilityControl;
    sequence<DOMString> accessibilityFeature;
    sequence<DOMString> accessibilityHazard;
    LocalizableString      accessibilitySummary;
};

partial dictionary WebPublicationManifest {
    required DOMString url;
};

partial dictionary WebPublicationManifest {
    DOMString id;
};

partial dictionary WebPublicationManifest {
    sequence<CreatorInfo> artist;
    sequence<CreatorInfo> author;
    sequence<CreatorInfo> colorist;
    sequence<CreatorInfo> contributor;
    sequence<CreatorInfo> creator;
    sequence<CreatorInfo> editor;
    sequence<CreatorInfo> illustrator;
    sequence<CreatorInfo> inker;
    sequence<CreatorInfo> letterer;
    sequence<CreatorInfo> penciler;
    sequence<CreatorInfo> publisher;
    sequence<CreatorInfo> readBy;
    sequence<CreatorInfo> translator;
};


dictionary CreatorInfo {
             sequence<DOMString>         type;
    required sequence<LocalizableString> name;
             DOMString                      id;
             DOMString                      url;
};

partial dictionary WebPublicationManifest {
    DOMString     inLanguage;
    TextDirection inDirection;
};

enum TextDirection {
    "ltr",
    "rtl",
    "auto"
};

dictionary LocalizableString {
    required DOMString value;
             DOMString language;
};

partial dictionary WebPublicationManifest {
    DOMString dateModified;
};

partial dictionary WebPublicationManifest {
    DOMString datePublished;
};

partial dictionary WebPublicationManifest {
    ProgressionDirection readingProgression = "ltr";
};

enum ProgressionDirection {
	"ltr",
	"rtl"
};

partial dictionary WebPublicationManifest {
    required sequence<LocalizableString> name;
};

partial dictionary WebPublicationManifest {
   required sequence<LinkedResource> readingOrder;
};

partial dictionary WebPublicationManifest {
    sequence<LinkedResource> resources = [];
};

partial dictionary WebPublicationManifest {
    sequence<LinkedResource> links = [];
};

F. Image Descriptions

This section is non-normative.

Description for the "Structure of Web Publications" diagram:
A simplified diagram of the structure of a Web Publication. The Web Publication is broken down into two elements. The first element is the actual contents (all the real things listed in the manifest). This element is broken down into the CSS, the actual "things" such as the HTML documents, audio, etc, and the images, fonts etc. The actual "things" have an additional subset of items that includes the entry page to the publication and all of the other documents. The second element is the Manifest (JSON). The manifest is used to generate the canonical manifest, which consists of a list of all the "things" in the publication, the publication metadata, and the default reading order of content. It is noted in the diagram that the entry page has to link to the manifest. (Return to the diagram of Web Publication.)

G. Acknowledgements

This section is non-normative.

The editors would like to specially thank the following individuals for making significant contributions to the authoring and editing of this specification:

Additionally, the following people were members of the Working Group at the time of publication:

The Working Group would also like to thank the members of the Digital Publishing Interest Group for all the hard work they did paving the road for this specification.

H. References

H.1 Normative references

[accname-1.1]
Accessible Name and Description Computation 1.1. Joanmarie Diggs; Bryan Garaventa; Michael Cooper. W3C. 18 December 2018. W3C Recommendation. URL: https://www.w3.org/TR/accname-1.1/
[bcp47]
Tags for Identifying Languages. A. Phillips; M. Davis. IETF. September 2009. IETF Best Current Practice. URL: https://tools.ietf.org/html/bcp47
[bibtex]
BibTeX Format Description. URL: http://www.bibtex.org/Format/
[bidi]
Unicode Bidirectional Algorithm. Mark Davis; Aharon Lanin; Andrew Glass. Unicode Consortium. 14 May 2017. Unicode Standard Annex #9. URL: https://www.unicode.org/reports/tr9/tr9-37.html
[dcterms]
DCMI Metadata Terms. DCMI Usage Board. DCMI. 14 June 2012. DCMI Recommendation. URL: http://dublincore.org/documents/dcmi-terms/
[dom]
DOM Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[dpub-aria-1.0]
Digital Publishing WAI-ARIA Module 1.0. Matt Garrish; Tzviya Siegman; Markus Gylling; Shane McCarron. W3C. 14 December 2017. W3C Recommendation. URL: https://www.w3.org/TR/dpub-aria-1.0/
[ecma-404]
The JSON Data Interchange Format. Ecma International. 1 October 2013. Standard. URL: https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
[ecmascript]
ECMAScript Language Specification. Ecma International. URL: https://tc39.github.io/ecma262/
[fetch]
Fetch Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://fetch.spec.whatwg.org/
[html]
HTML Standard. Anne van Kesteren; Domenic Denicola; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
Link Relations. URL: https://www.iana.org/assignments/link-relations/link-relations.xhtml
[iso8601]
Representation of dates and times. ISO 8601:2004.. International Organization for Standardization (ISO). 2004. ISO 8601:2004. URL: http://www.iso.org/iso/catalogue_detail?csnumber=40874
[json]
The application/json Media Type for JavaScript Object Notation (JSON). D. Crockford. IETF. July 2006. Informational. URL: https://tools.ietf.org/html/rfc4627
[json-ld]
JSON-LD 1.0. Manu Sporny; Gregg Kellogg; Markus Lanthaler. W3C. 16 January 2014. W3C Recommendation. URL: https://www.w3.org/TR/json-ld/
[onix]
ONIX for Books. URL: http://www.editeur.org/83/Overview
[publishing-linking]
Publishing and Linking on the Web. Ashok Malhotra; Larry Masinter; Jeni Tennison; Daniel Appelquist. W3C. 30 April 2013. W3C Note. URL: https://www.w3.org/TR/publishing-linking/
[PWP-UCR]
Web Publications Use Cases and Requirements. Heather Flanagan; Ivan Herman; Leonard Rosenthol. W3C. 2 May 2017. W3C Note. URL: https://www.w3.org/TR/pwp-ucr/
[rfc2046]
Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types. N. Freed; N. Borenstein. IETF. November 1996. Draft Standard. URL: https://tools.ietf.org/html/rfc2046
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[rfc3987]
Internationalized Resource Identifiers (IRIs). M. Duerst; M. Suignard. IETF. January 2005. Proposed Standard. URL: https://tools.ietf.org/html/rfc3987
[rfc5988]
Web Linking. M. Nottingham. IETF. October 2010. Proposed Standard. URL: https://tools.ietf.org/html/rfc5988
[schema.org]
Schema.org. URL: https://schema.org
[string-meta]
Requirements for Language and Direction Metadata in Data Formats. Addison Phillips; Richard Ishida.2017-12-01. URL: https://w3c.github.io/string-meta/
[url]
URL Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://url.spec.whatwg.org/
[WCAG20]
Web Content Accessibility Guidelines (WCAG) 2.0. Ben Caldwell; Michael Cooper; Loretta Guarino Reid; Gregg Vanderheiden et al. W3C. 11 December 2008. W3C Recommendation. URL: https://www.w3.org/TR/WCAG20/
[WCAG21]
Web Content Accessibility Guidelines (WCAG) 2.1. Andrew Kirkpatrick; Joshue O Connor; Alastair Campbell; Michael Cooper. W3C. 5 June 2018. W3C Recommendation. URL: https://www.w3.org/TR/WCAG21/
[WEBIDL]
Web IDL. Cameron McCormack; Boris Zbarsky; Tobie Langel. W3C. 15 December 2016. W3C Editor's Draft. URL: https://heycam.github.io/webidl/
[webidl-1]
WebIDL Level 1. Cameron McCormack. W3C. 15 December 2016. W3C Recommendation. URL: https://www.w3.org/TR/2016/REC-WebIDL-1-20161215/

H.2 Informative references

[activitystreams-core]
Activity Streams 2.0. James Snell; Evan Prodromou. W3C. 23 May 2017. W3C Recommendation. URL: https://www.w3.org/TR/activitystreams-core/
Identifier: A Link Relation to Convey a Preferred URI for Referencing. H. Van de Sompel; M. Nelson; G. Bilder; J. Kunze; S. Warner. IETF. URL: https://tools.ietf.org/html/draft-vandesompel-identifier-00