@readium/shared 2.4.0-alpha.1 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/README.MD +8 -7
  2. package/dist/_virtual/preload-helper.js +1 -0
  3. package/dist/fetcher/Fetcher.js +1 -0
  4. package/dist/fetcher/HttpFetcher.js +1 -0
  5. package/dist/fetcher/Resource.js +1 -0
  6. package/dist/index.js +1 -4993
  7. package/dist/locales/publication-metadata/ar.json.js +1 -0
  8. package/dist/locales/publication-metadata/da.json.js +1 -0
  9. package/dist/locales/publication-metadata/el.json.js +1 -0
  10. package/dist/locales/publication-metadata/en.json.js +1 -0
  11. package/dist/locales/publication-metadata/es.json.js +1 -0
  12. package/dist/locales/publication-metadata/et.json.js +1 -0
  13. package/dist/locales/publication-metadata/fi.json.js +1 -0
  14. package/dist/locales/publication-metadata/fr.json.js +1 -0
  15. package/dist/locales/publication-metadata/it.json.js +1 -0
  16. package/dist/locales/publication-metadata/pl.json.js +1 -0
  17. package/dist/locales/publication-metadata/pt_PT.json.js +1 -0
  18. package/dist/locales/publication-metadata/sv.json.js +1 -0
  19. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/constants.js +1 -0
  20. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/index.js +1 -0
  21. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/selector-attribute.js +1 -0
  22. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/selector-class.js +1 -0
  23. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/selector-fallback.js +1 -0
  24. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/selector-id.js +1 -0
  25. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/selector-nth-child.js +1 -0
  26. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/selector-nth-of-type.js +1 -0
  27. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/selector-tag.js +1 -0
  28. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/types.js +1 -0
  29. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/utilities-cartesian.js +1 -0
  30. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/utilities-data.js +1 -0
  31. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/utilities-dom.js +1 -0
  32. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/utilities-element-data.js +1 -0
  33. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/utilities-iselement.js +1 -0
  34. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/utilities-messages.js +1 -0
  35. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/utilities-options.js +1 -0
  36. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/utilities-powerset.js +1 -0
  37. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/utilities-selectors.js +1 -0
  38. package/dist/node_modules/.pnpm/css-selector-generator@3.8.0/node_modules/css-selector-generator/esm/utilities-typescript.js +1 -0
  39. package/dist/opds/Acquisition.js +1 -0
  40. package/dist/opds/Availability.js +1 -0
  41. package/dist/opds/Copies.js +1 -0
  42. package/dist/opds/Holds.js +1 -0
  43. package/dist/opds/Price.js +1 -0
  44. package/dist/publication/AltIdentifier.js +1 -0
  45. package/dist/publication/BelongsTo.js +1 -0
  46. package/dist/publication/Contributor.js +1 -0
  47. package/dist/publication/GuidedNavigation.js +1 -0
  48. package/dist/publication/Layout.js +1 -0
  49. package/dist/publication/Link.js +1 -0
  50. package/dist/publication/LocalizedString.js +1 -0
  51. package/dist/publication/Locator.js +1 -0
  52. package/dist/publication/LocatorCollection.js +1 -0
  53. package/dist/publication/Manifest.js +1 -0
  54. package/dist/publication/Metadata.js +1 -0
  55. package/dist/publication/Profiles.js +1 -0
  56. package/dist/publication/Properties.js +1 -0
  57. package/dist/publication/Publication.js +1 -0
  58. package/dist/publication/PublicationCollection.js +1 -0
  59. package/dist/publication/ReadingProgression.js +1 -0
  60. package/dist/publication/Subject.js +1 -0
  61. package/dist/publication/TDM.js +1 -0
  62. package/dist/publication/accessibility/Accessibility.js +1 -0
  63. package/dist/publication/accessibility/AccessibilityMetadataDisplayGuide.js +1 -0
  64. package/dist/publication/accessibility/Localization.js +1 -0
  65. package/dist/publication/accessibility/SupportedLanguages.js +1 -0
  66. package/dist/publication/encryption/Encryption.js +1 -0
  67. package/dist/publication/encryption/Properties.js +1 -0
  68. package/dist/publication/encryption/index.js +1 -0
  69. package/dist/publication/epub/MediaOverlay.js +1 -0
  70. package/dist/publication/epub/Metadata.js +1 -0
  71. package/dist/publication/epub/Properties.js +1 -0
  72. package/dist/publication/epub/Publication.js +1 -0
  73. package/dist/publication/epub/index.js +1 -0
  74. package/dist/publication/html/DomRange.js +1 -0
  75. package/dist/publication/html/DomRangePoint.js +1 -0
  76. package/dist/publication/html/Locations.js +1 -0
  77. package/dist/publication/html/index.js +1 -0
  78. package/dist/publication/opds/Properties.js +1 -0
  79. package/dist/publication/opds/Publication.js +1 -0
  80. package/dist/publication/opds/index.js +1 -0
  81. package/dist/publication/services/content/Content.js +2 -0
  82. package/dist/publication/services/content/ContentTokenizer.js +1 -0
  83. package/dist/publication/services/content/Iterator.js +1 -0
  84. package/dist/publication/services/content/element/attributes.js +1 -0
  85. package/dist/publication/services/content/element/element.js +1 -0
  86. package/dist/publication/services/content/element/text_role.js +1 -0
  87. package/dist/publication/services/content/iterators/HTMLResourceContentIterator.js +1 -0
  88. package/dist/publication/services/content/iterators/PDFTextContentIterator.js +1 -0
  89. package/dist/publication/services/content/iterators/PublicationContentIterator.js +1 -0
  90. package/dist/publication/services/content/iterators/helpers.js +1 -0
  91. package/dist/publication/services/timeline/Timeline.js +1 -0
  92. package/dist/publication/services/timeline/audio.js +1 -0
  93. package/dist/publication/services/timeline/html.js +1 -0
  94. package/dist/publication/services/timeline/index.js +1 -0
  95. package/dist/util/JSONParse.js +1 -0
  96. package/dist/util/URITemplate.js +1 -0
  97. package/dist/util/mediatype/MediaType.js +1 -0
  98. package/dist/util/npt.js +1 -0
  99. package/dist/util/tokenizer/TextTokenizer.js +1 -0
  100. package/dist/util/tokenizer/tokenize-english/abbreviations.js +1 -0
  101. package/dist/util/tokenizer/tokenize-english/index.js +2 -0
  102. package/dist/util/tokenizer/tokenize-english/utils.js +1 -0
  103. package/dist/util/tokenizer/tokenize-text/index.js +1 -0
  104. package/dist/util/tokenizer/tokenize-text/tokens.js +1 -0
  105. package/package.json +29 -19
  106. package/src/fetcher/HttpFetcher.ts +5 -5
  107. package/src/fetcher/Resource.ts +5 -10
  108. package/src/locales/publication-metadata/ar.json +402 -0
  109. package/src/locales/publication-metadata/brh.json +1 -0
  110. package/src/locales/publication-metadata/da.json +310 -0
  111. package/src/locales/publication-metadata/el.json +310 -0
  112. package/src/locales/publication-metadata/en.json +310 -0
  113. package/src/locales/publication-metadata/es.json +333 -0
  114. package/src/locales/publication-metadata/et.json +310 -0
  115. package/src/locales/publication-metadata/fi.json +310 -0
  116. package/src/locales/publication-metadata/fr.json +333 -0
  117. package/src/locales/publication-metadata/he.json +9 -0
  118. package/src/locales/publication-metadata/it.json +333 -0
  119. package/src/locales/publication-metadata/lt.json +8 -0
  120. package/src/locales/publication-metadata/pl.json +333 -0
  121. package/src/locales/publication-metadata/pt_PT.json +329 -0
  122. package/src/locales/publication-metadata/sv.json +310 -0
  123. package/src/locales/publication-metadata/tr.json +51 -0
  124. package/src/locales/publication-metadata/uk.json +1 -0
  125. package/src/publication/Link.ts +2 -6
  126. package/src/publication/Locator.ts +21 -3
  127. package/src/publication/Manifest.ts +10 -10
  128. package/src/publication/Publication.ts +2 -1
  129. package/src/publication/accessibility/Localization.ts +12 -14
  130. package/src/publication/accessibility/SupportedLanguages.ts +1 -1
  131. package/src/publication/encryption/Properties.ts +3 -15
  132. package/src/publication/epub/Metadata.ts +6 -12
  133. package/src/publication/epub/Properties.ts +3 -13
  134. package/src/publication/epub/Publication.ts +18 -39
  135. package/src/publication/html/Locations.ts +63 -99
  136. package/src/publication/opds/Properties.ts +21 -66
  137. package/src/publication/opds/Publication.ts +3 -9
  138. package/src/publication/services/content/iterators/HTMLResourceContentIterator.ts +3 -1
  139. package/src/publication/services/timeline/Timeline.ts +311 -60
  140. package/src/publication/services/timeline/TimelineItem.ts +3 -3
  141. package/src/publication/services/timeline/audio.ts +31 -0
  142. package/src/publication/services/timeline/html.ts +5 -0
  143. package/src/publication/services/timeline/index.ts +12 -0
  144. package/src/util/npt.ts +19 -0
  145. package/types/src/fetcher/HttpFetcher.d.ts +3 -3
  146. package/types/src/fetcher/Resource.d.ts +2 -6
  147. package/types/src/publication/encryption/Properties.d.ts +2 -9
  148. package/types/src/publication/epub/Metadata.d.ts +3 -6
  149. package/types/src/publication/epub/Properties.d.ts +2 -10
  150. package/types/src/publication/epub/Publication.d.ts +7 -18
  151. package/types/src/publication/html/Locations.d.ts +17 -44
  152. package/types/src/publication/opds/Properties.d.ts +8 -36
  153. package/types/src/publication/opds/Publication.d.ts +2 -5
  154. package/types/src/publication/services/timeline/Timeline.d.ts +93 -13
  155. package/types/src/publication/services/timeline/TimelineItem.d.ts +3 -3
  156. package/types/src/publication/services/timeline/audio.d.ts +4 -0
  157. package/types/src/publication/services/timeline/html.d.ts +4 -0
  158. package/types/src/publication/services/timeline/index.d.ts +6 -0
  159. package/types/src/util/npt.d.ts +10 -0
  160. package/dist/ar-DyHX_uy2.js +0 -7
  161. package/dist/da-Dct0PS3E.js +0 -7
  162. package/dist/fr-C5HEel98.js +0 -7
  163. package/dist/index.umd.cjs +0 -3
  164. package/dist/it-DFOBoXGy.js +0 -7
  165. package/dist/pt_PT-Di3sVjze.js +0 -7
  166. package/dist/sv-BfzAFsVN.js +0 -7
@@ -6,8 +6,8 @@
6
6
  * show previous/next as chapter titles, group search results by chapter, etc.
7
7
  */
8
8
  export interface TimelineItem {
9
- /** Display title of this entry. */
10
- title: string;
9
+ /** Display title of this entry, when one could be derived. */
10
+ title?: string;
11
11
  /**
12
12
  * References as hrefs with optional fragments.
13
13
  * e.g. ["track1.mp3#t=60"] for audio, ["chapter1.html"] for EPUB, ["#page=6"] for PDF.
@@ -15,7 +15,7 @@ export interface TimelineItem {
15
15
  references: string[];
16
16
  /** Structural roles of this entry, e.g. ["chapter"], ["part"]. */
17
17
  role?: string[];
18
- /** Position number in the reading order context. */
18
+ /** Raw position: book-global seconds for audio, a Positions List position for EPUB, a page number for PDF. */
19
19
  position?: number;
20
20
  /** Scroll progression within the resource (0 to 1), for entries that start mid-way in a resource. */
21
21
  scroll?: number;
@@ -0,0 +1,31 @@
1
+ import { parseNptTime } from "../../../util/npt.ts";
2
+ import { Timeline, PublicationLike } from "./Timeline.ts";
3
+
4
+ export function buildAudioTimeline(pub: PublicationLike, opts?: { depth?: number }): Timeline {
5
+ const t = Timeline.build(pub, opts);
6
+ const ro = pub.readingOrder.items;
7
+ const canLabel = ro.length <= 1 || ro.every(l => l.duration !== undefined);
8
+ if (!canLabel) return t;
9
+
10
+ let offset = 0;
11
+ const offsets = new Map(ro.map(l => {
12
+ const o = offset;
13
+ offset += l.duration ?? 0;
14
+ return [l.href, o];
15
+ }));
16
+
17
+ t.augment((_item, link) => {
18
+ const href = link.href;
19
+ const hashIndex = href.indexOf('#');
20
+ const bare = hashIndex >= 0 ? href.slice(0, hashIndex) : href;
21
+ const fragment = hashIndex >= 0 ? href.slice(hashIndex + 1) : undefined;
22
+ const trackOffset = offsets.get(bare) ?? 0;
23
+ const tMatch = fragment?.match(/(?:^|&)t=([^&]+)/);
24
+ const seconds = tMatch ? parseNptTime(tMatch[1]) : undefined;
25
+ return {
26
+ position: trackOffset + (seconds ?? 0),
27
+ };
28
+ });
29
+
30
+ return t;
31
+ }
@@ -0,0 +1,5 @@
1
+ import { Timeline, PublicationLike } from "./Timeline.ts";
2
+
3
+ export function buildHtmlTimeline(pub: PublicationLike, opts?: { depth?: number }): Timeline {
4
+ return Timeline.build(pub, opts);
5
+ }
@@ -1,2 +1,14 @@
1
+ import { Profile } from "../../Profiles.ts";
2
+ import { PublicationLike, Timeline } from "./Timeline.ts";
3
+ import { buildAudioTimeline } from "./audio.ts";
4
+ import { buildHtmlTimeline } from "./html.ts";
5
+
1
6
  export * from './Timeline.ts';
2
7
  export * from './TimelineItem.ts';
8
+ export { buildHtmlTimeline } from './html.ts';
9
+ export { buildAudioTimeline } from './audio.ts';
10
+
11
+ export function buildTimeline(pub: PublicationLike, options?: { depth?: number }): Timeline {
12
+ const isAudio = pub.metadata?.conformsTo?.includes(Profile.AUDIOBOOK) ?? false;
13
+ return isAudio ? buildAudioTimeline(pub, options) : buildHtmlTimeline(pub, options);
14
+ }
package/src/util/npt.ts CHANGED
@@ -49,3 +49,22 @@ export function isNptStartOfResource(raw: string): boolean {
49
49
  const t = parseNptTime(raw);
50
50
  return t !== undefined && t === 0;
51
51
  }
52
+
53
+ /**
54
+ * Formats a duration in seconds as a human-readable string suitable for
55
+ * display in a Table of Contents or progress indicator.
56
+ *
57
+ * Outputs "H:MM:SS" when hours > 0, otherwise "M:SS".
58
+ * Minutes and seconds are always zero-padded to two digits.
59
+ *
60
+ * Examples: 0 → "0:00", 90 → "1:30", 3661 → "1:01:01"
61
+ */
62
+ export function formatNptTime(seconds: number): string {
63
+ const totalSeconds = Math.floor(seconds);
64
+ const h = Math.floor(totalSeconds / 3600);
65
+ const m = Math.floor((totalSeconds % 3600) / 60);
66
+ const s = totalSeconds % 60;
67
+ const mm = String(m).padStart(2, "0");
68
+ const ss = String(s).padStart(2, "0");
69
+ return h > 0 ? `${h}:${mm}:${ss}` : `${m}:${ss}`;
70
+ }
@@ -1,6 +1,6 @@
1
1
  import { Link } from '../publication/Link.ts';
2
2
  import { Fetcher } from './Fetcher.ts';
3
- import { NumberRange, Resource, ResourceReadOptions } from './Resource.ts';
3
+ import { NumberRange, Resource } from './Resource.ts';
4
4
  export type FetchImplementation = (input: RequestInfo | URL, init?: RequestInit | undefined) => Promise<Response>;
5
5
  export declare class HttpFetcher implements Fetcher {
6
6
  private readonly baseUrl?;
@@ -20,9 +20,9 @@ export declare class HttpResource implements Resource {
20
20
  private headResponse;
21
21
  close(): void;
22
22
  link(): Promise<Link>;
23
- read(range?: NumberRange, options?: ResourceReadOptions): Promise<Uint8Array | undefined>;
23
+ read(range?: NumberRange): Promise<Uint8Array | undefined>;
24
24
  length(): Promise<number>;
25
25
  readAsJSON(): Promise<unknown>;
26
26
  readAsString(): Promise<string>;
27
- readAsXML(): Promise<Document>;
27
+ readAsXML(): Promise<XMLDocument>;
28
28
  }
@@ -4,16 +4,12 @@ export declare class NumberRange {
4
4
  readonly endInclusive: number;
5
5
  constructor(start: number, endInclusive: number);
6
6
  }
7
- export interface ResourceReadOptions {
8
- /** Aborts the underlying request, e.g. when a prefetched resource is no longer needed */
9
- signal?: AbortSignal;
10
- }
11
7
  export declare abstract class Resource {
12
8
  abstract link(): Promise<Link>;
13
9
  abstract length(): Promise<number | undefined>;
14
- abstract read(range?: NumberRange, options?: ResourceReadOptions): Promise<Uint8Array | undefined>;
10
+ abstract read(range?: NumberRange): Promise<Uint8Array | undefined>;
15
11
  readAsString(): Promise<string | undefined>;
16
12
  readAsJSON(): Promise<unknown | undefined>;
17
- readAsXML(): Promise<Document | undefined>;
13
+ readAsXML(): Promise<XMLDocument | undefined>;
18
14
  abstract close(): void;
19
15
  }
@@ -1,10 +1,3 @@
1
+ import { Properties } from '../Properties.ts';
1
2
  import { Encryption } from './Encryption.ts';
2
- declare module '../Properties' {
3
- interface Properties {
4
- /**
5
- * Indicates that a resource is encrypted/obfuscated and provides relevant information for
6
- * decryption.
7
- */
8
- encryption: Encryption | undefined;
9
- }
10
- }
3
+ export declare function getEncryption(properties: Properties): Encryption | undefined;
@@ -1,6 +1,3 @@
1
- import { MediaOverlay } from "./MediaOverlay.ts";
2
- declare module '../Metadata' {
3
- interface Metadata {
4
- getMediaOverlay(): MediaOverlay | undefined;
5
- }
6
- }
1
+ import { Metadata } from '../Metadata.ts';
2
+ import { MediaOverlay } from './MediaOverlay.ts';
3
+ export declare function getMediaOverlay(metadata: Metadata): MediaOverlay | undefined;
@@ -1,10 +1,2 @@
1
- declare module '../Properties' {
2
- interface Properties {
3
- /**
4
- * Identifies content contained in the linked resource, that cannot be strictly identified using a
5
- * media type.
6
- */
7
- getContains(): Set<string> | undefined;
8
- }
9
- }
10
- export {};
1
+ import { Properties } from '../Properties.ts';
2
+ export declare function getContains(properties: Properties): Set<string>;
@@ -1,19 +1,8 @@
1
1
  import { Links } from '../Link.ts';
2
- declare module '../Publication' {
3
- interface Publication {
4
- /**
5
- * Provides navigation to positions in the Publication content that correspond to the locations of
6
- * page boundaries present in a print source being represented by this EPUB Publication.
7
- */
8
- getPageList(): Links | undefined;
9
- /**
10
- * Identifies fundamental structural components of the publication in order to enable Reading
11
- * Systems to provide the User efficient access to them.
12
- */
13
- getLandmarks(): Links | undefined;
14
- getListOfAudioClips(): Links | undefined;
15
- getListOfIllustrations(): Links | undefined;
16
- getListOfTables(): Links | undefined;
17
- getListOfVideoClips(): Links | undefined;
18
- }
19
- }
2
+ import { Publication } from '../Publication.ts';
3
+ export declare function getPageList(pub: Publication): Links | undefined;
4
+ export declare function getLandmarks(pub: Publication): Links | undefined;
5
+ export declare function getListOfAudioClips(pub: Publication): Links | undefined;
6
+ export declare function getListOfIllustrations(pub: Publication): Links | undefined;
7
+ export declare function getListOfTables(pub: Publication): Links | undefined;
8
+ export declare function getListOfVideoClips(pub: Publication): Links | undefined;
@@ -1,45 +1,18 @@
1
+ import { LocatorLocations } from '../Locator.ts';
1
2
  import { DomRange } from './DomRange.ts';
2
- declare module '../Locator' {
3
- interface LocatorLocations {
4
- /**
5
- * A CSS Selector.
6
- */
7
- getCssSelector(): string | undefined;
8
- /**
9
- * [partialCfi] is an expression conforming to the "right-hand" side of the EPUB CFI syntax, that is
10
- * to say: without the EPUB-specific OPF spine item reference that precedes the first ! exclamation
11
- * mark (which denotes the "step indirection" into a publication document). Note that the wrapping
12
- * epubcfi(***) syntax is not used for the [partialCfi] string, i.e. the "fragment" part of the CFI
13
- * grammar is ignored.
14
- */
15
- getPartialCfi(): string | undefined;
16
- /**
17
- * An HTML DOM range.
18
- */
19
- getDomRange(): DomRange | undefined;
20
- /**
21
- * All named parameters found in the fragments, such as `p=5`.
22
- */
23
- fragmentParameters(): Map<string, string>;
24
- /**
25
- * HTML ID fragment identifier.
26
- */
27
- htmlId(): string | undefined;
28
- /**
29
- * Page fragment identifier, used for example in PDF.
30
- */
31
- page(): number | undefined;
32
- /**
33
- * Temporal Dimension media fragment, used for example in audiobooks.
34
- *
35
- * https://www.w3.org/TR/media-frags/
36
- */
37
- time(): number | undefined;
38
- /**
39
- * Spatial Dimension media fragment, used for example in audiobooks.
40
- *
41
- * https://www.w3.org/TR/media-frags/
42
- */
43
- space(): [number, number, number, number] | undefined;
44
- }
45
- }
3
+ import { TextFragmentDirective } from '@readium/helpers';
4
+ export declare function getCssSelector(loc: LocatorLocations): string | undefined;
5
+ export declare function getPartialCfi(loc: LocatorLocations): string | undefined;
6
+ export declare function getDomRange(loc: LocatorLocations): DomRange | undefined;
7
+ export declare function getTextFragment(loc: LocatorLocations): TextFragmentDirective | undefined;
8
+ export declare function getFragmentParameters(loc: LocatorLocations): Map<string, string>;
9
+ export declare function getHtmlId(loc: LocatorLocations): string | undefined;
10
+ export declare function getPage(loc: LocatorLocations): number | undefined;
11
+ export declare function getTime(loc: LocatorLocations): number | undefined;
12
+ export declare function getSpace(loc: LocatorLocations): {
13
+ unit: "pixel" | "percent";
14
+ x: number;
15
+ y: number;
16
+ width: number;
17
+ height: number;
18
+ } | undefined;
@@ -1,38 +1,10 @@
1
1
  import { Copies, Acquisition, Holds, Price, Availability } from '../../opds/index.ts';
2
2
  import { Link } from '../Link.ts';
3
- declare module '../Properties' {
4
- interface Properties {
5
- /**
6
- * Provides a hint about the expected number of items returned.
7
- */
8
- getNumberOfItems(): number | undefined;
9
- /**
10
- * The price of a publication is tied to its acquisition link.
11
- */
12
- getPrice(): Price | undefined;
13
- /**
14
- * Indirect acquisition provides a hint for the expected media type that will be acquired after
15
- * additional steps.
16
- */
17
- getIndirectAcquisitions(): Array<Acquisition> | undefined;
18
- /**
19
- * Library-specific features when a specific book is unavailable but provides a hold list.
20
- */
21
- getHolds(): Holds | undefined;
22
- /**
23
- * Library-specific feature that contains information about the copies that a library has acquired.
24
- */
25
- getCopies(): Copies | undefined;
26
- /**
27
- * Indicated the availability of a given resource.
28
- */
29
- getAvailability(): Availability | undefined;
30
- /**
31
- * Indicates that the linked resource supports authentication with the associated Authentication
32
- * Document.
33
- *
34
- * See https://specs.opds.io/authentication-for-opds-1.0.html
35
- */
36
- getAuthenticate(): Link | undefined;
37
- }
38
- }
3
+ import { Properties } from '../Properties.ts';
4
+ export declare function getNumberOfItems(properties: Properties): number | undefined;
5
+ export declare function getPrice(properties: Properties): Price | undefined;
6
+ export declare function getIndirectAcquisitions(properties: Properties): Array<Acquisition> | undefined;
7
+ export declare function getHolds(properties: Properties): Holds | undefined;
8
+ export declare function getCopies(properties: Properties): Copies | undefined;
9
+ export declare function getAvailability(properties: Properties): Availability | undefined;
10
+ export declare function getAuthenticate(properties: Properties): Link | undefined;
@@ -1,6 +1,3 @@
1
1
  import { Links } from '../Link.ts';
2
- declare module '../Publication' {
3
- interface Publication {
4
- getImages(): Links | undefined;
5
- }
6
- }
2
+ import { Publication } from '../Publication.ts';
3
+ export declare function getImages(pub: Publication): Links | undefined;
@@ -1,9 +1,29 @@
1
1
  import { Link, Links } from "../../Link.ts";
2
2
  import { Locator } from "../../Locator.ts";
3
+ import { Profile } from "../../Profiles.ts";
3
4
  import { TimelineItem } from "./TimelineItem.ts";
4
- interface PublicationLike {
5
+ export interface PublicationLike {
5
6
  toc?: Links;
6
7
  readingOrder: Links;
8
+ metadata?: {
9
+ conformsTo?: Profile[];
10
+ };
11
+ }
12
+ /**
13
+ * A TOC entry, mirroring `publication.toc`'s authored hierarchy and
14
+ * contextualized with display-ready progression. When a publication has no
15
+ * `toc` at all, falls back to one flat entry per reading-order item.
16
+ *
17
+ * Exactly one of `position`/`timestamp` is populated, depending on the
18
+ * publication's profile.
19
+ */
20
+ export interface ContextualizedTocEntry {
21
+ link: Link;
22
+ /** Display-ready label for non-audio profiles: a Positions List position for EPUB, a page number for PDF (e.g. "42"). */
23
+ position?: string;
24
+ /** Display-ready formatted time for audiobooks (e.g. "27:27"). */
25
+ timestamp?: string;
26
+ children?: ContextualizedTocEntry[];
7
27
  }
8
28
  /**
9
29
  * A publication's timeline, built once from its reading order and table of contents.
@@ -14,26 +34,50 @@ interface PublicationLike {
14
34
  * 2. Populate flat children — all TOC fragment entries that reference the
15
35
  * resource, collected depth-first in TOC declaration order.
16
36
  *
17
- * No TOC hierarchy is reconstructed; that requires role context and is not yet
18
- * implemented. TOC entries whose href does not match any reading order item
19
- * are ignored.
37
+ * `contextualizedToc` returns the authored TOC hierarchy (see
38
+ * `ContextualizedTocEntry`), each entry contextualized with progression.
39
+ * `tocEntryFor(item)` maps a `TimelineItem` (e.g. from
40
+ * `locate()`) back to its entry in that hierarchy. TOC entries whose href
41
+ * does not match any reading order item are ignored.
20
42
  *
21
- * The `depth` build option limits how many levels deep into the TOC tree both
22
- * title resolution and child collection may look. Level 1 = top-level TOC
23
- * entries; level 2 = their children; etc. `undefined` means no limit.
43
+ * The `depth` build option limits how many levels deep into the TOC tree
44
+ * title resolution, child collection, and `contextualizedToc` traversal may
45
+ * look. Level 1 = top-level TOC entries; level 2 = their children; etc.
46
+ * `undefined` means no limit.
24
47
  */
25
48
  export declare class Timeline {
26
49
  private readonly _allItems;
27
50
  private readonly linkMap;
51
+ private readonly _conformsTo;
52
+ private readonly tocLinks;
28
53
  private _depth;
54
+ /**
55
+ * Depth used for `contextualizedToc` traversal. Tracks `_depth`, but is
56
+ * seeded independently from `Timeline.build()`'s `depth` option: unlike
57
+ * `_depth`, which only ever triggers `items`/`flat` re-trimming via the
58
+ * runtime `depth` setter, the TOC tree is walked fresh from `tocLinks`
59
+ * every time, so there's no equivalent "already baked in, don't reapply"
60
+ * hazard to avoid.
61
+ */
62
+ private _tocDepth;
29
63
  private _items;
30
64
  private _flat;
65
+ private _toc;
66
+ private _linkToItem;
31
67
  /** Populated when depth is set; maps cloned items from trimToDepth back to their Links. */
32
68
  private _trimmedLinkMap;
33
- constructor(items: TimelineItem[], linkMap: Map<TimelineItem, Link>);
69
+ constructor(items: TimelineItem[], linkMap: Map<TimelineItem, Link>, conformsTo?: readonly Profile[], tocLinks?: Link[], tocDepth?: number | undefined);
34
70
  static build(publication: PublicationLike, options?: {
35
71
  depth?: number;
36
72
  }): Timeline;
73
+ /**
74
+ * Augments all items in the timeline by applying the mapper's returned patch.
75
+ * The mapper receives the item and its original manifest Link, and returns
76
+ * a partial TimelineItem — any fields it sets will overwrite the item's
77
+ * current value. Use this to populate `position`, `scroll`, `role`, or any
78
+ * future TimelineItem fields from format-specific data.
79
+ */
80
+ augment(mapper: (item: TimelineItem, link: Link) => Partial<TimelineItem>): void;
37
81
  /**
38
82
  * The active depth limit for TOC traversal (title resolution and child
39
83
  * collection). `undefined` means unlimited. Setting the same value again
@@ -44,15 +88,33 @@ export declare class Timeline {
44
88
  /** Top-level timeline items. Cached; invalidated when `depth` changes. */
45
89
  get items(): TimelineItem[];
46
90
  locate(locator: Locator): TimelineItem | undefined;
47
- adjacentTo(item: TimelineItem): {
91
+ /** The items navigable to/from `item`: its previous/next neighbors in the flattened timeline. */
92
+ navigableFrom(item: TimelineItem): {
48
93
  previous: TimelineItem | undefined;
49
94
  next: TimelineItem | undefined;
50
95
  };
51
96
  segmentsForHref(href: string): TimelineItem[];
52
- itemAtProgression(href: string, progression: number, duration?: number): TimelineItem | undefined;
53
97
  ancestors(item: TimelineItem): TimelineItem[];
54
98
  linkFor(item: TimelineItem): Link | undefined;
99
+ /**
100
+ * The authored TOC, contextualized with display-ready progression. Mirrors
101
+ * `publication.toc`'s authored hierarchy (respecting `depth`), falling
102
+ * back to one flat entry per reading-order item when there's no toc at
103
+ * all. Cached; invalidated when `depth` changes.
104
+ */
105
+ get contextualizedToc(): ContextualizedTocEntry[];
106
+ /**
107
+ * Maps a `TimelineItem` (typically from `locate()`) to its `ContextualizedTocEntry`,
108
+ * trying three fallbacks in order:
109
+ * 1. A direct match on `current`'s own link.
110
+ * 2. The nearest preceding toc entry within the same resource.
111
+ * 3. When no toc entry references the resource at all, the nearest
112
+ * preceding resource's toc entry.
113
+ */
114
+ tocEntryFor(current: TimelineItem): ContextualizedTocEntry | undefined;
55
115
  private get flat();
116
+ /** All items flattened from _allItems, depth-independent — used by augment(). */
117
+ private get flatAll();
56
118
  /**
57
119
  * Resolve a display title for `bare` from the TOC, looking no deeper than
58
120
  * `maxDepth` levels (1 = top-level entries only). Priority:
@@ -80,12 +142,30 @@ export declare class Timeline {
80
142
  * explicit beginning of the file).
81
143
  */
82
144
  private static isStartOfResource;
145
+ private get linkToItem();
146
+ private buildTocEntries;
147
+ /** All toc Links flattened, respecting the same depth limit as `buildTocEntries`. */
148
+ private tocLinksFlat;
149
+ private entryFor;
150
+ private resourceStartItem;
151
+ private findTocEntryByLink;
152
+ /**
153
+ * Tier-2 fallback for `tocEntryFor`: among the toc entries that reference
154
+ * `href`'s own resource (e.g. chapter markers within one audio file),
155
+ * return the nearest one at or before `current`'s position/scroll.
156
+ */
157
+ private nearestTocEntryForResource;
158
+ /**
159
+ * Tier-3 fallback for `tocEntryFor`: when no toc entry references
160
+ * `href`'s resource at all, walk backward through the reading order and
161
+ * return the nearest preceding resource's toc entry.
162
+ */
163
+ private previousResolvedTocEntry;
83
164
  private static trimToDepth;
84
165
  private flattenItems;
85
166
  private itemStartTime;
86
- private bareHrefFromItem;
87
- private timeFromItem;
167
+ private itemMatchesHref;
88
168
  private ancestorPath;
169
+ private itemScrollPosition;
89
170
  private static bareHref;
90
171
  }
91
- export {};
@@ -6,8 +6,8 @@
6
6
  * show previous/next as chapter titles, group search results by chapter, etc.
7
7
  */
8
8
  export interface TimelineItem {
9
- /** Display title of this entry. */
10
- title: string;
9
+ /** Display title of this entry, when one could be derived. */
10
+ title?: string;
11
11
  /**
12
12
  * References as hrefs with optional fragments.
13
13
  * e.g. ["track1.mp3#t=60"] for audio, ["chapter1.html"] for EPUB, ["#page=6"] for PDF.
@@ -15,7 +15,7 @@ export interface TimelineItem {
15
15
  references: string[];
16
16
  /** Structural roles of this entry, e.g. ["chapter"], ["part"]. */
17
17
  role?: string[];
18
- /** Position number in the reading order context. */
18
+ /** Raw position: book-global seconds for audio, a Positions List position for EPUB, a page number for PDF. */
19
19
  position?: number;
20
20
  /** Scroll progression within the resource (0 to 1), for entries that start mid-way in a resource. */
21
21
  scroll?: number;
@@ -0,0 +1,4 @@
1
+ import { Timeline, PublicationLike } from "./Timeline.ts";
2
+ export declare function buildAudioTimeline(pub: PublicationLike, opts?: {
3
+ depth?: number;
4
+ }): Timeline;
@@ -0,0 +1,4 @@
1
+ import { Timeline, PublicationLike } from "./Timeline.ts";
2
+ export declare function buildHtmlTimeline(pub: PublicationLike, opts?: {
3
+ depth?: number;
4
+ }): Timeline;
@@ -1,2 +1,8 @@
1
+ import { PublicationLike, Timeline } from "./Timeline.ts";
1
2
  export * from './Timeline.ts';
2
3
  export * from './TimelineItem.ts';
4
+ export { buildHtmlTimeline } from './html.ts';
5
+ export { buildAudioTimeline } from './audio.ts';
6
+ export declare function buildTimeline(pub: PublicationLike, options?: {
7
+ depth?: number;
8
+ }): Timeline;
@@ -18,3 +18,13 @@ export declare function parseNptTime(raw: string): number | undefined;
18
18
  * (t=0, t=0.0, t=npt:0, t=npt:0:0:0, etc.).
19
19
  */
20
20
  export declare function isNptStartOfResource(raw: string): boolean;
21
+ /**
22
+ * Formats a duration in seconds as a human-readable string suitable for
23
+ * display in a Table of Contents or progress indicator.
24
+ *
25
+ * Outputs "H:MM:SS" when hours > 0, otherwise "M:SS".
26
+ * Minutes and seconds are always zero-padded to two digits.
27
+ *
28
+ * Examples: 0 → "0:00", 90 → "1:30", 3661 → "1:01:01"
29
+ */
30
+ export declare function formatNptTime(seconds: number): string;
@@ -1,7 +0,0 @@
1
- const e = { metadata: { accessibility: { "display-guide": { "accessibility-summary": { "no-metadata": "لا تتوفر أي معلومات", "publisher-contact": "لمزيد من المعلومات حول إمكانية الوصول إلى هذا المنتج، يُرجى التواصل مع الناشر: ", title: "ملخص إمكانية الوصول" }, "additional-accessibility-information": { aria: { compact: "أدوار ARIA مدرَجة", descriptive: "يتم تعزيز المحتوى باستخدام أدوار ARIA لتحسين التنظيم وتيسير التنقّل" }, "audio-descriptions": "الوصف الصوتي", braille: "برايل", "color-not-sole-means-of-conveying-information": "اللون ليس الوسيلة الوحيدة لنقل المعلومات", "dyslexia-readability": "سهولة القراءة لذوي عُسر القراءة", "full-ruby-annotations": "شروح روبي كاملة", "high-contrast-between-foreground-and-background-audio": "تباين عالٍ بين الصوت الرئيسي وصوت الخلفية", "high-contrast-between-text-and-background": "تباين عالٍ بين النص والخلفية", "large-print": "خط كبير", "page-breaks": { compact: "فواصل الصفحات متضمَّنة", descriptive: "فواصل الصفحات متضمَّنة من المصدر المطبوع الأصلي" }, "ruby-annotations": "بعض شروح الروبي", "sign-language": "لغة الإشارة", "tactile-graphics": { compact: "الرسوم اللمسية مدرجة", descriptive: "تم دمج الرسوم اللمسية لتيسير الوصول إلى العناصر البصرية للأشخاص المكفوفين" }, "tactile-objects": "مجسمات لمسية ثلاثية الأبعاد", "text-to-speech-hinting": "إرشادات تحويل النص إلى كلام (TTS)متوفرة", title: "معلومات إضافية عن إمكانية الوصول", "ultra-high-contrast-between-text-and-background": "تباين عالٍ جدًا بين النص والخلفية", "visible-page-numbering": "ترقيم صفحات مرئي", "without-background-sounds": "من دون أصوات في خلفية" }, conformance: { a: { compact: "هذا المنشور يفي بالمعايير الدنيا لإمكانية الوصول", descriptive: "يحتوي هذا المنشور على بيان مطابقة يفيد بأنه يفي بمعيار إمكانية الوصول في EPUB وبمستوى A من معيار WCAG 2" }, aa: { compact: "هذا المنشور يفي بالمعايير المعتمدة لإمكانية الوصول", descriptive: "يحتوي هذا المنشور على بيان مطابقة يفيد بأنه يفي بمعيار إمكانية الوصول في EPUB وبمستوى AA من معيار WCAG 2" }, aaa: { compact: "هذا المنشور يفوق المعايير المقبولة لإمكانية الوصول", descriptive: "يحتوي هذا المنشور على بيان مطابقة يفيد بأنه يفي بمعيار إمكانية الوصول في EPUB وبمستوى AAA من معيار WCAG 2" }, certifier: "تم اعتماد هذا المنشور من قبل ", "certifier-credentials": "بيانات اعتماد جهة التصديق ", details: { "certification-info": "تم اعتماد هذا المنشور في تاريخ ", "certifier-report": "لمزيد من المعلومات، يرجى الرجوع إلى تقرير جهة التصديق", claim: "يدّعي هذا المنشور أنه يستوفي", "epub-accessibility-1-0": "معيار إمكانية الوصول لـ EPUB إصدار 1.0", "epub-accessibility-1-1": "معيار إمكانية الوصول لـ EPUB إصدار 1.1", "level-a": "المستوى A", "level-aa": "المستوى AA", "level-aaa": "المستوى AAA", "wcag-2-0": { compact: "WCAG 2.0", descriptive: "مبادئ النفاذ إلى محتوى الويب (WCAG) 2.0" }, "wcag-2-1": { compact: "WCAG 2.1", descriptive: "مبادئ النفاذ إلى محتوى الويب (WCAG) 2.1" }, "wcag-2-2": { compact: "WCAG 2.2", descriptive: "مبادئ النفاذ إلى محتوى الويب (WCAG) 2.2" } }, "details-title": "معلومات تفصيلية عن مدى المطابقة", no: "لا تتوفر أي معلومات", title: "المطابقة", "unknown-standard": "لا يمكن التأكد من مدى مطابقة هذا المنشور للمعايير المقبولة لإمكانية الوصول" }, hazards: { flashing: { compact: "محتوى وامض", descriptive: "يحتوي هذا المنشور على محتوى وامض قد يسبب نوبات حساسة للضوء" }, "flashing-none": { compact: "لا توجد مخاطر وميض", descriptive: "لا يحتوي هذا المنشور على محتوى وامض قد يسبب نوبات حساسة للضوء" }, "flashing-unknown": { compact: "مخاطر الوميض غير معروفة", descriptive: "لم يُمكن التأكد من وجود محتوى وامض قد يسبب نوبات حساسية للضوء" }, motion: { compact: "محاكاة الحركة", descriptive: "يحتوي المنشور على محاكاة حركة قد تسبّب دوار الحركة" }, "motion-none": { compact: "لا توجد مخاطر محاكاة الحركة", descriptive: "لا يحتوي المنشور على محاكاة حركة قد تسبّب دوار الحركة" }, "motion-unknown": { compact: "مخاطر محاكاة الحركة غير معروفة", descriptive: "تعذّر تحديد ما إذا كانت هناك محاكاة للحركة قد تُسبب دوار الحركة" }, "no-metadata": "لا تتوفر أي معلومات", none: { compact: "لا توجد مخاطر", descriptive: "لا يحتوي المنشور على أي مخاطر" }, sound: { compact: "أصوات", descriptive: "يحتوي المنشور على أصوات قد تؤدي إلى مشاكل حساسية صوتية" }, "sound-none": { compact: "لا توجد مخاطر صوتية", descriptive: "لا يحتوي المنشور على أصوات قد تؤدي إلى مشاكل حساسية صوتية" }, "sound-unknown": { compact: "مخاطر الصوت غير معروفة", descriptive: "تعذّر تحديد ما إذا كانت هناك أصوات قد تُسبب مشكلات في الحساسية" }, title: "مخاطر", unknown: "وجود المخاطر غير معروف" }, "legal-considerations": { exempt: { compact: "يُعلن عن استثناء من متطلبات إمكانية الوصول من بعض السلطات القضائية", descriptive: "يُصرّح هذا المنشور بوجود استثناء من متطلبات إمكانية الوصول من بعض السلطات القضائية" }, "no-metadata": "لا تتوفر أي معلومات", title: "اعتبارات قانونية" }, navigation: { index: { compact: "كشاف", descriptive: "كشاف يحتوي على روابط إلى الإدخالات المشار إليها" }, "no-metadata": "لا تتوفر أي معلومات", "page-navigation": { compact: "الانتقال إلى صفحة", descriptive: "قائمة الصفحات للانتقال إلى صفحات من النسخة المطبوعة الأصلية" }, structural: { compact: "العناوين", descriptive: "عناصر مثل العناوين والجداول وغيرها للتنقل المنظّم" }, title: "التنقل", toc: { compact: "جدول المحتويات", descriptive: "جدول المحتويات لكل فصول النص عبر روابط" } }, "rich-content": { "accessible-chemistry-as-latex": { compact: "الصيغ الكيميائية بصيغة LaTeX", descriptive: "الصيغ الكيميائية بشكل ميسر (LaTeX)" }, "accessible-chemistry-as-mathml": { compact: "الصيغ الكيميائية بصيغة MathML", descriptive: "الصيغ الكيميائية بشكل ميسر (MathML)" }, "accessible-math-as-latex": { compact: "الرياضيات بصيغة LaTeX", descriptive: "الصيغ الرياضية بشكل ميسر (LaTeX)" }, "accessible-math-described": "تتوفر أوصاف نصية للصيغ الرياضية", "closed-captions": { compact: "تحتوي الفيديوهات على شروح مغلقة", descriptive: "الفيديوهات الموجودة في المنشورات تحتوي على شروح مغلقة" }, "extended-descriptions": "يتم وصف الصور الغنية بالمعلومات بأوصاف مفصّلة", "math-as-mathml": { compact: "الرياضيات بصيغة MathML", descriptive: "الصيغ الرياضية بشكل ميسر(MathML)" }, "open-captions": { compact: "تحتوي الفيديوهات على شروح مدمجة", descriptive: "الفيديوهات الموجودة في المنشورات تحتوي على شروح مدمجة" }, title: "محتوى غني", transcript: "يتوفر نص(نصوص)", unknown: "لا تتوفر أي معلومات" }, "ways-of-reading": { "nonvisual-reading": { "alt-text": { compact: "يحتوي على نص بديل", descriptive: "يحتوي على أوصاف نصية بديلة للصور" }, "no-metadata": "لا تتوفر معلومات عن القراءة غير البصرية", none: { compact: "غير قابل للقراءة بصوتٍ عالٍ أو بطريقة برايل الديناميكية", descriptive: "المحتوى غير قابل للقراءة بصوتٍ عالٍ أو بطريقة برايل الديناميكية" }, "not-fully": { compact: "غير قابل للقراءة بالكامل بصوتٍ عالٍ أو بطريقة برايل الديناميكية", descriptive: "لن يكون كل المحتوى قابلًا للقراءة بصوتٍ عالٍ أو بطريقة برايل الديناميكية" }, readable: { compact: "قابل للقراءة بصوتٍ عالٍ أو بطريقة برايل الديناميكية", descriptive: "يمكن قراءة كل المحتوى بصوتٍ عالٍ أو بطريقة برايل الديناميكية" } }, "prerecorded-audio": { complementary: { compact: "مقاطع الصوت المسجّلة مسبقًا", descriptive: "مقاطع الصوت المسجّلة مسبقًا مدمجة في المحتوى" }, "no-metadata": "لا توجد معلومات عن الصوت المسجّل مسبقًا", only: { compact: "الصوت المسجّل مسبقًا فقط", descriptive: "كتاب صوتي بدون بديل نصي" }, synchronized: { compact: "صوت مسجّل مسبقًا متزامن مع النص", descriptive: "كل المحتوى متوفر كصوت مسجّل مسبقًا متزامن مع النص" } }, title: "طرق القراءة", "visual-adjustments": { modifiable: { compact: "يمكن تعديل المظهر", descriptive: "يمكن تعديل مظهر النص وتخطيط الصفحة وفقاً لإمكانات نظام القراءة (اسم الخط وحجمه، والمسافات بين الفقرات والجمل والكلمات والأحرف، بالإضافة إلى لون الخلفية والنص)" }, unknown: "لا توجد معلومات عن إمكانية تعديل المظهر", unmodifiable: { compact: "لا يمكن تعديل المظهر", descriptive: "لا يمكن تعديل مظهر النص وتخطيط الصفحات لأن تجربة القراءة قريبة من النسخة المطبوعة، ولكن تطبيقات القراءة ما زالت تتيح خيارات التكبير" } } } } }, altIdentifier_one: "رمز تعريفي بديل", altIdentifier_other: "رموز تعريفية بديلة", artist_one: "فنان", artist_other: "فنانون", author_one: "مؤلف", author_other: "مؤلفون", collection_one: "سلسلة تحريرية", collection_other: "سلاسل تحريرية", colorist_one: "ملوّن الألوان", colorist_other: "ملوّنو الألوان", contributor_one: "مساهم", contributor_other: "مساهمون", description: "وصف", duration: "مدة", editor_one: "محرر", editor_other: "محررون", identifier_one: "رمز تعريفي", identifier_other: "رموز تعريفية", illustrator_one: "رسًام", illustrator_other: "رسامون", imprint_one: "العلامة التجارية للنشر", imprint_other: "العلامات التجارية للنشر", inker_one: "مُحَبِّر", inker_other: "مُحَبِّرون", language_one: "اللغة", language_other: "اللغات", letterer_one: "خطّاط", letterer_other: "خطّاطون", modified: "تاريخ التعديل", narrator_one: "قارئ صوتي", narrator_other: "قرّاء صوتيون", numberOfPages: "عدد الصفحات في النسخة المطبوعة", penciler_one: "رسّام أولي", penciler_other: "رسّامون أوّليون", published: "تاريخ النشر", publisher_one: "ناشر", publisher_other: "ناشرون", series_one: "سلسلة", series_other: "سلاسل", subject_one: "موضوع", subject_other: "مواضيع", subtitle: "عنوان فرعي", title: "العنوان", translator_one: "مترجم", translator_other: "مترجمون" } }, t = {
2
- publication: e
3
- };
4
- export {
5
- t as default,
6
- e as publication
7
- };
@@ -1,7 +0,0 @@
1
- const e = { metadata: { accessibility: { "display-guide": { "accessibility-summary": { "no-metadata": "Ingen information tilgængelig", "publisher-contact": "For mere information om tilgængeligheden af denne bog, kontakt venligst udgiveren: ", title: "Tilgængeligheds-oversigt" }, "additional-accessibility-information": { aria: { compact: "Indeholder ARIA roller", descriptive: "Indhold forbedres med ARIA-roller for at optimere organisering og gøre navigation lettere" }, "audio-descriptions": "Lydbeskrivelser", braille: "Punktskrift (braille)", "color-not-sole-means-of-conveying-information": "Information gives ikke udelukkende via farver", "dyslexia-readability": "Læsbarhed for ordblinde", "full-ruby-annotations": 'Indeholder såkalde "ruby" notationer (til asiatiske sprog)', "high-contrast-between-foreground-and-background-audio": "Høj kontrast imellem forgrunds- og baggrunds-lyd", "high-contrast-between-text-and-background": "Høj kontrast imellem tekst og baggrunden", "large-print": "Forstørret tekst", "page-breaks": { compact: "Indeholder sideskift", descriptive: "Indeholder sideskift fra den trykte version af bogen" }, "ruby-annotations": 'Nogle "ruby" annotationer (til asiatiske sprog)', "sign-language": "Tegnsprog", "tactile-graphics": { compact: "Indeholder taktil grafik", descriptive: "Indeholder taktil grafik for at muliggøre adgang til visuel information for blinde" }, "tactile-objects": "Taktile 3D objekter", "text-to-speech-hinting": "Udtaleforbedringer til syntetisk tale", title: "Yderligere information om tilgængelighed", "ultra-high-contrast-between-text-and-background": "Ultra høj kontrast imellem tekst og baggrund", "visible-page-numbering": "Synlige sidenumre", "without-background-sounds": "Uden baggrundslyd" }, conformance: { a: { compact: "Denne bog overholder minimum-tilgængelighedskravene", descriptive: "Denne bog en overensstemmelseserklæring om, at den opfylder EPUB Tilgængelighedskrav og WCAG 2 standarden på niveau A" }, aa: { compact: "Denne bog lever op til de accepterede tilgængelighedskrav", descriptive: "Denne bog en overensstemmelseserklæring om, at den opfylder EPUB Tilgængelighedskrav og WCAG 2 standarden på niveau AA" }, aaa: { compact: "Denne bog mere end opfylder de accepterede tilgængelighedskrav", descriptive: "Denne bog en overensstemmelseserklæring om, at den opfylder EPUB Tilgængelighedskrav og WCAG 2 standarden på niveau AAA" }, certifier: "Denne bog blev certificeret af ", "certifier-credentials": "Certificeringsorganets legitimationsoplysninger er ", details: { "certification-info": "Bogen blev certificeret den ", "certifier-report": "Se certificeringsorganets rapport for mere information", claim: "Denne bog hævder at opfylde", "epub-accessibility-1-0": "EPUB Tilgængelighed 1.0", "epub-accessibility-1-1": "EPUB Tilgængelighed 1.1", "level-a": "Niveau A", "level-aa": "Niveau AA", "level-aaa": "Niveau AAA", "wcag-2-0": { compact: "WCAG 2.0", descriptive: "Retningslinjer for tilgængeligt webindhold (WCAG) 2.0" }, "wcag-2-1": { compact: "WCAG 2.1", descriptive: "Retningslinjer for tilgængeligt webindhold (WCAG) 2.1" }, "wcag-2-2": { compact: "WCAG 2.2", descriptive: "Retningslinjer for tilgængeligt webindhold (WCAG) 2.2" } }, "details-title": "Detaljeret overholdelses-information", no: "Ingen information tilgængelig", title: "Overholdelse", "unknown-standard": "Overholdelse af de accepterede tilgængelighedskrav kan ikke vurderes for denne bog" }, hazards: { flashing: { compact: "Blinkende indhold", descriptive: "Bogen indeholder blinkende indhold der kan forårsage epileptiske anfald" }, "flashing-none": { compact: "Ingen blinkende indhold", descriptive: "Bogen indeholder ikke noget blinkende indhold, der kunne forårsage epileptiske anfald" }, "flashing-unknown": { compact: "Ingen information om bogen har blinkende indhold", descriptive: "Det kunne ikke afgøres om bogen indeholder blinkende indhold der kan lede til epileptiske anfald" }, motion: { compact: "Simuleret bevægelse", descriptive: "Bogen indeholder simuleret bevægelse, der kan forårsage en følelse af køresyge" }, "motion-none": { compact: "Indeholder ikke simuleret bevægelse", descriptive: "Denne bog indeholder ikke noget indhold med simuleret bevægelse, der kunne lede til en følelse af køresyge" }, "motion-unknown": { compact: "Ingen information om simuleret bevægelse", descriptive: "Det kunne ikke vurderes om bogen indeholder simuleret bevægelse, der kan lede til en følelse af køresyge" }, "no-metadata": "Ingen information tilgængelig", none: { compact: "Ingen farer", descriptive: "Bogen indeholder ikke noget indhold der kategoriseres som farligt" }, sound: { compact: "Lyde", descriptive: "Bogen indeholder lyde der kan være ubehagelige hvis man er sensitiv overfor lyde" }, "sound-none": { compact: "Ingen ubehagelige lyde", descriptive: "Bogen indeholder ikke lyde der kunne opleves som ubehagelige hvis man er sensitiv overfor lyde" }, "sound-unknown": { compact: "Ingen information om ubehagelige lyde", descriptive: "Det kunne ikke afgøres om bogen indeholder ubehagelige lyde" }, title: "Farer", unknown: "Ingen information om farligt indhold" }, "legal-considerations": { exempt: { compact: "Gør krav på undtagelser fra tilgængelighedskrav", descriptive: "Denne bog gør krav på en tilgængelighedsundtagelse i en eller flere jurisdiktioner" }, "no-metadata": "Ingen information tilgængelig", title: "Juridiske overvejelser" }, navigation: { index: { compact: "Indholdsfortegnelse", descriptive: "Indholdsfortegnelse med links til referencer" }, "no-metadata": "Ingen information tilgængelig", "page-navigation": { compact: "Gå til side", descriptive: "Sideliste for at gå til sider fra den trykte kildeversion" }, structural: { compact: "Overskrifter", descriptive: "Elementer så som overskrifter og tabeller til struktureret navigation" }, title: "Navigation", toc: { compact: "Indholdsfortegnelse", descriptive: "Indholdsfortegnelse med links til alle kapitler" } }, "rich-content": { "accessible-chemistry-as-latex": { compact: "Kemiske formularer i LaTeX", descriptive: "Kemiske formularer i tilgængeligt format (LaTeX)" }, "accessible-chemistry-as-mathml": { compact: "Kemiske formularer i MathML notation", descriptive: "Kemiske formularer i tilgængeligt format (MathML)" }, "accessible-math-as-latex": { compact: "Matematik som LaTeX", descriptive: "Matematikformler i tilgængeligt format (LaTeX)" }, "accessible-math-described": "Tekstbeskrivelser til matematiske formler", "closed-captions": { compact: "Videoer har undertekster", descriptive: "Videoer der optræder i bogen har undertekster" }, "extended-descriptions": "Informationsrige billeder beskrives med udvidede beskrivelser", "math-as-mathml": { compact: "Matematik som MathML", descriptive: "Matematiske formler i tilgængeligt format (MathML)" }, "open-captions": { compact: "Videoer har indlejrede undertekster", descriptive: "Videoer der optræder i bogen har indlejrede undertekster" }, title: "Komplekst indhold", transcript: "Indeholder transskription(er)", unknown: "Ingen information tilgængelig" }, "ways-of-reading": { "nonvisual-reading": { "alt-text": { compact: "Har alternativ tekst", descriptive: "Har billedbeskrivelser" }, "no-metadata": "Ingen information omkring ikke-visuel læsning", none: { compact: "Ikke læsbar med oplæsning eller dynamisk punktskrift", descriptive: "Dette indhold er ikke læsbart med oplæsning eller dynamisk punktskrift" }, "not-fully": { compact: "Ikke fuldt læsbar med oplæsning eller dynamisk punktskrift", descriptive: "Alt indholdet er ikke fuldt læsbart med oplæsning eller dynamisk punktskrift" }, readable: { compact: "Læsbar med oplæsning eller dynamisk punktskrift", descriptive: "Alt indholdet er læsbart med oplæsning eller dynamisk punktskrift" } }, "prerecorded-audio": { complementary: { compact: "Indlæste lydklip", descriptive: "Indlæste lydklip er indlejret i indholdet" }, "no-metadata": "Ingen information om indlæst lyd", only: { compact: "Kun indlæst lyd", descriptive: "Lydbog uden tekst alternativer" }, synchronized: { compact: "Indlæst lyd med synkroniseret tekst", descriptive: "Alt indholdet er tilgængeligt med indlæst lyd og synkroniseret tekst" } }, title: "Læseformer", "visual-adjustments": { modifiable: { compact: "Udseende kan ændres", descriptive: "Udseende af tekst og sidelayout kan ændres, så vidt muligt i læsesystemet (skrifttype, skriftstørrelse, afstand mellem afsnit, sætninger, ord og bogstaver, samt farven på tekst og baggrund)" }, unknown: "Ingen information om mulighed for ændring af udseende", unmodifiable: { compact: "Udseende kan ikke ændres", descriptive: "Tekst og sidelayout kan ikke ændres, da læseoplevelsen afspejler den trykte version af materialet. Læsesystemet kan dog stadig give mulighed for zoom" } } } } }, altIdentifier_one: "alternativt ID", altIdentifier_other: "alternative ID'er", artist_one: "kunstner", artist_other: "kunstnere", author_one: "forfatter", author_other: "forfattere", collection_one: "redaktionel samling", collection_other: "redaktionelle samlinger", colorist_one: "farvelægger", colorist_other: "farvelæggere", contributor_one: "bidragsyder", contributor_other: "bidragsydere", description: "beskrivelse", duration: "varighed", editor_one: "redaktør", editor_other: "redaktører", identifier_one: "ID", identifier_other: "ID'er", illustrator_one: "illustrator", illustrator_other: "illustratorer", imprint_one: "trykkeri", imprint_other: "trykkerier", inker_one: "tegner", inker_other: "tegnere", language_one: "sprog", language_other: "sprog", letterer_one: "taleboble-forfatter", letterer_other: "taleboble-forfattere", modified: "rettet dato", narrator_one: "indlæser", narrator_other: "indlæsere", numberOfPages: "printbare sider", penciler_one: "tegneseriekunstner", penciler_other: "tegneseriekunstnere", published: "udgivelsesdato", publisher_one: "udgiver", publisher_other: "udgivere", series_one: "serie", series_other: "serier", subject_one: "emne", subject_other: "emner", subtitle: "undertitel", title: "titel", translator_one: "oversætter", translator_other: "oversættere" } }, i = {
2
- publication: e
3
- };
4
- export {
5
- i as default,
6
- e as publication
7
- };