-
Notifications
You must be signed in to change notification settings - Fork 33
0027 alternative page order #638
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 16 commits
9a83fa5
9ecf57f
bd73b91
a806ffb
3e1d602
49684ac
577a9dd
8560805
c5c54c7
f75bea2
a0638ce
6b288ee
5857c86
8142e8b
448a12e
b7ae3e3
bb79130
08d9201
966dc22
5460d65
76a7c7f
9367c1d
4ebd91e
260646f
861dc34
37a52d0
3f166a0
66b40ce
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,51 @@ | ||
| --- | ||
| title: Alternative Page Order | ||
| id: 27 | ||
| layout: recipe | ||
| tags: [book, presentation] | ||
| summary: "Using Ranges to offer alternative orderings of book pages." | ||
| viewers: | ||
| topic: | ||
| - structure | ||
| --- | ||
|
|
||
| ## Use Case | ||
|
|
||
| A book may contain pages in the incorrect order; for example, a codex which was rebound at some point in history may have certain folios or quires accidentally misplaced. You want to digitally represent the book object in its current order while offering users the option to browse its contents in the intended order. | ||
|
|
||
| ## Implementation Notes | ||
|
|
||
| In Presentation API 3.0, setting a Range's `behavior` value to `sequence` allows you to define a specific viewing order for Canvases that differs from the default order in the Manifest’s `items` property. | ||
| There may be more than one Range, each representing an alternative sequence of items (for example, alternative orderings of book pages). The `items` of each Range are an array of referenced Canvases. The first Range should act as the default ordering, and any additional Ranges should be available for the user to select. | ||
| For an IIIF viewer to display the selectable Ranges, each Range should have a `label`. Additionally, for the viewer to be able to use the provided Ranges for ordering purposes, they must have the `behavior` value `sequence`. | ||
|
|
||
| When `behavior` is set to `sequence`, "user interfaces that interact with this order should use the order within the selected Range, rather than the default order of items" ([Presentation API 3.0](https://iiif.io/api/presentation/3.0/#54-range)). | ||
| Furthermore, the behavior property can be assigned to a list containing, besides `sequence`, other valid behaviors listed on the [behaviors section of the Presentation API](https://iiif.io/api/presentation/3.0/#behavior). These behaviors will work in combination with any behaviors inherited from the parent Manifest. | ||
|
||
|
|
||
| Other properties of the Range, such as `viewingDirection`, can be set to control the intended visualization of the Range. | ||
|
|
||
| ## Restrictions | ||
|
|
||
| Ranges with `behavior` set to `sequence` indicate that they define an alternative reading order. Therefore, they: | ||
| - "must be directly within the `structures` property of the Manifest, and must not be embedded or referenced within other Ranges" (see [Range section](https://iiif.io/api/presentation/3.0/#54-range)). This ensures that clients can easily locate all available sequences without traversing or resolving nested structures. | ||
|
||
| - cannot have `thumbnail-nav` or `no-nav` behaviors. | ||
|
||
|
|
||
| ## Example | ||
|
|
||
| These manuscript folios are an excerpt from the original draft of the 1895 novel _Piccolo mondo antico_ by novelist and Nobel Prize Nominee for Literature, Antonio Fogazzaro. The original autograph numbering in pen (384, 385, [386], 387) is incorrect, so archivists noted the correct reading order in pencil: 171r (387), 171v (384), 172r (385), 172v ([386]). | ||
|
|
||
| Two ranges are provided within the `structures` to represent this case study. From the two Ranges with the `behavior` value `sequence`, the first Range should be used as the navigation default, and the other should be selectable. | ||
|
|
||
| Images provided by permission of [Biblioteca Civica Bertoliana](https://www.bibliotecabertoliana.it/). | ||
|
|
||
| {% include manifest_links.html viewers="" manifest="manifest.json" %} | ||
|
|
||
| {% include jsonviewer.html src="manifest.json" config='data-line="200-261"' %} | ||
|
|
||
| ## Related Recipes | ||
|
|
||
| * [Simple Manifest - Book][0009] shows an example where the order of the pages follows the order in the `items` property. | ||
| * [Table of Contents for Book Chapters][0024] shows how to use Ranges to create a table of contents rather than to represent alternative orders. | ||
|
|
||
| {% include acronyms.md %} | ||
| {% include links.md %} | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,262 @@ | ||
| { | ||
| "@context": "http://iiif.io/api/presentation/3/context.json", | ||
| "id": "{{ id.url }}", | ||
| "type": "Manifest", | ||
| "label": { | ||
| "en": [ | ||
| "Alternative Page Order" | ||
| ] | ||
| }, | ||
| "provider": [ | ||
| { | ||
| "id": "https://www.bibliotecabertoliana.it/", | ||
| "type": "Agent", | ||
| "label": { | ||
| "en": [ | ||
| "Biblioteca Civica Bertoliana" | ||
| ] | ||
| }, | ||
| "homepage": [ | ||
| { | ||
| "id": "https://www.bibliotecabertoliana.it/", | ||
| "type": "Text", | ||
| "label": { | ||
| "en": [ | ||
| "Biblioteca Civica Bertoliana Homepage" | ||
| ] | ||
| }, | ||
| "format": "text/html" | ||
| } | ||
| ], | ||
| "logo": [ | ||
| { | ||
| "id": "https://www.bibliotecabertoliana.it/img/logo-bertoliana.png", | ||
| "type": "Image", | ||
| "format": "image/png", | ||
| "height": 346, | ||
| "width": 89 | ||
| } | ||
| ] | ||
| } | ||
| ], | ||
| "items": [ | ||
| { | ||
| "id": "{{ id.path }}/canvas/p1", | ||
| "type": "Canvas", | ||
| "label": { | ||
| "en": [ | ||
| "171r (387)" | ||
| ] | ||
| }, | ||
| "height": 3184, | ||
| "width": 2156, | ||
| "items": [ | ||
| { | ||
| "id": "{{ id.path }}/page/p1/1", | ||
| "type": "AnnotationPage", | ||
| "items": [ | ||
| { | ||
| "id": "{{ id.path }}/annotation/p0001-image", | ||
| "type": "Annotation", | ||
| "motivation": "painting", | ||
| "body": { | ||
| "id": "https://iiif.io/api/image/3.0/example/reference/3ec31f43ce55cfcc076804c88c06aa43-CF-f0186r_aVISNK_387/full/max/0/default.jpg", | ||
| "type": "Image", | ||
| "format": "image/jpeg", | ||
| "height": 3184, | ||
| "width": 2156, | ||
| "service": [ | ||
| { | ||
| "id": "https://iiif.io/api/image/3.0/example/reference/3ec31f43ce55cfcc076804c88c06aa43-CF-f0186r_aVISNK_387", | ||
| "type": "ImageService3", | ||
| "profile": "level1" | ||
| } | ||
| ] | ||
| }, | ||
| "target": "{{ id.path }}/canvas/p1" | ||
| } | ||
| ] | ||
| } | ||
| ] | ||
| }, | ||
| { | ||
| "id": "{{ id.path }}/canvas/p2", | ||
| "type": "Canvas", | ||
| "label": { | ||
| "en": [ | ||
| "171v (384)" | ||
| ] | ||
| }, | ||
| "height": 3184, | ||
| "width": 2156, | ||
| "items": [ | ||
| { | ||
| "id": "{{ id.path }}/page/p2/1", | ||
| "type": "AnnotationPage", | ||
| "items": [ | ||
| { | ||
| "id": "{{ id.path }}/annotation/p0002-image", | ||
| "type": "Annotation", | ||
| "motivation": "painting", | ||
| "body": { | ||
| "id": "https://iiif.io/api/image/3.0/example/reference/3ec31f43ce55cfcc076804c88c06aa43-CF-f0186v_aVISNK_384/full/max/0/default.jpg", | ||
| "type": "Image", | ||
| "format": "image/jpeg", | ||
| "height": 3184, | ||
| "width": 2156, | ||
| "service": [ | ||
| { | ||
| "id": "https://iiif.io/api/image/3.0/example/reference/3ec31f43ce55cfcc076804c88c06aa43-CF-f0186v_aVISNK_384", | ||
| "type": "ImageService3", | ||
| "profile": "level1" | ||
| } | ||
| ] | ||
| }, | ||
| "target": "{{ id.path }}/canvas/p2" | ||
| } | ||
| ] | ||
| } | ||
| ] | ||
| }, | ||
| { | ||
| "id": "{{ id.path }}/canvas/p3", | ||
| "type": "Canvas", | ||
| "label": { | ||
| "en": [ | ||
| "172r (385)" | ||
| ] | ||
| }, | ||
| "height": 3184, | ||
| "width": 2156, | ||
| "items": [ | ||
| { | ||
| "id": "{{ id.path }}/page/p3/1", | ||
| "type": "AnnotationPage", | ||
| "items": [ | ||
| { | ||
| "id": "{{ id.path }}/annotation/p0003-image", | ||
| "type": "Annotation", | ||
| "motivation": "painting", | ||
| "body": { | ||
| "id": "https://iiif.io/api/image/3.0/example/reference/3ec31f43ce55cfcc076804c88c06aa43-CF-f0187r_aVISNK_385/full/max/0/default.jpg", | ||
| "type": "Image", | ||
| "format": "image/jpeg", | ||
| "height": 3184, | ||
| "width": 2156, | ||
| "service": [ | ||
| { | ||
| "id": "https://iiif.io/api/image/3.0/example/reference/3ec31f43ce55cfcc076804c88c06aa43-CF-f0187r_aVISNK_385", | ||
| "type": "ImageService3", | ||
| "profile": "level1" | ||
| } | ||
| ] | ||
| }, | ||
| "target": "{{ id.path }}/canvas/p3" | ||
| } | ||
| ] | ||
| } | ||
| ] | ||
| }, | ||
| { | ||
| "id": "{{ id.path }}/canvas/p4", | ||
| "type": "Canvas", | ||
| "label": { | ||
| "en": [ | ||
| "172v ([386])" | ||
| ] | ||
| }, | ||
| "height": 3184, | ||
| "width": 2156, | ||
| "items": [ | ||
| { | ||
| "id": "{{ id.path }}/page/p4/1", | ||
| "type": "AnnotationPage", | ||
| "items": [ | ||
| { | ||
| "id": "{{ id.path }}/annotation/p0004-image", | ||
| "type": "Annotation", | ||
| "motivation": "painting", | ||
| "body": { | ||
| "id": "https://iiif.io/api/image/3.0/example/reference/3ec31f43ce55cfcc076804c88c06aa43-CF-f0187v_aVISNK_386/full/max/0/default.jpg", | ||
| "type": "Image", | ||
| "format": "image/jpeg", | ||
| "height": 3184, | ||
| "width": 2156, | ||
| "service": [ | ||
| { | ||
| "id": "https://iiif.io/api/image/3.0/example/reference/3ec31f43ce55cfcc076804c88c06aa43-CF-f0187v_aVISNK_386", | ||
| "type": "ImageService3", | ||
| "profile": "level1" | ||
| } | ||
| ] | ||
| }, | ||
| "target": "{{ id.path }}/canvas/p4" | ||
| } | ||
| ] | ||
| } | ||
| ] | ||
| } | ||
| ], | ||
| "structures": [ | ||
| { | ||
| "id": "{{ id.path }}/range/r1", | ||
| "type": "Range", | ||
| "behavior": [ | ||
| "sequence" | ||
| ], | ||
| "label": { | ||
| "en": [ | ||
| "Corrected Page Order" | ||
| ] | ||
| }, | ||
| "items": [ | ||
| { | ||
| "id": "{{ id.path }}/canvas/p1", | ||
| "type": "Canvas" | ||
| }, | ||
| { | ||
| "id": "{{ id.path }}/canvas/p2", | ||
| "type": "Canvas" | ||
| }, | ||
| { | ||
| "id": "{{ id.path }}/canvas/p3", | ||
| "type": "Canvas" | ||
| }, | ||
| { | ||
| "id": "{{ id.path }}/canvas/p4", | ||
| "type": "Canvas" | ||
| } | ||
| ] | ||
| }, | ||
| { | ||
| "id": "{{ id.path }}/range/r2", | ||
| "type": "Range", | ||
| "behavior": [ | ||
| "sequence" | ||
| ], | ||
| "label": { | ||
| "en": [ | ||
| "Original Page Order" | ||
| ] | ||
| }, | ||
| "items": [ | ||
| { | ||
| "id": "{{ id.path }}/canvas/p2", | ||
| "type": "Canvas" | ||
| }, | ||
| { | ||
| "id": "{{ id.path }}/canvas/p3", | ||
| "type": "Canvas" | ||
| }, | ||
| { | ||
| "id": "{{ id.path }}/canvas/p4", | ||
| "type": "Canvas" | ||
| }, | ||
| { | ||
| "id": "{{ id.path }}/canvas/p1", | ||
| "type": "Canvas" | ||
| } | ||
| ] | ||
| } | ||
| ] | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here you mention representing the book in its current order, then having intended order as the secondary option, but the example shows the reverse - should the example match the use case as described?