├── .eslintignore ├── .eslintrc.js ├── .gitattributes ├── .github ├── CODEOWNERS └── workflows │ ├── browserstack.yml │ ├── cypress.yml │ ├── main.yml │ ├── playwright.yml │ └── size.yml ├── .gitignore ├── .husky ├── .gitignore └── pre-commit ├── .nvmrc ├── .parcelrc ├── LICENSE ├── README.md ├── browserstack.yml ├── cypress.json ├── cypress ├── fixtures │ └── example.json ├── integration │ ├── html-reader │ │ ├── errors.ts │ │ ├── get-content.ts │ │ ├── injectables.ts │ │ ├── internal-link.ts │ │ ├── location-sync.ts │ │ ├── missing-toc.ts │ │ ├── navigations.ts │ │ ├── page-button.ts │ │ ├── render-app.ts │ │ ├── settings.ts │ │ └── toc-navigation.ts │ ├── multi-pdf │ │ ├── navigations.ts │ │ ├── page-button.ts │ │ ├── render-app.ts │ │ └── settings.ts │ └── single-pdf │ │ ├── navigations.ts │ │ ├── page-button.ts │ │ ├── render-app.ts │ │ └── settings.ts ├── plugins │ └── index.ts ├── support │ ├── commands.ts │ ├── constants.ts │ ├── index.ts │ └── pdfZoomTestHelper.ts └── tsconfig.json ├── example ├── .npmignore ├── README.txt ├── Tests.tsx ├── cors-proxy.js ├── globals.d.ts ├── index.html ├── index.tsx ├── static │ ├── css │ │ └── sample.css │ ├── fonts │ │ └── opendyslexic │ │ │ ├── OFL.txt │ │ │ ├── opendyslexic-regular-webfont.woff │ │ │ ├── opendyslexic-regular-webfont.woff2 │ │ │ └── opendyslexic.css │ ├── js │ │ └── sample.js │ ├── pdf-worker │ │ ├── pdf.js │ │ ├── pdf.js.map │ │ ├── pdf.min.js │ │ ├── pdf.worker.entry.js │ │ ├── pdf.worker.js │ │ ├── pdf.worker.js.map │ │ └── pdf.worker.min.js │ ├── pdf.worker.min.js │ └── samples │ │ ├── ReadiumCSS-docs │ │ ├── META-INF │ │ │ ├── com.apple.ibooks.display-options.xml │ │ │ └── container.xml │ │ ├── OEBPS │ │ │ ├── Images │ │ │ │ ├── Fragmented-Model.jpg │ │ │ │ ├── Page-Model.jpg │ │ │ │ ├── alt-lines.png │ │ │ │ ├── charis-sil.png │ │ │ │ ├── clear-sans.png │ │ │ │ ├── cover.jpg │ │ │ │ ├── dynamic-leading.jpg │ │ │ │ ├── faustina.png │ │ │ │ ├── fira-sans.png │ │ │ │ ├── libre-franklin.png │ │ │ │ ├── literata.png │ │ │ │ ├── merriweather-sans.png │ │ │ │ ├── merriweather.png │ │ │ │ ├── plex-serif.png │ │ │ │ ├── pt-sans.png │ │ │ │ ├── pt-serif.png │ │ │ │ ├── source-sans-pro.png │ │ │ │ ├── spread-model.jpg │ │ │ │ └── vollkorn.png │ │ │ ├── Styles │ │ │ │ └── stylesheet.css │ │ │ ├── Text │ │ │ │ ├── Section-001.xhtml │ │ │ │ ├── Section-002.xhtml │ │ │ │ ├── Section-003.xhtml │ │ │ │ ├── Section-004.xhtml │ │ │ │ ├── Section-005.xhtml │ │ │ │ ├── Section-006.xhtml │ │ │ │ ├── Section-007.xhtml │ │ │ │ ├── Section-008.xhtml │ │ │ │ ├── Section-009.xhtml │ │ │ │ ├── Section-010.xhtml │ │ │ │ ├── Section-011.xhtml │ │ │ │ ├── Section-012.xhtml │ │ │ │ ├── Section-013.xhtml │ │ │ │ ├── Section-014.xhtml │ │ │ │ ├── Section-015.xhtml │ │ │ │ ├── Section-016.xhtml │ │ │ │ ├── Section-017.xhtml │ │ │ │ ├── Section-018.xhtml │ │ │ │ ├── Section-019.xhtml │ │ │ │ ├── Section-020.xhtml │ │ │ │ ├── Section-021.xhtml │ │ │ │ ├── Section-022.xhtml │ │ │ │ ├── Section-023.xhtml │ │ │ │ ├── Section-024.xhtml │ │ │ │ ├── Section-025.xhtml │ │ │ │ ├── Section-026.xhtml │ │ │ │ ├── Section-027.xhtml │ │ │ │ ├── cover.xhtml │ │ │ │ ├── nav.xhtml │ │ │ │ └── title_page.xhtml │ │ │ ├── content.opf │ │ │ └── toc.ncx │ │ ├── manifest.json │ │ └── mimetype │ │ ├── dickens-axisnow │ │ ├── decrypted │ │ │ ├── OEBPS │ │ │ │ ├── copyright.xhtml │ │ │ │ ├── cover.xhtml │ │ │ │ ├── css │ │ │ │ │ ├── media.css │ │ │ │ │ └── style.css │ │ │ │ ├── fonts │ │ │ │ │ ├── SIL-Open-Font-License-1.1.txt │ │ │ │ │ └── im-fell-double-pica-pro.otf │ │ │ │ ├── images │ │ │ │ │ ├── fell-flower-abc-fixed.png │ │ │ │ │ ├── fell-flower-d-fixed.png │ │ │ │ │ ├── fell-flower-kj-fixed.png │ │ │ │ │ ├── recovering-the-classics-stacked-logo-black-on-white.jpg │ │ │ │ │ ├── rtc_ataleoftwocities_alexislampley.jpg │ │ │ │ │ └── vellum-created-fixed.png │ │ │ │ ├── recovering-the-classics.xhtml │ │ │ │ ├── title-page.xhtml │ │ │ │ ├── toc-display.xhtml │ │ │ │ ├── toc.ncx │ │ │ │ ├── vol-001-chapter-001.xhtml │ │ │ │ ├── vol-001-chapter-002.xhtml │ │ │ │ ├── vol-001-chapter-003.xhtml │ │ │ │ ├── vol-001-chapter-004.xhtml │ │ │ │ ├── vol-001-chapter-005.xhtml │ │ │ │ ├── vol-001-chapter-006.xhtml │ │ │ │ ├── vol-001.xhtml │ │ │ │ ├── vol-002-chapter-001.xhtml │ │ │ │ ├── vol-002-chapter-002.xhtml │ │ │ │ ├── vol-002-chapter-003.xhtml │ │ │ │ ├── vol-002-chapter-004.xhtml │ │ │ │ ├── vol-002-chapter-005.xhtml │ │ │ │ ├── vol-002-chapter-006.xhtml │ │ │ │ ├── vol-002-chapter-007.xhtml │ │ │ │ ├── vol-002-chapter-008.xhtml │ │ │ │ ├── vol-002-chapter-009.xhtml │ │ │ │ ├── vol-002-chapter-010.xhtml │ │ │ │ ├── vol-002-chapter-011.xhtml │ │ │ │ ├── vol-002-chapter-012.xhtml │ │ │ │ ├── vol-002-chapter-013.xhtml │ │ │ │ ├── vol-002-chapter-014.xhtml │ │ │ │ ├── vol-002-chapter-015.xhtml │ │ │ │ ├── vol-002-chapter-016.xhtml │ │ │ │ ├── vol-002-chapter-017.xhtml │ │ │ │ ├── vol-002-chapter-018.xhtml │ │ │ │ ├── vol-002-chapter-019.xhtml │ │ │ │ ├── vol-002-chapter-020.xhtml │ │ │ │ ├── vol-002-chapter-021.xhtml │ │ │ │ ├── vol-002-chapter-022.xhtml │ │ │ │ ├── vol-002-chapter-023.xhtml │ │ │ │ ├── vol-002-chapter-024.xhtml │ │ │ │ ├── vol-002.xhtml │ │ │ │ ├── vol-003-chapter-001.xhtml │ │ │ │ ├── vol-003-chapter-002.xhtml │ │ │ │ ├── vol-003-chapter-003.xhtml │ │ │ │ ├── vol-003-chapter-004.xhtml │ │ │ │ ├── vol-003-chapter-005.xhtml │ │ │ │ ├── vol-003-chapter-006.xhtml │ │ │ │ ├── vol-003-chapter-007.xhtml │ │ │ │ ├── vol-003-chapter-008.xhtml │ │ │ │ ├── vol-003-chapter-009.xhtml │ │ │ │ ├── vol-003-chapter-010.xhtml │ │ │ │ ├── vol-003-chapter-011.xhtml │ │ │ │ ├── vol-003-chapter-012.xhtml │ │ │ │ ├── vol-003-chapter-013.xhtml │ │ │ │ ├── vol-003-chapter-014.xhtml │ │ │ │ ├── vol-003-chapter-015.xhtml │ │ │ │ └── vol-003.xhtml │ │ │ └── manifest.json │ │ └── encrypted │ │ │ ├── OEBPS │ │ │ ├── copyright.xhtml │ │ │ ├── cover.xhtml │ │ │ ├── css │ │ │ │ ├── media.css │ │ │ │ └── style.css │ │ │ ├── fonts │ │ │ │ ├── SIL-Open-Font-License-1.1.txt │ │ │ │ └── im-fell-double-pica-pro.otf │ │ │ ├── images │ │ │ │ ├── fell-flower-abc-fixed.png │ │ │ │ ├── fell-flower-d-fixed.png │ │ │ │ ├── fell-flower-kj-fixed.png │ │ │ │ ├── recovering-the-classics-stacked-logo-black-on-white.jpg │ │ │ │ ├── rtc_ataleoftwocities_alexislampley.jpg │ │ │ │ └── vellum-created-fixed.png │ │ │ ├── recovering-the-classics.xhtml │ │ │ ├── title-page.xhtml │ │ │ ├── toc-display.xhtml │ │ │ ├── toc.ncx │ │ │ ├── vol-001-chapter-001.xhtml │ │ │ ├── vol-001-chapter-002.xhtml │ │ │ ├── vol-001-chapter-003.xhtml │ │ │ ├── vol-001-chapter-004.xhtml │ │ │ ├── vol-001-chapter-005.xhtml │ │ │ ├── vol-001-chapter-006.xhtml │ │ │ ├── vol-001.xhtml │ │ │ ├── vol-002-chapter-001.xhtml │ │ │ ├── vol-002-chapter-002.xhtml │ │ │ ├── vol-002-chapter-003.xhtml │ │ │ ├── vol-002-chapter-004.xhtml │ │ │ ├── vol-002-chapter-005.xhtml │ │ │ ├── vol-002-chapter-006.xhtml │ │ │ ├── vol-002-chapter-007.xhtml │ │ │ ├── vol-002-chapter-008.xhtml │ │ │ ├── vol-002-chapter-009.xhtml │ │ │ ├── vol-002-chapter-010.xhtml │ │ │ ├── vol-002-chapter-011.xhtml │ │ │ ├── vol-002-chapter-012.xhtml │ │ │ ├── vol-002-chapter-013.xhtml │ │ │ ├── vol-002-chapter-014.xhtml │ │ │ ├── vol-002-chapter-015.xhtml │ │ │ ├── vol-002-chapter-016.xhtml │ │ │ ├── vol-002-chapter-017.xhtml │ │ │ ├── vol-002-chapter-018.xhtml │ │ │ ├── vol-002-chapter-019.xhtml │ │ │ ├── vol-002-chapter-020.xhtml │ │ │ ├── vol-002-chapter-021.xhtml │ │ │ ├── vol-002-chapter-022.xhtml │ │ │ ├── vol-002-chapter-023.xhtml │ │ │ ├── vol-002-chapter-024.xhtml │ │ │ ├── vol-002.xhtml │ │ │ ├── vol-003-chapter-001.xhtml │ │ │ ├── vol-003-chapter-002.xhtml │ │ │ ├── vol-003-chapter-003.xhtml │ │ │ ├── vol-003-chapter-004.xhtml │ │ │ ├── vol-003-chapter-005.xhtml │ │ │ ├── vol-003-chapter-006.xhtml │ │ │ ├── vol-003-chapter-007.xhtml │ │ │ ├── vol-003-chapter-008.xhtml │ │ │ ├── vol-003-chapter-009.xhtml │ │ │ ├── vol-003-chapter-010.xhtml │ │ │ ├── vol-003-chapter-011.xhtml │ │ │ ├── vol-003-chapter-012.xhtml │ │ │ ├── vol-003-chapter-013.xhtml │ │ │ ├── vol-003-chapter-014.xhtml │ │ │ ├── vol-003-chapter-015.xhtml │ │ │ └── vol-003.xhtml │ │ │ └── manifest.json │ │ ├── fixed-layout │ │ ├── EPUB │ │ │ ├── Content │ │ │ │ ├── PageBlanche_Page_000.xhtml │ │ │ │ ├── PageBlanche_Page_001.xhtml │ │ │ │ ├── PageBlanche_Page_002.xhtml │ │ │ │ ├── PageBlanche_Page_003.xhtml │ │ │ │ ├── PageBlanche_Page_004.xhtml │ │ │ │ ├── PageBlanche_Page_005.xhtml │ │ │ │ ├── PageBlanche_Page_006.xhtml │ │ │ │ ├── PageBlanche_Page_007.xhtml │ │ │ │ ├── PageBlanche_Page_008.xhtml │ │ │ │ └── cover.xhtml │ │ │ ├── Image │ │ │ │ ├── PageBlanche_Page_001.jpg │ │ │ │ ├── PageBlanche_Page_002.jpg │ │ │ │ ├── PageBlanche_Page_003.jpg │ │ │ │ ├── PageBlanche_Page_004.jpg │ │ │ │ ├── PageBlanche_Page_005.jpg │ │ │ │ ├── PageBlanche_Page_006.jpg │ │ │ │ ├── PageBlanche_Page_007.jpg │ │ │ │ ├── PageBlanche_Page_008.jpg │ │ │ │ └── cover.jpg │ │ │ ├── Navigation │ │ │ │ ├── nav.xhtml │ │ │ │ └── toc.ncx │ │ │ ├── Style │ │ │ │ └── style.css │ │ │ └── package.opf │ │ ├── META-INF │ │ │ └── container.xml │ │ ├── manifest.json │ │ ├── mimetype │ │ └── page-blanche.epub │ │ ├── fxl-poems │ │ ├── META-INF │ │ │ └── container.xml │ │ ├── OPS │ │ │ ├── TOC.xhtml │ │ │ ├── css │ │ │ │ └── igp-twss-fxl.css │ │ │ ├── fonts │ │ │ │ ├── texgyrebonum-bold.woff │ │ │ │ ├── texgyrebonum-bolditalic.woff │ │ │ │ ├── texgyrebonum-italic.woff │ │ │ │ └── texgyrebonum-regular.woff │ │ │ ├── images │ │ │ │ └── ss_fixed_online.jpg │ │ │ ├── package.opf │ │ │ ├── s001-Cover-01.xhtml │ │ │ ├── s002-BookTitlePage-01.xhtml │ │ │ ├── s003-Section-01.xhtml │ │ │ ├── s004-Copyright-01.xhtml │ │ │ ├── s005-Epigraph-01.xhtml │ │ │ ├── s006-TableOfContents-01.xhtml │ │ │ ├── s007-Section-02.xhtml │ │ │ ├── s008-Section-03.xhtml │ │ │ ├── s009-Part-001.xhtml │ │ │ ├── s010-Section-004.xhtml │ │ │ ├── s011-Poem-001.xhtml │ │ │ ├── s012-Poem-002.xhtml │ │ │ ├── s013-Poem-003.xhtml │ │ │ ├── s014-Section-005.xhtml │ │ │ ├── s015-Poem-004.xhtml │ │ │ ├── s016-Poem-005.xhtml │ │ │ ├── s017-Poem-006.xhtml │ │ │ ├── s018-Section-006.xhtml │ │ │ ├── s019-Poem-007.xhtml │ │ │ ├── s020-Section-007.xhtml │ │ │ ├── s021-Poem-008.xhtml │ │ │ ├── s022-Poem-009.xhtml │ │ │ ├── s023-Poem-010.xhtml │ │ │ ├── s024-Poem-011.xhtml │ │ │ ├── s025-Poem-012.xhtml │ │ │ ├── s026-Poem-013.xhtml │ │ │ ├── s027-Poem-014.xhtml │ │ │ ├── s028-Section-008.xhtml │ │ │ ├── s029-Poem-015.xhtml │ │ │ ├── s030-Poem-016.xhtml │ │ │ ├── s031-Poem-017.xhtml │ │ │ ├── s032-Poem-018.xhtml │ │ │ ├── s033-Poem-019.xhtml │ │ │ ├── s034-Poem-020.xhtml │ │ │ ├── s035-Poem-021.xhtml │ │ │ ├── s036-Poem-022.xhtml │ │ │ ├── s037-Section-009.xhtml │ │ │ ├── s038-Poem-023.xhtml │ │ │ ├── s039-Poem-024.xhtml │ │ │ ├── s040-Poem-025.xhtml │ │ │ ├── s041-Poem-026.xhtml │ │ │ ├── s042-Section-010.xhtml │ │ │ ├── s043-Part-002.xhtml │ │ │ ├── s044-Section-011.xhtml │ │ │ ├── s045-Poem-027.xhtml │ │ │ ├── s046-Poem-028.xhtml │ │ │ ├── s047-Poem-029.xhtml │ │ │ ├── s048-Poem-030.xhtml │ │ │ ├── s049-Poem-031.xhtml │ │ │ ├── s050-Poem-032.xhtml │ │ │ ├── s051-Poem-033.xhtml │ │ │ ├── s052-Poem-034.xhtml │ │ │ ├── s053-Poem-035.xhtml │ │ │ ├── s054-Poem-036.xhtml │ │ │ ├── s055-Poem-037.xhtml │ │ │ ├── s056-Poem-038.xhtml │ │ │ ├── s057-Poem-039.xhtml │ │ │ ├── s058-Poem-040.xhtml │ │ │ ├── s059-Poem-041.xhtml │ │ │ ├── s060-Poem-042.xhtml │ │ │ ├── s061-Poem-043.xhtml │ │ │ ├── s062-Poem-044.xhtml │ │ │ ├── s063-Poem-045.xhtml │ │ │ ├── s064-Poem-046.xhtml │ │ │ ├── s065-Poem-047.xhtml │ │ │ ├── s066-Section-012.xhtml │ │ │ ├── s067-Part-003.xhtml │ │ │ ├── s068-Section-013.xhtml │ │ │ ├── s069-Poem-048.xhtml │ │ │ ├── s070-Poem-049.xhtml │ │ │ ├── s071-Section-014.xhtml │ │ │ ├── s072-Poem-050.xhtml │ │ │ ├── s073-Poem-051.xhtml │ │ │ ├── s074-Poem-052.xhtml │ │ │ ├── s075-Poem-053.xhtml │ │ │ ├── s076-Section-015.xhtml │ │ │ ├── s077-Poem-054.xhtml │ │ │ ├── s078-Poem-055.xhtml │ │ │ ├── s079-Poem-056.xhtml │ │ │ ├── s080-Poem-057.xhtml │ │ │ ├── s081-Poem-058.xhtml │ │ │ ├── s082-Section-016.xhtml │ │ │ ├── s083-Section-017.xhtml │ │ │ ├── s084-Poem-059.xhtml │ │ │ ├── s085-Poem-060.xhtml │ │ │ ├── s086-Poem-061.xhtml │ │ │ ├── s087-Section-018.xhtml │ │ │ ├── s088-Poem-062.xhtml │ │ │ ├── s089-Section-019.xhtml │ │ │ ├── s090-Poem-063.xhtml │ │ │ └── s091-Poem-064.xhtml │ │ ├── igp-twss-fxl.epub │ │ ├── manifest.json │ │ └── mimetype │ │ ├── moby-epub2-exploded │ │ ├── META-INF │ │ │ └── container.xml │ │ ├── OEBPS │ │ │ ├── 0.css │ │ │ ├── 1.css │ │ │ ├── @export@sunsite@users@gutenbackend@cache@epub@2701@2701-cover.png │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-0.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-1.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-10.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-11.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-12.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-13.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-14.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-15.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-16.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-17.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-18.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-19.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-2.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-20.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-21.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-22.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-23.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-24.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-3.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-4.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-5.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-6.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-7.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-8.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-9.htm.html │ │ │ ├── content.opf │ │ │ ├── pgepub.css │ │ │ ├── toc.ncx │ │ │ └── wrap0000.html │ │ ├── manifest.json │ │ └── mimetype │ │ ├── moby-epub3-exploded │ │ ├── META-INF │ │ │ └── container.xml │ │ ├── OPS │ │ │ ├── chapter_001.xhtml │ │ │ ├── chapter_002.xhtml │ │ │ ├── chapter_003.xhtml │ │ │ ├── chapter_004.xhtml │ │ │ ├── chapter_005.xhtml │ │ │ ├── chapter_006.xhtml │ │ │ ├── chapter_007.xhtml │ │ │ ├── chapter_008.xhtml │ │ │ ├── chapter_009.xhtml │ │ │ ├── chapter_010.xhtml │ │ │ ├── chapter_011.xhtml │ │ │ ├── chapter_012.xhtml │ │ │ ├── chapter_013.xhtml │ │ │ ├── chapter_014.xhtml │ │ │ ├── chapter_015.xhtml │ │ │ ├── chapter_016.xhtml │ │ │ ├── chapter_017.xhtml │ │ │ ├── chapter_018.xhtml │ │ │ ├── chapter_019.xhtml │ │ │ ├── chapter_020.xhtml │ │ │ ├── chapter_021.xhtml │ │ │ ├── chapter_022.xhtml │ │ │ ├── chapter_023.xhtml │ │ │ ├── chapter_024.xhtml │ │ │ ├── chapter_025.xhtml │ │ │ ├── chapter_026.xhtml │ │ │ ├── chapter_027.xhtml │ │ │ ├── chapter_028.xhtml │ │ │ ├── chapter_029.xhtml │ │ │ ├── chapter_030.xhtml │ │ │ ├── chapter_031.xhtml │ │ │ ├── chapter_032.xhtml │ │ │ ├── chapter_033.xhtml │ │ │ ├── chapter_034.xhtml │ │ │ ├── chapter_035.xhtml │ │ │ ├── chapter_036.xhtml │ │ │ ├── chapter_037.xhtml │ │ │ ├── chapter_038.xhtml │ │ │ ├── chapter_039.xhtml │ │ │ ├── chapter_040.xhtml │ │ │ ├── chapter_041.xhtml │ │ │ ├── chapter_042.xhtml │ │ │ ├── chapter_043.xhtml │ │ │ ├── chapter_044.xhtml │ │ │ ├── chapter_045.xhtml │ │ │ ├── chapter_046.xhtml │ │ │ ├── chapter_047.xhtml │ │ │ ├── chapter_048.xhtml │ │ │ ├── chapter_049.xhtml │ │ │ ├── chapter_050.xhtml │ │ │ ├── chapter_051.xhtml │ │ │ ├── chapter_052.xhtml │ │ │ ├── chapter_053.xhtml │ │ │ ├── chapter_054.xhtml │ │ │ ├── chapter_055.xhtml │ │ │ ├── chapter_056.xhtml │ │ │ ├── chapter_057.xhtml │ │ │ ├── chapter_058.xhtml │ │ │ ├── chapter_059.xhtml │ │ │ ├── chapter_060.xhtml │ │ │ ├── chapter_061.xhtml │ │ │ ├── chapter_062.xhtml │ │ │ ├── chapter_063.xhtml │ │ │ ├── chapter_064.xhtml │ │ │ ├── chapter_065.xhtml │ │ │ ├── chapter_066.xhtml │ │ │ ├── chapter_067.xhtml │ │ │ ├── chapter_068.xhtml │ │ │ ├── chapter_069.xhtml │ │ │ ├── chapter_070.xhtml │ │ │ ├── chapter_071.xhtml │ │ │ ├── chapter_072.xhtml │ │ │ ├── chapter_073.xhtml │ │ │ ├── chapter_074.xhtml │ │ │ ├── chapter_075.xhtml │ │ │ ├── chapter_076.xhtml │ │ │ ├── chapter_077.xhtml │ │ │ ├── chapter_078.xhtml │ │ │ ├── chapter_079.xhtml │ │ │ ├── chapter_080.xhtml │ │ │ ├── chapter_081.xhtml │ │ │ ├── chapter_082.xhtml │ │ │ ├── chapter_083.xhtml │ │ │ ├── chapter_084.xhtml │ │ │ ├── chapter_085.xhtml │ │ │ ├── chapter_086.xhtml │ │ │ ├── chapter_087.xhtml │ │ │ ├── chapter_088.xhtml │ │ │ ├── chapter_089.xhtml │ │ │ ├── chapter_090.xhtml │ │ │ ├── chapter_091.xhtml │ │ │ ├── chapter_092.xhtml │ │ │ ├── chapter_093.xhtml │ │ │ ├── chapter_094.xhtml │ │ │ ├── chapter_095.xhtml │ │ │ ├── chapter_096.xhtml │ │ │ ├── chapter_097.xhtml │ │ │ ├── chapter_098.xhtml │ │ │ ├── chapter_099.xhtml │ │ │ ├── chapter_100.xhtml │ │ │ ├── chapter_101.xhtml │ │ │ ├── chapter_102.xhtml │ │ │ ├── chapter_103.xhtml │ │ │ ├── chapter_104.xhtml │ │ │ ├── chapter_105.xhtml │ │ │ ├── chapter_106.xhtml │ │ │ ├── chapter_107.xhtml │ │ │ ├── chapter_108.xhtml │ │ │ ├── chapter_109.xhtml │ │ │ ├── chapter_110.xhtml │ │ │ ├── chapter_111.xhtml │ │ │ ├── chapter_112.xhtml │ │ │ ├── chapter_113.xhtml │ │ │ ├── chapter_114.xhtml │ │ │ ├── chapter_115.xhtml │ │ │ ├── chapter_116.xhtml │ │ │ ├── chapter_117.xhtml │ │ │ ├── chapter_118.xhtml │ │ │ ├── chapter_119.xhtml │ │ │ ├── chapter_120.xhtml │ │ │ ├── chapter_121.xhtml │ │ │ ├── chapter_122.xhtml │ │ │ ├── chapter_123.xhtml │ │ │ ├── chapter_124.xhtml │ │ │ ├── chapter_125.xhtml │ │ │ ├── chapter_126.xhtml │ │ │ ├── chapter_127.xhtml │ │ │ ├── chapter_128.xhtml │ │ │ ├── chapter_129.xhtml │ │ │ ├── chapter_130.xhtml │ │ │ ├── chapter_131.xhtml │ │ │ ├── chapter_132.xhtml │ │ │ ├── chapter_133.xhtml │ │ │ ├── chapter_134.xhtml │ │ │ ├── chapter_135.xhtml │ │ │ ├── chapter_136.xhtml │ │ │ ├── copyright.xhtml │ │ │ ├── cover.xhtml │ │ │ ├── css │ │ │ │ └── stylesheet.css │ │ │ ├── epigraph_001.xhtml │ │ │ ├── fonts │ │ │ │ ├── STIXGeneral.otf │ │ │ │ ├── STIXGeneralBol.otf │ │ │ │ ├── STIXGeneralBolIta.otf │ │ │ │ └── STIXGeneralItalic.otf │ │ │ ├── images │ │ │ │ ├── 9780316000000.jpg │ │ │ │ └── Moby-Dick_FE_title_page.jpg │ │ │ ├── introduction_001.xhtml │ │ │ ├── package.opf │ │ │ ├── preface_001.xhtml │ │ │ ├── titlepage.xhtml │ │ │ ├── toc-short.xhtml │ │ │ └── toc.xhtml │ │ ├── manifest.json │ │ └── mimetype │ │ ├── moby-remote.json │ │ ├── moby-webpub │ │ ├── OEBPS │ │ │ ├── 0.css │ │ │ ├── 1.css │ │ │ ├── @export@sunsite@users@gutenbackend@cache@epub@2701@2701-cover.png │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-0.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-1.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-10.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-11.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-12.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-13.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-14.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-15.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-16.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-17.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-18.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-19.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-2.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-20.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-21.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-22.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-23.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-24.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-3.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-4.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-5.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-6.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-7.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-8.htm.html │ │ │ ├── @public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-9.htm.html │ │ │ ├── pgepub.css │ │ │ ├── toc.ncx │ │ │ └── wrap0000.html │ │ └── manifest.json │ │ ├── pdf │ │ ├── multi-resource.json │ │ ├── single-resource-long.json │ │ └── single-resource-short.json │ │ └── test │ │ ├── missing-resource.json │ │ ├── missing-toc.json │ │ ├── unparsable-manifst.json │ │ └── unparseable-manifst.json ├── tsconfig.json ├── use-html-reader.tsx └── use-pdf-reader.tsx ├── jest.config.ts ├── package-lock.json ├── package.json ├── playwright.config.ts ├── playwright ├── pageobjects │ └── web-reader.page.ts └── tests │ ├── html-reader-navigation.spec.ts │ ├── html-reader-settings.spec.ts │ ├── pdf-reader-navigation.spec.ts │ ├── pdf-reader-settings.spec.ts │ └── test.spec.ts ├── src ├── HtmlReader │ ├── ReadiumCss │ │ ├── LICENSE │ │ ├── ReadiumCSS-after.css │ │ ├── ReadiumCSS-before.css │ │ └── ReadiumCSS-default.css │ ├── architecture.md │ ├── effects.ts │ ├── index.tsx │ ├── injectable-styles.css │ ├── lib.ts │ ├── reducer.ts │ ├── types.ts │ ├── useIframeLinkClick.ts │ ├── useLocationQuery.ts │ ├── useResource.tsx │ ├── useUpdateCSS.ts │ ├── useUpdateScroll.ts │ └── useWindowResize.ts ├── PdfReader │ ├── ChakraPage.tsx │ ├── ScrollPage.tsx │ ├── addTocToManifest.tsx │ ├── index.tsx │ ├── lib.ts │ ├── pdf.css │ ├── reducer.ts │ ├── types.ts │ └── useMeasure.tsx ├── Readium │ ├── Injectable.ts │ └── Locator.ts ├── WebpubManifestTypes │ ├── ConformsTo.ts │ ├── Contributor.ts │ ├── EpubExtension.ts │ ├── LanguageMap.ts │ ├── Metadata.ts │ ├── OPDSLink.ts │ ├── PresentationHints.ts │ ├── ReadiumLink.ts │ ├── Subject.ts │ └── WebpubManifest.ts ├── constants.ts ├── index.tsx ├── types.ts ├── ui │ ├── Button.tsx │ ├── ErrorBoundary.tsx │ ├── Footer.tsx │ ├── Header.tsx │ ├── HtmlSettings.tsx │ ├── LoadingSkeleton.tsx │ ├── PageButton.tsx │ ├── PdfSettings.tsx │ ├── SettingsButton.tsx │ ├── SkipNavigation.tsx │ ├── TableOfContent.tsx │ ├── ToggleButton.tsx │ ├── ToggleGroup.tsx │ ├── hooks │ │ ├── document.d.ts │ │ ├── useColorModeValue.tsx │ │ ├── useContainerWidth.ts │ │ ├── useEventListener.ts │ │ └── useFullScreen.ts │ ├── icons │ │ ├── Continuous.tsx │ │ ├── Day.tsx │ │ ├── EnlargeFont.tsx │ │ ├── Night.tsx │ │ ├── Paginated.tsx │ │ ├── Previous.tsx │ │ ├── ReaderSettings.tsx │ │ ├── ReduceFont.tsx │ │ ├── Reset.tsx │ │ ├── Sepia.tsx │ │ ├── TableOfContents.tsx │ │ ├── ToggleFullScreen.tsx │ │ ├── ToggleFullScreenExit.tsx │ │ └── index.tsx │ ├── manager.tsx │ ├── menu │ │ ├── index.tsx │ │ ├── menu.tsx │ │ └── use-menu.tsx │ ├── nypl-base-theme │ │ ├── components │ │ │ ├── button.ts │ │ │ ├── checkbox.ts │ │ │ ├── form-error.ts │ │ │ ├── form-label.ts │ │ │ ├── form.ts │ │ │ ├── input.ts │ │ │ └── text-area.ts │ │ ├── foundations │ │ │ ├── breakpoints.ts │ │ │ ├── colors.ts │ │ │ ├── global.ts │ │ │ ├── radii.ts │ │ │ ├── spacing.ts │ │ │ └── typography.ts │ │ ├── index.ts │ │ └── types.ts │ └── theme │ │ ├── components │ │ ├── alert.ts │ │ ├── button.ts │ │ ├── skipNavigation.ts │ │ └── text.ts │ │ ├── foundations │ │ ├── colors.ts │ │ ├── fonts.tsx │ │ └── typography.ts │ │ ├── index.ts │ │ └── types.ts ├── useWebReader.tsx └── utils │ ├── fetch.ts │ ├── getColor.ts │ └── localstorage.ts ├── tests ├── Button.test.tsx ├── Header.test.tsx ├── PageButton.test.tsx ├── SettingsCard.test.tsx ├── TableOfContent.test.tsx ├── ToggleButton.test.tsx ├── ToggleGroup.test.tsx ├── cssStub.js ├── hooks │ ├── useColorModeValue.test.tsx │ └── useEventListener.test.ts ├── jest.setup.ts └── utils │ └── MockData.tsx ├── tsconfig.build.json ├── tsconfig.json ├── tsup.config.ts └── vercel.json /.eslintignore: -------------------------------------------------------------------------------- 1 | *.log 2 | .DS_Store 3 | node_modules 4 | .cache 5 | dist 6 | 7 | .parcel-cache 8 | .cache 9 | 10 | .vercel 11 | 12 | # env 13 | .env 14 | 15 | # the parcel built example app 16 | www 17 | 18 | # all config files 19 | .* 20 | 21 | # static files 22 | example/static/**/* 23 | 24 | # the cors-proxy 25 | example/cors-proxy.js -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: '@typescript-eslint/parser', 4 | plugins: ['@typescript-eslint'], 5 | extends: [ 6 | 'react-app', 7 | 'eslint:recommended', 8 | 'plugin:@typescript-eslint/recommended', 9 | 'plugin:react-hooks/recommended', 10 | 'prettier', 11 | ], 12 | settings: { 13 | react: { 14 | version: 'detect', 15 | }, 16 | }, 17 | }; 18 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Each line is a file pattern followed by one or more owners. These owners will be the default owners for everything in the repo. Unless a later match takes precedence,e ach owner will be requested for review when someone opens a pull request. 2 | * @samanthaandrews @jackiequach @kristojorg @Toxiapo @oliviawongnyc 3 | -------------------------------------------------------------------------------- /.github/workflows/browserstack.yml: -------------------------------------------------------------------------------- 1 | name: 'Playwright Tests for Web Reader via BrowserStack' 2 | on: 3 | schedule: 4 | - cron: '00 12 * * 1-5' # every day at 7-9 AM ET (12 PM wherever the server is) excluding weekends 5 | jobs: 6 | test: 7 | name: 'Playwright Tests for Web Reader via BrowserStack' 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: 'BrowserStack Env Setup' 11 | uses: 'browserstack/github-actions/setup-env@master' 12 | with: 13 | username: ${{ secrets.BROWSERSTACK_USERNAME }} 14 | access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} 15 | project-name: DRB Web Reader 16 | build-name: DRB Web Reader Automated Tests 17 | 18 | - name: 'BrowserStack Local Tunnel Setup' # set up tunnel connection between GitHub Actions runner environment and BrowserStack device cloud 19 | uses: browserstack/github-actions/setup-local@master 20 | with: 21 | local-testing: start 22 | local-identifier: random 23 | 24 | - name: Checkout 25 | uses: actions/checkout@v4 26 | 27 | - name: Setup node 28 | uses: actions/setup-node@v4 29 | with: 30 | node-version-file: '.nvmrc' 31 | 32 | - name: Install dependencies 33 | run: npm ci 34 | 35 | - name: Install Playwright Browsers 36 | run: npx playwright install --with-deps 37 | 38 | - name: Run tests on BrowserStack 39 | id: run-tests 40 | run: npx browserstack-node-sdk playwright test 41 | continue-on-error: true 42 | 43 | - name: Set failure workflow status 🚨 44 | if: steps.run-tests.outcome != 'success' 45 | run: exit 1 46 | 47 | - name: Set successful workflow status ✅ 48 | if: steps.run-tests.outcome == 'success' 49 | run: exit 0 50 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: [push] 3 | jobs: 4 | build: 5 | name: Build, lint, and test 6 | runs-on: ubuntu-latest 7 | 8 | steps: 9 | - name: Checkout repo 10 | uses: actions/checkout@v4 11 | 12 | - name: Use Node 20 13 | uses: actions/setup-node@v4 14 | with: 15 | node-version: '20' 16 | cache: 'npm' 17 | 18 | - name: Use NPM 9.x 19 | run: npm i -g npm@8 20 | 21 | - name: Install Dependencies 22 | run: npm install 23 | 24 | - name: Lint 25 | run: npm run lint 26 | 27 | - name: Check Formatting 28 | run: npm run prettier:check 29 | 30 | - name: Test 31 | run: npm run test:ci 32 | 33 | - name: Build 34 | run: npm run build 35 | -------------------------------------------------------------------------------- /.github/workflows/size.yml: -------------------------------------------------------------------------------- 1 | # commented out for now, we should bring this back when we 2 | # work on the bundle size 3 | 4 | # name: size 5 | # on: [pull_request] 6 | # jobs: 7 | # size: 8 | # runs-on: ubuntu-latest 9 | # env: 10 | # CI_JOB_NUMBER: 1 11 | # steps: 12 | # - uses: actions/checkout@v1 13 | # - uses: andresz1/size-limit-action@v1 14 | # with: 15 | # github_token: ${{ secrets.GITHUB_TOKEN }} 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | .DS_Store 3 | node_modules 4 | .cache 5 | dist 6 | coverage 7 | 8 | .eslintcache 9 | .parcel-cache 10 | .cache 11 | 12 | .vercel 13 | 14 | # env 15 | .env 16 | 17 | # the parcel built example app 18 | www 19 | 20 | # cypress 21 | cypress/screenshots 22 | cypress/videos 23 | 24 | # Playwright 25 | /test-results/ 26 | /playwright-report/ 27 | /blob-report/ 28 | /playwright/.cache/ 29 | -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v20 2 | -------------------------------------------------------------------------------- /.parcelrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["@parcel/config-default", "parcel-config-precache-manifest"], 3 | "reporters": ["...", "parcel-reporter-static-files-copy"], 4 | } 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 kristojorg 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "baseUrl": "http://localhost:1234", 3 | "projectId": "79fvf2", 4 | "chromeWebSecurity": false, 5 | "retries": { 6 | "runMode": 1, 7 | "openMode": 0 8 | }, 9 | "pluginsFile": false 10 | } 11 | -------------------------------------------------------------------------------- /cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /cypress/integration/html-reader/errors.ts: -------------------------------------------------------------------------------- 1 | describe('error states', () => { 2 | beforeEach(() => { 3 | /** 4 | * React re-throws caught exceptions in dev so that they appear in the 5 | * console, but this makes cypress think it was uncaught, so we have to 6 | * turn this off 7 | */ 8 | cy.on('uncaught:exception', (err, runnable) => { 9 | // returning false here prevents Cypress from 10 | // failing the test 11 | return false; 12 | }); 13 | }); 14 | 15 | it('throws error for unparsable manifest', () => { 16 | /* 17 | we use visit here instead of 'loadPage' because 'loadPage' 18 | checks for an iframe that should fail to render in this test 19 | */ 20 | cy.visit('/html/test/unparsable-manifest'); 21 | 22 | cy.findByRole('heading', { name: 'An error occurred' }); 23 | cy.findByRole('alert', { 24 | name: /Network Error: Unparsable JSON file found at http.+\/unparsable-manifest.json/i, 25 | }); 26 | }); 27 | 28 | // @TODO - Improve this error UX. Requires change in R2D2BC. 29 | it('throws error for missing resource', () => { 30 | cy.visit('/html/test/missing-resource'); 31 | 32 | cy.getIframeBody().contains('Page not found.', { timeout: 10000 }); 33 | }); 34 | }); 35 | -------------------------------------------------------------------------------- /cypress/integration/html-reader/get-content.ts: -------------------------------------------------------------------------------- 1 | describe('getContent', () => { 2 | it('getContent returns HTML', () => { 3 | cy.visit('/html/test/get-content'); 4 | cy.getIframeBody() 5 | .find('p') 6 | .should('include.text', '/samples/moby-epub2-exploded/OEBPS/'); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /cypress/integration/html-reader/injectables.ts: -------------------------------------------------------------------------------- 1 | describe('useHtmlReader configuration settings', () => { 2 | it('should have no injectables by default', () => { 3 | cy.loadPage('/html/test/no-injectables'); 4 | cy.getIframeHead() 5 | .find('link[href$="/fonts/opensyslexic/opendyslexic.css"]') 6 | .should('not.exist'); 7 | cy.getIframeHead() 8 | .find('link[href$="/css/sample.css"]') 9 | .should('not.exist'); 10 | }); 11 | 12 | it('should render injectables script when provided', () => { 13 | cy.log('Reflowable Book with both fixed and reflowable CSS injected'); 14 | cy.loadPage('/html/test/with-script-injectable'); 15 | 16 | cy.getIframeHead() 17 | .find(`script[src$="/js/sample.js"]`, { timeout: 50000 }) 18 | .should('exist'); 19 | }); 20 | 21 | it('should render reflowable injectables CSS when provided for reflowable books', () => { 22 | cy.log('Reflowable Book with both fixed and reflowable CSS injected'); 23 | cy.loadPage('/html/test/with-reflowable-layout'); 24 | cy.getIframeHead() 25 | .find(`link[href$="/fonts/opensyslexic/opendyslexic.css"]`, { 26 | timeout: 50000, 27 | }) 28 | .should('exist'); 29 | cy.getIframeHead() 30 | .find(`link[href$="/css/sample.css"]`, { timeout: 50000 }) 31 | .should('exist'); 32 | cy.getIframeBody().should('have.css', 'color', 'rgb(0, 0, 255)'); 33 | }); 34 | 35 | it('should not render reflowable injectables CSS for FXL books', () => { 36 | cy.log('FXL Book with both fixed and reflowable CSS injected'); 37 | cy.loadPage('/html/test/with-fixed-layout'); 38 | cy.getIframeHead() 39 | .find('link[href$="/fonts/opensyslexic/opendyslexic.css"]') 40 | .should('not.exist'); 41 | cy.getIframeHead() 42 | .find('link[href$="/css/sample.css"]') 43 | .should('not.exist'); 44 | }); 45 | }); 46 | -------------------------------------------------------------------------------- /cypress/integration/html-reader/internal-link.ts: -------------------------------------------------------------------------------- 1 | describe('navigating an EPUB page using internal link', () => { 2 | beforeEach(() => { 3 | // FIXME: Ignore random reader bug for now, remove this after [OE-300] 4 | cy.on('uncaught:exception', (err, runnable) => { 5 | return false; 6 | }); 7 | }); 8 | 9 | it('Paginated mode & internal links should navigates users', () => { 10 | cy.visit('/html/moby-epub2'); 11 | cy.wait(1000); 12 | cy.log('Go to a page with TOC'); 13 | 14 | cy.findByRole('button', { name: 'Table of Contents' }).click(); 15 | cy.findByLabelText('MOBY-DICK; or, THE WHALE.').click(); 16 | 17 | cy.wait(3000); 18 | 19 | cy.findByRole('button', { name: 'Next Page' }).click(); 20 | 21 | cy.log('Go to ETYMOLOGY'); 22 | cy.getIframeBody() 23 | .find('.toc a', { timeout: 3000 }) 24 | .contains(/^ETYMOLOGY\.$/) 25 | .click(); 26 | 27 | cy.getIframeBody() 28 | .find('h4', { timeout: 3000 }) 29 | .contains('Original Transcriber’s Notes:'); 30 | }); 31 | 32 | it('Scrolling mode & internal links should navigates users', () => { 33 | cy.visit('/html/moby-epub2'); 34 | cy.log('Go to a page with TOC'); 35 | 36 | cy.findByRole('button', { name: 'Table of Contents' }).click(); 37 | cy.wait(1000); 38 | cy.findByLabelText('MOBY-DICK; or, THE WHALE.').click(); 39 | 40 | cy.wait(3000); 41 | 42 | cy.findByRole('button', { name: 'Settings' }).click(); 43 | cy.findByText('Scrolling').click(); 44 | 45 | cy.wait(1000); 46 | 47 | cy.log('Go to Chapter 133'); 48 | cy.getIframeBody() 49 | .find('.toc a', { timeout: 3000 }) 50 | .contains(/^CHAPTER 133. The Chase—First Day\.$/) 51 | .click(); 52 | 53 | cy.wait(1000); 54 | 55 | cy.getIframeBody() 56 | .find('h2', { timeout: 3000 }) 57 | .contains('CHAPTER 133. The Chase—First Day'); 58 | }); 59 | }); 60 | -------------------------------------------------------------------------------- /cypress/integration/html-reader/missing-toc.ts: -------------------------------------------------------------------------------- 1 | describe('Book without a TOC or empty TOC menulist', () => { 2 | it('Shows mssing TOC message', () => { 3 | cy.visit('/html/test/missing-toc'); 4 | cy.getIframeBody() 5 | .find('h1') 6 | .should('include.text', 'missing Table of Contents'); 7 | 8 | cy.log('open TOC menu'); 9 | cy.findByRole('button', { name: 'Table of Contents' }).click(); 10 | 11 | cy.findByRole('menu').should( 12 | 'include.text', 13 | 'This publication does not have a Table of Contents' 14 | ); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /cypress/integration/multi-pdf/render-app.ts: -------------------------------------------------------------------------------- 1 | describe('Renders multi PDF', () => { 2 | it('Renders page content', () => { 3 | cy.loadPdf('/pdf/collection'); 4 | 5 | cy.log('check that all the essential buttons are on the page'); 6 | cy.findByRole('link', { name: 'Return to Homepage' }).should('exist'); 7 | cy.findByRole('button', { name: 'Table of Contents' }).should('exist'); 8 | cy.findByRole('button', { name: 'Settings' }).should('exist'); 9 | cy.findByRole('button', { name: 'Toggle full screen' }).should('exist'); 10 | cy.findByRole('button', { name: 'Next Page' }).should('not.be.disabled'); 11 | cy.findByRole('button', { name: 'Previous Page' }).should('be.disabled'); 12 | 13 | cy.findByText( 14 | 'Anthropology without Informants: Collected Works in Paleoanthropology by L.G. Freeman.' 15 | ).should('be.visible'); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /cypress/integration/multi-pdf/settings.ts: -------------------------------------------------------------------------------- 1 | import { SCALE_STEP } from '../../support/constants'; 2 | import { pdfZoomTestHelper } from '../../support/pdfZoomTestHelper'; 3 | 4 | describe('Multi PDF display settings', () => { 5 | beforeEach(() => { 6 | cy.loadPdf('/pdf/collection'); 7 | cy.log('open the settings menu'); 8 | cy.findByRole('button', { name: 'Settings' }).click(); 9 | }); 10 | 11 | it('should have the default settings', () => { 12 | cy.findByRole('radio', { name: 'Paginated' }).should('be.checked'); 13 | cy.findByRole('radio', { name: 'Scrolling' }).should('not.be.checked'); 14 | }); 15 | 16 | it('should not have font or theme display settings', () => { 17 | cy.findByRole('radiogroup', { name: 'text font options' }).should( 18 | 'not.exist' 19 | ); 20 | cy.findByRole('radiogroup', { name: 'reading theme options' }).should( 21 | 'not.exist' 22 | ); 23 | cy.findByRole('button', { name: 'Decrease font size' }).should('not.exist'); 24 | cy.findByRole('button', { name: 'Increase font size' }).should('not.exist'); 25 | }); 26 | 27 | it('should zoom in and out', () => { 28 | cy.get('.react-pdf__Page').then(($elm) => { 29 | pdfZoomTestHelper($elm, '1', '1'); 30 | }); 31 | 32 | cy.findByRole('button', { name: 'Zoom In' }).click(); 33 | cy.get('.react-pdf__Page').then(($elm) => { 34 | pdfZoomTestHelper($elm, `${1 + SCALE_STEP}`, `${1 + SCALE_STEP}`); 35 | }); 36 | 37 | cy.findByRole('button', { name: 'Zoom Out' }).click(); 38 | cy.get('.react-pdf__Page').then(($elm) => { 39 | pdfZoomTestHelper($elm, '1', '1'); 40 | }); 41 | }); 42 | }); 43 | -------------------------------------------------------------------------------- /cypress/integration/single-pdf/page-button.ts: -------------------------------------------------------------------------------- 1 | describe('Pagebutton on single PDF page', () => { 2 | beforeEach(() => { 3 | cy.loadPdf('/pdf/single-resource-short'); 4 | }); 5 | 6 | it('Should disable page buttons on scrolling mode', () => { 7 | cy.findByRole('button', { name: 'Next Page' }).should('not.be.disabled'); 8 | cy.findByRole('button', { name: 'Previous Page' }).should('be.disabled'); 9 | 10 | cy.findByRole('button', { name: 'Settings' }).click(); 11 | cy.findByText('Scrolling').click(); 12 | 13 | cy.findByRole('button', { name: 'Next Page' }).should('be.disabled'); 14 | cy.findByRole('button', { name: 'Previous Page' }).should('be.disabled'); 15 | }); 16 | 17 | it('Should trigger page button state when moving back and forward between pages on paginated mode', () => { 18 | cy.findByRole('button', { name: 'Next Page' }).click(); 19 | 20 | cy.findByRole('button', { name: 'Next Page' }).should('not.be.disabled'); 21 | cy.findByRole('button', { name: 'Previous Page' }).should( 22 | 'not.be.disabled' 23 | ); 24 | 25 | cy.findByRole('button', { name: 'Previous Page' }).click(); 26 | 27 | cy.findByRole('button', { name: 'Next Page' }).should('not.be.disabled'); 28 | cy.findByRole('button', { name: 'Previous Page' }).should('be.disabled'); 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /cypress/integration/single-pdf/render-app.ts: -------------------------------------------------------------------------------- 1 | describe('Renders single PDF', () => { 2 | it('Render page content', () => { 3 | cy.loadPdf('/pdf/single-resource-short'); 4 | 5 | cy.log('check that all the essential buttons are on the page'); 6 | cy.findByRole('link', { name: 'Return to Homepage' }).should('exist'); 7 | cy.findByRole('button', { name: 'Table of Contents' }).should('exist'); 8 | cy.findByRole('button', { name: 'Settings' }).should('exist'); 9 | cy.findByRole('button', { name: 'Toggle full screen' }).should('exist'); 10 | cy.findByRole('button', { name: 'Next Page' }).should('not.be.disabled'); 11 | cy.findByRole('button', { name: 'Previous Page' }).should('be.disabled'); 12 | 13 | cy.findByText('Assessing climate change').should('be.visible'); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /cypress/integration/single-pdf/settings.ts: -------------------------------------------------------------------------------- 1 | import { SCALE_STEP } from '../../support/constants'; 2 | import { pdfZoomTestHelper } from '../../support/pdfZoomTestHelper'; 3 | 4 | describe('Single PDF display settings', () => { 5 | beforeEach(() => { 6 | cy.loadPdf('/pdf/single-resource-short'); 7 | cy.log('open the settings menu'); 8 | cy.findByRole('button', { name: 'Settings' }).click(); 9 | }); 10 | 11 | it('should have the default settings', () => { 12 | cy.findByRole('radio', { name: 'Paginated' }).should('be.checked'); 13 | cy.findByRole('radio', { name: 'Scrolling' }).should('not.be.checked'); 14 | }); 15 | 16 | it('should not have font or theme display settings', () => { 17 | cy.findByRole('radiogroup', { name: 'text font options' }).should( 18 | 'not.exist' 19 | ); 20 | cy.findByRole('radiogroup', { name: 'reading theme options' }).should( 21 | 'not.exist' 22 | ); 23 | cy.findByRole('button', { name: 'Decrease font size' }).should('not.exist'); 24 | cy.findByRole('button', { name: 'Increase font size' }).should('not.exist'); 25 | }); 26 | 27 | it('should zoom in and out', () => { 28 | cy.get('.react-pdf__Page__textContent') 29 | .find('span') 30 | .should( 31 | 'have.text', 32 | 'ECONOMICS – WORKING PAPERS 2021/03Assessing climate changerisks at the country level:the EIB scoring model' 33 | ); 34 | 35 | cy.get('.react-pdf__Page').then(($elm) => { 36 | pdfZoomTestHelper($elm, '1', '1'); 37 | }); 38 | 39 | cy.findByRole('button', { name: 'Zoom In' }).click(); 40 | cy.get('.react-pdf__Page').then(($elm) => { 41 | pdfZoomTestHelper($elm, `${1 + SCALE_STEP}`, `${1 + SCALE_STEP}`); 42 | }); 43 | 44 | cy.findByRole('button', { name: 'Zoom Out' }).click(); 45 | cy.get('.react-pdf__Page').then(($elm) => { 46 | pdfZoomTestHelper($elm, '1', '1'); 47 | }); 48 | }); 49 | }); 50 | -------------------------------------------------------------------------------- /cypress/plugins/index.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-unused-vars */ 2 | /// 3 | // *********************************************************** 4 | // This example plugins/index.js can be used to load plugins 5 | // 6 | // You can change the location of this file or turn off loading 7 | // the plugins file with the 'pluginsFile' configuration option. 8 | // 9 | // You can read more here: 10 | // https://on.cypress.io/plugins-guide 11 | // *********************************************************** 12 | 13 | // This function is called when a project is opened or re-opened (e.g. due to 14 | // the project's config changing) 15 | /** 16 | * @type {Cypress.PluginConfig} 17 | */ 18 | module.exports = ( 19 | on: Cypress.PluginEvents, 20 | config: Cypress.PluginConfigOptions 21 | ) => { 22 | // `on` is used to hook into various events Cypress emits 23 | // `config` is the resolved Cypress config 24 | }; 25 | 26 | export {}; 27 | -------------------------------------------------------------------------------- /cypress/support/constants.ts: -------------------------------------------------------------------------------- 1 | export const SCALE_STEP = 0.1; 2 | -------------------------------------------------------------------------------- /cypress/support/index.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/index.js is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // Import commands.js using ES2015 syntax: 17 | import './commands'; 18 | 19 | // Alternatively you can use CommonJS syntax: 20 | // require('./commands') 21 | -------------------------------------------------------------------------------- /cypress/support/pdfZoomTestHelper.ts: -------------------------------------------------------------------------------- 1 | export const pdfZoomTestHelper = ( 2 | $elm: JQuery, 3 | expectedValueX: string, 4 | expectedValueY: string 5 | ): void => { 6 | cy.window().then((win) => { 7 | const styles = win.getComputedStyle($elm[0]); 8 | const scaleX = styles.getPropertyValue('--chakra-scale-x'); 9 | const scaleY = styles.getPropertyValue('--chakra-scale-y'); 10 | expect(scaleX).to.eq(expectedValueX); 11 | expect(scaleY).to.eq(expectedValueY); 12 | }); 13 | }; 14 | -------------------------------------------------------------------------------- /cypress/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "include": ["**/*.ts", "**/*.js"], 4 | "exclude": [], 5 | "compilerOptions": { 6 | "types": ["cypress", "@testing-library/cypress", "node"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /example/.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .cache 3 | dist -------------------------------------------------------------------------------- /example/README.txt: -------------------------------------------------------------------------------- 1 | The AxisNow example is a real book in the NYPL Open eBooks catalog. If it 2 | isn't working, you may need to re-borrow it and then use a new book_vault_uuid 3 | and isbn in your env vars. 4 | 5 | This is the link to the OPDS entry 6 | https://USERNAME:PASSWORD@circulation.openebooks.us/USOEI/works/Axis%20360%20ID/0018450548/ 7 | 8 | Borrow this book with this command: 9 | curl https://USERNAME:PASSWORD@circulation.openebooks.us/USOEI/works/Axis%20360%20ID/0018450548/borrow/44 10 | 11 | Then fulfill the book with this command to get the params: 12 | curl https://USERNAME:PASSWORD@circulation.openebooks.us/USOEI/works/6141/fulfill/44 -------------------------------------------------------------------------------- /example/cors-proxy.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const request = require('request'); 3 | const app = express(); 4 | const port = process.env.PORT | 3001; 5 | 6 | app.use((req, res, next) => { 7 | res.header('Access-Control-Allow-Origin', '*'); 8 | next(); 9 | }); 10 | 11 | app.get('/', (req, res) => { 12 | // read query parameters 13 | const requestUrl = req.query['requestUrl']; 14 | 15 | console.log(`Proxying request to: ${requestUrl}`); 16 | 17 | // make request to IEX API and forward response 18 | try { 19 | // allow a 30s timeout 20 | request(requestUrl, { timeout: 300000 }) 21 | .on('error', (e) => { 22 | const msg = `Request error at ${requestUrl}: ${e.message}`; 23 | console.error(e); 24 | res.status(500); 25 | res.send(msg); 26 | }) 27 | .pipe(res); 28 | } catch (e) { 29 | console.error(e); 30 | res.status(500); 31 | res.send(e.message); 32 | } 33 | }); 34 | 35 | app.listen(port, () => 36 | console.log(`CORS Proxy Listening on: http://localhost:${port}`) 37 | ); 38 | -------------------------------------------------------------------------------- /example/globals.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'url:*' { 2 | const url: string; 3 | export default url; 4 | } 5 | -------------------------------------------------------------------------------- /example/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 13 | NYPL Web Reader Example 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /example/static/css/sample.css: -------------------------------------------------------------------------------- 1 | /* this is a sample css file for testing */ 2 | body { 3 | color: rgb(0, 0, 255); 4 | } 5 | -------------------------------------------------------------------------------- /example/static/fonts/opendyslexic/opendyslexic-regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/fonts/opendyslexic/opendyslexic-regular-webfont.woff -------------------------------------------------------------------------------- /example/static/fonts/opendyslexic/opendyslexic-regular-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/fonts/opendyslexic/opendyslexic-regular-webfont.woff2 -------------------------------------------------------------------------------- /example/static/fonts/opendyslexic/opendyslexic.css: -------------------------------------------------------------------------------- 1 | /*! Generated by Font Squirrel (https://www.fontsquirrel.com) on August 16, 2019 */ 2 | 3 | 4 | 5 | @font-face { 6 | font-family: 'opendyslexic'; 7 | src: url('opendyslexic-regular-webfont.woff2') format('woff2'), 8 | url('opendyslexic-regular-webfont.woff') format('woff'); 9 | font-weight: normal; 10 | font-style: normal; 11 | 12 | } -------------------------------------------------------------------------------- /example/static/js/sample.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('click', (_) => { 2 | console.log('user clicked inside the iframe'); 3 | }); 4 | -------------------------------------------------------------------------------- /example/static/pdf-worker/pdf.worker.entry.js: -------------------------------------------------------------------------------- 1 | /* Copyright 2022 Mozilla Foundation 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | 16 | (typeof window !== "undefined" 17 | ? window 18 | : {} 19 | ).pdfjsWorker = require("./pdf.worker.js"); 20 | -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/META-INF/com.apple.ibooks.display-options.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/META-INF/container.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/Fragmented-Model.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/Fragmented-Model.jpg -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/Page-Model.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/Page-Model.jpg -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/alt-lines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/alt-lines.png -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/charis-sil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/charis-sil.png -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/clear-sans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/clear-sans.png -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/cover.jpg -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/dynamic-leading.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/dynamic-leading.jpg -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/faustina.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/faustina.png -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/fira-sans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/fira-sans.png -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/libre-franklin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/libre-franklin.png -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/literata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/literata.png -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/merriweather-sans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/merriweather-sans.png -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/merriweather.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/merriweather.png -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/plex-serif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/plex-serif.png -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/pt-sans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/pt-sans.png -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/pt-serif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/pt-serif.png -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/source-sans-pro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/source-sans-pro.png -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/spread-model.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/spread-model.jpg -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Images/vollkorn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/ReadiumCSS-docs/OEBPS/Images/vollkorn.png -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Text/cover.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Readium CSS Implementers’ doc 9 | 10 | 15 | 16 | 17 | 18 |
19 | Readium CSS, Implementers’ documentation. 20 |
21 | 22 | -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/OEBPS/Text/title_page.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Readium CSS Implementers’ doc 9 | 10 | 11 | 12 | 13 |
14 |

Readium CSS
Implementers’ doc

15 |
16 | 17 | -------------------------------------------------------------------------------- /example/static/samples/ReadiumCSS-docs/mimetype: -------------------------------------------------------------------------------- 1 | application/epub+zip -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/decrypted/OEBPS/cover.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | A Tale of Two Cities 7 | 16 | 17 | 18 |
19 | A Tale of Two Cities 22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/decrypted/OEBPS/fonts/im-fell-double-pica-pro.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/decrypted/OEBPS/fonts/im-fell-double-pica-pro.otf -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/decrypted/OEBPS/images/fell-flower-abc-fixed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/decrypted/OEBPS/images/fell-flower-abc-fixed.png -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/decrypted/OEBPS/images/fell-flower-d-fixed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/decrypted/OEBPS/images/fell-flower-d-fixed.png -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/decrypted/OEBPS/images/fell-flower-kj-fixed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/decrypted/OEBPS/images/fell-flower-kj-fixed.png -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/decrypted/OEBPS/images/recovering-the-classics-stacked-logo-black-on-white.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/decrypted/OEBPS/images/recovering-the-classics-stacked-logo-black-on-white.jpg -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/decrypted/OEBPS/images/rtc_ataleoftwocities_alexislampley.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/decrypted/OEBPS/images/rtc_ataleoftwocities_alexislampley.jpg -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/decrypted/OEBPS/images/vellum-created-fixed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/decrypted/OEBPS/images/vellum-created-fixed.png -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/decrypted/OEBPS/title-page.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | Title Page 7 | 10 | 13 | 15 | 16 | 17 |
18 |
19 |

A Tale of Two Cities

20 |
21 |
22 |

Charles Dickens

23 |
24 |
25 |
26 | 29 |
30 |
31 |
32 | 33 | 34 | -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/decrypted/OEBPS/vol-001.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | Book the First 7 | 10 | 13 | 15 | 16 | 17 |
18 |
19 |
20 |
21 |
22 |
23 |

Book the First

24 |
25 |

Recalled to Life

26 |
27 |
28 |
29 |
30 |
31 | 32 | 33 | -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/decrypted/OEBPS/vol-002.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | Book the Second 7 | 10 | 13 | 15 | 16 | 17 |
18 |
19 |
20 |
21 |
22 |
23 |

Book the Second

24 |
25 |

The Golden Thread

26 |
27 |
28 |
29 |
30 |
31 | 32 | 33 | -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/decrypted/OEBPS/vol-003.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | Book the Third 7 | 10 | 13 | 15 | 16 | 17 |
18 |
19 |
20 |
21 |
22 |
23 |

Book the Third

24 |
25 |

The Track of a Storm

26 |
27 |
28 |
29 |
30 |
31 | 32 | 33 | -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/copyright.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/copyright.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/cover.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/cover.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/css/media.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/css/media.css -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/css/style.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/css/style.css -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/fonts/SIL-Open-Font-License-1.1.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/fonts/SIL-Open-Font-License-1.1.txt -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/fonts/im-fell-double-pica-pro.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/fonts/im-fell-double-pica-pro.otf -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/images/fell-flower-abc-fixed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/images/fell-flower-abc-fixed.png -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/images/fell-flower-d-fixed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/images/fell-flower-d-fixed.png -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/images/fell-flower-kj-fixed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/images/fell-flower-kj-fixed.png -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/images/recovering-the-classics-stacked-logo-black-on-white.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/images/recovering-the-classics-stacked-logo-black-on-white.jpg -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/images/rtc_ataleoftwocities_alexislampley.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/images/rtc_ataleoftwocities_alexislampley.jpg -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/images/vellum-created-fixed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/images/vellum-created-fixed.png -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/recovering-the-classics.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/recovering-the-classics.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/title-page.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/title-page.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-001-chapter-001.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-001-chapter-001.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-001-chapter-002.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-001-chapter-002.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-001-chapter-003.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-001-chapter-003.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-001-chapter-004.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-001-chapter-004.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-001-chapter-005.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-001-chapter-005.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-001-chapter-006.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-001-chapter-006.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-001.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-001.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-001.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-001.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-002.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-002.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-003.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-003.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-004.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-004.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-005.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-005.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-006.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-006.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-007.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-007.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-008.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-008.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-009.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-009.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-010.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-010.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-011.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-011.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-012.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-012.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-013.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-013.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-014.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-014.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-015.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-015.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-016.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-016.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-017.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-017.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-018.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-018.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-019.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-019.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-020.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-020.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-021.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-021.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-022.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-022.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-023.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-023.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-024.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002-chapter-024.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-002.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-001.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-001.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-002.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-002.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-003.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-003.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-004.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-004.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-005.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-005.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-006.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-006.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-007.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-007.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-008.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-008.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-009.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-009.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-010.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-010.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-011.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-011.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-012.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-012.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-013.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-013.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-014.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-014.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-015.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003-chapter-015.xhtml -------------------------------------------------------------------------------- /example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003.xhtml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/dickens-axisnow/encrypted/OEBPS/vol-003.xhtml -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Content/PageBlanche_Page_000.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | La Page Blanche 7 | 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Content/PageBlanche_Page_001.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | La Page Blanche 7 | 8 | 9 | 10 |
page 1
12 | 13 | 14 | -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Content/PageBlanche_Page_002.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | La Page Blanche 7 | 8 | 9 | 10 |
page 2
12 | 13 | 14 | -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Content/PageBlanche_Page_003.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | La Page Blanche 7 | 8 | 9 | 10 |
page 3
12 | 13 | 14 | -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Content/PageBlanche_Page_004.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | La Page Blanche 7 | 8 | 9 | 10 |
page 4
12 | 13 | 14 | -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Content/PageBlanche_Page_005.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | La Page Blanche 7 | 8 | 9 | 10 |
page 5
12 | 13 | 14 | -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Content/PageBlanche_Page_006.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | La Page Blanche 7 | 8 | 9 | 10 |
page 6
12 | 13 | 14 | -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Content/PageBlanche_Page_007.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | La Page Blanche 7 | 8 | 9 | 10 |
page 7
12 | 13 | 14 | -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Content/PageBlanche_Page_008.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | La Page Blanche 7 | 8 | 9 | 10 |
page 8
12 | 13 | 14 | -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Content/cover.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | La Page Blanche 7 | 8 | 9 | 10 |
cover
11 | 12 | 13 | -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_001.jpg -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_002.jpg -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_003.jpg -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_004.jpg -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_005.jpg -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_006.jpg -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_007.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_007.jpg -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_008.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fixed-layout/EPUB/Image/PageBlanche_Page_008.jpg -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Image/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fixed-layout/EPUB/Image/cover.jpg -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Navigation/nav.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | La Page Blanche 5 | 6 | 7 | 8 |
9 |
10 |

Sommaire

11 |
12 | 22 | 34 |
35 | 36 | 37 | -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/EPUB/Style/style.css: -------------------------------------------------------------------------------- 1 | 2 | /* FL */ 3 | body { 4 | width: 1200px; 5 | height: 1577px; 6 | margin: 0; 7 | } 8 | img { 9 | position: absolute; 10 | margin: 0; 11 | z-index: 0; 12 | } 13 | 14 | /* NAV */ 15 | a { 16 | color: black !important; 17 | } 18 | 19 | #guide { 20 | display: none; 21 | } -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/META-INF/container.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/mimetype: -------------------------------------------------------------------------------- 1 | application/epub+zip -------------------------------------------------------------------------------- /example/static/samples/fixed-layout/page-blanche.epub: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fixed-layout/page-blanche.epub -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/META-INF/container.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/fonts/texgyrebonum-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fxl-poems/OPS/fonts/texgyrebonum-bold.woff -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/fonts/texgyrebonum-bolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fxl-poems/OPS/fonts/texgyrebonum-bolditalic.woff -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/fonts/texgyrebonum-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fxl-poems/OPS/fonts/texgyrebonum-italic.woff -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/fonts/texgyrebonum-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fxl-poems/OPS/fonts/texgyrebonum-regular.woff -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/images/ss_fixed_online.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fxl-poems/OPS/images/ss_fixed_online.jpg -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/s001-Cover-01.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <meta name="viewport" content="width=850, height=1190"/> 7 | <link rel="stylesheet" href="css/igp-twss-fxl.css" type="text/css"/> 8 | </head> 9 | <body> 10 | <div class="galley-rw"> 11 | <section class="frontmatter-rw cover-rw Cover-rw dp-eBook1-rw exclude-print-rw page-open-auto-rw" id="dp-TradePaperback1" epub:type="frontmatter cover"> 12 | 13 | 14 | <div class="media-rw rwapp-temp image-rw float-none-rw floatgalley-none-rw align-left-rw width-auto-rw exclude-auto-rw" id="image2"> 15 | 16 | 17 | <div class="pc-rw" id="pc2"><img src="images/ss_fixed_online.jpg" alt=""/></div> 18 | 19 | </div> 20 | 21 | <p><span class="pagebreak-rw" id="pagebreak-rw_" epub:type="pagebreak"/></p></section> 22 | </div> 23 | </body> 24 | </html> 25 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/s002-BookTitlePage-01.xhtml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="en"> 3 | <head> 4 | <meta http-equiv="default-style" content="text/html; charset=utf-8"/> 5 | <title/> 6 | <meta name="viewport" content="width=850, height=1190"/> 7 | <link rel="stylesheet" href="css/igp-twss-fxl.css" type="text/css"/> 8 | </head> 9 | <body> 10 | <div class="galley-rw"> 11 | <section class="frontmatter-rw BookTitlePage-rw exclude-auto-rw page-open-auto-rw" id="BookTitlePage1" epub:type="frontmatter titlepage"> 12 | 13 | 14 | <div class="layout-rw dp-eBook1-rw exclude-print-rw" id="dp-eBook11"> 15 | 16 | 17 | <p id="p1177"> 18 | </p> 19 | 20 | </div> 21 | 22 | <div class="title-block-book-rw exclude-auto-rw" id="title-block-book1"> 23 | 24 | 25 | </div><p><span class="pagebreak-rw" id="pagebreak-rw_blankpage" epub:type="pagebreak">blankpage</span></p></section> 26 | </div> 27 | </body> 28 | </html> 29 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/s003-Section-01.xhtml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="en"> 3 | <head> 4 | <meta http-equiv="default-style" content="text/html; charset=utf-8"/> 5 | <title>THE WAR POEMS OF SIEGFRIED SASSOON 6 | 7 | 8 | 9 | 10 |
11 |

THE WAR POEMS OF SIEGFRIED SASSOON 12 |

13 | 14 |

1919

15 | 16 |

Siegfried Sassoon

17 | 18 |
19 | 20 |
21 | 22 | 23 |

INFOGRID PACIFIC

24 | 25 |

Auckland London Singapore Pune

26 | 27 |
28 | 29 |

iii

30 |
31 | 32 | 33 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/s008-Section-03.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <meta name="viewport" content="width=850, height=1190"/> 7 | <link rel="stylesheet" href="css/igp-twss-fxl.css" type="text/css"/> 8 | </head> 9 | <body> 10 | <div class="galley-rw"> 11 | <section class="frontmatter-rw Section-rw" id="section_viii" epub:type="frontmatter toc"> 12 | <p><span class="pagebreak-rw" id="pagebreak-rw_viii" epub:type="pagebreak">viii</span></p></section> 13 | </div> 14 | </body> 15 | </html> 16 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/s009-Part-001.xhtml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="en"> 3 | <head> 4 | <meta http-equiv="default-style" content="text/html; charset=utf-8"/> 5 | <title>Part I 6 | 7 | 8 | 9 | 10 |
11 |
12 | 13 | 14 |
15 | 16 | 17 | 18 |

Part I

19 | 20 |
21 |

1

22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/s010-Section-004.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <meta name="viewport" content="width=850, height=1190"/> 7 | <link rel="stylesheet" href="css/igp-twss-fxl.css" type="text/css"/> 8 | </head> 9 | <body> 10 | <div class="galley-rw"> 11 | <section class="body-rw Section-rw" id="section_2" epub:type="bodymatter part"> 12 | <p><span class="pagebreak-rw" id="pagebreak-rw_2" epub:type="pagebreak">2</span></p></section> 13 | </div> 14 | </body> 15 | </html> 16 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/s014-Section-005.xhtml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="en"> 3 | <head> 4 | <meta http-equiv="default-style" content="text/html; charset=utf-8"/> 5 | <title/> 6 | <meta name="viewport" content="width=850, height=1190"/> 7 | <link rel="stylesheet" href="css/igp-twss-fxl.css" type="text/css"/> 8 | </head> 9 | <body> 10 | <div class="galley-rw"> 11 | <section class="body-rw Section-rw" id="section_6" epub:type="bodymatter"><div class="poem-rw poem-normal-rw exclude-auto-rw"><div class="poem-rw poem-body-rw exclude-auto-rw"><div class="poem-rw stanza-rw"><p class="para-continue-rw">He faced me, reeling in his weariness, 12 | </p> 13 | 14 | <p id="p71">Shouldering his load of planks, so hard to bear.</p> 15 | 16 | <p id="p72">I say that he was Christ, who wrought to bless</p> 17 | 18 | <p id="p73">All groping things with freedom bright as air,</p> 19 | 20 | <p id="p74">And with His mercy washed and made them fair.</p> 21 | 22 | <p id="p75">Then the flame sank, and all grew black as pitch,</p> 23 | 24 | <p id="p76">While we began to struggle along the ditch;</p> 25 | 26 | <p id="p77">And some one flung his burden in the muck,</p> 27 | 28 | <p id="id00096">Mumbling: “O Christ Almighty, now I’m stuck!”</p> 29 | 30 | </div> 31 | 32 | </div> 33 | 34 | </div> 35 | 36 | <p><span class="pagebreak-rw" id="pagebreak-rw_6" epub:type="pagebreak">6</span></p></section> 37 | </div> 38 | </body> 39 | </html> 40 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/s042-Section-010.xhtml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="en"> 3 | <head> 4 | <meta http-equiv="default-style" content="text/html; charset=utf-8"/> 5 | <title/> 6 | <meta name="viewport" content="width=850, height=1190"/> 7 | <link rel="stylesheet" href="css/igp-twss-fxl.css" type="text/css"/> 8 | </head> 9 | <body> 10 | <div class="galley-rw"> 11 | <section class="body-rw Section-rw" id="section_34" epub:type="bodymatter"> 12 | <p><span class="pagebreak-rw" id="pagebreak-rw_34" epub:type="pagebreak">34</span></p></section> 13 | </div> 14 | </body> 15 | </html> 16 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/s043-Part-002.xhtml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="en"> 3 | <head> 4 | <meta http-equiv="default-style" content="text/html; charset=utf-8"/> 5 | <title>Part II 6 | 7 | 8 | 9 | 10 |
11 |
12 | 13 | 14 |
15 | 16 | 17 | 18 |

Part II

19 | 20 |
21 |

35

22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/s044-Section-011.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <meta name="viewport" content="width=850, height=1190"/> 7 | <link rel="stylesheet" href="css/igp-twss-fxl.css" type="text/css"/> 8 | </head> 9 | <body> 10 | <div class="galley-rw"> 11 | <section class="body-rw Section-rw" id="section_36" epub:type="bodymatter part"> 12 | <p><span class="pagebreak-rw" id="pagebreak-rw_36" epub:type="pagebreak">36</span></p></section> 13 | </div> 14 | </body> 15 | </html> 16 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/s066-Section-012.xhtml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="en"> 3 | <head> 4 | <meta http-equiv="default-style" content="text/html; charset=utf-8"/> 5 | <title/> 6 | <meta name="viewport" content="width=850, height=1190"/> 7 | <link rel="stylesheet" href="css/igp-twss-fxl.css" type="text/css"/> 8 | </head> 9 | <body> 10 | <div class="galley-rw"> 11 | <section class="body-rw Section-rw" id="section_58" epub:type="bodymatter"> 12 | <p><span class="pagebreak-rw" id="pagebreak-rw_58" epub:type="pagebreak">58</span></p></section> 13 | </div> 14 | </body> 15 | </html> 16 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/s067-Part-003.xhtml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="en"> 3 | <head> 4 | <meta http-equiv="default-style" content="text/html; charset=utf-8"/> 5 | <title>Part III 6 | 7 | 8 | 9 | 10 |
11 |
12 | 13 | 14 |
15 | 16 | 17 | 18 |

Part III

19 | 20 |
21 |

59

22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/s068-Section-013.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <meta name="viewport" content="width=850, height=1190"/> 7 | <link rel="stylesheet" href="css/igp-twss-fxl.css" type="text/css"/> 8 | </head> 9 | <body> 10 | <div class="galley-rw"> 11 | <section class="body-rw Section-rw" id="section_60" epub:type="bodymatter part"> 12 | <p><span class="pagebreak-rw" id="pagebreak-rw_60" epub:type="pagebreak">60</span></p></section> 13 | </div> 14 | </body> 15 | </html> 16 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/OPS/s089-Section-019.xhtml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="en"> 3 | <head> 4 | <meta http-equiv="default-style" content="text/html; charset=utf-8"/> 5 | <title/> 6 | <meta name="viewport" content="width=850, height=1190"/> 7 | <link rel="stylesheet" href="css/igp-twss-fxl.css" type="text/css"/> 8 | </head> 9 | <body> 10 | <div class="galley-rw"> 11 | <section class="body-rw Section-rw" id="section_81" epub:type="bodymatter"><div class="poem-rw poem-normal-rw exclude-auto-rw"><div class="poem-rw poem-body-rw exclude-auto-rw"><div class="poem-rw stanza-rw"> 12 | 13 | <p id="p1134">Do you remember the stretcher-cases lurching back</p> 14 | 15 | <p id="p1135">With dying eyes and lolling heads,—those ashen-grey</p> 16 | 17 | <p id="p1136">Masks of the lads who once were keen and kind and gay?</p> 18 | 19 | <p id="id00354"><i>Have you forgotten yet?… </i> 20 | </p> 21 | 22 | <p id="p1168"><i>Look up, and swear by the green of the </i><i>Spring that<br/> 23 | you’ll never forget.</i> 24 | </p> 25 | 26 | </div> 27 | 28 | </div> 29 | 30 | </div> 31 | 32 | <p><span class="pagebreak-rw" id="pagebreak-rw_81" epub:type="pagebreak">81</span></p></section> 33 | </div> 34 | </body> 35 | </html> 36 | -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/igp-twss-fxl.epub: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/fxl-poems/igp-twss-fxl.epub -------------------------------------------------------------------------------- /example/static/samples/fxl-poems/mimetype: -------------------------------------------------------------------------------- 1 | application/epub+zip -------------------------------------------------------------------------------- /example/static/samples/moby-epub2-exploded/META-INF/container.xml: -------------------------------------------------------------------------------- 1 | <?xml version='1.0' encoding='utf-8'?> 2 | <container xmlns="urn:oasis:names:tc:opendocument:xmlns:container" version="1.0"> 3 | <rootfiles> 4 | <rootfile full-path="OEBPS/content.opf" media-type="application/oebps-package+xml"/> 5 | </rootfiles> 6 | </container> 7 | -------------------------------------------------------------------------------- /example/static/samples/moby-epub2-exploded/OEBPS/0.css: -------------------------------------------------------------------------------- 1 | /**/ 2 | body { 3 | margin-left: 15%; 4 | margin-right: 15%; 5 | text-align: justify 6 | } 7 | p { 8 | text-indent: 1em; 9 | margin-top: 0.25em; 10 | margin-bottom: 0.25em 11 | } 12 | h1, h2, h3, h4, h5, h6 { 13 | text-align: center; 14 | margin-left: 15%; 15 | margin-right: 15% 16 | } 17 | hr { 18 | width: 50%; 19 | text-align: center 20 | } 21 | blockquote { 22 | font-size: 100%; 23 | margin-left: 0%; 24 | margin-right: 0% 25 | } 26 | .mynote { 27 | background-color: #DDE; 28 | color: #000; 29 | padding: 0.5em; 30 | margin-left: 10%; 31 | margin-right: 10%; 32 | font-family: sans-serif; 33 | font-size: 95% 34 | } 35 | .toc { 36 | margin-left: 10%; 37 | margin-bottom: 0.75em 38 | } 39 | pre { 40 | font-family: times new roman; 41 | font-size: 100%; 42 | margin-left: 10% 43 | } 44 | table { 45 | margin-left: 10% 46 | } 47 | a:link { 48 | color: blue; 49 | text-decoration: none 50 | } 51 | link { 52 | color: blue; 53 | text-decoration: none 54 | } 55 | a:visited { 56 | color: blue; 57 | text-decoration: none 58 | } 59 | a:hover { 60 | color: red 61 | } 62 | /**/ -------------------------------------------------------------------------------- /example/static/samples/moby-epub2-exploded/OEBPS/1.css: -------------------------------------------------------------------------------- 1 | /**/ 2 | div.c15 { 3 | margin-left: 0.7em 4 | } 5 | div.c14 { 6 | text-indent: -0.7em 7 | } 8 | div.c13 { 9 | display: block; 10 | font-size: 1.1em; 11 | margin: 1em 0; 12 | font-weight: bold 13 | } 14 | div.c12 { 15 | margin: 0.83em 0; 16 | font-size: 1.1em; 17 | text-align: center 18 | } 19 | span.c11 { 20 | font-size: smaller 21 | } 22 | div.c10 { 23 | display: block; 24 | margin: 1em 0 25 | } 26 | div.c9 { 27 | display: block; 28 | margin-top: 4em 29 | } 30 | div.c8 { 31 | height: 4em 32 | } 33 | big.c7 { 34 | font-weight: bold 35 | } 36 | div.c6 { 37 | margin-top: 2em; 38 | margin-bottom: 4em 39 | } 40 | div.c5 { 41 | display: block; 42 | margin-left: 2em; 43 | text-indent: -2em 44 | } 45 | div.c4 { 46 | display: block; 47 | margin: 1em 0 48 | } 49 | div.c3 { 50 | display: block; 51 | margin-top: 1em; 52 | margin-bottom: 1em; 53 | margin-left: 2em; 54 | text-indent: -2em 55 | } 56 | div.c2 { 57 | display: block; 58 | margin: 1em 0 59 | } 60 | div.c1 { 61 | text-align: center; 62 | font-size: 1.2em; 63 | font-weight: bold 64 | } 65 | /**/ -------------------------------------------------------------------------------- /example/static/samples/moby-epub2-exploded/OEBPS/@export@sunsite@users@gutenbackend@cache@epub@2701@2701-cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/moby-epub2-exploded/OEBPS/@export@sunsite@users@gutenbackend@cache@epub@2701@2701-cover.png -------------------------------------------------------------------------------- /example/static/samples/moby-epub2-exploded/OEBPS/pgepub.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | body, body.tei.tei-text { 3 | color: black; 4 | background-color: white; 5 | margin: 0.5em; 6 | width: auto; 7 | border: 0; 8 | padding: 0 9 | } 10 | div, p, pre, h1, h2, h3, h4, h5, h6 { 11 | margin-left: 0; 12 | margin-right: 0; 13 | display: block 14 | } 15 | div.pgebub-root-div { 16 | margin: 0 17 | } 18 | h2 { 19 | page-break-before: always; 20 | padding-top: 1em 21 | } 22 | div.figcenter span.caption { 23 | display: block 24 | } 25 | .pgmonospaced { 26 | font-family: monospace; 27 | font-size: 0.9em 28 | } 29 | a.pgkilled { 30 | text-decoration: none 31 | } -------------------------------------------------------------------------------- /example/static/samples/moby-epub2-exploded/OEBPS/wrap0000.html: -------------------------------------------------------------------------------- 1 | <?xml version="1.0"?> 2 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 3 | <html xmlns="http://www.w3.org/1999/xhtml"> 4 | <head> 5 | <title>"Cover" 6 | 7 | 8 |
9 | Cover 10 | 11 |
12 | 13 | -------------------------------------------------------------------------------- /example/static/samples/moby-epub2-exploded/mimetype: -------------------------------------------------------------------------------- 1 | application/epub+zip -------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/META-INF/container.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/chapter_030.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Moby-Dick 5 | 6 | 7 | 8 |
9 |
10 |

Chapter 30. The Pipe.

11 |

When Stubb had departed, Ahab stood for a while leaning over the bulwarks; and then, as had been usual with him of late, calling a sailor of the watch, he sent him below for his ivory stool, and also his pipe. Lighting the pipe at the binnacle lamp and planting the stool on the weather side of the deck, he sat and smoked.

12 |

In old Norse times, the thrones of the sea-loving Danish kings were fabricated, saith tradition, of the tusks of the narwhale. How could one look at Ahab then, seated on that tripod of bones, without bethinking him of the royalty it symbolized? For a Khan of the plank, and a king of the sea, and a great lord of Leviathans was Ahab.

13 |

Some moments passed, during which the thick vapour came from his mouth in quick and constant puffs, which blew back again into his face. “How now,” he soliloquized at last, withdrawing the tube, “this smoking no longer soothes. Oh, my pipe! hard must it go with me if thy charm be gone! Here have I been unconsciously toiling, not pleasuring—aye, and ignorantly smoking to windward all the while; to windward, and with such nervous whiffs, as if, like the dying whale, my final jets were the strongest and fullest of trouble. What business have I with this pipe? This thing that is meant for sereneness, to send up mild white vapours among mild white hairs, not among torn iron-grey locks like mine. I’ll smoke no more—”

14 |

He tossed the still lighted pipe into the sea. The fire hissed in the waves; the same instant the ship shot by the bubble the sinking pipe made. With slouched hat, Ahab lurchingly paced the planks.

15 |
-------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/chapter_039.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Moby-Dick 5 | 6 | 7 | 8 |
9 |
10 |

Chapter 39. First Night Watch.

11 |

Fore-Top.

12 |

(STUBB SOLUS, AND MENDING A BRACE.)

13 |

Ha! ha! ha! ha! hem! clear my throat!—I’ve been thinking over it ever since, and that ha, ha’s the final consequence. Why so? Because a laugh’s the wisest, easiest answer to all that’s queer; and come what will, one comfort’s always left—that unfailing comfort is, it’s all predestinated. I heard not all his talk with Starbuck; but to my poor eye Starbuck then looked something as I the other evening felt. Be sure the old Mogul has fixed him, too. I twigged it, knew it; had had the gift, might readily have prophesied it—for when I clapped my eye upon his skull I saw it. Well, Stubb, WISE Stubb—that’s my title—well, Stubb, what of it, Stubb? Here’s a carcase. I know not all that may be coming, but be it what it will, I’ll go to it laughing. Such a waggish leering as lurks in all your horribles! I feel funny. Fa, la! lirra, skirra! What’s my juicy little pear at home doing now? Crying its eyes out?—Giving a party to the last arrived harpooneers, I dare say, gay as a frigate’s pennant, and so am I—fa, la! lirra, skirra! Oh—

14 |

We’ll drink to-night with hearts as light, To love, as gay and fleeting As bubbles that swim, on the beaker’s brim, And break on the lips while meeting.

15 |

A brave stave that—who calls? Mr. Starbuck? Aye, aye, sir—(ASIDE) he’s my superior, he has his too, if I’m not mistaken.—Aye, aye, sir, just through with this job—coming.

16 |
-------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/chapter_097.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Moby-Dick 5 | 6 | 7 | 8 |
9 |
10 |

Chapter 97. The Lamp.

11 |

Had you descended from the Pequod’s try-works to the Pequod’s forecastle, where the off duty watch were sleeping, for one single moment you would have almost thought you were standing in some illuminated shrine of canonized kings and counsellors. There they lay in their triangular oaken vaults, each mariner a chiselled muteness; a score of lamps flashing upon his hooded eyes.

12 |

In merchantmen, oil for the sailor is more scarce than the milk of queens. To dress in the dark, and eat in the dark, and stumble in darkness to his pallet, this is his usual lot. But the whaleman, as he seeks the food of light, so he lives in light. He makes his berth an Aladdin’s lamp, and lays him down in it; so that in the pitchiest night the ship’s black hull still houses an illumination.

13 |

See with what entire freedom the whaleman takes his handful of lamps—often but old bottles and vials, though—to the copper cooler at the try-works, and replenishes them there, as mugs of ale at a vat. He burns, too, the purest of oil, in its unmanufactured, and, therefore, unvitiated state; a fluid unknown to solar, lunar, or astral contrivances ashore. It is sweet as early grass butter in April. He goes and hunts for his oil, so as to be sure of its freshness and genuineness, even as the traveller on the prairie hunts up his own supper of game.

14 |
-------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/chapter_120.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Moby-Dick 5 | 6 | 7 | 8 |
9 |
10 |

Chapter 120. The Deck Towards the End of the First Night Watch.

11 |

AHAB STANDING BY THE HELM. STARBUCK APPROACHING HIM.

12 |

“We must send down the main-top-sail yard, sir. The band is working loose and the lee lift is half-stranded. Shall I strike it, sir?”

13 |

“Strike nothing; lash it. If I had sky-sail poles, I’d sway them up now.”

14 |

“Sir!—in God’s name!—sir?”

15 |

“Well.”

16 |

“The anchors are working, sir. Shall I get them inboard?”

17 |

“Strike nothing, and stir nothing, but lash everything. The wind rises, but it has not got up to my table-lands yet. Quick, and see to it.—By masts and keels! he takes me for the hunch-backed skipper of some coasting smack. Send down my main-top-sail yard! Ho, gluepots! Loftiest trucks were made for wildest winds, and this brain-truck of mine now sails amid the cloud-scud. Shall I strike that? Oh, none but cowards send down their brain-trucks in tempest time. What a hooroosh aloft there! I would e’en take it for sublime, did I not know that the colic is a noisy malady. Oh, take medicine, take medicine!”

18 |
-------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/chapter_122.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Moby-Dick 5 | 6 | 7 | 8 |
9 |
10 |

Chapter 122. Midnight Aloft.—Thunder and Lightning.

11 |

THE MAIN-TOP-SAIL YARD.—TASHTEGO PASSING NEW LASHINGS AROUND IT.

12 |

“Um, um, um. Stop that thunder! Plenty too much thunder up here. What’s the use of thunder? Um, um, um. We don’t want thunder; we want rum; give us a glass of rum. Um, um, um!”

13 |
-------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/chapter_136.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Moby-Dick 5 | 6 | 7 | 8 |
9 |
10 |

Epilogue

11 |
12 |

“AND I ONLY AM ESCAPED ALONE TO TELL THEE”

13 |

—Job.

14 |
15 |
16 |

The drama’s done. Why then here does any one step forth?—Because one did survive the wreck.

17 |

It so chanced, that after the Parsee’s disappearance, I was he whom the Fates ordained to take the place of Ahab’s bowsman, when that bowsman assumed the vacant post; the same, who, when on the last day the three men were tossed from out of the rocking boat, was dropped astern. So, floating on the margin of the ensuing scene, and in full sight of it, when the halfspent suction of the sunk ship reached me, I was then, but slowly, drawn towards the closing vortex. When I reached it, it had subsided to a creamy pool. Round and round, then, and ever contracting towards the button-like black bubble at the axis of that slowly wheeling circle, like another Ixion I did revolve. Till, gaining that vital centre, the black bubble upward burst; and now, liberated by reason of its cunning spring, and, owing to its great buoyancy, rising with great force, the coffin life-buoy shot lengthwise from the sea, fell over, and floated by my side. Buoyed up by that coffin, for almost one whole day and night, I floated on a soft and dirgelike main. The unharming sharks, they glided by as if with padlocks on their mouths; the savage sea-hawks sailed with sheathed beaks. On the second day, a sail drew near, nearer, and picked me up at last. It was the devious-cruising Rachel, that in her retracing search after her missing children, only found another orphan.

-------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/copyright.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Moby-Dick 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/cover.xhtml: -------------------------------------------------------------------------------- 1 | Moby-Dick 2 |
3 | Cover Image
4 | 5 | -------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/fonts/STIXGeneral.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/moby-epub3-exploded/OPS/fonts/STIXGeneral.otf -------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/fonts/STIXGeneralBol.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/moby-epub3-exploded/OPS/fonts/STIXGeneralBol.otf -------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/fonts/STIXGeneralBolIta.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/moby-epub3-exploded/OPS/fonts/STIXGeneralBolIta.otf -------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/fonts/STIXGeneralItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/moby-epub3-exploded/OPS/fonts/STIXGeneralItalic.otf -------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/images/9780316000000.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/moby-epub3-exploded/OPS/images/9780316000000.jpg -------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/images/Moby-Dick_FE_title_page.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/moby-epub3-exploded/OPS/images/Moby-Dick_FE_title_page.jpg -------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/preface_001.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Moby-Dick 5 | 6 | 7 | 8 |
9 | 10 |
11 |

Original Transcriber’s Notes:

12 |
13 |

This text is a combination of etexts, one from the now-defunct ERIS project at Virginia Tech and one from Project Gutenberg’s archives. The proofreaders of this version are indebted to The University of Adelaide Library for preserving the Virginia Tech version. The resulting etext was compared with a public domain hard copy version of the text.

14 |

In chapters 24, 89, and 90, we substituted a capital L for the symbol for the British pound, a unit of currency.1

15 | 16 | 19 | 20 | 21 |
-------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/titlepage.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Moby-Dick 5 | 6 | 7 | 8 | 9 |
10 | title page 11 |
12 | 13 | -------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/OPS/toc-short.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Moby-Dick 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 |
15 |

Brief Contents

16 |
17 | 18 |
19 | 20 |
    21 |
  1. 22 | Title Page 23 |
  2. 24 |
  3. 25 | Original Transcriber’s Notes 26 |
  4. 27 |
  5. 28 | Etymology 29 |
  6. 30 |
  7. 31 | Extracts (Supplied by a Sub-Sub-Librarian) 32 |
  8. 33 | 34 | 35 |
  9. Begin Reading Moby-Dick
  10. 36 | 37 |
  11. Show detailed contents
  12. 38 | 39 | 40 | 41 |
  13. 42 | Copyright Page 43 |
  14. 44 |
45 | 46 |
47 | 48 |
49 | 50 | -------------------------------------------------------------------------------- /example/static/samples/moby-epub3-exploded/mimetype: -------------------------------------------------------------------------------- 1 | application/epub+zip -------------------------------------------------------------------------------- /example/static/samples/moby-webpub/OEBPS/0.css: -------------------------------------------------------------------------------- 1 | /**/ 2 | body { 3 | margin-left: 15%; 4 | margin-right: 15%; 5 | text-align: justify 6 | } 7 | p { 8 | text-indent: 1em; 9 | margin-top: 0.25em; 10 | margin-bottom: 0.25em 11 | } 12 | h1, h2, h3, h4, h5, h6 { 13 | text-align: center; 14 | margin-left: 15%; 15 | margin-right: 15% 16 | } 17 | hr { 18 | width: 50%; 19 | text-align: center 20 | } 21 | blockquote { 22 | font-size: 100%; 23 | margin-left: 0%; 24 | margin-right: 0% 25 | } 26 | .mynote { 27 | background-color: #DDE; 28 | color: #000; 29 | padding: 0.5em; 30 | margin-left: 10%; 31 | margin-right: 10%; 32 | font-family: sans-serif; 33 | font-size: 95% 34 | } 35 | .toc { 36 | margin-left: 10%; 37 | margin-bottom: 0.75em 38 | } 39 | pre { 40 | font-family: times new roman; 41 | font-size: 100%; 42 | margin-left: 10% 43 | } 44 | table { 45 | margin-left: 10% 46 | } 47 | a:link { 48 | color: blue; 49 | text-decoration: none 50 | } 51 | link { 52 | color: blue; 53 | text-decoration: none 54 | } 55 | a:visited { 56 | color: blue; 57 | text-decoration: none 58 | } 59 | a:hover { 60 | color: red 61 | } 62 | /**/ -------------------------------------------------------------------------------- /example/static/samples/moby-webpub/OEBPS/1.css: -------------------------------------------------------------------------------- 1 | /**/ 2 | div.c15 { 3 | margin-left: 0.7em 4 | } 5 | div.c14 { 6 | text-indent: -0.7em 7 | } 8 | div.c13 { 9 | display: block; 10 | font-size: 1.1em; 11 | margin: 1em 0; 12 | font-weight: bold 13 | } 14 | div.c12 { 15 | margin: 0.83em 0; 16 | font-size: 1.1em; 17 | text-align: center 18 | } 19 | span.c11 { 20 | font-size: smaller 21 | } 22 | div.c10 { 23 | display: block; 24 | margin: 1em 0 25 | } 26 | div.c9 { 27 | display: block; 28 | margin-top: 4em 29 | } 30 | div.c8 { 31 | height: 4em 32 | } 33 | big.c7 { 34 | font-weight: bold 35 | } 36 | div.c6 { 37 | margin-top: 2em; 38 | margin-bottom: 4em 39 | } 40 | div.c5 { 41 | display: block; 42 | margin-left: 2em; 43 | text-indent: -2em 44 | } 45 | div.c4 { 46 | display: block; 47 | margin: 1em 0 48 | } 49 | div.c3 { 50 | display: block; 51 | margin-top: 1em; 52 | margin-bottom: 1em; 53 | margin-left: 2em; 54 | text-indent: -2em 55 | } 56 | div.c2 { 57 | display: block; 58 | margin: 1em 0 59 | } 60 | div.c1 { 61 | text-align: center; 62 | font-size: 1.2em; 63 | font-weight: bold 64 | } 65 | /**/ -------------------------------------------------------------------------------- /example/static/samples/moby-webpub/OEBPS/@export@sunsite@users@gutenbackend@cache@epub@2701@2701-cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NYPL/web-reader/f652d3f3e3ad7a4182ab572289dba1a5461e6cd4/example/static/samples/moby-webpub/OEBPS/@export@sunsite@users@gutenbackend@cache@epub@2701@2701-cover.png -------------------------------------------------------------------------------- /example/static/samples/moby-webpub/OEBPS/@public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-24.htm.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | The Project Gutenberg eBook of Moby Dick; Or the Whale, by Herman Melville 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
Section 5. General Information About Project Gutenberg™ electronic works
19 |
Professor Michael S. Hart was the originator of the Project Gutenberg™ concept of a library of electronic works that could be freely shared with anyone. For forty years, he produced and distributed Project Gutenberg™ eBooks with only a loose network of volunteer support.
20 |
Project Gutenberg™ eBooks are often created from several printed editions, all of which are confirmed as not protected by copyright in the U.S. unless a copyright notice is included. Thus, we do not necessarily keep eBooks in compliance with any particular paper edition.
21 |
Most people start at our website which has the main PG search facility: www.gutenberg.org.
22 |
This website includes information about Project Gutenberg™, including how to make donations to the Project Gutenberg Literary Archive Foundation, how to help produce our new eBooks, and how to subscribe to our email newsletter to hear about new eBooks.
23 | 24 | 25 | -------------------------------------------------------------------------------- /example/static/samples/moby-webpub/OEBPS/pgepub.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | body, body.tei.tei-text { 3 | color: black; 4 | background-color: white; 5 | margin: 0.5em; 6 | width: auto; 7 | border: 0; 8 | padding: 0 9 | } 10 | div, p, pre, h1, h2, h3, h4, h5, h6 { 11 | margin-left: 0; 12 | margin-right: 0; 13 | display: block 14 | } 15 | div.pgebub-root-div { 16 | margin: 0 17 | } 18 | h2 { 19 | page-break-before: always; 20 | padding-top: 1em 21 | } 22 | div.figcenter span.caption { 23 | display: block 24 | } 25 | .pgmonospaced { 26 | font-family: monospace; 27 | font-size: 0.9em 28 | } 29 | a.pgkilled { 30 | text-decoration: none 31 | } -------------------------------------------------------------------------------- /example/static/samples/moby-webpub/OEBPS/wrap0000.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | "Cover" 6 | 7 | 8 |
9 | Cover 10 | 11 |
12 | 13 | -------------------------------------------------------------------------------- /example/static/samples/pdf/single-resource-long.json: -------------------------------------------------------------------------------- 1 | { 2 | "context": "https://drb-files-qa-s3.amazonaws.com/manifests/context.jsonld", 3 | "metadata": { 4 | "@type": "https://schema.org/Book", 5 | "title": "Pioneers of Zionism: Hess, Pinsker, R\u00fclf Messianism, Settlement Policy, and the Israeli-Palestinian Conflict", 6 | "author": "Schoeps, Julius H.", 7 | "identifier": "urn:isbn:9783110314724", 8 | "conformsTo": "http://librarysimplified.org/terms/profiles/pdf" 9 | }, 10 | "links": [ 11 | { 12 | "href": "https://www.degruyter.com/document/doi/10.1515/9783110314724/pdf", 13 | "type": "application/pdf", 14 | "rel": "alternate" 15 | }, 16 | { 17 | "rel": "self", 18 | "href": "https://drb-files-qa.s3.amazonaws.com/manifests/degruyter/9783110314724.json", 19 | "type": "application/webpub+json" 20 | } 21 | ], 22 | "readingOrder": [ 23 | { 24 | "href": "https://www.degruyter.com/document/doi/10.1515/9783110314724/pdf", 25 | "title": "Pioneers of Zionism: Hess, Pinsker, R\u00fclf Messianism, Settlement Policy, and the Israeli-Palestinian Conflict", 26 | "type": "application/pdf" 27 | } 28 | ], 29 | "resources": [ 30 | { 31 | "href": "https://www.degruyter.com/document/doi/10.1515/9783110314724/pdf", 32 | "type": "application/pdf" 33 | } 34 | ], 35 | "toc": [ 36 | { 37 | "href": "https://www.degruyter.com/document/doi/10.1515/9783110314724/pdf", 38 | "title": "Pioneers of Zionism: Hess, Pinsker, R\u00fclf Messianism, Settlement Policy, and the Israeli-Palestinian Conflict" 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /example/static/samples/pdf/single-resource-short.json: -------------------------------------------------------------------------------- 1 | { 2 | "context": "https://drb-files-qa-s3.amazonaws.com/manifests/context.jsonld", 3 | "metadata": { 4 | "@type": "https://schema.org/Book", 5 | "title": "EIB Working Paper 2021/03 - Assessing climate change risks at the country level", 6 | "author": "Ferrazzi, Matteo", 7 | "conformsTo": "http://librarysimplified.org/terms/profiles/pdf" 8 | }, 9 | "links": [ 10 | { 11 | "href": "https://library.oapen.org/bitstream/20.500.12657/50076/1/9789286150340.pdf", 12 | "type": "application/pdf", 13 | "rel": "alternate" 14 | }, 15 | { 16 | "rel": "self", 17 | "href": "https://drb-files-qa.s3.amazonaws.com/manifests/doab/20.500.12854/71362.json", 18 | "type": "application/webpub+json" 19 | } 20 | ], 21 | "readingOrder": [ 22 | { 23 | "href": "https://library.oapen.org/bitstream/20.500.12657/50076/1/9789286150340.pdf", 24 | "title": "EIB Working Paper 2021/03 - Assessing climate change risks at the country level", 25 | "type": "application/pdf" 26 | } 27 | ], 28 | "resources": [ 29 | { 30 | "href": "https://library.oapen.org/bitstream/20.500.12657/50076/1/9789286150340.pdf", 31 | "type": "application/pdf" 32 | } 33 | ], 34 | "toc": [ 35 | { 36 | "href": "https://library.oapen.org/bitstream/20.500.12657/50076/1/9789286150340.pdf", 37 | "title": "EIB Working Paper 2021/03 - Assessing climate change risks at the country level" 38 | } 39 | ] 40 | } -------------------------------------------------------------------------------- /example/static/samples/test/missing-resource.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "https://readium.org/webpub-manifest/context.jsonld", 3 | "metadata": { 4 | "title": "Moby Dick; Or, The Whale", 5 | "language": "en", 6 | "author": "Herman Melville" 7 | }, 8 | "resources": [ 9 | { 10 | "href": "OEBPS/@export@sunsite@users@gutenbackend@cache@epub@2701@2701-cover.png", 11 | "type": "image/png", 12 | "id": "item1" 13 | }, 14 | { "href": "OEBPS/pgepub.css", "type": "text/css", "id": "item2" }, 15 | { "href": "OEBPS/0.css", "type": "text/css", "id": "item3" }, 16 | { "href": "OEBPS/1.css", "type": "text/css", "id": "item4" }, 17 | { "href": "OEBPS/toc.ncx", "type": "application/x-dtbncx+xml", "id": "ncx" } 18 | ], 19 | "readingOrder": [ 20 | { 21 | "href": "OEBPS/non-existent.html", 22 | "type": "application/xhtml+xml", 23 | "id": "coverpage-wrapper" 24 | }, 25 | { 26 | "href": "OEBPS/@public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-0.htm.html", 27 | "type": "application/xhtml+xml", 28 | "id": "item5" 29 | } 30 | ], 31 | "toc": [ 32 | { 33 | "title": "MOBY-DICK; or, THE WHALE.", 34 | "href": "OEBPS/@public@vhost@g@gutenberg@html@files@2701@2701-h@2701-h-0.htm.html#pgepubid00000" 35 | } 36 | ], 37 | "links": [] 38 | } 39 | -------------------------------------------------------------------------------- /example/static/samples/test/missing-toc.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "https://readium.org/webpub-manifest/context.jsonld", 3 | "metadata": { 4 | "title": "Moby-Dick", 5 | "language": "en-US", 6 | "author": "Herman Melville" 7 | }, 8 | "resources": [], 9 | "readingOrder": [ 10 | { 11 | "href": "OPS/copyright.html", 12 | "type": "text/html", 13 | "id": "copyright" 14 | } 15 | ], 16 | "toc": [], 17 | "links": [] 18 | } 19 | -------------------------------------------------------------------------------- /example/static/samples/test/unparsable-manifst.json: -------------------------------------------------------------------------------- 1 | this is not a valid json file. -------------------------------------------------------------------------------- /example/static/samples/test/unparseable-manifst.json: -------------------------------------------------------------------------------- 1 | this is not a valid json file. -------------------------------------------------------------------------------- /example/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "include": [".", "../src"], 4 | "compilerOptions": { 5 | "module": "esnext", 6 | "resolveJsonModule": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /example/use-html-reader.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { useHtmlReader } from '../src'; 3 | import { Injectable } from '../src/Readium/Injectable'; 4 | import { WebpubManifest } from '../src/types'; 5 | import Footer from '../src/ui/Footer'; 6 | import Header from '../src/ui/Header'; 7 | 8 | type HTMLReaderProps = { 9 | injectablesReflowable: Injectable[]; 10 | webpubManifestUrl: string; 11 | manifest: WebpubManifest; 12 | }; 13 | 14 | /** 15 | * This sample shows setting how to use the useHTMLReader hook 16 | * to render EPUBs. Use it when you know you're _not_ going to be 17 | * opening PDFs. 18 | */ 19 | const UseHtmlReader: React.FC = ({ 20 | injectablesReflowable, 21 | webpubManifestUrl, 22 | manifest, 23 | }) => { 24 | const reader = useHtmlReader({ 25 | webpubManifestUrl, 26 | manifest, 27 | injectablesReflowable, 28 | }); 29 | const containerRef = React.useRef(null); 30 | 31 | if (!reader || !reader.type) { 32 | return null; 33 | } 34 | 35 | return ( 36 |
37 |
Back} 40 | containerRef={containerRef} 41 | /> 42 | {reader.content} 43 |
44 |
45 | ); 46 | }; 47 | 48 | export default UseHtmlReader; 49 | -------------------------------------------------------------------------------- /example/use-pdf-reader.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { usePdfReader } from '../src'; 3 | import { WebpubManifest } from '../src/types'; 4 | import Footer from '../src/ui/Footer'; 5 | import Header from '../src/ui/Header'; 6 | 7 | type PDFReaderProps = { 8 | webpubManifestUrl: string; 9 | manifest: WebpubManifest; 10 | proxyUrl: string | undefined; 11 | pdfWorkerSrc: string; 12 | }; 13 | 14 | /** 15 | * This sample shows setting how to use the usePdfReader hook 16 | * to render PDFs. Use it when you know you're _not_ going to be 17 | * opening EPUBs. 18 | */ 19 | const UsePdfReader: React.FC = ({ 20 | webpubManifestUrl, 21 | manifest, 22 | proxyUrl, 23 | pdfWorkerSrc, 24 | }) => { 25 | const reader = usePdfReader({ 26 | webpubManifestUrl, 27 | manifest, 28 | proxyUrl, 29 | pdfWorkerSrc, 30 | }); 31 | const containerRef = React.useRef(null); 32 | 33 | if (!reader || !reader.type) { 34 | return null; 35 | } 36 | 37 | return ( 38 |
39 |
Back} 42 | containerRef={containerRef} 43 | /> 44 | {reader.content} 45 |
46 |
47 | ); 48 | }; 49 | 50 | export default UsePdfReader; 51 | -------------------------------------------------------------------------------- /jest.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from '@jest/types'; 2 | 3 | const config: Config.InitialOptions = { 4 | transform: { 5 | // '.(ts|tsx)$': require.resolve('ts-jest/dist'), 6 | '^.+\\.tsx?$': 'esbuild-jest', 7 | '^.+\\.jsx?$': 'esbuild-jest', 8 | '.(js|jsx)$': require.resolve('babel-jest'), // jest's default 9 | }, 10 | transformIgnorePatterns: ['[/\\\\]node_modules[/\\\\].+\\.(js|jsx)$'], 11 | testPathIgnorePatterns: ['/playwright/'], 12 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], 13 | collectCoverageFrom: ['src/**/*.{ts,tsx,js,jsx}'], 14 | testMatch: ['/**/*.(spec|test).{ts,tsx,js,jsx}'], 15 | rootDir: '.', 16 | watchPlugins: [ 17 | require.resolve('jest-watch-typeahead/filename'), 18 | require.resolve('jest-watch-typeahead/testname'), 19 | ], 20 | moduleNameMapper: { 21 | '\\.(css|less)$': '/tests/cssStub.js', 22 | }, 23 | snapshotSerializers: ['@emotion/jest/serializer'], 24 | setupFilesAfterEnv: ['/tests/jest.setup.ts'], 25 | testEnvironment: 'jsdom', 26 | }; 27 | 28 | export default config; 29 | -------------------------------------------------------------------------------- /playwright/tests/test.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from '@playwright/test'; 2 | 3 | test('Open moby-epub3', async ({ page }) => { 4 | await page.goto('/html/moby-epub3'); 5 | await expect(page.getByLabel('Return to Homepage')).toBeVisible(); 6 | }); 7 | -------------------------------------------------------------------------------- /src/HtmlReader/ReadiumCss/LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2017, Readium 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /src/HtmlReader/injectable-styles.css: -------------------------------------------------------------------------------- 1 | @import './ReadiumCss/ReadiumCSS-before.css'; 2 | @import './ReadiumCss/ReadiumCSS-default.css'; 3 | @import './ReadiumCss/ReadiumCSS-after.css'; 4 | -------------------------------------------------------------------------------- /src/HtmlReader/useIframeLinkClick.ts: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { WebpubManifest } from '../WebpubManifestTypes/WebpubManifest'; 3 | import { getFromReadingOrder } from './lib'; 4 | import { HtmlAction } from './types'; 5 | 6 | export default function useIframeLinkClick( 7 | baseUrl: string | undefined, 8 | manifest: WebpubManifest | undefined, 9 | dispatch: React.Dispatch 10 | ): void { 11 | React.useEffect(() => { 12 | if (!baseUrl || !manifest) return; 13 | 14 | const messageHandler = ({ data }: { data: MessageEvent['data'] }) => { 15 | if (typeof data === 'object' && data !== null && 'type' in data) { 16 | switch (data.type) { 17 | case 'LINK_CLICKED': 18 | handleIframeLink(data.href, manifest, baseUrl, dispatch); 19 | } 20 | } 21 | }; 22 | 23 | window.addEventListener('message', messageHandler); 24 | 25 | return () => window.removeEventListener('message', messageHandler); 26 | }, [dispatch, baseUrl, manifest]); 27 | } 28 | 29 | const handleIframeLink = ( 30 | href: string, 31 | manifest: WebpubManifest, 32 | baseUrl: string, 33 | dispatch: React.Dispatch 34 | ) => { 35 | if (isExternalLink(href, manifest, baseUrl)) { 36 | window.open(href, '_blank'); 37 | } else { 38 | dispatch({ type: 'GO_TO_HREF', href: href }); 39 | } 40 | }; 41 | 42 | // If the href doesn't exist in the readingOrder, it's not 43 | // part of the book link, we can say this is an external link 44 | const isExternalLink = ( 45 | href: string, 46 | manifest: WebpubManifest, 47 | baseUrl: string 48 | ) => { 49 | const resource = getFromReadingOrder(href, manifest, baseUrl); 50 | return resource === undefined; 51 | }; 52 | -------------------------------------------------------------------------------- /src/HtmlReader/useUpdateCSS.ts: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { WebpubManifest } from '../types'; 3 | import { setReflowableCss } from './effects'; 4 | import { getMaybeIframeHtml } from './lib'; 5 | import { HtmlState } from './types'; 6 | 7 | /** 8 | * Set CSS variables when user state changes 9 | */ 10 | export default function useUpdateCSS( 11 | state: HtmlState, 12 | manifest: WebpubManifest | undefined 13 | ): void { 14 | React.useEffect(() => { 15 | if (!manifest) return; 16 | if (state.state !== 'NAVIGATING' && state.state !== 'READY') return; 17 | const html = getMaybeIframeHtml(state.iframe); 18 | if (!html) return; 19 | setReflowableCss(html, state.settings); 20 | }, [state.state, state.iframe, state.settings, manifest]); 21 | } 22 | -------------------------------------------------------------------------------- /src/HtmlReader/useUpdateScroll.ts: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { HtmlAction, HtmlState } from './types'; 3 | 4 | const SCROLL_STOP_DEBOUNCE = 100; 5 | 6 | /** 7 | * Dispatch a USER_SCROLLED event after some delay 8 | */ 9 | export function useUpdateScroll( 10 | state: HtmlState, 11 | dispatch: React.Dispatch 12 | ): void { 13 | const timeout = React.useRef(); 14 | 15 | React.useLayoutEffect(() => { 16 | if (state.state !== 'READY') return; 17 | const iframeDocument = state.iframe.contentDocument; 18 | if (!iframeDocument) return; 19 | 20 | function handleScroll() { 21 | if (timeout.current) clearTimeout(timeout.current); 22 | timeout.current = window.setTimeout(() => { 23 | dispatch({ type: 'USER_SCROLLED' }); 24 | }, SCROLL_STOP_DEBOUNCE); 25 | } 26 | iframeDocument.addEventListener('scroll', handleScroll); 27 | return () => iframeDocument.removeEventListener('scroll', handleScroll); 28 | }, [state.state, state.iframe, dispatch]); 29 | } 30 | -------------------------------------------------------------------------------- /src/HtmlReader/useWindowResize.ts: -------------------------------------------------------------------------------- 1 | import debounce from 'debounce'; 2 | import React from 'react'; 3 | import { WebpubManifest } from '../types'; 4 | import { setFixedCss } from './effects'; 5 | import { HtmlAction, HtmlState } from './types'; 6 | 7 | /** 8 | * Simply dispatches an action when the window is resized. 9 | */ 10 | export default function useWindowResize( 11 | manifest: WebpubManifest | undefined, 12 | state: HtmlState, 13 | dispatch: React.Dispatch 14 | ): void { 15 | React.useEffect(() => { 16 | if (state.state !== 'NAVIGATING' && state.state !== 'READY') return; 17 | function handleResize() { 18 | const iframeDocument = state.iframe?.contentDocument as Document; 19 | const iframeContainer = window.document.querySelector( 20 | 'main' 21 | ) as HTMLElement; 22 | 23 | const isFixedLayout = 24 | manifest?.metadata?.presentation?.layout === 'fixed'; 25 | if (isFixedLayout) setFixedCss(iframeDocument, iframeContainer); 26 | 27 | dispatch({ 28 | type: 'WINDOW_RESIZED', 29 | }); 30 | } 31 | 32 | const deboucedHandleResize = debounce(handleResize, 100); 33 | window.addEventListener('resize', deboucedHandleResize); 34 | return () => window.removeEventListener('resize', deboucedHandleResize); 35 | }, [dispatch, manifest, state]); 36 | } 37 | -------------------------------------------------------------------------------- /src/PdfReader/ChakraPage.tsx: -------------------------------------------------------------------------------- 1 | import { Page } from 'react-pdf'; 2 | import { chakra, shouldForwardProp } from '@chakra-ui/react'; 3 | 4 | // Wrap Page component so that we can pass it styles 5 | const ChakraPage = chakra(Page, { 6 | shouldForwardProp: (prop) => { 7 | // Definitely forward width and height 8 | if (['width', 'height', 'scale'].includes(prop)) return true; 9 | // don't forward the rest of Chakra's props 10 | const isChakraProp = !shouldForwardProp(prop); 11 | if (isChakraProp) return false; 12 | // else, only forward `sample` prop 13 | return true; 14 | }, 15 | baseStyle: { 16 | outline: '1px', 17 | outlineColor: 'ui.gray.light-cool', 18 | }, 19 | }); 20 | 21 | export default ChakraPage; 22 | -------------------------------------------------------------------------------- /src/PdfReader/ScrollPage.tsx: -------------------------------------------------------------------------------- 1 | import React, { FC } from 'react'; 2 | import ChakraPage from './ChakraPage'; 3 | import { useInView } from 'react-intersection-observer'; 4 | import { PageProps } from 'react-pdf'; 5 | 6 | type ScrollPageProps = { 7 | pageNumber: number; 8 | width: number | undefined; 9 | scale: number; 10 | onLoadSuccess: (page: PageProps) => void; 11 | placeholderHeight: number; 12 | placeholderWidth: number; 13 | }; 14 | 15 | type PlaceholderProps = { 16 | height: number; 17 | width: number | undefined; 18 | pageNumber: number; 19 | }; 20 | 21 | const Placeholder: FC = ({ width, height, pageNumber }) => { 22 | return ( 23 |
28 | ); 29 | }; 30 | 31 | const ScrollPage: FC = ({ 32 | scale, 33 | pageNumber, 34 | width, 35 | onLoadSuccess, 36 | placeholderHeight, 37 | placeholderWidth, 38 | }) => { 39 | const { ref, inView } = useInView({ 40 | threshold: 0, 41 | triggerOnce: true, 42 | }); 43 | 44 | return ( 45 |
46 | {inView ? ( 47 | 55 | ) : ( 56 | 61 | )} 62 |
63 | ); 64 | }; 65 | 66 | export default ScrollPage; 67 | -------------------------------------------------------------------------------- /src/PdfReader/pdf.css: -------------------------------------------------------------------------------- 1 | /* CSS from react-pdf in order to make links clickable */ 2 | @import url('../../node_modules/react-pdf/dist/esm/Page/AnnotationLayer.css'); 3 | /* CSS from react-pdf for text layer */ 4 | @import url('../../node_modules/react-pdf/dist/esm/Page/TextLayer.css'); 5 | -------------------------------------------------------------------------------- /src/PdfReader/types.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ActiveReaderArguments, 3 | InactiveReaderArguments, 4 | ReaderSettings, 5 | ReaderState, 6 | } from '../types'; 7 | 8 | export type InternalState = { 9 | resourceIndex: number; 10 | resource: { data: Uint8Array } | null; 11 | // we only know the numPages once the resource has been parsed 12 | numPages: number | null; 13 | // if pageNumber is -1, we will navigate to the end of the 14 | // resource once it is parsed 15 | pageNumber: number; 16 | scale: number; 17 | pdfHeight: number; 18 | pdfWidth: number; 19 | pageHeight: number | undefined; 20 | pageWidth: number | undefined; 21 | rendered: boolean; 22 | }; 23 | 24 | export type InactiveState = ReaderState & 25 | InternalState & { state: 'INACTIVE'; settings: undefined }; 26 | 27 | export type ActiveState = ReaderState & 28 | InternalState & { state: 'ACTIVE'; settings: ReaderSettings }; 29 | 30 | export type ErrorState = ReaderState & 31 | InternalState & { 32 | state: 'ERROR'; 33 | error: Error; 34 | settings: ReaderSettings; 35 | }; 36 | 37 | export type PdfState = InactiveState | ActiveState | ErrorState; 38 | 39 | export type PdfReaderArguments = 40 | | ActiveReaderArguments 41 | | InactiveReaderArguments; 42 | 43 | export type PdfReaderAction = 44 | | { 45 | type: 'ARGS_CHANGED'; 46 | args: PdfReaderArguments; 47 | } 48 | | { type: 'GO_FORWARD' } 49 | | { type: 'GO_BACKWARD' } 50 | | { type: 'GO_TO_HREF'; href: string } 51 | | { type: 'RESOURCE_FETCH_SUCCESS'; resource: { data: Uint8Array } } 52 | | { type: 'PDF_PARSED'; numPages: number } 53 | | { type: 'PDF_LOAD_ERROR'; error: Error } 54 | | { type: 'SET_SCALE'; scale: number } 55 | | { type: 'SET_SCROLL'; isScrolling: boolean } 56 | | { type: 'PAGE_LOAD_SUCCESS'; height: number; width: number } 57 | | { 58 | type: 'RESIZE_PAGE'; 59 | height: number | undefined; 60 | width: number | undefined; 61 | } 62 | | { type: 'BOOK_BOUNDARY_CHANGED'; atStart: boolean; atEnd: boolean }; 63 | -------------------------------------------------------------------------------- /src/Readium/Injectable.ts: -------------------------------------------------------------------------------- 1 | export interface Injectable { 2 | type: string; 3 | url?: string; 4 | r2after?: boolean; 5 | r2before?: boolean; 6 | r2default?: boolean; 7 | fontFamily?: string; 8 | systemFont?: boolean; 9 | appearance?: string; 10 | async?: boolean; 11 | } 12 | -------------------------------------------------------------------------------- /src/Readium/Locator.ts: -------------------------------------------------------------------------------- 1 | export interface Locator { 2 | href: string; 3 | type?: string; 4 | title?: string; 5 | locations: Locations; 6 | text?: LocatorText; 7 | } 8 | export interface LocatorText { 9 | after?: string; 10 | before?: string; 11 | highlight?: string; 12 | } 13 | export interface Locations { 14 | fragment?: string; 15 | progression?: number; 16 | position?: number; 17 | totalProgression?: number; 18 | remainingPositions?: number; 19 | totalRemainingPositions?: number; 20 | } 21 | -------------------------------------------------------------------------------- /src/WebpubManifestTypes/ConformsTo.ts: -------------------------------------------------------------------------------- 1 | // a webpub pdf collection 2 | export const WebpubPdfConformsTo = 3 | 'http://librarysimplified.org/terms/profiles/pdf'; 4 | // Epub profiles 5 | export const EpubConformsTo = 6 | 'https://readium.org/webpub-manifest/profiles/epub'; 7 | 8 | export type ConformsTo = typeof WebpubPdfConformsTo | typeof EpubConformsTo; 9 | -------------------------------------------------------------------------------- /src/WebpubManifestTypes/Contributor.ts: -------------------------------------------------------------------------------- 1 | import { ReadiumLink } from './ReadiumLink'; 2 | 3 | export interface ContributorObject { 4 | name: 5 | | string 6 | | { 7 | /** 8 | * This interface was referenced by `undefined`'s JSON-Schema definition 9 | * via the `patternProperty` "^((?(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)|(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))|((?([A-Za-z]{2,3}(-(?[A-Za-z]{3}(-[A-Za-z]{3}){0,2}))?)|[A-Za-z]{4}|[A-Za-z]{5,8})(-(?