CINXE.COM

Audiobooks

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"> <head> <meta charset="utf-8" /> <meta name="generator" content="ReSpec 25.18.1" /> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /> <style> span.example-title { text-transform: none } aside.example, div.example, div.illegal-example { padding: .5em; margin: 1em 0; position: relative; clear: both } div.illegal-example { color: red } div.illegal-example p { color: #000 } aside.example, div.example { padding: .5em; border-left-width: .5em; border-left-style: solid; border-color: #e0cb52; background: #fcfaee } aside.example div.example { border-left-width: .1em; border-color: #999; background: #fff } aside.example div.example span.example-title { color: #999 }</style> <style> .issue-label { text-transform: initial } .warning > p:first-child { margin-top: 0 } .warning { padding: .5em; border-left-width: .5em; border-left-style: solid } span.warning { padding: .1em .5em .15em } .issue.closed span.issue-number { text-decoration: line-through } .warning { border-color: #f11; border-width: .2em; border-style: solid; background: #fbe9e9 } .warning-title:before { content: "⚠"; font-size: 1.3em; float: left; padding-right: .3em; margin-top: -.3em } li.task-list-item { list-style: none } input.task-list-item-checkbox { margin: 0 .35em .25em -1.6em; vertical-align: middle } .issue a.respec-gh-label { padding: 5px; margin: 0 2px 0 2px; font-size: 10px; text-transform: none; text-decoration: none; font-weight: 700; border-radius: 4px; position: relative; bottom: 2px; border: none; display: inline-block }</style> <style> dfn { cursor: pointer } .dfn-panel { position: absolute; z-index: 35; min-width: 300px; max-width: 500px; padding: .5em .75em; margin-top: .6em; font: small Helvetica Neue, sans-serif, Droid Sans Fallback; background: #fff; color: #000; box-shadow: 0 1em 3em -.4em rgba(0, 0, 0, .3), 0 0 1px 1px rgba(0, 0, 0, .05); border-radius: 2px } .dfn-panel:not(.docked) > .caret { position: absolute; top: -9px } .dfn-panel:not(.docked) > .caret::after, .dfn-panel:not(.docked) > .caret::before { content: ""; position: absolute; border: 10px solid transparent; border-top: 0; border-bottom: 10px solid #fff; top: 0 } .dfn-panel:not(.docked) > .caret::before { border-bottom: 9px solid #a2a9b1 } .dfn-panel * { margin: 0 } .dfn-panel b { display: block; color: #000; margin-top: .25em } .dfn-panel ul a[href] { color: #333 } .dfn-panel > div { display: flex } .dfn-panel a.self-link { font-weight: 700; margin-right: auto } .dfn-panel .marker { padding: .1em; margin-left: .5em; border-radius: .2em; text-align: center; white-space: nowrap; font-size: 90%; color: #040b1c } .dfn-panel .marker.dfn-exported { background: #d1edfd; box-shadow: 0 0 0 .125em #1ca5f940 } .dfn-panel .marker.idl-block { background: #8ccbf2; box-shadow: 0 0 0 .125em #0670b161 } .dfn-panel a:not(:hover) { text-decoration: none !important; border-bottom: none !important } .dfn-panel a[href]:hover { border-bottom-width: 1px } .dfn-panel ul { padding: 0 } .dfn-panel li { margin-left: 1em } .dfn-panel.docked { position: fixed; left: .5em; top: unset; bottom: 2em; margin: 0 auto; max-width: calc(100vw - .75em * 2 - .5em - .2em * 2); max-height: 30vh; overflow: auto }</style> <title>Audiobooks</title> <link href="common/css/common.css" rel="stylesheet" type="text/css" /> <style id="respec-mainstyle"> @keyframes pop{ 0%{transform:scale(1,1)} 25%{transform:scale(1.25,1.25);opacity:.75} 100%{transform:scale(1,1)} } .hljs { background: 0 0 !important } a abbr, h1 abbr, h2 abbr, h3 abbr, h4 abbr, h5 abbr, h6 abbr { border: none } dfn { font-weight: 700 } a.internalDFN { color: inherit; border-bottom: 1px solid #99c; text-decoration: none } a.externalDFN { color: inherit; border-bottom: 1px dotted #ccc; text-decoration: none } a.bibref { text-decoration: none } .respec-offending-element:target { animation: pop .25s ease-in-out 0s 1 } .respec-offending-element, a[href].respec-offending-element { text-decoration: red wavy underline } @supports not (text-decoration:red wavy underline){ .respec-offending-element:not(pre){display:inline-block} .respec-offending-element{background:url(data:image/gif;base64,R0lGODdhBAADAPEAANv///8AAP///wAAACwAAAAABAADAEACBZQjmIAFADs=) bottom repeat-x} } #references :target { background: #eaf3ff; animation: pop .4s ease-in-out 0s 1 } cite .bibref { font-style: normal } code { color: #c63501 } th code { color: inherit } a[href].orcid { padding-left: 4px; padding-right: 4px } a[href].orcid > svg { margin-bottom: -2px } .toc a, .tof a { text-decoration: none } a .figno, a .secno { color: #000 } ol.tof, ul.tof { list-style: none outside none } .caption { margin-top: .5em; font-style: italic } table.simple { border-spacing: 0; border-collapse: collapse; border-bottom: 3px solid #005a9c } .simple th { background: #005a9c; color: #fff; padding: 3px 5px; text-align: left } .simple th a { color: #fff; padding: 3px 5px; text-align: left } .simple th[scope = row] { background: inherit; color: inherit; border-top: 1px solid #ddd } .simple td { padding: 3px 10px; border-top: 1px solid #ddd } .simple tr:nth-child(even) { background: #f0f6ff } .section dd > p:first-child { margin-top: 0 } .section dd > p:last-child { margin-bottom: 0 } .section dd { margin-bottom: 1em } .section dl.attrs dd, .section dl.eldef dd { margin-bottom: 0 } #issue-summary > ul { column-count: 2 } #issue-summary li { list-style: none; display: inline-block } details.respec-tests-details { margin-left: 1em; display: inline-block; vertical-align: top } details.respec-tests-details > * { padding-right: 2em } details.respec-tests-details[open] { z-index: 999999; position: absolute; border: thin solid #cad3e2; border-radius: .3em; background-color: #fff; padding-bottom: .5em } details.respec-tests-details[open] > summary { border-bottom: thin solid #cad3e2; padding-left: 1em; margin-bottom: 1em; line-height: 2em } details.respec-tests-details > ul { width: 100%; margin-top: -.3em } details.respec-tests-details > li { padding-left: 1em } a[href].self-link:hover { opacity: 1; text-decoration: none; background-color: transparent } h2, h3, h4, h5, h6 { position: relative } aside.example .marker > a.self-link { color: inherit } h2 > a.self-link, h3 > a.self-link, h4 > a.self-link, h5 > a.self-link, h6 > a.self-link { border: none; color: inherit; font-size: 83%; height: 2em; left: -1.6em; opacity: .5; position: absolute; text-align: center; text-decoration: none; top: 0; transition: opacity .2s; width: 2em } h2 > a.self-link::before, h3 > a.self-link::before, h4 > a.self-link::before, h5 > a.self-link::before, h6 > a.self-link::before { content: "§"; display: block } @media (max-width : 767px) { dd { margin-left: 0 } h2 > a.self-link, h3 > a.self-link, h4 > a.self-link, h5 > a.self-link, h6 > a.self-link { left: auto; top: auto } } @media print { .removeOnSave { display: none } }</style> <meta name="description" content="This specification describes the requirements for the creation of audiobooks, using a profile of the Publication Manifest specification." /> <link rel="canonical" href="https://www.w3.org/TR/audiobooks/" /> <style> .hljs { display: block; overflow-x: auto; padding: .5em; color: #383a42; background: #fafafa } .hljs-comment, .hljs-quote { color: #717277; font-style: italic } .hljs-doctag, .hljs-formula, .hljs-keyword { color: #a626a4 } .hljs-deletion, .hljs-name, .hljs-section, .hljs-selector-tag, .hljs-subst { color: #ca4706; font-weight: 700 } .hljs-literal { color: #0b76c5 } .hljs-addition, .hljs-attribute, .hljs-meta-string, .hljs-regexp, .hljs-string { color: #42803c } .hljs-built_in, .hljs-class .hljs-title { color: #9a6a01 } .hljs-attr, .hljs-number, .hljs-selector-attr, .hljs-selector-class, .hljs-selector-pseudo, .hljs-template-variable, .hljs-type, .hljs-variable { color: #986801 } .hljs-bullet, .hljs-link, .hljs-meta, .hljs-selector-id, .hljs-symbol, .hljs-title { color: #336ae3 } .hljs-emphasis { font-style: italic } .hljs-strong { font-weight: 700 } .hljs-link { text-decoration: underline }</style> <style> var { position: relative; cursor: pointer } var[data-type]::after, var[data-type]::before { position: absolute; left: 50%; top: -6px; opacity: 0; transition: opacity .4s; pointer-events: none } var[data-type]::before { content: ""; transform: translateX(-50%); border-width: 4px 6px 0 6px; border-style: solid; border-color: transparent; border-top-color: #000 } var[data-type]::after { content: attr(data-type); transform: translateX(-50%) translateY(-100%); background: #000; text-align: center; font-family: "Dank Mono", "Fira Code", monospace; font-style: normal; padding: 6px; border-radius: 3px; color: #daca88; text-indent: 0; font-weight: 400 } var[data-type]:hover::after, var[data-type]:hover::before { opacity: 1 }</style> <script id="initialUserConfig" type="application/json">{ "group": "publishing", "wgPublicList": "public-publ-wg", "edDraftURI": "https://w3c.github.io/audiobooks/", "errata": "https://w3c.github.io/audiobooks/errata/", "previousPublishDate": "2020-10-01", "prEnd": "2020-10-30", "previousMaturity": "PR", "specStatus": "REC", "implementationReportURI": "https://www.w3.org/publishing/groups/publ-wg/implementation/results.html", "crEnd": "2020-03-31", "updateableRec": true, "noRecTrack": false, "shortName": "audiobooks", "copyrightStart": "2019", "editors": [ { "name": "Wendy Reid", "company": "Rakuten/Kobo", "companyURL": "https://www.kobo.com/", "w3cid": 102009 }, { "name": "Matt Garrish", "company": "DAISY Consortium", "companyURL": "https://daisy.org", "w3cid": 51655 } ], "processVersion": 2020, "includePermalinks": true, "permalinkEdge": true, "permalinkHide": false, "diffTool": "http://www.aptest.com/standards/htmldiff/htmldiff.pl", "github": { "repoURL": "https://github.com/w3c/audiobooks", "branch": "master" }, "localBiblio": { "link-relation": { "title": "Identifier: A Link Relation to Convey a Preferred URI for Referencing", "authors": [ "H. Van de Sompel", "M. Nelson", "G. Bilder", "J. Kunze", "S. Warner" ], "rawDate": "2017-08", "publisher": "IETF", "href": "https://tools.ietf.org/html/draft-vandesompel-identifier-00" }, "cfi": { "authors": [ "Peter Sorotokin", "Garth Conboy", "Brady Duga", "John Rivlin", "Don Beaver", "Kevin Ballard", "Alastair Fettes", "Daniel Weck" ], "title": "EPUB Canonical Fragment Identifiers 1.1", "href": "http://www.idpf.org/epub/linking/cfi/epub-cfi.html", "publisher": "IDPF", "rawDate": "2017-01-05", "status": "Recommended Specification" }, "css": { "title": "CSS Snapshot", "authors": [ "Tab Atkins Jr.", "Elika J. Etemad", "Florian Rivoal" ], "status": "W3C Working Group Note", "href": "https://www.w3.org/TR/CSS/", "publisher": "W3C" }, "doi": { "title": "Information and documentation — Digital object identifier system", "date": "2012-05", "status": "Published", "href": "https://www.iso.org/standard/43506.html" }, "iana-link-relations": { "title": "Link Relations", "href": "https://www.iana.org/assignments/link-relations/link-relations.xhtml" }, "wpub-ann": { "title": "Web Annotation Extensions for Web Publications", "href": "https://www.w3.org/TR/wpub-ann/", "authors": [ "Timothy W. Cole", "Ivan Herman" ], "date": "2018-01-04" }, "pwpub": { "title": "Packaged Web Publications", "href": "https://www.w3.org/TR/pwpub/", "authors": [ "David Wood" ], "date": "2018-01-04" }, "wpub": { "title": "Web Publications", "href": "https://www.w3.org/TR/wpub/", "authors": [ "Matt Garrish", "Ivan Herman" ], "date": "2018-01-04" }, "pub-manifest": { "title": "Publication Manifest", "href": "https://www.w3.org/TR/pub-manifest/", "authors": [ "Matt Garrish", "Ivan Herman" ], "date": "2018-08-16", "id": "pub-manifest" }, "lpf": { "title": "Lightweight Packaging Format (LPF)", "href": "https://w3c.github.io/lpf/", "authors": [ "Laurent Le Meur" ], "date": "2018-08-07", "id": "lpf" }, "sync-media-pub": { "title": "Packaging Synchronized Narration for Web Publications", "href": "https://w3c.github.io/sync-media-pub/packaging.html", "authors": [ "Marisa DeMeglio", "Daniel Weck" ], "date": "2019-07-12" }, "string-meta": { "title": "Requirements for Language and Direction Metadata in Data Formats", "href": "https://w3c.github.io/string-meta/", "authors": [ "Addison Phillips", "Richard Ishida" ], "date": "2017-12-01" }, "schema.org": { "title": "Schema.org", "href": "https://schema.org", "id": "schema.org" }, "onix": { "title": "ONIX for Books", "href": "http://www.editeur.org/83/Overview" }, "bibtex": { "title": "BibTeX Format Description", "href": "http://www.bibtex.org/Format/" } }, "alternateFormats": [ { "uri": "audiobooks.epub", "label": "EPUB" } ], "publishDate": "2020-11-10", "publishISODate": "2020-11-10T00:00:00.000Z", "generatedSubtitle": "Recommendation 10 November 2020" }</script> <link rel="stylesheet" href="https://www.w3.org/StyleSheets/TR/2016/W3C-REC" /> </head> <body class="h-entry"> <div class="head"> <a class="logo" href="https://www.w3.org/"> <img alt="W3C" width="72" height="48" src="https://www.w3.org/StyleSheets/TR/2016/logos/W3C" /> </a> <h1 id="title" class="title">Audiobooks</h1> <h2> W3C Recommendation <time class="dt-published" datetime="2020-11-10">10 November 2020</time> </h2> <dl> <dt>This version:</dt> <dd> <a class="u-url" href="https://www.w3.org/TR/2020/REC-audiobooks-20201110/" >https://www.w3.org/TR/2020/REC-audiobooks-20201110/</a> </dd> <dt>Latest published version:</dt> <dd> <a href="https://www.w3.org/TR/audiobooks/">https://www.w3.org/TR/audiobooks/</a> </dd> <dt>Latest editor's draft:</dt> <dd> <a href="https://w3c.github.io/audiobooks/">https://w3c.github.io/audiobooks/</a> </dd> <dt>Implementation report:</dt> <dd> <a href="https://www.w3.org/publishing/groups/publ-wg/implementation/results.html" >https://www.w3.org/publishing/groups/publ-wg/implementation/results.html</a> </dd> <dt>Previous version:</dt> <dd> <a href="https://www.w3.org/TR/2020/PR-audiobooks-20201001/" >https://www.w3.org/TR/2020/PR-audiobooks-20201001/</a> </dd> <dt>Editors:</dt> <dd class="p-author h-card vcard" data-editor-id="102009"><span class="p-name fn">Wendy Reid</span> (<a class="p-org org h-org h-card" href="https://www.kobo.com/">Rakuten/Kobo</a>) </dd> <dd class="p-author h-card vcard" data-editor-id="51655"><span class="p-name fn">Matt Garrish</span> (<a class="p-org org h-org h-card" href="https://daisy.org">DAISY Consortium</a>) </dd> <dt>Participate:</dt> <dd> <a href="https://github.com/w3c/audiobooks/">GitHub w3c/audiobooks</a> </dd> <dd> <a href="https://github.com/w3c/audiobooks/issues/">File a bug</a> </dd> <dd> <a href="https://github.com/w3c/audiobooks/commits/master">Commit history</a> </dd> <dd> <a href="https://github.com/w3c/audiobooks/pulls/">Pull requests</a> </dd> </dl> <p> Please check the <a href="https://w3c.github.io/audiobooks/errata/"><strong>errata</strong></a> for any errors or issues reported since publication. </p> <p> See also <a href="https://www.w3.org/2003/03/Translations/byTechnology?technology=audiobooks"> <strong>translations</strong></a>. </p> <p> This document is also available in this non-normative format: <a rel="alternate" href="audiobooks.epub" >EPUB</a> </p> <p class="copyright"> <a href="https://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> © 2019-2020 <a href="https://www.w3.org/"><abbr title="World Wide Web Consortium">W3C</abbr></a><sup>®</sup> (<a href="https://www.csail.mit.edu/"><abbr title="Massachusetts Institute of Technology" >MIT</abbr></a>, <a href="https://www.ercim.eu/"><abbr title="European Research Consortium for Informatics and Mathematics">ERCIM</abbr></a>, <a href="https://www.keio.ac.jp/">Keio</a>, <a href="https://ev.buaa.edu.cn/">Beihang</a>). W3C <a href="https://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>, <a href="https://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a> and <a rel="license" href="https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document" >permissive document license</a> rules apply. </p> <hr title="Separator for header" /> </div> <section id="abstract" class="introductory"> <h2>Abstract</h2> <p>This specification describes the requirements for the creation of audiobooks, using a profile of the <dfn id="dfn-publication-manifest">Publication Manifest</dfn> specification.</p> </section> <section id="sotd" class="introductory"> <h2>Status of This Document</h2> <p> <em>This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current <abbr title="World Wide Web Consortium">W3C</abbr> publications and the latest revision of this technical report can be found in the <a href="https://www.w3.org/TR/"><abbr title="World Wide Web Consortium">W3C</abbr> technical reports index</a> at https://www.w3.org/TR/.</em> </p> <p> This document was published by the <a href="https://www.w3.org/publishing/groups/publ-wg/">Publishing Working Group</a> as a Recommendation. </p> <p> <a href="https://github.com/w3c/audiobooks/issues/">GitHub Issues</a> are preferred for discussion of this specification. Alternatively, you can send comments to our mailing list. Please send them to <a href="mailto:public-publ-wg@w3.org">public-publ-wg@w3.org</a> (<a href="https://lists.w3.org/Archives/Public/public-publ-wg/">archives</a>). </p> <p> A <abbr title="World Wide Web Consortium">W3C</abbr> Recommendation is a specification that, after extensive consensus-building, has received the endorsement of the <abbr title="World Wide Web Consortium">W3C</abbr> and its Members. <abbr title="World Wide Web Consortium">W3C</abbr> recommends the wide deployment of this specification as a standard for the Web. Future updates to this Recommendation may incorporate <a href="https://www.w3.org/2020/Process-20200915/#allow-new-features">new features</a>. </p> <p> This document was produced by a group operating under the <a href="https://www.w3.org/Consortium/Patent-Policy-20170801/">1 August 2017 <abbr title="World Wide Web Consortium">W3C</abbr> Patent Policy</a>. <abbr title="World Wide Web Consortium">W3C</abbr> maintains a <a rel="disclosure" href="https://www.w3.org/2004/01/pp-impl/100074/status">public list of any patent disclosures</a> 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 <a href="https://www.w3.org/Consortium/Patent-Policy-20170801/#def-essential">Essential Claim(s)</a> must disclose the information in accordance with <a href="https://www.w3.org/Consortium/Patent-Policy-20170801/#sec-Disclosure">section 6 of the <abbr title="World Wide Web Consortium">W3C</abbr> Patent Policy</a>. </p> <p> This document is governed by the <a id="w3c_process_revision" href="https://www.w3.org/2020/Process-20200915/">15 September 2020 <abbr title="World Wide Web Consortium">W3C</abbr> Process Document</a>. </p> </section> <nav id="toc"> <h2 class="introductory" id="table-of-contents">Table of Contents</h2> <ol class="toc"> <li class="tocline"> <a class="tocxref" href="#intro"><bdi class="secno">1. </bdi>Introduction</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-terminology"><bdi class="secno">2. </bdi>Terminology</a> </li> <li class="tocline"> <a class="tocxref" href="#conformance"><bdi class="secno">3. </bdi>Conformance</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-construction"><bdi class="secno">4. </bdi>Construction</a> <ol class="toc"> <li class="tocline"> <a class="tocxref" href="#audio-pep"><bdi class="secno">4.1 </bdi>Primary Entry Page</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-toc"><bdi class="secno">4.2 </bdi>Table of Contents</a> </li> </ol> </li> <li class="tocline"> <a class="tocxref" href="#audio-manifest"><bdi class="secno">5. </bdi>Manifest</a> <ol class="toc"> <li class="tocline"> <a class="tocxref" href="#audio-properties-intro"><bdi class="secno">5.1 </bdi>Introduction</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-requirements"><bdi class="secno">5.2 </bdi>Requirements</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-context"><bdi class="secno">5.3 </bdi>Manifest Contexts</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-conformance"><bdi class="secno">5.4 </bdi>Publication Conformance</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-type"><bdi class="secno">5.5 </bdi>Publication Type</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-properties"><bdi class="secno">5.6 </bdi>Properties</a> <ol class="toc"> <li class="tocline"> <a class="tocxref" href="#audio-creators"><bdi class="secno">5.6.1 </bdi>Creators</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-duration"><bdi class="secno">5.6.2 </bdi>Duration</a> </li> </ol> </li> <li class="tocline"> <a class="tocxref" href="#audio-readingorder"><bdi class="secno">5.7 </bdi>Default Reading Order</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-resourcelist"><bdi class="secno">5.8 </bdi>Resource List</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-preview"><bdi class="secno">5.9 </bdi>Audiobook Previews</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-packaging"><bdi class="secno">5.10 </bdi>Packaging</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-accessibility"><bdi class="secno">5.11 </bdi>Accessibility</a> </li> </ol> </li> <li class="tocline"> <a class="tocxref" href="#audio-manifest-processing"><bdi class="secno">6. </bdi>Manifest Processing</a> </li> <li class="tocline"> <a class="tocxref" href="#toc-algorithm-extension"><bdi class="secno">7. </bdi>User Agent Processing of Machine-Processable Table of Contents</a> </li> <li class="tocline"> <a class="tocxref" href="#security-privacy"><bdi class="secno">8. </bdi>Security and Privacy Considerations</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-ua-behaviour"><bdi class="secno">9. </bdi>User Agent Behaviors for Audiobooks</a> <ol class="toc"> <li class="tocline"> <a class="tocxref" href="#audio-ua-navigation"><bdi class="secno">9.1 </bdi>Opening and Navigating the Contents of an Audiobook</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-ua-playback"><bdi class="secno">9.2 </bdi>Audiobook Playability</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-ua-packaging"><bdi class="secno">9.3 </bdi>Audiobook Packaging and Offlining</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-ua-accessibility"><bdi class="secno">9.4 </bdi>Audiobooks Accessibility</a> </li> </ol> </li> <li class="tocline"> <a class="tocxref" href="#change-log"><bdi class="secno">10. </bdi>Change Log</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-manifest-examples"><bdi class="secno">A. </bdi>Manifest Examples</a> <ol class="toc"> <li class="tocline"> <a class="tocxref" href="#audio-simple"><bdi class="secno">A.1 </bdi>Simple Audiobook</a> </li> <li class="tocline"> <a class="tocxref" href="#audio-supplemental"><bdi class="secno">A.2 </bdi>Audiobook with Supplemental Content</a> </li> </ol> </li> <li class="tocline"> <a class="tocxref" href="#audio-toc-examples"><bdi class="secno">B. </bdi>Table of Contents Examples</a> <ol class="toc"> <li class="tocline"> <a class="tocxref" href="#toc-pep"><bdi class="secno">B.1 </bdi>Primary Entry Page with a Table of Contents</a> </li> <li class="tocline"> <a class="tocxref" href="#toc-simple"><bdi class="secno">B.2 </bdi>Simple Table of Contents</a> </li> <li class="tocline"> <a class="tocxref" href="#toc-mediafragments"><bdi class="secno">B.3 </bdi>Table of Contents with Media Fragments</a> </li> </ol> </li> <li class="tocline"> <a class="tocxref" href="#ack"><bdi class="secno">C. </bdi>Acknowledgements</a> </li> <li class="tocline"> <a class="tocxref" href="#references"><bdi class="secno">D. </bdi>References</a> <ol class="toc"> <li class="tocline"> <a class="tocxref" href="#normative-references"><bdi class="secno">D.1 </bdi>Normative references</a> </li> <li class="tocline"> <a class="tocxref" href="#informative-references"><bdi class="secno">D.2 </bdi>Informative references</a> </li> </ol> </li> </ol> </nav> <section id="intro" class="informative"> <h2 id="x1-introduction"><bdi class="secno">1. </bdi>Introduction<a class="self-link" aria-label="§" href="#intro"></a></h2> <p> <em>This section is non-normative.</em> </p> <p>An Audiobook is a collection of audio resources grouped together by a reading order, metadata, and resources, all contained in a manifest. This Audiobook can live on the Open Web Platform, or as a packaged entity.</p> <p>This specification is intended to standardize the audiobooks distribution model on the web and between businesses. It should facilitate different user agent architectures for the consumption of Audiobooks. The primary goal is to bring clarity to a part of the publishing industry currently underserved by standards, while opening Audiobooks to the Open Web Platform and new user agents. This specification does not outline what file types or formats should be used by content creators, only a manifest format for delivering them.</p> <p>This specification does not define how user agents are expected to render Audiobooks. Details about the types of affordances that user agents can provide to enhance the reading experience for users are instead defined in [<cite><a class="bibref" data-link-type="biblio" href="#bib-pwp-ucr" title="Web Publications Use Cases and Requirements">pwp-ucr</a></cite>].</p> </section> <section id="audio-terminology"> <h2 id="x2-terminology"><bdi class="secno">2. </bdi>Terminology<a class="self-link" aria-label="§" href="#audio-terminology"></a></h2> <p>Terms with meanings specific to the publishing industry are capitalized in this document (e.g., "Reading System"). A complete list of these <a href="https://www.w3.org/TR/pub-manifest/#terminology">terms and definitions</a> is provided in [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>].</p> <p>Only the first instance of a term in a section is linked to its definition.</p> <p>In addition, the following terminology is defined for use in this specification:</p> <dl class="termlist"> <dt> <dfn id="dfn-file-name" data-lt="File Names|Supplemental Content">Supplemental Content</dfn> </dt> <dd> <p>Supplemental content is any content relating to the audiobook content but not required for the full experience of the publication. Examples of supplemental content include photographs, charts, or data relating to topics mentioned in the audiobook.</p> </dd> </dl> </section> <section id="conformance"> <h2 id="x3-conformance"><bdi class="secno">3. </bdi>Conformance<a class="self-link" aria-label="§" href="#conformance"></a></h2> <p>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.</p> <p> The key words <em class="rfc2119">MAY</em>, <em class="rfc2119">MUST</em>, <em class="rfc2119">MUST NOT</em>, <em class="rfc2119">RECOMMENDED</em>, <em class="rfc2119">REQUIRED</em>, and <em class="rfc2119">SHOULD</em> in this document are to be interpreted as described in <a href="https://tools.ietf.org/html/bcp14">BCP 14</a> [<cite><a class="bibref" data-link-type="biblio" href="#bib-rfc2119" title="Key words for use in RFCs to Indicate Requirement Levels" >RFC2119</a></cite>] [<cite><a class="bibref" data-link-type="biblio" href="#bib-rfc8174" title="Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words">RFC8174</a></cite>] when, and only when, they appear in all capitals, as shown here. </p> </section> <section id="audio-construction"> <h2 id="x4-construction"><bdi class="secno">4. </bdi>Construction<a class="self-link" aria-label="§" href="#audio-construction"></a></h2> <section id="audio-pep"> <h3 id="x4-1-primary-entry-page"><bdi class="secno">4.1 </bdi>Primary Entry Page<a class="self-link" aria-label="§" href="#audio-pep"></a></h3> <p>The <dfn id="dfn-primary-entry-page">primary entry page</dfn> is an HTML <a href="#audio-resourcelist">resource</a> that represents the preferred starting resource of an Audiobook and enables discovery of its manifest. It typically introduces the audiobook and provides access to the content.</p> <p>The primary entry page <em class="rfc2119">MUST</em> include either a <a href="https://www.w3.org/TR/pub-manifest/#manifest-link">link to the manifest</a> or <a href="https://www.w3.org/TR/pub-manifest/#manifest-embed">embed the manifest</a> [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest" >pub-manifest</a></cite>]. It also <em class="rfc2119">SHOULD</em> contain the <a href="#audio-toc">table of contents</a>.</p> <p>An Audiobook <em class="rfc2119">MUST</em> include a primary entry page except when <a href="https://www.w3.org/TR/audiobooks/#audio-packaging">packaging</a> allows alternative discovery of the manifest. When present, the page <em class="rfc2119">MUST</em> be included in the <a href="#audio-resourcelist">resource list</a>.</p> </section> <section id="audio-toc"> <h3 id="x4-2-table-of-contents"><bdi class="secno">4.2 </bdi>Table of Contents<a class="self-link" aria-label="§" href="#audio-toc"></a></h3> <p>The table of contents provides a hierarchical list of links that reflects the structural outline of the major sections of the Audiobook and any supplemental content it may contain.</p> <p>The table of contents is expressed via an [<cite><a class="bibref" data-link-type="biblio" href="#bib-html" title="HTML Standard">html</a></cite>] element (typically a nav element) in one of the resources. This element <em class="rfc2119">MUST</em> be identified by the role attribute [<cite><a class="bibref" data-link-type="biblio" href="#bib-html" title="HTML Standard" >html</a></cite>] value <code>"doc-toc"</code> [<cite><a class="bibref" data-link-type="biblio" href="#bib-dpub-aria-1.0" title="Digital Publishing WAI-ARIA Module 1.0">dpub-aria-1.0</a></cite>].</p> <p>If the table of contents is located in the <a href="#audio-pep">primary entry page</a>, the table of contents <em class="rfc2119">MUST</em> be the first element in the document — in document tree order [<cite><a class="bibref" data-link-type="biblio" href="#bib-dom" title="DOM Standard" >dom</a></cite>] — with that role value. Otherwise, the manifest <em class="rfc2119" >SHOULD</em> identify the resource that contains the structure.</p> <p>If the table of contents is not located in the <a href="#audio-pep">primary entry page</a>, the manifest <em class="rfc2119">SHOULD</em> identify the resource that contains the structure.</p> <p>When an Audiobook contains additional resources (i.e. supplemental content):</p> <ul> <li> <p>a table of contents <em class="rfc2119">SHOULD</em> be included;</p> </li> <li> <p>the table of contents <em class="rfc2119">SHOULD</em> include a link to any of the <a href="#audio-resourcelist">resources</a>; and</p> </li> <li> <p>all links <em class="rfc2119">SHOULD</em> refer to <a href="https://www.w3.org/TR/pub-manifest/#publication-resources">publication resources</a>&#160;[<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>].</p> </li> </ul> <div class="note" role="note" id="issue-container-generatedID"> <div role="heading" class="note-title marker" id="h-note" aria-level="4"> <span>Note</span> </div> <p class="">When including supplemental content, be aware that users might not have access to this content unless it is linked to from the table of contents. It is strongly advised to provide links to all content that is not in the default reading order.</p> </div> <div class="note" role="note" id="issue-container-generatedID-0"> <div role="heading" class="note-title marker" id="h-note-0" aria-level="4"> <span>Note</span> </div> <p class="">For more guidance on the structure and formatting for tables of contents, consult <a href="https://w3c.github.io/pub-manifest/#app-toc-structure">Publication Manifest - Machine-Processable Table of Contents</a> [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>].</p> </div> </section> </section> <section id="audio-manifest" class="normative"> <h2 id="x5-manifest"><bdi class="secno">5. </bdi>Manifest<a class="self-link" aria-label="§" href="#audio-manifest"></a></h2> <section id="audio-properties-intro" class="informative"> <h3 id="x5-1-introduction"><bdi class="secno">5.1 </bdi>Introduction<a class="self-link" aria-label="§" href="#audio-properties-intro"></a></h3> <p> <em>This section is non-normative.</em> </p> <p>The Audiobook manifest is defined by a set of properties that describe the basic information a user agent requires to process and render an Audiobook. These properties are categorized in the Publication Manifest [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>]. Where these properties are extended from the Publication Manifest is specified in this section.</p> <div class="note" role="note" id="issue-container-generatedID-1"> <div role="heading" class="note-title marker" id="h-note-1" aria-level="4"> <span>Note</span> </div> <p class="">The Audiobook manifest is defined as a specific "shape" of [<cite><a class="bibref" data-link-type="biblio" href="#bib-json-ld11" title="JSON-LD 1.1">json-ld11</a></cite>]. This shape is also defined, informally, through a JSON schema&#160;[<cite><a class="bibref" data-link-type="biblio" href="#bib-json-schema" title="JSON Schema: core definitions and terminology">json-schema</a></cite>] that expresses the constraints defined in this specification. This schema is maintained at <a href="https://www.w3.org/ns/pub-schema/audiobooks/" >https://www.w3.org/ns/pub-schema/audiobooks/</a>.</p> </div> </section> <section id="audio-requirements"> <h3 id="x5-2-requirements"><bdi class="secno">5.2 </bdi>Requirements<a class="self-link" aria-label="§" href="#audio-requirements"></a></h3> <p>The requirements for the expression of Audiobook properties and resource relations are defined as follows:</p> <div class="note" role="note" id="issue-container-generatedID-2"> <div role="heading" class="note-title marker" id="h-note-2" aria-level="4"> <span>Note</span> </div> <p class="">The list of properties uses the formal names for each property as described in [<cite><a class="bibref" data-link-type="biblio" href="#bib-schema.org" title="Schema.org" >schema.org</a></cite>] and [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>]. A descriptive label is included in parentheses where the purpose of these properties might be unclear.</p> </div> <dl> <dt><em class="rfc2119">REQUIRED</em>:</dt> <dd> <ul> <li> <a href="https://www.w3.org/TR/pub-manifest/#profile-conformance"> <code>conformsTo</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#manifest-context"> <code>@context</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#default-reading-order"> <code>readingOrder</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#pub-title"><code>name</code></a> (publication title) </li> </ul> </dd> <dt><em class="rfc2119">RECOMMENDED</em>:</dt> <dd> <ul> <li> <a href="https://www.w3.org/TR/pub-manifest/#abridged"> <code>abridged</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#accessibilityFeature"> <code>accessibilityFeature</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#accessibilityHazard"> <code>accessibilityHazard</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#accessibilitySummary"> <code>accessibilitySummary</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#accessMode"> <code>accessMode</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#accessModeSufficient"> <code>accessModeSufficient</code> </a> </li> <li> <a href="#audio-creators"> <code>author</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#cover"> <code>cover</code> </a> </li> <li> <a href="#audio-duration"> <code>duration</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#last-modification-date"> <code>dateModified</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#publication-date"> <code>datePublished</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#canonical-identifier"><code>id</code></a> (canonical identifier) </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#inLanguage"><code>inLanguage</code></a> (publication language) </li> <li> <a href="#audio-creators"> <code>readBy</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#reading-progression-direction"> <code>readingProgression</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#resource-list"> <code>resources</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#publication-types"> <code>type</code> </a> </li> <li> <a href="https://www.w3.org/TR/pub-manifest/#address"><code>url</code></a> (address) </li> </ul> </dd> </dl> <div class="note" role="note" id="issue-container-generatedID-3"> <div role="heading" class="note-title marker" id="h-note-3" aria-level="4"> <span>Note</span> </div> <p class="">Some properties are implicitly required, as they are compiled from alternative information when not explicitly authored. Refer to the <a href="https://www.w3.org/TR/pub-manifest/#app-internal-rep-data-model">internal representation data models</a>&#160;[<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>] for more information (the Audiobooks representation only differs in the default value for the <code>type</code> term).</p> </div> </section> <section id="audio-context" class="normative"> <h3 id="x5-3-manifest-contexts"><bdi class="secno">5.3 </bdi>Manifest Contexts<a class="self-link" aria-label="§" href="#audio-context"></a></h3> <p>An Audiobook manifest has to start by setting the JSON-LD context [<cite><a class="bibref" data-link-type="biblio" href="#bib-json-ld" title="JSON-LD 1.0">json-ld</a></cite>]. The context has the following two major components:</p> <ul> <li>the [<cite><a class="bibref" data-link-type="biblio" href="#bib-schema.org" title="Schema.org" >schema.org</a></cite>] context: <code>https://schema.org</code></li> <li>the publication context: <code>https://www.w3.org/ns/pub-context</code></li> </ul> <div class="example" id="example-1-the-context-declaration"> <div class="marker"> <a class="self-link" href="#example-1-the-context-declaration">Example<bdi> 1</bdi></a> <span class="example-title">: The context declaration.</span> </div> <pre aria-busy="false"><code class="hljs javascript">{ <span class="hljs-string">"@context"</span> : [<span class="hljs-string">"https://schema.org"</span>, <span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>], … }</code></pre> </div> <p>To add the global language and direction of the manifest metadata, <a href="https://www.w3.org/TR/pub-manifest/#manifest-lang-dir">language and direction</a> declaration [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>] can also be added to the context:</p> <div class="example" id="example-2-declaring-french-as-the-default-language-for-the-manifest"> <div class="marker"> <a class="self-link" href="#example-2-declaring-french-as-the-default-language-for-the-manifest" >Example<bdi> 2</bdi></a> <span class="example-title">: Declaring French as the default language for the manifest</span> </div> <pre aria-busy="false"><code class="hljs json">{ <span class="hljs-attr">"@context"</span> : [ <span class="hljs-string">"https://schema.org"</span>, <span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>, {<span class="hljs-attr">"language"</span>:<span class="hljs-string">"fr"</span>} ] … }</code></pre> </div> </section> <section id="audio-conformance"> <h3 id="x5-4-publication-conformance"><bdi class="secno">5.4 </bdi>Publication Conformance<a class="self-link" aria-label="§" href="#audio-conformance"></a></h3> <p>The conformance URL expressed in the <a href="https://www.w3.org/TR/pub-manifest/#profile-conformance"><code>conformsTo</code> term</a>&#160;[<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>] <em class="rfc2119">MUST</em> be "<code>https://www.w3.org/TR/audiobooks/</code>".</p> <div class="example" id="example-3-setting-a-publication-s-conformance-to-audiobook"> <div class="marker"> <a class="self-link" href="#example-3-setting-a-publication-s-conformance-to-audiobook" >Example<bdi> 3</bdi></a> <span class="example-title">: Setting a publication's conformance to Audiobook.</span> </div> <pre aria-busy="false"><code class="hljs json">{ <span class="hljs-attr">"@context"</span> : [<span class="hljs-string">"https://schema.org"</span>, <span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>], <span class="hljs-attr">"conformsTo"</span> : <span class="hljs-string">"https://www.w3.org/TR/audiobooks/"</span> … }</code></pre> </div> </section> <section id="audio-type"> <h3 id="x5-5-publication-type"><bdi class="secno">5.5 </bdi>Publication Type<a class="self-link" aria-label="§" href="#audio-type"></a></h3> <p>The <dfn id="dfn-publication-type">Publication Type</dfn> is defined using the <code>type</code> term&#160;[<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>].</p> <div class="example" id="example-4-setting-a-publication-s-type-to-audiobook"> <div class="marker"> <a class="self-link" href="#example-4-setting-a-publication-s-type-to-audiobook">Example<bdi> 4</bdi></a> <span class="example-title">: Setting a publication's type to Audiobook.</span> </div> <pre aria-busy="false"><code class="hljs json">{ <span class="hljs-attr">"@context"</span> : [<span class="hljs-string">"https://schema.org"</span>, <span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>], <span class="hljs-attr">"type"</span> : <span class="hljs-string">"Audiobook"</span> … }</code></pre> </div> <p>If a <code>type</code> is not specified, <a href="https://schema.org/Audiobook" ><code>Audiobook</code></a>&#160;[<cite><a class="bibref" data-link-type="biblio" href="#bib-schema.org" title="Schema.org">schema.org</a></cite>] is assumed as the default.</p> </section> <section id="audio-properties"> <h3 id="x5-6-properties"><bdi class="secno">5.6 </bdi>Properties<a class="self-link" aria-label="§" href="#audio-properties"></a></h3> <section id="audio-creators"> <h4 id="x5-6-1-creators"><bdi class="secno">5.6.1 </bdi>Creators<a class="self-link" aria-label="§" href="#audio-creators"></a></h4> <p>A <dfn id="dfn-creator">creator</dfn> is an individual or entity responsible for the creation of the Audiobook. The Audiobooks profile can use the full list of <a href="https://www.w3.org/TR/pub-manifest/#creators">creators</a> defined in [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>].</p> <p>The creators list includes two recommended creators for Audiobooks:</p> <ul> <li> <a href="https://schema.org/author">author</a> </li> <li> <a href="https://schema.org/readBy">readBy</a> </li> </ul> <div class="example" id="example-5-author-of-a-book"> <div class="marker"> <a class="self-link" href="#example-5-author-of-a-book">Example<bdi> 5</bdi></a> <span class="example-title">: Author of a book</span> </div> <pre aria-busy="false"><code class="hljs javascript">{ <span class="hljs-string">"conformsTo"</span> : <span class="hljs-string">"https://www.w3.org/TR/audiobooks/"</span>, <span class="hljs-string">"@context"</span> : [<span class="hljs-string">"https://schema.org"</span>,<span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>], <span class="hljs-string">"type"</span> : <span class="hljs-string">"Audiobook"</span>, … <span class="hljs-string">"url"</span> : <span class="hljs-string">"https://publisher.example.org/janeeyre"</span>, <span class="hljs-string">"author"</span> : { <span class="hljs-string">"type"</span> : <span class="hljs-string">"Person"</span>, <span class="hljs-string">"name"</span> : <span class="hljs-string">"Charlotte Bronte"</span> } }</code></pre> </div> <div class="example" id="example-6-author-and-narrator-of-an-audiobook"> <div class="marker"> <a class="self-link" href="#example-6-author-and-narrator-of-an-audiobook">Example<bdi> 6</bdi></a> <span class="example-title">: Author and Narrator of an Audiobook</span> </div> <pre aria-busy="false"><code class="hljs javascript">{ <span class="hljs-string">"conformsTo"</span> : <span class="hljs-string">"https://www.w3.org/TR/audiobooks/"</span>; <span class="hljs-string">"@context"</span>: [<span class="hljs-string">"https://schema.org"</span>, <span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>], … <span class="hljs-string">"url"</span> : <span class="hljs-string">"https://publisher.example.org/janeeyre"</span>, <span class="hljs-string">"author"</span> : { <span class="hljs-string">"type"</span>: <span class="hljs-string">"Person"</span>, <span class="hljs-string">"name"</span>: <span class="hljs-string">"Charlotte Bronte"</span> } <span class="hljs-string">"readBy"</span> : { <span class="hljs-string">"type"</span>: <span class="hljs-string">"Person"</span>, <span class="hljs-string">"name"</span>: <span class="hljs-string">"Ivan Herman"</span>, <span class="hljs-string">"id"</span> : <span class="hljs-string">"https://www.w3.org/People/Ivan/"</span> } }</code></pre> </div> </section> <section id="audio-duration"> <h4 id="x5-6-2-duration"><bdi class="secno">5.6.2 </bdi>Duration<a class="self-link" aria-label="§" href="#audio-duration"></a></h4> <p>A <dfn id="dfn-duration">duration</dfn> is the length of the audio resources in an Audiobook. The duration property is fully defined in <a href="https://www.w3.org/TR/pub-manifest/#duration" >Publication Manifest</a> [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>].</p> <p>Duration <em class="rfc2119">SHOULD</em> be expressed for the entirety of the audiobook as part of the manifest, and <em class="rfc2119">SHOULD</em> be present at the item level in the <a href="#audio-readingorder">default reading order</a>.</p> <p>When a content creator specifies both the duration for the audiobook and item-level duration in the <a href="#audio-readingorder">default reading order</a> the resource-level duration <em class="rfc2119">SHOULD</em> be equal to the sum of the durations of the items in the reading order.</p> <div class="example" id="example-7-duration-of-an-audiobook-in-seconds"> <div class="marker"> <a class="self-link" href="#example-7-duration-of-an-audiobook-in-seconds">Example<bdi> 7</bdi></a> <span class="example-title">: Duration of an Audiobook in Seconds</span> </div> <pre aria-busy="false"><code class="hljs javascript">{ <span class="hljs-string">"conformsTo"</span> : <span class="hljs-string">"https://www.w3.org/TR/audiobooks/"</span>, <span class="hljs-string">"@context"</span> : [<span class="hljs-string">"https://schema.org"</span>,<span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>], … <span class="hljs-string">"url"</span> : <span class="hljs-string">"https://publisher.example.org/janeeyre"</span>, <span class="hljs-string">"author"</span> : { <span class="hljs-string">"type"</span> : <span class="hljs-string">"Person"</span>, <span class="hljs-string">"name"</span> : <span class="hljs-string">"Charlotte Bronte"</span> }, <span class="hljs-string">"duration"</span> : <span class="hljs-string">"PT12345.235S"</span> }</code></pre> </div> </section> </section> <section id="audio-readingorder"> <h3 id="x5-7-default-reading-order"><bdi class="secno">5.7 </bdi>Default Reading Order<a class="self-link" aria-label="§" href="#audio-readingorder"></a></h3> <p>The <a href="https://www.w3.org/TR/pub-manifest/#default-reading-order"><dfn id="dfn-default-reading-order">default reading order</dfn></a> [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest" >pub-manifest</a></cite>] is a specific progression through the audio resources in the audiobook.</p> <p>The default reading order <em class="rfc2119">MUST</em> contain at least one audio resource, which <em class="rfc2119">MAY</em> be identified by the <code>type</code> of <a href="https://www.w3.org/TR/pub-manifest/#value-linked-resource"><code>LinkedResource</code></a> [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>]. The default reading order <em class="rfc2119">MUST NOT</em> contain non-audio resources.</p> <p>An audio resource can be referenced in its entirety via a URL [<cite><a class="bibref" data-link-type="biblio" href="#bib-url" title="URL Standard">url</a></cite>], or for content where multiple chapters occupy a single file by using <a href="https://www.w3.org/TR/media-frags/" >media fragments</a> [<cite><a class="bibref" data-link-type="biblio" href="#bib-media-frags" title="Media Fragments URI 1.0 (basic)">media-frags</a></cite>] to locate the exact starting and end points.</p> <div class="note" role="note" id="issue-container-generatedID-4"> <div role="heading" class="note-title marker" id="h-note-4" aria-level="4"> <span>Note</span> </div> <p class="">It is important to note that a resource cannot be referenced more than once in the reading order. In the case where an audio file represents the content of multiple chapters or sections of the book, the <a href="#audio-toc">table of contents</a> can be used to specify the starting and ending points of those chapters in the larger audio file, as demonstrated in <a href="#toc-mediafragments">this example</a>.</p> </div> <div class="note" role="note" id="issue-container-generatedID-5"> <div role="heading" class="note-title marker" id="h-note-5" aria-level="4"> <span>Note</span> </div> <p class="">Annotations can also use media fragments to identify the location of the annotation in the resource, and are compatible with the <a href="https://www.w3.org/TR/annotation-model/">Web Annotations</a> model. This method will only apply to audiobook manifests that are not packaged.</p> </div> <div class="example" id="example-8-audiobook-reading-order-for-a-single-resource"> <div class="marker"> <a class="self-link" href="#example-8-audiobook-reading-order-for-a-single-resource" >Example<bdi> 8</bdi></a> <span class="example-title">: Audiobook Reading Order for a Single Resource</span> </div> <pre aria-busy="false"><code class="hljs json">{ <span class="hljs-attr">"@context"</span> : [<span class="hljs-string">"https://schema.org"</span>, <span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>], <span class="hljs-attr">"conformsTo"</span> : <span class="hljs-string">"https://www.w3.org/TR/audiobooks/"</span>, <span class="hljs-attr">"url"</span> : <span class="hljs-string">"https://publisher.example.org/janeeyre"</span>, <span class="hljs-attr">"name"</span> : <span class="hljs-string">"Jane Eyre"</span>, <span class="hljs-attr">"readingOrder"</span> : [{ <span class="hljs-attr">"type"</span> : <span class="hljs-string">"LinkedResource"</span>, <span class="hljs-attr">"url"</span> : <span class="hljs-string">"audio/janeeyre.mp3"</span>, <span class="hljs-attr">"encodingFormat"</span> : <span class="hljs-string">"audio/mp3"</span>, <span class="hljs-attr">"name"</span> : <span class="hljs-string">"Jane Eyre"</span>, <span class="hljs-attr">"duration"</span> : <span class="hljs-string">"PT124503.123S"</span> }] }</code></pre> </div> <div class="example" id="example-9-audiobook-reading-order-for-multiple-resources-using-media-fragments"> <div class="marker"> <a class="self-link" href="#example-9-audiobook-reading-order-for-multiple-resources-using-media-fragments" >Example<bdi> 9</bdi></a> <span class="example-title">: Audiobook Reading Order for Multiple Resources using Media Fragments</span> </div> <pre aria-busy="false"><code class="hljs json">{ <span class="hljs-attr">"@context"</span> : [<span class="hljs-string">"https://schema.org"</span>, <span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>], <span class="hljs-attr">"conformsTo"</span> : <span class="hljs-string">"https://www.w3.org/TR/audiobooks/"</span>, <span class="hljs-attr">"url"</span> : <span class="hljs-string">"https://publisher.example.org/janeeyre"</span>, <span class="hljs-attr">"name"</span> : <span class="hljs-string">"Jane Eyre"</span>, <span class="hljs-attr">"readingOrder"</span> : [{ <span class="hljs-attr">"type"</span>: <span class="hljs-string">"LinkedResource"</span>, <span class="hljs-attr">"url"</span> : <span class="hljs-string">"audio/part001.wav#t=0,457.931"</span>, <span class="hljs-attr">"encodingFormat"</span> : <span class="hljs-string">"audio/vnd-wav"</span>, <span class="hljs-attr">"name"</span> : <span class="hljs-string">"Chapter 1"</span>, <span class="hljs-attr">"duration"</span> : <span class="hljs-string">"PT457.931S"</span> }, { <span class="hljs-attr">"type"</span> : <span class="hljs-string">"LinkedResource"</span>, <span class="hljs-attr">"url"</span> : <span class="hljs-string">"audio/part002.wav#t=12.741"</span>, <span class="hljs-attr">"encodingFormat"</span> : <span class="hljs-string">"audio/vnd-wav"</span>, <span class="hljs-attr">"name"</span> : <span class="hljs-string">"Chapter 2"</span>, <span class="hljs-attr">"duration"</span> : <span class="hljs-string">"PT234.245S"</span> }] }</code></pre> </div> </section> <section id="audio-resourcelist"> <h3 id="x5-8-resource-list"><bdi class="secno">5.8 </bdi>Resource List<a class="self-link" aria-label="§" href="#audio-resourcelist"></a></h3> <p>The <dfn id="dfn-resource-list">resource list</dfn> enumerates any additional resources used in the processing and rendering of an audiobook that are not listed in the reading order. It is expressed using the <code>resources</code> property.</p> <p>If an audiobook includes supplemental content it <em class="rfc2119">MUST</em> be referenced in the resource list.</p> <div class="example" id="example-10-audiobook-with-supplemental-content"> <div class="marker"> <a class="self-link" href="#example-10-audiobook-with-supplemental-content">Example<bdi> 10</bdi></a> <span class="example-title">: Audiobook with Supplemental Content</span> </div> <pre aria-busy="false"><code class="hljs json">{ <span class="hljs-attr">"@context"</span> : [<span class="hljs-string">"https://schema.org"</span>, <span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>], <span class="hljs-attr">"conformsTo"</span> : <span class="hljs-string">"https://www.w3.org/TR/audiobooks/"</span>, <span class="hljs-attr">"url"</span> : <span class="hljs-string">"https://publisher.example.org/janeeyre"</span>, <span class="hljs-attr">"name"</span> : <span class="hljs-string">"Jane Eyre"</span>, <span class="hljs-attr">"resources"</span> : [ <span class="hljs-string">"cover.jpg"</span>, <span class="hljs-string">"portrait_CB.jpg"</span>, <span class="hljs-string">"supplement.pdf"</span> ] }</code></pre> </div> </section> <section id="audio-preview"> <h3 id="x5-9-audiobook-previews"><bdi class="secno">5.9 </bdi>Audiobook Previews<a class="self-link" aria-label="§" href="#audio-preview"></a></h3> <p>Previews are a common way to provide users an experience of the full content before purchasing or downloading the full audiobook.</p> <p>A <a href="https://www.w3.org/TR/pub-manifest/#preview">preview</a> is identified using the <code>preview</code> link relation, as defined in [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest" >pub-manifest</a></cite>].</p> <p>Previews <em class="rfc2119">MAY</em> be located externally or included as a resource of the audiobook.</p> <div class="example" id="example-11-audiobook-with-an-external-preview"> <div class="marker"> <a class="self-link" href="#example-11-audiobook-with-an-external-preview">Example<bdi> 11</bdi></a> <span class="example-title">: Audiobook with an External Preview</span> </div> <pre aria-busy="false"><code class="hljs json">{ <span class="hljs-attr">"@context"</span> : [<span class="hljs-string">"https://schema.org"</span>, <span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>], <span class="hljs-attr">"conformsTo"</span> : <span class="hljs-string">"https://www.w3.org/TR/audiobooks/"</span>, <span class="hljs-attr">"url"</span> : <span class="hljs-string">"https://publisher.example.org/janeeyre"</span>, <span class="hljs-attr">"name"</span> : <span class="hljs-string">"Jane Eyre"</span>, <span class="hljs-attr">"resources"</span> : [{ <span class="hljs-attr">"type"</span> : <span class="hljs-string">"LinkedResource"</span>, <span class="hljs-attr">"url"</span> : <span class="hljs-string">"https://publisher.example.org/jane-eyre-preview.wav"</span>, <span class="hljs-attr">"encodingFormat"</span> : <span class="hljs-string">"audio/wav"</span>, <span class="hljs-attr">"rel"</span> : <span class="hljs-string">"preview"</span> }] }</code></pre> </div> <div class="example" id="example-12-audiobook-with-an-internal-preview"> <div class="marker"> <a class="self-link" href="#example-12-audiobook-with-an-internal-preview">Example<bdi> 12</bdi></a> <span class="example-title">: Audiobook with an Internal Preview</span> </div> <pre aria-busy="false"><code class="hljs json">{ <span class="hljs-attr">"@context"</span> : [<span class="hljs-string">"https://schema.org"</span>, <span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>], <span class="hljs-attr">"conformsTo"</span> : <span class="hljs-string">"https://www.w3.org/TR/audiobooks/"</span>, <span class="hljs-attr">"url"</span> : <span class="hljs-string">"https://publisher.example.org/janeeyre"</span>, <span class="hljs-attr">"name"</span> : <span class="hljs-string">"Jane Eyre"</span>, <span class="hljs-attr">"resources"</span> : [{ <span class="hljs-attr">"type"</span> : <span class="hljs-string">"LinkedResource"</span>, <span class="hljs-attr">"url"</span> : <span class="hljs-string">"preview.wav"</span>, <span class="hljs-attr">"encodingFormat"</span> : <span class="hljs-string">"audio/wav"</span>, <span class="hljs-attr">"rel"</span> : <span class="hljs-string">"preview"</span> }] }</code></pre> </div> </section> <section id="audio-packaging" class="informative"> <h3 id="x5-10-packaging"><bdi class="secno">5.10 </bdi>Packaging<a class="self-link" aria-label="§" href="#audio-packaging"></a></h3> <p> <em>This section is non-normative.</em> </p> <p>Audiobooks will be packaged using the method described in the <a href="https://www.w3.org/TR/lpf/" >Lightweight Packaging Format</a> [<cite><a class="bibref" data-link-type="biblio" href="#bib-lpf" title="Lightweight Packaging Format (LPF)">lpf</a></cite>] note.</p> </section> <section id="audio-accessibility" class="informative"> <h3 id="x5-11-accessibility"><bdi class="secno">5.11 </bdi>Accessibility<a class="self-link" aria-label="§" href="#audio-accessibility"></a></h3> <p> <em>This section is non-normative.</em> </p> <p>The history of the audiobook is rooted in the world of accessibility. Both purely audio publications and publications that synchronize text and audio playback have long been used to assist users with alternative reading needs and preferences.</p> <p>An approach for accessible synchronized media in publications is currently being done by the <a href="https://www.w3.org/community/sync-media-pub/">Synchronized Multimedia for Publications Community Group</a>. Refer to the work of that group for more information about creating such content and incorporating it into an Audiobook.</p> <p>Alternatively, a content creator can provide the text equivalent as HTML [<cite><a class="bibref" data-link-type="biblio" href="#bib-html" title="HTML Standard">html</a></cite>] resources in the <a href="#audio-resourcelist">resources</a>.</p> <div class="example" id="example-13-audiobook-with-alternate-text"> <div class="marker"> <a class="self-link" href="#example-13-audiobook-with-alternate-text">Example<bdi> 13</bdi></a> <span class="example-title">: Audiobook with Alternate Text</span> </div> <pre aria-busy="false"><code class="hljs json">{ <span class="hljs-attr">"@context"</span> : [<span class="hljs-string">"https://schema.org"</span>, <span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>], <span class="hljs-attr">"conformsTo"</span> : <span class="hljs-string">"https://www.w3.org/TR/audiobooks/"</span>, <span class="hljs-attr">"url"</span> : <span class="hljs-string">"https://publisher.example.org/janeeyre"</span>, <span class="hljs-attr">"name"</span> : <span class="hljs-string">"Jane Eyre"</span>, <span class="hljs-attr">"readingOrder"</span> : { <span class="hljs-attr">"type"</span> : <span class="hljs-string">"LinkedResource"</span>, <span class="hljs-attr">"url"</span> : <span class="hljs-string">"audio/part001.wav#t=0"</span>, <span class="hljs-attr">"encodingFormat"</span> : <span class="hljs-string">"audio/vnd-wav"</span>, <span class="hljs-attr">"name"</span> : <span class="hljs-string">"Chapter 1"</span>, <span class="hljs-attr">"duration"</span> : <span class="hljs-string">"PT457.931S"</span>, <span class="hljs-attr">"alternate"</span> : { <span class="hljs-attr">"type"</span> : <span class="hljs-string">"LinkedResource"</span>, <span class="hljs-attr">"url"</span> : <span class="hljs-string">"text/part001-1.html"</span>, <span class="hljs-attr">"encodingFormat"</span> : <span class="hljs-string">"text/html"</span>}, }, <span class="hljs-attr">"resources"</span> : [{ <span class="hljs-attr">"type"</span>: <span class="hljs-string">"LinkedResource"</span>, <span class="hljs-attr">"url"</span>: <span class="hljs-string">"text/part001-1.html"</span>, <span class="hljs-attr">"encodingFormat"</span> : <span class="hljs-string">"text/html"</span> }… ] }</code></pre> </div> </section> </section> <section id="audio-manifest-processing"> <h2 id="x6-manifest-processing"><bdi class="secno">6. </bdi>Manifest Processing<a class="self-link" aria-label="§" href="#audio-manifest-processing"></a></h2> <p> <em>This section depends on the Infra Standard [<cite><a class="bibref" data-link-type="biblio" href="#bib-infra" title="Infra Standard">infra</a></cite>].</em> </p> <p>The specification extends the Publication Manifest <a href="https://www.w3.org/TR/pub-manifest/#manifest-processing">processing algorithms</a>&#160;[<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>] as follows:</p> <dl> <dt>Generating the Internal Representation</dt> <dd> <p>The following <a href="https://www.w3.org/TR/pub-manifest/#processing-extension">extension steps</a> are added for Audiobook manifests:</p> <ol id="processing-toc"> <li id="processing-duration"> <p>(<a href="#audio-duration" class="sec-ref">§&#160;<bdi class="secno">5.6.2 </bdi>Duration</a>) Check the duration of the publication as follows:</p> <ol> <li id="processing-duration-var"> <p>Let <var>resourceDuration</var> hold the total duration of individual resources.</p> </li> <li id="processing-duration-iterate"> <p><a href="https://infra.spec.whatwg.org/#list-iterate">For each</a> <var>resource</var> of <var>data["readingOrder"]</var>:</p> <ol> <li id="processing-duration-res-none"> <p>if <var>resource["duration"]</var> is not defined, <a href="https://www.w3.org/TR/pub-manifest/#dfn-validation-errors" >validation error</a>.</p> </li> <li id="processing-duration-add"> <p>otherwise, if <var>resource["duration"]</var>, add <var>resource["duration"]</var> to <var>resourceDuration</var>.</p> </li> </ol> </li> <li id="processing-duration-total"> <p>If the values cannot be compared because <var>data["duration"]</var> is not set, <a href="https://www.w3.org/TR/pub-manifest/#dfn-validation-errors" >validation error</a>.</p> <p>Otherwise, if <var>resourceDuration</var> does not specify the same total duration as <var>data["duration"]</var>, <a href="https://www.w3.org/TR/pub-manifest/#dfn-validation-errors">validation error</a>.</p> </li> </ol> <details> <summary>Explanation</summary> <p>This step checks both that all resources in the reading order specify a duration and that the sum of all those durations matches the total duration for the publication.</p> <p>A validation error is only emitted while checking each resource if the resource does not specify a duration. The <a href="https://www.w3.org/TR/pub-manifest/#validate-duration">validity of the durations</a>&#160;[<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest" >pub-manifest</a></cite>] is already checked in the publication manifest algorithm so does not need to be repeated.</p> </details> </li> </ol> </dd> <dt>Data Validation</dt> <dd> <p>The following <a href="https://www.w3.org/TR/pub-manifest/#validate-extension">extension steps</a> are added for Audiobook manifests:</p> <ol> <li id="validate-readingorder"> <p>(<a href="#audio-readingorder" class="sec-ref">§&#160;<bdi class="secno">5.7 </bdi>Default Reading Order</a>) Check the reading order as follows:</p> <ol> <li id="validate-ro-none"> <p>If <var>data["readingOrder"]</var> is not set, <a href="https://www.w3.org/TR/pub-manifest/#dfn-fatal-errors">fatal error</a>.</p> </li> <li id="validate-ro-audio"> <p><a href="https://infra.spec.whatwg.org/#list-iterate">For each</a> <var>resource</var> in <var>data["readingOrder"]</var>, if <var>resource</var> is not an audio resource, <a href="https://www.w3.org/TR/pub-manifest/#dfn-validation-errors">validation error</a>, <a href="https://infra.spec.whatwg.org/#list-remove">remove</a> <var>resource</var> from <var>data["readingOrder"]</var>.</p> </li> <li id="validate-ro-empty"> <p>If <var>data["readingOrder"]</var> is an empty <a href="https://infra.spec.whatwg.org/#list">list</a>, <a href="https://www.w3.org/TR/pub-manifest/#dfn-fatal-errors">fatal error</a>.</p> </li> </ol> <details> <summary>Explanation</summary> <p>This step ensures that only audio resources are listed in the reading order and removes any that are not.</p> <p>If the reading order does not contain any entries after checking each resource, a fatal error is returned as the publication is not a valid audiobook.</p> </details> </li> <li id="validate-type"> <p>(<a href="#audio-type" class="sec-ref">§&#160;<bdi class="secno">5.5 </bdi>Publication Type</a>) If <var>data["type"]</var> is not set or is an empty <a href="https://infra.spec.whatwg.org/#list">list</a>, <a href="https://www.w3.org/TR/pub-manifest/#dfn-validation-errors">validation error</a>, set to <code>«&#160;"Audiobook"&#160;»</code>.</p> <details> <summary>Explanation</summary> <p>This step sets the default type of the publication to <code>Audiobook</code> when a <var>type</var> property has not been specified.</p> </details> </li> <li id="validate-rec-properties"> <p>(<a href="#audio-requirements" class="sec-ref">§&#160;<bdi class="secno">5.2 </bdi>Requirements</a>) Check that each of the following properties is set. If not, issue a <a href="https://www.w3.org/TR/pub-manifest/#dfn-validation-errors">validation error</a> for each one.</p> <ul> <li> <var>data["abridged"]</var> </li> <li> <var>data["accessMode"]</var> </li> <li> <var>data["accessModeSufficient"]</var> </li> <li> <var>data["accessibilityFeature"]</var> </li> <li> <var>data["accessibilityHazard"]</var> </li> <li> <var>data["accessibilitySummary"]</var> </li> <li> <var>data["author"]</var> </li> <li> <var>data["dateModified"]</var> </li> <li> <var>data["datePublished"]</var> </li> <li> <var>data["id"]</var> </li> <li> <var>data["inLanguage"]</var> </li> <li> <var>data["name"]</var> </li> <li> <var>data["readBy"]</var> </li> <li> <var>data["readingProgression"]</var> </li> <li> <var>data["resources"]</var> </li> <li> <var>data["url"]</var> </li> </ul> <details> <summary>Explanation</summary> <p>This step checks that all the recommended properties have been set. For more information about these, refer to <a href="#audio-requirements" class="sec-ref" >§&#160;<bdi class="secno">5.2 </bdi>Requirements</a>.</p> </details> </li> <li id="validate-rec-relations"> <p>(<a href="#audio-requirements" class="sec-ref">§&#160;<bdi class="secno">5.2 </bdi>Requirements</a>) If no resource in <var>data["readingOrder"]</var> or <var>data["resources"]</var> has a <var>rel</var> <a href="https://infra.spec.whatwg.org/#map-entry">entry</a> that <a href="https://infra.spec.whatwg.org/#list-contain">contains</a> the relation <code>cover</code>, <a href="https://www.w3.org/TR/pub-manifest/#dfn-validation-errors">validation error</a>.</p> <details> <summary>Explanation</summary> <p>This step checks the reading order and resource list to verify that a cover has been specified (i.e., an resource has the value <code>cover</code> in its <code>rel</code> property).</p> </details> </li> </ol> </dd> </dl> </section> <section class="informative" id="toc-algorithm-extension"> <h2 id="x7-user-agent-processing-of-machine-processable-table-of-contents"><bdi class="secno">7. </bdi>User Agent Processing of Machine-Processable Table of Contents<a class="self-link" aria-label="§" href="#toc-algorithm-extension"></a></h2> <p> <em>This section is non-normative.</em> </p> <p>This specification extends the Publication Manifest’s <a href="https://www.w3.org/TR/pub-manifest/#app-toc-ua">User Agent Processing Algorithm</a> for Machine-Processable Table of Contents [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>] to locate a table of content element as follows:</p> <ol> <li> If the <a href="#dfn-primary-entry-page" class="internalDFN" data-link-type="dfn" id="ref-for-dfn-primary-entry-page-1">primary entry page</a> is available, then execute the algorithm locating the table of content element on the primary entry page. </li> <li> If the previous step is not successful, locate the relevant resource, if available, in the manifest as described in <a href="https://www.w3.org/TR/pub-manifest/#contents">§&#160;4.8.1.3&#160;Table of Contents</a> in [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>], and execute the same algorithm on that resource. </li> </ol> <p>See also <a href="#audio-toc" class="sec-ref">§&#160;<bdi class="secno">4.2 </bdi>Table of Contents</a> for further details.</p> </section> <section id="security-privacy"> <h2 id="x8-security-and-privacy-considerations"><bdi class="secno">8. </bdi>Security and Privacy Considerations<a class="self-link" aria-label="§" href="#security-privacy"></a></h2> <p>As Audiobooks is a profile of Publication Manifest [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>], all <a href="https://www.w3.org/TR/pub-manifest/#security-privacy">security and privacy</a> considerations detailed in that specification are applicable to this profile.</p> <p>This profile acknowledges the following considerations:</p> <ul> <li>References within the <a href="#audio-readingorder">Reading Order</a> and <a href="#audio-resourcelist">Resource List</a> can be references to both remote and local resources.</li> </ul> </section> <section id="audio-ua-behaviour" class="informative"> <h2 id="x9-user-agent-behaviors-for-audiobooks"><bdi class="secno">9. </bdi>User Agent Behaviors for Audiobooks<a class="self-link" aria-label="§" href="#audio-ua-behaviour"></a></h2> <p> <em>This section is non-normative.</em> </p> <p>This section outlines the expected user agent behaviors for implementation of audiobooks. For processing instructions, user agents should refer to the <a href="https://www.w3.org/TR/pub-manifest/#manifest-processing"><code>Processing a Manifest</code></a> section of the Publication Manifest [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest" >pub-manifest</a></cite>] specification, and conform to any behavior described there.</p> <p>All user agent behaviors described in this section are intended to provide implementors with guidance, not strict requirements. Behaviors in this document are taken mainly from the <a href="https://www.w3.org/TR/pwp-ucr/">Use Cases and Requirements</a> [<cite><a class="bibref" data-link-type="biblio" href="#bib-pwp-ucr" title="Web Publications Use Cases and Requirements" >pwp-ucr</a></cite>] note published by the working group.</p> <section id="audio-ua-navigation"> <h3 id="x9-1-opening-and-navigating-the-contents-of-an-audiobook"><bdi class="secno">9.1 </bdi>Opening and Navigating the Contents of an Audiobook<a class="self-link" aria-label="§" href="#audio-ua-navigation"></a></h3> <p>When a user agent opens an Audiobook, and the manifest processes according to the rules laid out in <a href="https://www.w3.org/TR/pub-manifest/#manifest-processing">Publication Manifest</a> [<cite><a class="bibref" data-link-type="biblio" href="#bib-pub-manifest" title="Publication Manifest">pub-manifest</a></cite>], it should be opened by the User Agent. The <a href="#audio-readingorder">Reading Order</a> or, if available, <a href="#audio-toc" >Table of Contents</a> should be accessible to the user. A User Agent should be able to provide a list of the contents of the audiobook available to the user when requested. If a non-audio resource is present in the Reading Order, the User Agent can choose to present it to the user or skip it.</p> <p>User agents should provide a means of rendering non-audio resources within the Reading Order and Resource list. If the content cannot be rendered by the user agent, it is recommended that the user agent inform the user that the content is present but cannot be rendered.</p> <p>The <a href="#audio-pep">Primary Entry Page</a> is intended to be, when available, the entry point to the audiobook. If a content creator has provided a primary entry page, and the User Agent is capable of rendering or processing HTML content, it should be the first thing presented to the user. The Primary Entry Page may or may not contain a Table of Contents, if included using the <code>role="doc-toc"</code> it should be treated as the Table of Contents. If the Table of Contents is a separate document, it can be rendered however the User Agent chooses as long as it meets the requirements laid out above. If no Table of Contents is included in the Primary Entry Page or elsewhere, the User Agent should refer to the Reading Order.</p> </section> <section id="audio-ua-playback"> <h3 id="x9-2-audiobook-playability"><bdi class="secno">9.2 </bdi>Audiobook Playability<a class="self-link" aria-label="§" href="#audio-ua-playback"></a></h3> <p>As outlined in the <a href="https://www.w3.org/TR/pwp-ucr/">Use Cases and Requirements</a> [<cite><a class="bibref" data-link-type="biblio" href="#bib-pwp-ucr" title="Web Publications Use Cases and Requirements">pwp-ucr</a></cite>] note, an audiobook must be navigable in the User Agent. This means that a User Agent must provide methods for the user to move through the audiobook in a linear or non-linear fashion by either moving through the <a href="#audio-readingorder">Reading Order</a> seamlessly or by accessing the <a href="#audio-toc" >Table of Contents</a>. The User Agent should also allow the user to move through individual audio files in short time increments.</p> <p>For an audiobook, the User Agent should provide a <a href="https://www.w3.org/TR/pwp-ucr/#player" >player interface</a> [<cite><a class="bibref" data-link-type="biblio" href="#bib-pwp-ucr" title="Web Publications Use Cases and Requirements">pwp-ucr</a></cite>] that will allow the user to navigate, play, or pause the audiobook. This interface can be represented to the user in any way (i.e. physical buttons, visual interface, keyboard input, or voice commands), but should be accessible at any point in the listening experience.</p> </section> <section id="audio-ua-packaging"> <h3 id="x9-3-audiobook-packaging-and-offlining"><bdi class="secno">9.3 </bdi>Audiobook Packaging and Offlining<a class="self-link" aria-label="§" href="#audio-ua-packaging"></a></h3> <p>The <a href="https://www.w3.org/TR/pwp-ucr/">Use Cases and Requirements</a> [<cite><a class="bibref" data-link-type="biblio" href="#bib-pwp-ucr" title="Web Publications Use Cases and Requirements">pwp-ucr</a></cite>] note recommends that content be available offline and that any packaged formats should not affect the iterations of the publications. This means that even if the content is copied many times to many users via multiple User Agents, the core manifest and its identifier are never changed.</p> <p>This specification recommends the <a href="https://www.w3.org/TR/lpf/">Lightweight Packaging Format</a> [<cite><a class="bibref" data-link-type="biblio" href="#bib-lpf" title="Lightweight Packaging Format (LPF)">lpf</a></cite>] for packaging audiobook content, but this is not a requirement. Audiobook User Agents should be able to ingest LPF files for play, and should display content according to the requirements and recommendations in this document.</p> <p>If a User Agent is serving the content directly from their service (i.e. as a retailer or repository of content), it is recommended that they provide a method for offlining or downloading the content to the user. This can be in any format they choose, but the audiobook should be complete and valid and the contents listed in the manifest should be served in their entirety. Even if a User Agent does not support the display of a certain resource (i.e. an image file or data table), it should still be available to the user for download.</p> <p>This specification does not provide a method for content creators to protect or watermark their content, as there are existing methods available in the market today. User Agents who work with content creators that wish to protect or limit the distribution of their content can choose a method that works best for their requirements.</p> </section> <section id="audio-ua-accessibility"> <h3 id="x9-4-audiobooks-accessibility"><bdi class="secno">9.4 </bdi>Audiobooks Accessibility<a class="self-link" aria-label="§" href="#audio-ua-accessibility"></a></h3> <p>This specification recommends and provides a method for content creators to create fully <a href="#audio-accessibility">accessible audiobooks</a>. User Agents should use this information, in the section on Accessibility, to implement accessible audiobook interfaces. It is recommended that User Agents provide accessible player interfaces, as well as a method for content creators who have provided <code>alternate</code> content to have that content displayed.</p> </section> </section> <section id="change-log"> <h2 id="x10-change-log"><bdi class="secno">10. </bdi>Change Log<a class="self-link" aria-label="§" href="#change-log"></a></h2> <p>Substantive changes since the <a href="https://www.w3.org/TR/2019/WD-audiobooks-20190620/">First Public Working Draft</a>:</p> <ul> <li>14-Sept-2020: Added a note that informative information about the table of contents structure and formatting information is available in the Publication Manifest specification. See <a href="https://github.com/w3c/audiobooks/issues/97">issue 97</a>.</li> <li>12-Sept-2020: Removed the manifest processing step that warns if a table of contents is not found as the requirement is dependent on the presence of supplementary resources which cannot be reliably tested. See <a href="https://github.com/w3c/audiobooks/issues/93">issue 93</a>.</li> <li>8-Sept-2020: Clarified that the primary entry page is only required when the packaging does not provide an alternative method. See <a href="https://github.com/w3c/audiobooks/issues/61">issue 61</a>.</li> <li>26-Aug-2020: Removed the example of synchronized narration and updated reference to the work of the Synchronized Multimedia for Publications Community Group to reflect the early nature of that work. See <a href="https://github.com/w3c/audiobooks/issues/87">issue 87</a>.</li> <li>27-July-2020: Updated the reference schema URL to a <abbr title="World Wide Web Consortium" >W3C</abbr> address. See <a href="https://github.com/w3c/pub-manifest/issues/226">issue 226 in Publication Manifest</a>.</li> <li>2-July-2020: Added a note about the shape of the manifest being defined by the JSON schema to the manifest introduction. See <a href="https://github.com/w3c/audiobooks/issues/71">issue 71</a>.</li> <li>12-Feb-2020: The algorithm step to check and compare resource durations to the total audiobook duration was moved to avoid duplicate validity checks. The algorithm step to warn about the primary entry page not being listed in the unique resources has been removed as it is no checked in the publication manifest algorithm. See <a href="https://github.com/w3c/audiobooks/issues/71">issue 71</a>.</li> <li>12-Feb-2020: The use of fragments in the reading order was clarified to also include end position. A number of examples were also fixed. See <a href="https://github.com/w3c/audiobooks/pull/69">pull request 69</a>.</li> <li>07-Feb-2020: The manifest requirements section was moved out of the properties section as it also includes resource relations. See <a href="https://github.com/w3c/audiobooks/issues/70">issue 70</a>.</li> <li>03-Jan-2020: A new (informative) section <a href="#toc-algorithm-extension" class="sec-ref" >§&#160;<bdi class="secno">7. </bdi>User Agent Processing of Machine-Processable Table of Contents</a> has been added defining, the extension of the table of contents processing algorithm. See <a href="https://github.com/w3c/audiobooks/issues/63">issue #63</a>. </li> <li>03-Jan-2020: Extra step in <a href="#audio-manifest-processing" class="sec-ref">§&#160;<bdi class="secno">6. </bdi>Manifest Processing</a> adding the PEP’s URL to the collection of unique resources in the manifest. See <a href="https://github.com/w3c/publ-tests/issues/7">issue #7 for the test-suite</a>. </li> </ul> <p>For a complete list of issues addressed, refer to the <a href="https://github.com/w3c/audiobooks/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated-desc">GitHub tracker</a>.</p> </section> <section id="audio-manifest-examples" class="appendix informative"> <h2 id="a-manifest-examples"><bdi class="secno">A. </bdi>Manifest Examples<a class="self-link" aria-label="§" href="#audio-manifest-examples"></a></h2> <p> <em>This section is non-normative.</em> </p> <section id="audio-simple"> <h3 id="a-1-simple-audiobook"><bdi class="secno">A.1 </bdi>Simple Audiobook<a class="self-link" aria-label="§" href="#audio-simple"></a></h3> <p>A manifest for an audiobook. The <a href="https://github.com/w3c/pub-manifest/blob/master/experiments/audiobook/flatland-canonical.json" >canonical version</a> of this manifest is also available.</p> <div class="example" id="example-14"> <div class="marker"> <a class="self-link" href="#example-14">Example<bdi> 14</bdi></a> </div> <pre aria-busy="false"><code class="hljs json">{ <span class="hljs-attr">"@context"</span>: [<span class="hljs-string">"https://schema.org"</span>, <span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>], <span class="hljs-attr">"conformsTo"</span> : <span class="hljs-string">"https://www.w3.org/TR/audiobooks/"</span>, <span class="hljs-attr">"type"</span>: <span class="hljs-string">"Audiobook"</span>, <span class="hljs-attr">"id"</span>: <span class="hljs-string">"https://librivox.org/flatland-a-romance-of-many-dimensions-by-edwin-abbott-abbott/"</span>, <span class="hljs-attr">"url"</span>: <span class="hljs-string">"https://w3c.github.io/wpub/experiments/audiobook/"</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Flatland: A Romance of Many Dimensions"</span>, <span class="hljs-attr">"author"</span>: <span class="hljs-string">"Edwin Abbott Abbott"</span>, <span class="hljs-attr">"readBy"</span>: <span class="hljs-string">"Ruth Golding"</span>, <span class="hljs-attr">"publisher"</span>: <span class="hljs-string">"Librivox"</span>, <span class="hljs-attr">"inLanguage"</span>: <span class="hljs-string">"en"</span>, <span class="hljs-attr">"dateModified"</span>: <span class="hljs-string">"2018-06-14T19:32:18Z"</span>, <span class="hljs-attr">"datePublished"</span>: <span class="hljs-string">"2008-10-12"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-string">"PT15153S"</span>, <span class="hljs-attr">"license"</span>: <span class="hljs-string">"https://creativecommons.org/publicdomain/zero/1.0/"</span>, <span class="hljs-attr">"resources"</span>: [ { <span class="hljs-attr">"rel"</span>: <span class="hljs-string">"cover"</span>, <span class="hljs-attr">"url"</span>: <span class="hljs-string">"http://ia800704.us.archive.org/9/items/LibrivoxCdCoverArt12/Flatland_1109.jpg"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"image/jpeg"</span> },{ <span class="hljs-attr">"rel"</span>: <span class="hljs-string">"contents"</span>, <span class="hljs-attr">"url"</span>: <span class="hljs-string">"toc.html"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"text/html"</span> } ], <span class="hljs-attr">"readingOrder"</span>: [ { <span class="hljs-attr">"url"</span>: <span class="hljs-string">"http://www.archive.org/download/flatland_rg_librivox/flatland_1_abbott.mp3"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"audio/mpeg"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-number">1371</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Part 1, Sections 1 - 3"</span> },{ <span class="hljs-attr">"url"</span>: <span class="hljs-string">"http://www.archive.org/download/flatland_rg_librivox/flatland_2_abbott.mp3"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"audio/mpeg"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-number">1669</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Part 1, Sections 4 - 5"</span> },{ <span class="hljs-attr">"url"</span>: <span class="hljs-string">"http://www.archive.org/download/flatland_rg_librivox/flatland_3_abbott.mp3"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"audio/mpeg"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-number">1506</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Part 1, Sections 6 - 7"</span> },{ <span class="hljs-attr">"url"</span>: <span class="hljs-string">"http://www.archive.org/download/flatland_rg_librivox/flatland_4_abbott.mp3"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"audio/mpeg"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-number">1669</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Part 1, Sections 8 - 10"</span> },{ <span class="hljs-attr">"url"</span>: <span class="hljs-string">"http://www.archive.org/download/flatland_rg_librivox/flatland_5_abbott.mp3"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"audio/mpeg"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-number">1506</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Part 1, Sections 11 - 12"</span> },{ <span class="hljs-attr">"url"</span>: <span class="hljs-string">"http://www.archive.org/download/flatland_rg_librivox/flatland_6_abbott.mp3"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"audio/mpeg"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-number">1798</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Part 2, Sections 13 - 14"</span> },{ <span class="hljs-attr">"url"</span>: <span class="hljs-string">"http://www.archive.org/download/flatland_rg_librivox/flatland_7_abbott.mp3"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"audio/mpeg"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-number">1225</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Part 2, Sections 15 - 17"</span> },{ <span class="hljs-attr">"url"</span>: <span class="hljs-string">"http://www.archive.org/download/flatland_rg_librivox/flatland_8_abbott.mp3"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"audio/mpeg"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-number">1371</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Part 2, Sections 18 - 20"</span> },{ <span class="hljs-attr">"url"</span>: <span class="hljs-string">"http://www.archive.org/download/flatland_rg_librivox/flatland_9_abbott.mp3"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"audio/mpeg"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-number">1659</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Part 2, Sections 21 - 22"</span> } ] }</code></pre> </div> </section> <section id="audio-supplemental"> <h3 id="a-2-audiobook-with-supplemental-content"><bdi class="secno">A.2 </bdi>Audiobook with Supplemental Content<a class="self-link" aria-label="§" href="#audio-supplemental"></a></h3> <p>A manifest for an audiobook with supplemental content.</p> <div class="example" id="example-15"> <div class="marker"> <a class="self-link" href="#example-15">Example<bdi> 15</bdi></a> </div> <pre aria-busy="false"><code class="hljs json">{ <span class="hljs-attr">"@context"</span> : [<span class="hljs-string">"https://schema.org"</span>, <span class="hljs-string">"https://www.w3/org/ns/pub-context"</span>], <span class="hljs-attr">"conformsTo"</span> : <span class="hljs-string">"https://www.w3.org/TR/audiobooks/"</span>, <span class="hljs-attr">"id"</span> : <span class="hljs-string">"https://publisher.example.com/janeeyre"</span>, <span class="hljs-attr">"url"</span> : <span class="hljs-string">"https://publisher.example.com/janeeyre"</span>, <span class="hljs-attr">"name"</span> : <span class="hljs-string">"Jane Eyre"</span>, <span class="hljs-attr">"author"</span> : <span class="hljs-string">"Charlotte Bronte"</span>, <span class="hljs-attr">"readBy"</span> : <span class="hljs-string">"Jane Doe"</span>, <span class="hljs-attr">"duration"</span> : <span class="hljs-string">"PT123456.789S"</span>, <span class="hljs-attr">"abridged"</span> : <span class="hljs-literal">false</span>, <span class="hljs-attr">"inLanguage"</span> : <span class="hljs-string">"en"</span>, <span class="hljs-attr">"dateModified"</span> : <span class="hljs-string">"2019-03-29T15:59:00Z"</span>, <span class="hljs-attr">"datePublished"</span> : <span class="hljs-string">"2019-03-29"</span>, <span class="hljs-attr">"readingOrder"</span>: [ {<span class="hljs-attr">"url"</span>: <span class="hljs-string">"audio/chapter001.aac"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"audio/aac"</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Chapter 1"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-string">"PT1234.567S"</span>}, {<span class="hljs-attr">"url"</span>: <span class="hljs-string">"audio/chapter002.aac"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"audio/aac"</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Chapter 2"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-string">"PT890.123S"</span>}, {<span class="hljs-attr">"url"</span>: <span class="hljs-string">"audio/chapter003.aac"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"audio/aac"</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Chapter 3"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-string">"PT456.789S"</span>}, {<span class="hljs-attr">"url"</span>: <span class="hljs-string">"audio/chapter004.aac"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"audio/aac"</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Chapter 4"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-string">"PT987.654S"</span>}, {<span class="hljs-attr">"url"</span>: <span class="hljs-string">"audio/chapter005.aac"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"audio/aac"</span>, <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Chapter 5"</span>, <span class="hljs-attr">"duration"</span>: <span class="hljs-string">"PT321.987S"</span>} ], <span class="hljs-attr">"resources"</span>: [ {<span class="hljs-attr">"rel"</span>: <span class="hljs-string">"cover"</span>, <span class="hljs-attr">"url"</span>: <span class="hljs-string">"images/cover.jpg"</span>, <span class="hljs-attr">"encordingFormat"</span>: <span class="hljs-string">"image/jpeg"</span>}, {<span class="hljs-attr">"rel"</span>: <span class="hljs-string">"contents"</span>, <span class="hljs-attr">"url"</span>: <span class="hljs-string">"toc.html"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"text/html"</span>}, {<span class="hljs-attr">"url"</span>: <span class="hljs-string">"haworth_house.pdf"</span>, <span class="hljs-attr">"encodingFormat"</span>: <span class="hljs-string">"application/pdf"</span>} ] }</code></pre> </div> </section> </section> <section id="audio-toc-examples" class="appendix informative"> <h2 id="b-table-of-contents-examples"><bdi class="secno">B. </bdi>Table of Contents Examples<a class="self-link" aria-label="§" href="#audio-toc-examples"></a></h2> <p> <em>This section is non-normative.</em> </p> <section id="toc-pep"> <h3 id="b-1-primary-entry-page-with-a-table-of-contents"><bdi class="secno">B.1 </bdi>Primary Entry Page with a Table of Contents<a class="self-link" aria-label="§" href="#toc-pep"></a></h3> <p>A primary entry page with a simple table of contents for an audiobook.</p> <div class="example" id="example-16"> <div class="marker"> <a class="self-link" href="#example-16">Example<bdi> 16</bdi></a> </div> <pre aria-busy="false"><code class="hljs xml"> <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span> … <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"application/ld+json"</span>&gt;</span><span class="javascript"> { <span class="hljs-string">"@context"</span> : [<span class="hljs-string">"https://schema.org"</span>,<span class="hljs-string">"https://www.w3.org/ns/pub-context"</span>], <span class="hljs-string">"conformsTo"</span> : <span class="hljs-string">"https://www.w3.org/TR/audiobooks/"</span>, … <span class="hljs-string">"url"</span> : <span class="hljs-string">"https://publisher.example.org/janeeyre"</span>, … } </span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span> … <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span> … <span class="hljs-tag">&lt;<span class="hljs-name">section</span> <span class="hljs-attr">role</span>=<span class="hljs-string">"doc-toc"</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">ol</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"audio/chapter001.wav"</span>&gt;</span>Chapter 1. There was no possibility of taking a walk that day...<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"audio/chapter002.wav"</span>&gt;</span>Chapter 2. I resisted all the way:...<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"audio/chapter003.wav"</span>&gt;</span>Chapter 3. The next thing I remember is,...<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span> … <span class="hljs-tag">&lt;/<span class="hljs-name">ol</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">section</span>&gt;</span> … <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span></code></pre> </div> </section> <section id="toc-simple"> <h3 id="b-2-simple-table-of-contents"><bdi class="secno">B.2 </bdi>Simple Table of Contents<a class="self-link" aria-label="§" href="#toc-simple"></a></h3> <p>A table of contents for a simple audiobook.</p> <div class="example" id="example-17"> <div class="marker"> <a class="self-link" href="#example-17">Example<bdi> 17</bdi></a> </div> <pre aria-busy="false"><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">role</span>=<span class="hljs-string">"doc-toc"</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>JANE EYRE<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">ol</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"audio/chapter001.mp3"</span>&gt;</span>Chapter 1. There was no possibility of taking a walk that day...<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"audio/chapter002.mp3"</span>&gt;</span>Chapter 2. I resisted all the way:...<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"audio/chapter003.mp3"</span>&gt;</span>Chapter 3. The next thing I remember is,...<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span> … <span class="hljs-tag">&lt;/<span class="hljs-name">ol</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span></code></pre> </div> </section> <section id="toc-mediafragments"> <h3 id="b-3-table-of-contents-with-media-fragments"><bdi class="secno">B.3 </bdi>Table of Contents with Media Fragments<a class="self-link" aria-label="§" href="#toc-mediafragments"></a></h3> <p>A table of contents using media fragment references to locations in a single audio track.</p> <div class="example" id="example-18"> <div class="marker"> <a class="self-link" href="#example-18">Example<bdi> 18</bdi></a> </div> <pre aria-busy="false"><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">role</span>=<span class="hljs-string">"doc-toc"</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>JANE EYRE<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">ol</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://example.publisher.org/janeeyre/part001.mp3#t=0,456.788"</span>&gt;</span>Chapter 1<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://example.publisher.org/janeeyre/part001.mp3#t=456.789,1234.566"</span>&gt;</span>Chapter 2<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://example.publisher.org/janeeyre/part001.mp3#t=1234.567"</span>&gt;</span>Chapter 3<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">ol</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span></code></pre> </div> </section> </section> <section id="ack" class="appendix informative"> <h2 id="c-acknowledgements"><bdi class="secno">C. </bdi>Acknowledgements<a class="self-link" aria-label="§" href="#ack"></a></h2> <p> <em>This section is non-normative.</em> </p> <p>The editor would like to thank the members of the Publishing Working Group for their contributions to this specification:</p> <ul class="ack"> <li>Greg Albers (J. Paul Getty Trust)</li> <li>Franco Alvarado (Macmillan Learning)</li> <li>Boris Anthony (The Rebus Foundation)</li> <li>Luc Audrain (Hachette Livre)</li> <li>Baldur Bjarnason (The Rebus Foundation)</li> <li>Laura Brady (<abbr title="World Wide Web Consortium">W3C</abbr> Invited Expert)</li> <li>Steve Breault (Scenarex Inc.)</li> <li>Don Brutzman (Web3D Consortium)</li> <li>Kaylin Bugbee (Earth Science Data Systems Program)</li> <li>Yu-Wei Chang (Taiwan Digital Publishing Forum)</li> <li>Fred Chasen (<abbr title="World Wide Web Consortium">W3C</abbr> Invited Expert)</li> <li>Timothy Cole (University of Illinois at Urbana-Champaign)</li> <li>Simon Collinson (Rakuten, Inc.)</li> <li>Rachel Comerford (Macmillan Learning)</li> <li>Garth Conboy (Google, Inc., chair)</li> <li>Juan Corona (Evident Point Software)</li> <li>Christopher Cosner (Stanford University)</li> <li>Dave Cramer (Hachette Livre)</li> <li>Greg Davis (Pearson plc)</li> <li>Romain Deltour (DAISY Consortium)</li> <li>Marisa DeMeglio (DAISY Consortium)</li> <li>Vagner Diniz (NIC.br - Brazilian Network Information Center)</li> <li>Kenneth Dougherty (Pearson plc)</li> <li>Brady Duga (Google, Inc.)</li> <li>Ben Dugas (Rakuten, Inc.)</li> <li>Roger Espinosa (University of Michigan)</li> <li>Reinaldo Ferraz (NIC.br - Brazilian Network Information Center)</li> <li>Teenya Franklin (Pearson plc)</li> <li>Jun Gamo (Voyager Japan, Inc.)</li> <li>Matt Garrish (DAISY Consortium)</li> <li>Michael Goodman (Wiley)</li> <li>Markku Hakkinen (Educational Testing Service)</li> <li>Katie Haritos-Shea (Knowbility)</li> <li>Ivan Herman (<abbr title="World Wide Web Consortium">W3C</abbr> Staff)</li> <li>Geoff Jukes (Blackstone Audio, Inc.)</li> <li>Deborah Kaplan (<abbr title="World Wide Web Consortium">W3C</abbr> Invited Expert)</li> <li>Bill Kasdorf (Book Industry Study Group)</li> <li>George Kerscher (DAISY Consortium)</li> <li>Yuri Khramov (Evident Point Software)</li> <li>Masakazu Kitahara (Voyager Japan, Inc.)</li> <li>Toshiaki Koike (Voyager Japan, Inc.)</li> <li>Charles LaPierre (Benetech)</li> <li>Mustapha Lazrek (Microsoft Corporation)</li> <li>Laurent Le Meur (EDRLab)</li> <li>Vladimir Levantovsky (Monotype)</li> <li>Mia Lipner (Pearson plc)</li> <li>Phil Madans (Hachette Livre)</li> <li>Christopher Maden (University of Illinois at Urbana-Champaign)</li> <li>Dmitry Markushevich (Evident Point Software)</li> <li>Keith McFarland (Blackstone Audio, Inc.)</li> <li>Jonathan McGlone (University of Michigan)</li> <li>Hugh McGuire (The Rebus Foundation)</li> <li>Nellie McKesson (<abbr title="World Wide Web Consortium">W3C</abbr> Invited Expert)</li> <li>Selma Morais (NIC.br - Brazilian Network Information Center)</li> <li>Jasmine Mulliken (Stanford University)</li> <li>Cristina Mussinelli (Fondazione LIA)</li> <li>Christos Nikolakakos (Wiley)</li> <li>Gregorio Pellegrino (Fondazione LIA)</li> <li>Fernando Pinto da Silva (EDRLab)</li> <li>Nicholas Polys (Web3D Consortium)</li> <li>Chris Powell (University of Michigan)</li> <li>Jeff Printy (Macmillan Learning)</li> <li>Ryan Pugatch (Hachette Livre)</li> <li>Joshua Pyle (Wiley)</li> <li>Florian Rivoal (<abbr title="World Wide Web Consortium">W3C</abbr> Invited Expert)</li> <li>Leonard Rosenthol (Adobe)</li> <li>Robert Sanderson (J. Paul Getty Trust)</li> <li>Jodi Schneider (University of Illinois at Urbana-Champaign)</li> <li>Ben Schroeter (Pearson plc)</li> <li>Tzviya Siegman (Wiley, chair)</li> <li>Avneesh Singh (DAISY Consortium)</li> <li>Adam Sisco (Earth Science Data Systems Program)</li> <li>David Stroup (Pearson plc)</li> <li>Mateus Teixeira (W. W. Norton &amp; Company)</li> <li>Jonathan Thurston (Pearson plc)</li> <li>Yukio Tomikura (Kodansha, Publishers, Ltd.)</li> <li>Ben Walters (Microsoft Corporation)</li> <li>Daniel Weck (EDRLab, DAISY Consortium)</li> <li>John Weise (University of Michigan)</li> <li>Jason White (Educational Testing Service)</li> <li>Richard Wright (EDRLab)</li> <li>Jeff Xu (Rakuten, Inc.)</li> <li>Evan Yamanishi (W. W. Norton &amp; Company)</li> <li>Maurice York (University of Michigan)</li> <li>Junichi Yoshii (Kodansha, Publishers, Ltd.)</li> <li>Benjamin Young (Wiley)</li> <li>Mohamed ZERGAOUI (INNOVIMAX)</li> </ul> <p> The Working Group would also like to thank the members of the <a href="https://www.w3.org/dpub/IG/" >Digital Publishing Interest Group</a> for all the hard work they did paving the road for this specification. </p> </section> <section id="references" class="appendix"> <h2 id="d-references"><bdi class="secno">D. </bdi>References<a class="self-link" aria-label="§" href="#references"></a></h2> <section id="normative-references"> <h3 id="d-1-normative-references"><bdi class="secno">D.1 </bdi>Normative references<a class="self-link" aria-label="§" href="#normative-references"></a></h3> <dl class="bibliography"> <dt id="bib-dom">[dom]</dt> <dd><a href="https://dom.spec.whatwg.org/"><cite>DOM Standard</cite></a>. Anne van Kesteren. WHATWG. Living Standard. URL: <a href="https://dom.spec.whatwg.org/" >https://dom.spec.whatwg.org/</a></dd> <dt id="bib-dpub-aria-1.0">[dpub-aria-1.0]</dt> <dd><a href="https://www.w3.org/TR/dpub-aria-1.0/"><cite>Digital Publishing WAI-ARIA Module 1.0</cite></a>. Matt Garrish; Tzviya Siegman; Markus Gylling; Shane McCarron. W3C. 14 December 2017. W3C Recommendation. URL: <a href="https://www.w3.org/TR/dpub-aria-1.0/" >https://www.w3.org/TR/dpub-aria-1.0/</a></dd> <dt id="bib-html">[html]</dt> <dd><a href="https://html.spec.whatwg.org/multipage/"><cite>HTML Standard</cite></a>. Anne van Kesteren; Domenic Denicola; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: <a href="https://html.spec.whatwg.org/multipage/" >https://html.spec.whatwg.org/multipage/</a></dd> <dt id="bib-infra">[infra]</dt> <dd><a href="https://infra.spec.whatwg.org/"><cite>Infra Standard</cite></a>. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: <a href="https://infra.spec.whatwg.org/" >https://infra.spec.whatwg.org/</a></dd> <dt id="bib-json-ld">[json-ld]</dt> <dd><a href="https://www.w3.org/TR/json-ld/"><cite>JSON-LD 1.0</cite></a>. Manu Sporny; Gregg Kellogg; Markus Lanthaler. W3C. 16 January 2014. W3C Recommendation. URL: <a href="https://www.w3.org/TR/json-ld/">https://www.w3.org/TR/json-ld/</a></dd> <dt id="bib-media-frags">[media-frags]</dt> <dd><a href="https://www.w3.org/TR/media-frags/"><cite>Media Fragments URI 1.0 (basic)</cite></a>. Raphaël Troncy; Erik Mannens; Silvia Pfeiffer; Davy Van Deursen. W3C. 25 September 2012. W3C Recommendation. URL: <a href="https://www.w3.org/TR/media-frags/" >https://www.w3.org/TR/media-frags/</a></dd> <dt id="bib-pub-manifest">[pub-manifest]</dt> <dd><a href="https://www.w3.org/TR/pub-manifest/"><cite>Publication Manifest</cite></a>. Matt Garrish; Ivan Herman. W3C. 10 November 2020. W3C Recommendation. URL: <a href="https://www.w3.org/TR/pub-manifest/">https://www.w3.org/TR/pub-manifest/</a></dd> <dt id="bib-rfc2119">[RFC2119]</dt> <dd><a href="https://tools.ietf.org/html/rfc2119"><cite>Key words for use in RFCs to Indicate Requirement Levels</cite></a>. S. Bradner. IETF. March 1997. Best Current Practice. URL: <a href="https://tools.ietf.org/html/rfc2119">https://tools.ietf.org/html/rfc2119</a></dd> <dt id="bib-rfc8174">[RFC8174]</dt> <dd><a href="https://tools.ietf.org/html/rfc8174"><cite>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</cite></a>. B. Leiba. IETF. May 2017. Best Current Practice. URL: <a href="https://tools.ietf.org/html/rfc8174">https://tools.ietf.org/html/rfc8174</a></dd> <dt id="bib-schema.org">[schema.org]</dt> <dd><a href="https://schema.org"><cite>Schema.org</cite></a>. URL: <a href="https://schema.org" >https://schema.org</a></dd> <dt id="bib-url">[url]</dt> <dd><a href="https://url.spec.whatwg.org/"><cite>URL Standard</cite></a>. Anne van Kesteren. WHATWG. Living Standard. URL: <a href="https://url.spec.whatwg.org/" >https://url.spec.whatwg.org/</a></dd> </dl> </section> <section id="informative-references"> <h3 id="d-2-informative-references"><bdi class="secno">D.2 </bdi>Informative references<a class="self-link" aria-label="§" href="#informative-references"></a></h3> <dl class="bibliography"> <dt id="bib-json-ld11">[json-ld11]</dt> <dd><a href="https://www.w3.org/TR/json-ld11/"><cite>JSON-LD 1.1</cite></a>. Gregg Kellogg; Pierre-Antoine Champin; Dave Longley. W3C. 7 May 2020. W3C Proposed Recommendation. URL: <a href="https://www.w3.org/TR/json-ld11/">https://www.w3.org/TR/json-ld11/</a></dd> <dt id="bib-json-schema">[json-schema]</dt> <dd><a href="https://tools.ietf.org/html/draft-zyp-json-schema"><cite>JSON Schema: core definitions and terminology</cite></a>. K. Zyp. Internet Engineering Task Force (IETF). 31 January 2013. Internet-Draft. URL: <a href="https://tools.ietf.org/html/draft-zyp-json-schema" >https://tools.ietf.org/html/draft-zyp-json-schema</a></dd> <dt id="bib-lpf">[lpf]</dt> <dd><a href="https://w3c.github.io/lpf/"><cite>Lightweight Packaging Format (LPF)</cite></a>. Laurent Le Meur. 2018-08-07. URL: <a href="https://w3c.github.io/lpf/" >https://w3c.github.io/lpf/</a></dd> <dt id="bib-pwp-ucr">[pwp-ucr]</dt> <dd><a href="https://www.w3.org/TR/pwp-ucr/"><cite>Web Publications Use Cases and Requirements</cite></a>. Franco Alvarado; Joshua Pyle. W3C. 13 August 2019. W3C Note. URL: <a href="https://www.w3.org/TR/pwp-ucr/">https://www.w3.org/TR/pwp-ucr/</a></dd> </dl> </section> </section> <p role="navigation" id="back-to-top"> <a href="#title"> <abbr title="Back to Top">↑</abbr> </a> </p> <aside class="dfn-panel" hidden="" id="dfn-panel-for-dfn-publication-manifest"> <span class="caret"></span> <div> <a class="self-link" href="#dfn-publication-manifest">Permalink</a> </div> <b>Referenced in:</b> <ul> <li>Not referenced in this document.</li> </ul> </aside> <aside class="dfn-panel" hidden="" id="dfn-panel-for-dfn-file-name"> <span class="caret"></span> <div> <a class="self-link" href="#dfn-file-name">Permalink</a> </div> <b>Referenced in:</b> <ul> <li>Not referenced in this document.</li> </ul> </aside> <aside class="dfn-panel" hidden="" id="dfn-panel-for-dfn-primary-entry-page"> <span class="caret"></span> <div> <a class="self-link" href="#dfn-primary-entry-page">Permalink</a> </div> <b>Referenced in:</b> <ul> <li> <a href="#ref-for-dfn-primary-entry-page-1">7. User Agent Processing of Machine-Processable Table of Contents</a> </li> </ul> </aside> <aside class="dfn-panel" hidden="" id="dfn-panel-for-dfn-publication-type"> <span class="caret"></span> <div> <a class="self-link" href="#dfn-publication-type">Permalink</a> </div> <b>Referenced in:</b> <ul> <li>Not referenced in this document.</li> </ul> </aside> <aside class="dfn-panel" hidden="" id="dfn-panel-for-dfn-creator"> <span class="caret"></span> <div> <a class="self-link" href="#dfn-creator">Permalink</a> </div> <b>Referenced in:</b> <ul> <li>Not referenced in this document.</li> </ul> </aside> <aside class="dfn-panel" hidden="" id="dfn-panel-for-dfn-duration"> <span class="caret"></span> <div> <a class="self-link" href="#dfn-duration">Permalink</a> </div> <b>Referenced in:</b> <ul> <li>Not referenced in this document.</li> </ul> </aside> <aside class="dfn-panel" hidden="" id="dfn-panel-for-dfn-default-reading-order"> <span class="caret"></span> <div> <a class="self-link" href="#dfn-default-reading-order">Permalink</a> </div> <b>Referenced in:</b> <ul> <li>Not referenced in this document.</li> </ul> </aside> <aside class="dfn-panel" hidden="" id="dfn-panel-for-dfn-resource-list"> <span class="caret"></span> <div> <a class="self-link" href="#dfn-resource-list">Permalink</a> </div> <b>Referenced in:</b> <ul> <li>Not referenced in this document.</li> </ul> </aside> <script id="respec-dfn-panel"> // <![CDATA[ (() => { // @ts-check if (document.respecIsReady) { document.respecIsReady.then(dfnPanel); } else { dfnPanel(); } function dfnPanel() { /** @type {HTMLElement} */ let panel; document.body.addEventListener("click", event => { if (!(event.target instanceof HTMLElement)) return; /** @type {HTMLElement} */ const el = event.target; const action = deriveAction(el); switch (action) { case "show": { if (panel) hidePanel(panel); /** @type {HTMLElement} */ const dfn = el.closest("dfn, .index-term"); panel = document.getElementById(`dfn-panel-for-${dfn.id}`); displayPanel(dfn, panel, { x: event.clientX, y: event.clientY }); break; } case "dock": { panel.style.left = null; panel.style.top = null; panel.classList.add("docked"); break; } case "hide": { hidePanel(panel); break; } } }); } /** @param {HTMLElement} clickTarget */ function deriveAction(clickTarget) { const hitALink = !!clickTarget.closest("a"); if (clickTarget.closest("dfn, .index-term")) { return hitALink ? null : "show"; } if (clickTarget.closest(".dfn-panel")) { if (hitALink) { const clickedSelfLink = clickTarget.classList.contains("self-link"); return clickedSelfLink ? "hide" : "dock"; } const panel = clickTarget.closest(".dfn-panel"); return panel.classList.contains("docked") ? "hide" : null; } if (document.querySelector(".dfn-panel:not([hidden])")) { return "hide"; } return null; } /** * @param {HTMLElement} dfn * @param {HTMLElement} panel * @param {{ x: number, y: number }} clickPosition */ function displayPanel(dfn, panel, { x, y }) { panel.hidden = false; // distance (px) between edge of panel and the pointing triangle (caret) const MARGIN = 20; const dfnRects = dfn.getClientRects(); // Find the `top` offset when the `dfn` can be spread across multiple lines let closestTop = 0; let minDiff = Infinity; for (const rect of dfnRects) { const { top, bottom } = rect; const diffFromClickY = Math.abs((top + bottom) / 2 - y); if (diffFromClickY < minDiff) { minDiff = diffFromClickY; closestTop = top; } } const top = window.scrollY + closestTop + dfnRects[0].height; const left = x - MARGIN; panel.style.left = `${left}px`; panel.style.top = `${top}px`; // Find if the panel is flowing out of the window const panelRect = panel.getBoundingClientRect(); const SCREEN_WIDTH = Math.min(window.innerWidth, window.screen.width); if (panelRect.right > SCREEN_WIDTH) { const newLeft = Math.max(MARGIN, x + MARGIN - panelRect.width); const newCaretOffset = left - newLeft; panel.style.left = `${newLeft}px`; /** @type {HTMLElement} */ const caret = panel.querySelector(".caret"); caret.style.left = `${newCaretOffset}px`; } } /** @param {HTMLElement} panel */ function hidePanel(panel) { panel.hidden = true; panel.classList.remove("docked"); } })() // ]]> </script> <script src="https://www.w3.org/scripts/TR/2016/fixup.js"></script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10