From 74c04918f5f2c73c7b9993e3df309d50f646989f Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 7 Jun 2024 09:14:04 -0400 Subject: [PATCH 01/50] =?UTF-8?q?Took=20a=20first=20pass=20at=20a=20multim?= =?UTF-8?q?edia=20Canvas=20recipe=201=EF=B8=8F=E2=83=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Initial commit to version control ⚡️ --- recipe/0489-multimedia-canvas/index.md | 50 +++++++++++++++++++++ recipe/0489-multimedia-canvas/manifest.json | 49 ++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 recipe/0489-multimedia-canvas/index.md create mode 100644 recipe/0489-multimedia-canvas/manifest.json diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md new file mode 100644 index 000000000..0cebd1cf3 --- /dev/null +++ b/recipe/0489-multimedia-canvas/index.md @@ -0,0 +1,50 @@ +--- +title: Multimedia Canvas +id: 499 +layout: recipe +tags: Complex Object +summary: "tbc" +viewers: + - Annona + - UV + - Mirador + - Clover + - Glycerine +topic: + - complex +--- + +## Use Case + +You want to engage in some form of digital storytelling with one or more AV resources painted onto the same Canvas as a still image that will serve as a background. You want part of the still image to remain visible behind any video AV resources while they play. This storytelling might happen in the context of teaching narrative techniques in curricular settings, as a component of scholarly communications around research output, or for other reasons and in other contexts. + +## Implementation Notes + +This recipe pulls together techniques and structures described in previous recipes. +Multiple `item`s on one Canvas as in 0036 +Differing dimensions of a resource and Canvas as in 0004 but sizing and placing the resource +New: Mixing video (AV) and still image resources + +## Restrictions + +No restrictions known. + +## Example + +Describe the solution in prose and provide an example. +The example json document must be an external document, and imported with the following: + +{% include manifest_links.html manifest="manifest.json" %} + +{% include jsonviewer.html src="manifest.json" %} + +The direct link to the fixture is a useful convenience. + +## Related Recipes + +* [Simple Image Manifest][0001] +* [Image and Canvas with Differing Dimensions][0004] for thinking through relative dimensioning of a resource and a Canvas + +{% include acronyms.md %} +{% include links.md %} + diff --git a/recipe/0489-multimedia-canvas/manifest.json b/recipe/0489-multimedia-canvas/manifest.json new file mode 100644 index 000000000..1942bd727 --- /dev/null +++ b/recipe/0489-multimedia-canvas/manifest.json @@ -0,0 +1,49 @@ +{ + "@context": "http://iiif.io/api/presentation/3/context.json", + "id": "{{ id.url }}", + "type": "Manifest", + "label": { "en": [ "Multimedia Canvas" ] }, + "items": [ + { + "id": "{{ id.path }}/canvas", + "type": "Canvas", + "height": 1800, + "width": 1200, + "items": [ + { + "id": "{{ id.path }}/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "{{ id.path }}/annotation/p0001-image", + "type": "Annotation", + "motivation": "painting", + "body": { + "id": "http://iiif.io/api/presentation/2.1/example/fixtures/resources/page1-full.png", + "type": "Image", + "format": "image/png", + "height": 1800, + "width": 1200 + }, + "target": "{{ id.path }}/canvas" + }, + { + "id": "{{ id.path }}/annotation/p0002-video q", + "type": "Annotation", + "motivation": "painting", + "body": { + "id": "https://fixtures.iiif.io/video/indiana/lunchroom_manners/high/lunchroom_manners_1024kb.mp4", + "type": "Video", + "height": 360, + "width": 480, + "duration": 572.034, + "format": "video/mp4" + }, + "target": "{{ id.path }}/canvas#xywh=200,200,480,360" + } + ] + } + ] + } + ] + } From ed1e3ce8e28f91e622947b16c6103231256c2447 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 7 Jun 2024 09:58:07 -0400 Subject: [PATCH 02/50] =?UTF-8?q?Replaced=20original=20resources=20with=20?= =?UTF-8?q?more=20nearly=20preferred=20ones=20=F0=9F=9A=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/manifest.json | 33 +++++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/recipe/0489-multimedia-canvas/manifest.json b/recipe/0489-multimedia-canvas/manifest.json index 1942bd727..eb0958baa 100644 --- a/recipe/0489-multimedia-canvas/manifest.json +++ b/recipe/0489-multimedia-canvas/manifest.json @@ -7,8 +7,8 @@ { "id": "{{ id.path }}/canvas", "type": "Canvas", - "height": 1800, - "width": 1200, + "height": 3024, + "width": 4032, "items": [ { "id": "{{ id.path }}/page/p1/1", @@ -19,11 +19,18 @@ "type": "Annotation", "motivation": "painting", "body": { - "id": "http://iiif.io/api/presentation/2.1/example/fixtures/resources/page1-full.png", + "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", "type": "Image", - "format": "image/png", - "height": 1800, - "width": 1200 + "format": "image/jpeg", + "height": 3024, + "width": 4032, + "service": [ + { + "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", + "profile": "level1", + "type": "ImageService3" + } + ] }, "target": "{{ id.path }}/canvas" }, @@ -32,14 +39,14 @@ "type": "Annotation", "motivation": "painting", "body": { - "id": "https://fixtures.iiif.io/video/indiana/lunchroom_manners/high/lunchroom_manners_1024kb.mp4", - "type": "Video", - "height": 360, - "width": 480, - "duration": 572.034, - "format": "video/mp4" + "id": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low_act_1.mp4", + "type": "Video", + "format": "video/mp4", + "height": 360, + "width": 480, + "duration": 3971.24 }, - "target": "{{ id.path }}/canvas#xywh=200,200,480,360" + "target": "{{ id.path }}/canvas#xywh=200,200,480,360&t=27,57" } ] } From 50e776aa89de73a27458260e85d4606d30c57057 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 7 Jun 2024 09:58:53 -0400 Subject: [PATCH 03/50] =?UTF-8?q?Set=20topic=20to=20real=20matrix=20option?= =?UTF-8?q?=20=F0=9F=94=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 0cebd1cf3..911112f7a 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -11,7 +11,7 @@ viewers: - Clover - Glycerine topic: - - complex + - annotation --- ## Use Case From 6f08ad050dabc754e147f45e6d68a2723b8c5a51 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 7 Jun 2024 10:39:13 -0400 Subject: [PATCH 04/50] =?UTF-8?q?Added=20recipe=20to=20TOC=20=F0=9F=93=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _includes/links.md | 1 + index.md | 1 + 2 files changed, 2 insertions(+) diff --git a/_includes/links.md b/_includes/links.md index 3f4bb003e..a35b9ff36 100644 --- a/_includes/links.md +++ b/_includes/links.md @@ -71,6 +71,7 @@ [0377]: {{ site.cookbook_url | absolute_url }}/recipe/0377-image-in-annotation/ "Image in annotation" [0434]: {{ site.cookbook_url | absolute_url }}/recipe/0434-choice-av/ "Multiple Choice of Audio Formats in a Single View (Canvas)" +[0489]: {{ site.cookbook_url | absolute_url }}/recipe/0489-multimedia-canvas/ "Complex Multimedia Canvas" [cookbook-process]: {{site.cookbook_url | absolute_url }}/recipe diff --git a/index.md b/index.md index ff51db561..9743dc5d0 100644 --- a/index.md +++ b/index.md @@ -113,6 +113,7 @@ _(leading on to segmentation examples later)_ * [Multiple choice of images in a single view][0033] (29) * [Foldouts, Flaps, and Maps][0035] * [Composition from Multiple Images][0036] (30,31) +* [Complex Multimedia Canvas][0489] * Multiple images and multiple choices (32,33,34) * [Annotating part of an image to a Canvas][recipe-segment-image-part] (e.g., crop out scanner) (35,36,37,38) * [Image Rotation Two Ways][0040] From 4dce5d9fb8c7603cc5d40bca8c57b5934c5d6fa4 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 7 Jun 2024 10:39:47 -0400 Subject: [PATCH 05/50] =?UTF-8?q?Corrected=20Glycerine=20to=20full=20prope?= =?UTF-8?q?r=20name=20=F0=9F=9B=A0=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 911112f7a..60b05e095 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -9,7 +9,7 @@ viewers: - UV - Mirador - Clover - - Glycerine + - Glycerine Viewer topic: - annotation --- From 795330fe9a6e98e1b82b00e9a260762e6d416e1f Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 7 Jun 2024 10:40:34 -0400 Subject: [PATCH 06/50] =?UTF-8?q?Added=20duration=20property=20as=20in=20r?= =?UTF-8?q?eference=20example=20=E2=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/recipe/0489-multimedia-canvas/manifest.json b/recipe/0489-multimedia-canvas/manifest.json index eb0958baa..432371b4d 100644 --- a/recipe/0489-multimedia-canvas/manifest.json +++ b/recipe/0489-multimedia-canvas/manifest.json @@ -9,6 +9,7 @@ "type": "Canvas", "height": 3024, "width": 4032, + "duration": 120, "items": [ { "id": "{{ id.path }}/page/p1/1", From 8b767f27c2161ea3909b6046d400192308948951 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Tue, 25 Jun 2024 10:30:48 -0400 Subject: [PATCH 07/50] =?UTF-8?q?Remove=20typo=20=F0=9F=9A=AE=F0=9F=A4=A6?= =?UTF-8?q?=F0=9F=8F=BB=E2=80=8D=E2=99=82=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Stephen Fraser --- recipe/0489-multimedia-canvas/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/0489-multimedia-canvas/manifest.json b/recipe/0489-multimedia-canvas/manifest.json index 432371b4d..4412ef7ed 100644 --- a/recipe/0489-multimedia-canvas/manifest.json +++ b/recipe/0489-multimedia-canvas/manifest.json @@ -36,7 +36,7 @@ "target": "{{ id.path }}/canvas" }, { - "id": "{{ id.path }}/annotation/p0002-video q", + "id": "{{ id.path }}/annotation/p0002-video", "type": "Annotation", "motivation": "painting", "body": { From 905009982ae8e5012ef38bad09e1e8c42ce907cd Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 12 Jul 2024 10:07:39 -0400 Subject: [PATCH 08/50] =?UTF-8?q?Created=20a=20decent=20working=20example?= =?UTF-8?q?=20=F0=9F=98=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/manifest.json | 40 +++++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/recipe/0489-multimedia-canvas/manifest.json b/recipe/0489-multimedia-canvas/manifest.json index 4412ef7ed..daa2bf645 100644 --- a/recipe/0489-multimedia-canvas/manifest.json +++ b/recipe/0489-multimedia-canvas/manifest.json @@ -9,7 +9,7 @@ "type": "Canvas", "height": 3024, "width": 4032, - "duration": 120, + "duration": 41, "items": [ { "id": "{{ id.path }}/page/p1/1", @@ -33,21 +33,47 @@ } ] }, - "target": "{{ id.path }}/canvas" + "target": "{{ id.path }}/canvas#t=11,41" }, { "id": "{{ id.path }}/annotation/p0002-video", "type": "Annotation", "motivation": "painting", "body": { - "id": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low_act_1.mp4", + "id": "https://fixtures.iiif.io/video/indiana/30-minute-clock/medium/30-minute-clock.mp4", "type": "Video", - "format": "video/mp4", "height": 360, - "width": 480, - "duration": 3971.24 + "width": 640, + "duration": 1801.055, + "format": "video/mp4" }, - "target": "{{ id.path }}/canvas#xywh=200,200,480,360&t=27,57" + "target": "{{ id.path }}/canvas#xywh=200,200,360,640&t=11,41" + }, + { + "id": "{{ id.path }}/annotation/p0004-text", + "type": "Annotation", + "motivation": "painting", + "body": { + "id": "{{ id.path }}/annotation/p0004-text-body", + "type": "TextualBody", + "format": "text/html", + "value": "

Press Play

", + "language": "fr" + }, + "target": "{{ id.path }}/canvas#xywh=1920,1640,500,500&t=0,1" + }, + { + "id": "{{ id.path }}/annotation/p0005-text", + "type": "Annotation", + "motivation": "painting", + "body": { + "id": "{{ id.path }}/annotation/p0005-text-body", + "type": "TextualBody", + "format": "text/html", + "value": "

When this text goes away, the clock will start. When it starts, you will have 30 seconds in which to take notes on the image you see. After 30 seconds, everything will disappear.

", + "language": "fr" + }, + "target": "{{ id.path }}/canvas#xywh=1920,1640,500,500&t=1,11" } ] } From 659d884cff29c892be732a3fcafbcdf0d8045bc6 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 12 Jul 2024 10:26:34 -0400 Subject: [PATCH 09/50] =?UTF-8?q?Sketched=20out=20a=20direction=20for=20th?= =?UTF-8?q?e=20text.=20=E2=9C=8F=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 60b05e095..cf4154860 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -5,25 +5,23 @@ layout: recipe tags: Complex Object summary: "tbc" viewers: - - Annona - - UV - - Mirador - - Clover - - Glycerine Viewer topic: - annotation --- ## Use Case -You want to engage in some form of digital storytelling with one or more AV resources painted onto the same Canvas as a still image that will serve as a background. You want part of the still image to remain visible behind any video AV resources while they play. This storytelling might happen in the context of teaching narrative techniques in curricular settings, as a component of scholarly communications around research output, or for other reasons and in other contexts. +You want to create a digital assignment by providing students with a IIIF image resource to analyze in a fixed amount of time, a timer to show students how long they have, and text instructions for how to complete the assignment. You want to keep everything in one IIIF viewer. ## Implementation Notes -This recipe pulls together techniques and structures described in previous recipes. +This recipe pulls together techniques and structures described in previous recipes, but also adds new elements. + Multiple `item`s on one Canvas as in 0036 + Differing dimensions of a resource and Canvas as in 0004 but sizing and placing the resource -New: Mixing video (AV) and still image resources + +The new elements include mixing AV and image IIIF resources, setting an image to be visible for an amount of time, and resizing an AV resource. ## Restrictions @@ -31,8 +29,7 @@ No restrictions known. ## Example -Describe the solution in prose and provide an example. -The example json document must be an external document, and imported with the following: +[Theseus Viewer temporary link](https://theseus-viewer.netlify.app/?iiif-content={{ id.path }}/manifest.json) {% include manifest_links.html manifest="manifest.json" %} From 10f2d775d6742b15c075a7bee0fbbbbd75acfb70 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Thu, 18 Jul 2024 10:45:19 -0400 Subject: [PATCH 10/50] =?UTF-8?q?Temporarily=20suppress=20validation=20?= =?UTF-8?q?=E2=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/preview.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 79e41ad02..36d624717 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -70,8 +70,8 @@ jobs: python -m pip install --upgrade pip pip install -r scripts/requirements.txt - - name: validate - run: scripts/validate.sh +# - name: validate +# run: scripts/validate.sh - name: add URL to config run: .github/bin/addURL.sh From 4344ffc00e99611164d74ea00c8d9eeef7705de4 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Thu, 18 Jul 2024 08:42:43 -0400 Subject: [PATCH 11/50] =?UTF-8?q?Corrected=20an=20ID=20=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/manifest.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/recipe/0489-multimedia-canvas/manifest.json b/recipe/0489-multimedia-canvas/manifest.json index daa2bf645..2238ec3e0 100644 --- a/recipe/0489-multimedia-canvas/manifest.json +++ b/recipe/0489-multimedia-canvas/manifest.json @@ -54,7 +54,6 @@ "type": "Annotation", "motivation": "painting", "body": { - "id": "{{ id.path }}/annotation/p0004-text-body", "type": "TextualBody", "format": "text/html", "value": "

Press Play

", @@ -67,7 +66,6 @@ "type": "Annotation", "motivation": "painting", "body": { - "id": "{{ id.path }}/annotation/p0005-text-body", "type": "TextualBody", "format": "text/html", "value": "

When this text goes away, the clock will start. When it starts, you will have 30 seconds in which to take notes on the image you see. After 30 seconds, everything will disappear.

", From 2fb9bdbaf0bda973ec9c6606f2e90ebd9ee77e2d Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Thu, 18 Jul 2024 08:43:09 -0400 Subject: [PATCH 12/50] =?UTF-8?q?Began=20fleshing=20out=20the=20implementa?= =?UTF-8?q?tion=20notes=20=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index cf4154860..33c539755 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -15,13 +15,7 @@ You want to create a digital assignment by providing students with a IIIF image ## Implementation Notes -This recipe pulls together techniques and structures described in previous recipes, but also adds new elements. - -Multiple `item`s on one Canvas as in 0036 - -Differing dimensions of a resource and Canvas as in 0004 but sizing and placing the resource - -The new elements include mixing AV and image IIIF resources, setting an image to be visible for an amount of time, and resizing an AV resource. +This recipe pulls together techniques and structures described in other recipes, and adds new elements. In other recipes, this cookbook shows [how to place multiple resources on a single Canvas][0036] and how to work with [a resource with different dimensions than its Canvas][0004]. In the Use Case for this recipe, the aim is to mix AV and image IIIF resources, set an image to be visible for an amount of time, and resize and position an AV resource on a Canvas. ## Restrictions From 1f22f9edfa203c9837643f4402f266cc9ea4fb4d Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 19 Jul 2024 12:35:15 -0400 Subject: [PATCH 13/50] =?UTF-8?q?Replaced=20image=20with=20museum=20one=20?= =?UTF-8?q?for=20authenticity=20=F0=9F=94=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Conformed other elements as well --- recipe/0489-multimedia-canvas/manifest.json | 44 ++++++++++----------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/recipe/0489-multimedia-canvas/manifest.json b/recipe/0489-multimedia-canvas/manifest.json index 2238ec3e0..d374e2cb8 100644 --- a/recipe/0489-multimedia-canvas/manifest.json +++ b/recipe/0489-multimedia-canvas/manifest.json @@ -7,8 +7,8 @@ { "id": "{{ id.path }}/canvas", "type": "Canvas", - "height": 3024, - "width": 4032, + "height": 31722, + "width": 70399, "duration": 41, "items": [ { @@ -17,23 +17,23 @@ "items": [ { "id": "{{ id.path }}/annotation/p0001-image", - "type": "Annotation", - "motivation": "painting", - "body": { - "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", - "type": "Image", - "format": "image/jpeg", - "height": 3024, - "width": 4032, - "service": [ - { - "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", + "type": "Annotation", + "motivation": "painting", + "body": { + "id": "https://iiif.io/api/image/3.0/example/reference/36ca0a3370db128ec984b33d71a1543d-100320001004/full/full/0/default.jpg", + "type": "Image", + "format": "image/jpeg", + "height": 31722, + "width": 70399, + "service": [ + { + "id": "https://iiif.io/api/image/3.0/example/reference/36ca0a3370db128ec984b33d71a1543d-100320001004", "profile": "level1", "type": "ImageService3" - } - ] - }, - "target": "{{ id.path }}/canvas#t=11,41" + } + ] + }, + "target": "{{ id.path }}/canvas#t=11,42" }, { "id": "{{ id.path }}/annotation/p0002-video", @@ -47,7 +47,7 @@ "duration": 1801.055, "format": "video/mp4" }, - "target": "{{ id.path }}/canvas#xywh=200,200,360,640&t=11,41" + "target": "{{ id.path }}/canvas#xywh=1000,500,5000,6000&t=11,42" }, { "id": "{{ id.path }}/annotation/p0004-text", @@ -56,10 +56,10 @@ "body": { "type": "TextualBody", "format": "text/html", - "value": "

Press Play

", + "value": "

Press Play

", "language": "fr" }, - "target": "{{ id.path }}/canvas#xywh=1920,1640,500,500&t=0,1" + "target": "{{ id.path }}/canvas#xywh=30200,10200,15000,5000&t=0,1" }, { "id": "{{ id.path }}/annotation/p0005-text", @@ -68,10 +68,10 @@ "body": { "type": "TextualBody", "format": "text/html", - "value": "

When this text goes away, the clock will start. When it starts, you will have 30 seconds in which to take notes on the image you see. After 30 seconds, everything will disappear.

", + "value": "

In 10 seconds, this text will be replaced by a clock and an image. You will have 30 seconds (shown on the clock) in which to take notes on the image you see. After 30 seconds, the image will be replaced by the start screen. You will not be responsible for the part of the image covered by the clock.

", "language": "fr" }, - "target": "{{ id.path }}/canvas#xywh=1920,1640,500,500&t=1,11" + "target": "{{ id.path }}/canvas#xywh=20220,5000,30000,5000&t=1,11" } ] } From c5e82844dfb1cf51cda95c810295a8825a901e2e Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 19 Jul 2024 12:37:08 -0400 Subject: [PATCH 14/50] =?UTF-8?q?Corrected=20language=20for=20text=20annot?= =?UTF-8?q?ations=20=F0=9F=A4=A6=F0=9F=8F=BB=E2=80=8D=E2=99=82=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipe/0489-multimedia-canvas/manifest.json b/recipe/0489-multimedia-canvas/manifest.json index d374e2cb8..cc3e8a0e6 100644 --- a/recipe/0489-multimedia-canvas/manifest.json +++ b/recipe/0489-multimedia-canvas/manifest.json @@ -57,7 +57,7 @@ "type": "TextualBody", "format": "text/html", "value": "

Press Play

", - "language": "fr" + "language": "en" }, "target": "{{ id.path }}/canvas#xywh=30200,10200,15000,5000&t=0,1" }, @@ -69,7 +69,7 @@ "type": "TextualBody", "format": "text/html", "value": "

In 10 seconds, this text will be replaced by a clock and an image. You will have 30 seconds (shown on the clock) in which to take notes on the image you see. After 30 seconds, the image will be replaced by the start screen. You will not be responsible for the part of the image covered by the clock.

", - "language": "fr" + "language": "en" }, "target": "{{ id.path }}/canvas#xywh=20220,5000,30000,5000&t=1,11" } From 07e1df4f40802abac4515f48fd305ac30ea8767f Mon Sep 17 00:00:00 2001 From: giacomounivr Date: Fri, 2 Aug 2024 16:57:03 +0200 Subject: [PATCH 15/50] First draft --- _includes/links.md | 2 + index.md | 1 + .../annotation.json | 14 +++ .../0485-contentstate-canvas-region/index.md | 96 +++++++++++++++++++ 4 files changed, 113 insertions(+) create mode 100644 recipe/0485-contentstate-canvas-region/annotation.json create mode 100644 recipe/0485-contentstate-canvas-region/index.md diff --git a/_includes/links.md b/_includes/links.md index c609ac312..ae70a9668 100644 --- a/_includes/links.md +++ b/_includes/links.md @@ -72,6 +72,8 @@ [0466]: {{ site.cookbook_url | absolute_url }}/recipe/0466-link-for-loading-manifest/ "Loading a manifest with a viewer using a link" +[0485]: {{ site.cookbook_url | absolute_url }}/recipe/0485-contentstate-canvas-region/ "Open a specific region of a canvas in a viewer" + [0434]: {{ site.cookbook_url | absolute_url }}/recipe/0434-choice-av/ "Multiple Choice of Audio Formats in a Single View (Canvas)" [cookbook-process]: {{site.cookbook_url | absolute_url }}/recipe diff --git a/index.md b/index.md index 327c8e848..7660e4acb 100644 --- a/index.md +++ b/index.md @@ -139,6 +139,7 @@ _(leading on to segmentation examples later)_ Recipes using [Content State API](https://iiif.io/api/content-state/1.0/) * [Loading a manifest with a viewer using a link][0466] +* [Open a specific region of a canvas in a viewer][0485] ## Technical diff --git a/recipe/0485-contentstate-canvas-region/annotation.json b/recipe/0485-contentstate-canvas-region/annotation.json new file mode 100644 index 000000000..f0e75c0bc --- /dev/null +++ b/recipe/0485-contentstate-canvas-region/annotation.json @@ -0,0 +1,14 @@ +{ + "@context": "http://iiif.io/api/presentation/3/context.json", + "id": "https://example.org/import/1", + "type": "Annotation", + "motivation": ["contentState"], + "target": { + "id": "https://iiif.io/api/cookbook/recipe/0009-book-1/canvas/p2#xywh=1528,3024,344,408", + "type": "Canvas", + "partOf": [{ + "id": "https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json", + "type": "Manifest" + }] + } + } \ No newline at end of file diff --git a/recipe/0485-contentstate-canvas-region/index.md b/recipe/0485-contentstate-canvas-region/index.md new file mode 100644 index 000000000..1e60c9a6f --- /dev/null +++ b/recipe/0485-contentstate-canvas-region/index.md @@ -0,0 +1,96 @@ +--- +title: Open a specific region of a canvas in a viewer +id: 485 +layout: recipe +tags: [annotation] +summary: "Allows users to use content state API to open a specific region of a canvas by means of supported viewers." +viewers: + - Mirador + - Clover +topic: + - content-state +--- + +## Use Case + +I want to share a link to highlight a detail in a specific region of an image. I want to share a portion of a digitized manuscript text allowing the user an easy access to the rest of the manuscript. + +Institutions might want to use this recipe for sharing portions of their object through social media allowing a direct link to the viewer for improving the users interaction with the digitized content. A scholar who finds a relevant passage on a manuscript might want to share the precise location with other colleagues, allowing them to check the original source. + +## Implementation Notes + +To implement this feature we must create a request to an entry point of a viewer instance with the necessary information for the viewer to open the Manifest, retrive the Canvas and set the viewport to the desired region. + +[Image API](https://iiif.io/api/image/3.0/#41-region) allows users to share a specific region of an image, however, the context from which the region is extracted is not easily accessible. Instead, sharing a link to a open the specific region with a viewer allows the users to explore other part of the image or related content and metadata present in the Manifest. [link to other recipe] + +This request can be implemented in a standardized manner using the [IIIF Content State API](https://iiif.io/api/content-state), providing the data as values of the `iiif-content` query string parameter as explained in the [API section](https://iiif.io/api/content-state/1.0/#initialization-mechanisms-link). + +We can use the [Web Annotation Data Model](https://www.w3.org/TR/annotation-model/) to encode the information necessary, as shown in [A Region of a Canvas in a Manifest](https://iiif.io/api/content-state/1.0/#51-a-region-of-a-canvas-in-a-manifest) section of the standard. + +However, before passing the data as a query parameter we must encode it as explained in the https://iiif.io/api/content-state/1.0/#6-content-state-encoding. + + +## Example +In this example we want to highlight a portion of an image contained in a book. + +We will use the following manifest shown in the Simple Manifest -Book recipe which is available at the following link: [https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json](https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json) + +We want to open the viewport to a specific region of a canvas using a viewer available at the following page https://example.org/viewer. + +First we create an Annotation: + +``` +{ + "@context": "http://iiif.io/api/presentation/3/context.json", + "id": "https://example.org/import/1", + "type": "Annotation", + "motivation": ["contentState"], + "target": { + "id": "https://iiif.io/api/cookbook/recipe/0009-book-1/canvas/p2#xywh=1528,3024,344,408", + "type": "Canvas", + "partOf": [{ + "id": "https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json", + "type": "Manifest" + }] + } +} +``` + +We can create an Annotation with `motivation` set to `contentState` and a target `type` set to Canvas the `id` of the target will contain a fragment selector with the coordinates of the canvas we want to share, and a `partOf` element containing the `id` of the Manifest containing the Canvas. + +We can now use one of the methods listed in the [examples of content state encoding section](https://iiif.io/api/content-state/1.0/#63-examples-of-content-state-encoding) to generate a base64url string (**note: we removed new lines characters and white spaces for brevity before computing the base64url**). + +We can pass as the encoded value using the query parameter `iiif-content` of the viewer landing page the Manifest URL: +```html +https://example.org/viewer?iiif-content=JTdCJTIyJTQwY29udGV4dCUyMiUzQSUyMmh0dHAlM0ElMkYlMkZpaWlmLmlvJTJGYXBpJTJGcHJlc2VudGF0aW9uJTJGMyUyRmNvbnRleHQuanNvbiUyMiUyQyUyMmlkJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZleGFtcGxlLm9yZyUyRmltcG9ydCUyRjElMjIlMkMlMjJ0eXBlJTIyJTNBJTIyQW5ub3RhdGlvbiUyMiUyQyUyMm1vdGl2YXRpb24lMjIlM0ElNUIlMjJjb250ZW50U3RhdGUlMjIlNUQlMkMlMjJ0YXJnZXQlMjIlM0ElN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZjYW52YXMlMkZwMiUyM3h5d2glM0QxNTI4JTJDMzAyNCUyQzM0NCUyQzQwOCUyMiUyQyUyMnR5cGUlMjIlM0ElMjJDYW52YXMlMjIlMkMlMjJwYXJ0T2YlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZtYW5pZmVzdC5qc29uJTIyJTJDJTIydHlwZSUyMiUzQSUyMk1hbmlmZXN0JTIyJTdEJTVEJTdEJTdE +``` + +Eventually, we can create an anchor tag with the link as the `href` attribute to use in the web page: + +```html +Link for visualizing the region of a Canvas using a viewer. +``` + +**Mirador**: +Link of the viewer: https://projectmirador.org/embed + +Complete link: https://projectmirador.org/embed/?iiif-content=JTdCJTIyJTQwY29udGV4dCUyMiUzQSUyMmh0dHAlM0ElMkYlMkZpaWlmLmlvJTJGYXBpJTJGcHJlc2VudGF0aW9uJTJGMyUyRmNvbnRleHQuanNvbiUyMiUyQyUyMmlkJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZleGFtcGxlLm9yZyUyRmltcG9ydCUyRjElMjIlMkMlMjJ0eXBlJTIyJTNBJTIyQW5ub3RhdGlvbiUyMiUyQyUyMm1vdGl2YXRpb24lMjIlM0ElNUIlMjJjb250ZW50U3RhdGUlMjIlNUQlMkMlMjJ0YXJnZXQlMjIlM0ElN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZjYW52YXMlMkZwMiUyM3h5d2glM0QxNTI4JTJDMzAyNCUyQzM0NCUyQzQwOCUyMiUyQyUyMnR5cGUlMjIlM0ElMjJDYW52YXMlMjIlMkMlMjJwYXJ0T2YlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZtYW5pZmVzdC5qc29uJTIyJTJDJTIydHlwZSUyMiUzQSUyMk1hbmlmZXN0JTIyJTdEJTVEJTdEJTdE + +**Clover**: +https://samvera-labs.github.io/clover-iiif/docs/viewer/demo?iiif-content=JTdCJTIyJTQwY29udGV4dCUyMiUzQSUyMmh0dHAlM0ElMkYlMkZpaWlmLmlvJTJGYXBpJTJGcHJlc2VudGF0aW9uJTJGMyUyRmNvbnRleHQuanNvbiUyMiUyQyUyMmlkJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZleGFtcGxlLm9yZyUyRmltcG9ydCUyRjElMjIlMkMlMjJ0eXBlJTIyJTNBJTIyQW5ub3RhdGlvbiUyMiUyQyUyMm1vdGl2YXRpb24lMjIlM0ElNUIlMjJjb250ZW50U3RhdGUlMjIlNUQlMkMlMjJ0YXJnZXQlMjIlM0ElN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZjYW52YXMlMkZwMiUyM3h5d2glM0QxNTI4JTJDMzAyNCUyQzM0NCUyQzQwOCUyMiUyQyUyMnR5cGUlMjIlM0ElMjJDYW52YXMlMjIlMkMlMjJwYXJ0T2YlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZtYW5pZmVzdC5qc29uJTIyJTJDJTIydHlwZSUyMiUzQSUyMk1hbmlmZXN0JTIyJTdEJTVEJTdEJTdE + +**Glycerine** + +https://demo.viewer.glycerine.io/viewer?iiif-content=iiif-content=JTdCJTIyJTQwY29udGV4dCUyMiUzQSUyMmh0dHAlM0ElMkYlMkZpaWlmLmlvJTJGYXBpJTJGcHJlc2VudGF0aW9uJTJGMyUyRmNvbnRleHQuanNvbiUyMiUyQyUyMmlkJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZleGFtcGxlLm9yZyUyRmltcG9ydCUyRjElMjIlMkMlMjJ0eXBlJTIyJTNBJTIyQW5ub3RhdGlvbiUyMiUyQyUyMm1vdGl2YXRpb24lMjIlM0ElNUIlMjJjb250ZW50U3RhdGUlMjIlNUQlMkMlMjJ0YXJnZXQlMjIlM0ElN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZjYW52YXMlMkZwMiUyM3h5d2glM0QxNTI4JTJDMzAyNCUyQzM0NCUyQzQwOCUyMiUyQyUyMnR5cGUlMjIlM0ElMjJDYW52YXMlMjIlMkMlMjJwYXJ0T2YlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZtYW5pZmVzdC5qc29uJTIyJTJDJTIydHlwZSUyMiUzQSUyMk1hbmlmZXN0JTIyJTdEJTVEJTdEJTdE + +## Related Recipes + +* [Simplest Manifest - Image][0001] shows the basic structure of a IIIF Manifest using presentation API 3.0. +* [A simple book][0009] shows the manifest structure. +* [Link for loading a manifest][0466] another example of content state API. + + + +{% include acronyms.md %} +{% include links.md %} + From 00a5c732dcd509eaf7aad51c2de4387692035c78 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 2 Aug 2024 11:36:47 -0400 Subject: [PATCH 16/50] =?UTF-8?q?Made=20more=20robust=20=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 33c539755..19f7938db 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -17,24 +17,29 @@ You want to create a digital assignment by providing students with a IIIF image This recipe pulls together techniques and structures described in other recipes, and adds new elements. In other recipes, this cookbook shows [how to place multiple resources on a single Canvas][0036] and how to work with [a resource with different dimensions than its Canvas][0004]. In the Use Case for this recipe, the aim is to mix AV and image IIIF resources, set an image to be visible for an amount of time, and resize and position an AV resource on a Canvas. +While other recipes have discussed [simple textual annotations][0266], this recipe changes the motivation for its textual annotations to `painting` to include the text directly and visibly on the Canvas. Each of the annotations in this recipe is bound both by its placement on the Canvas and by its time of visibility. + ## Restrictions No restrictions known. ## Example -[Theseus Viewer temporary link](https://theseus-viewer.netlify.app/?iiif-content={{ id.path }}/manifest.json) +In this example, a still image, a video, and plaintext annotations are combined on a single Canvas to simulate a classroom assignment designed to introduce students to image study and notetaking in a compressed period of time. Note that this example contains material pedagogical design flaws and is not to be used as is for a classroom assignment. + +A person using a viewer that supports this recipe is presented first with the instruction to "Press Play", added using a time-bound plaintext annotation. After pressing play, additional instructions appear, also created using a time-bound plaintext annotation. When the time elapses on this annotation, the person is presented with a clock video overlaid on top of a still image. In the hypothetical assignment, a student would follow the instructions and take notes on the still image while the clock counts up the time allotted. After 30 seconds passes, the still image and clock video disappear, replaced by text instructions to close the browser. + +[Theseus Viewer temporary link](https://theseus-viewer.netlify.app/?iiif-content=http://localhost:4000//recipe/0489-multimedia-canvas/manifest.json) {% include manifest_links.html manifest="manifest.json" %} {% include jsonviewer.html src="manifest.json" %} -The direct link to the fixture is a useful convenience. - ## Related Recipes -* [Simple Image Manifest][0001] -* [Image and Canvas with Differing Dimensions][0004] for thinking through relative dimensioning of a resource and a Canvas +* [Image and Canvas with Differing Dimensions][0004] for relative dimensioning of a resource and a Canvas +* [Simplest Annotation][0266] for a basic textual annotation +* [Composition from Multiple Images][0036] for using multiple IIIF resources on a single Canvas {% include acronyms.md %} {% include links.md %} From 58bf6a3616f08decf73548e2142009cf0ee1ef3e Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 2 Aug 2024 11:38:53 -0400 Subject: [PATCH 17/50] =?UTF-8?q?Added=20dummy=20final=20text=20to=20avoid?= =?UTF-8?q?=20immediate=20loop=20to=20start=20=F0=9F=96=BC=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/manifest.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/recipe/0489-multimedia-canvas/manifest.json b/recipe/0489-multimedia-canvas/manifest.json index cc3e8a0e6..af19e5815 100644 --- a/recipe/0489-multimedia-canvas/manifest.json +++ b/recipe/0489-multimedia-canvas/manifest.json @@ -9,7 +9,7 @@ "type": "Canvas", "height": 31722, "width": 70399, - "duration": 41, + "duration": 180, "items": [ { "id": "{{ id.path }}/page/p1/1", @@ -72,6 +72,18 @@ "language": "en" }, "target": "{{ id.path }}/canvas#xywh=20220,5000,30000,5000&t=1,11" + }, + { + "id": "{{ id.path }}/annotation/p0006-text", + "type": "Annotation", + "motivation": "painting", + "body": { + "type": "TextualBody", + "format": "text/html", + "value": "

Close your browser

", + "language": "en" + }, + "target": "{{ id.path }}/canvas#xywh=27000,10200,25000,5000&t=43,180" } ] } From 951af55da1a4cea00d62843720dc8e143b6b844a Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 2 Aug 2024 12:33:21 -0400 Subject: [PATCH 18/50] =?UTF-8?q?Stepped=20back=20the=20time=20when=20the?= =?UTF-8?q?=20closing=20instrux=20show=20=F0=9F=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/0489-multimedia-canvas/manifest.json b/recipe/0489-multimedia-canvas/manifest.json index af19e5815..89ad96822 100644 --- a/recipe/0489-multimedia-canvas/manifest.json +++ b/recipe/0489-multimedia-canvas/manifest.json @@ -83,7 +83,7 @@ "value": "

Close your browser

", "language": "en" }, - "target": "{{ id.path }}/canvas#xywh=27000,10200,25000,5000&t=43,180" + "target": "{{ id.path }}/canvas#xywh=27000,10200,25000,5000&t=42,180" } ] } From f517cb25e1f96b2e4435cd320ba368f2e4b77ae0 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 2 Aug 2024 16:26:45 -0400 Subject: [PATCH 19/50] =?UTF-8?q?Added=20detail=20about=20not=20using=20ti?= =?UTF-8?q?mings=20for=20precision=20=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 19f7938db..0145e9ddc 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -19,6 +19,8 @@ This recipe pulls together techniques and structures described in other recipes, While other recipes have discussed [simple textual annotations][0266], this recipe changes the motivation for its textual annotations to `painting` to include the text directly and visibly on the Canvas. Each of the annotations in this recipe is bound both by its placement on the Canvas and by its time of visibility. +When using timing for showing and hiding resources on a Canvas, a high degree of precision is not likely to be achieved for all people viewing the Canvas. Resources may load slowly for many reasons, including on the IIIF image server side, for network traffic reasons, or from customizations in a person's browser. Except in a very predictable environment, timing should be considered approximate + ## Restrictions No restrictions known. @@ -27,7 +29,7 @@ No restrictions known. In this example, a still image, a video, and plaintext annotations are combined on a single Canvas to simulate a classroom assignment designed to introduce students to image study and notetaking in a compressed period of time. Note that this example contains material pedagogical design flaws and is not to be used as is for a classroom assignment. -A person using a viewer that supports this recipe is presented first with the instruction to "Press Play", added using a time-bound plaintext annotation. After pressing play, additional instructions appear, also created using a time-bound plaintext annotation. When the time elapses on this annotation, the person is presented with a clock video overlaid on top of a still image. In the hypothetical assignment, a student would follow the instructions and take notes on the still image while the clock counts up the time allotted. After 30 seconds passes, the still image and clock video disappear, replaced by text instructions to close the browser. +A person using a viewer that supports this recipe is presented first with the instruction to "Press Play", added using a time-bound plaintext annotation. After pressing play, additional instructions appear, also created using a time-bound plaintext annotation. When the time elapses on this annotation, the person is presented with a clock video overlaid on top of a still image. In the hypothetical assignment, a student would follow the instructions and take notes on the still image while the clock counts up the time allotted. After 30 seconds passes, the still image and clock video disappear, replaced by text instructions to close the browser. (These final instructions stay visible for approximately 2-1/2 minutes to avoid an immediate return to the initial instructions.) [Theseus Viewer temporary link](https://theseus-viewer.netlify.app/?iiif-content=http://localhost:4000//recipe/0489-multimedia-canvas/manifest.json) From 5387df845cf2d37bd9969135d46e8521eff2271c Mon Sep 17 00:00:00 2001 From: giacomounivr Date: Fri, 9 Aug 2024 13:45:49 +0200 Subject: [PATCH 20/50] post-cookbook meeting comments --- .../0485-contentstate-canvas-region/index.md | 51 ++++++++----------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/recipe/0485-contentstate-canvas-region/index.md b/recipe/0485-contentstate-canvas-region/index.md index 1e60c9a6f..06f5e885d 100644 --- a/recipe/0485-contentstate-canvas-region/index.md +++ b/recipe/0485-contentstate-canvas-region/index.md @@ -2,44 +2,45 @@ title: Open a specific region of a canvas in a viewer id: 485 layout: recipe -tags: [annotation] +tags: [annotation, content-state] summary: "Allows users to use content state API to open a specific region of a canvas by means of supported viewers." viewers: - - Mirador - - Clover topic: - content-state --- ## Use Case -I want to share a link to highlight a detail in a specific region of an image. I want to share a portion of a digitized manuscript text allowing the user an easy access to the rest of the manuscript. +I want to share a link to highlight a detail in a specific region of an image. I want to share a portion of a digitized manuscript text, allowing the user easy access to the rest of the manuscript. -Institutions might want to use this recipe for sharing portions of their object through social media allowing a direct link to the viewer for improving the users interaction with the digitized content. A scholar who finds a relevant passage on a manuscript might want to share the precise location with other colleagues, allowing them to check the original source. +Institutions might want to use this recipe to share portions of their object through social media, allowing a direct link to the viewer to improve the user's interaction with the digitized content. A scholar who finds a relevant passage in a manuscript might want to share the precise location with other colleagues, allowing them to check the original source. ## Implementation Notes -To implement this feature we must create a request to an entry point of a viewer instance with the necessary information for the viewer to open the Manifest, retrive the Canvas and set the viewport to the desired region. +To implement this feature, we must create a request to an entry point of a viewer instance with the necessary information for the viewer to open the Manifest, retrieve the Canvas and set the viewport to the desired region. -[Image API](https://iiif.io/api/image/3.0/#41-region) allows users to share a specific region of an image, however, the context from which the region is extracted is not easily accessible. Instead, sharing a link to a open the specific region with a viewer allows the users to explore other part of the image or related content and metadata present in the Manifest. [link to other recipe] +[Image API](https://iiif.io/api/image/3.0/#41-region) allows users to share a specific region of an image. However, the context from which the region is extracted is not easily accessible. Instead, sharing a link to open the specific region with a viewer allows the users to explore another part of the image or related content and metadata in the Manifest. This request can be implemented in a standardized manner using the [IIIF Content State API](https://iiif.io/api/content-state), providing the data as values of the `iiif-content` query string parameter as explained in the [API section](https://iiif.io/api/content-state/1.0/#initialization-mechanisms-link). -We can use the [Web Annotation Data Model](https://www.w3.org/TR/annotation-model/) to encode the information necessary, as shown in [A Region of a Canvas in a Manifest](https://iiif.io/api/content-state/1.0/#51-a-region-of-a-canvas-in-a-manifest) section of the standard. +We can use the [Web Annotation Data Model](https://www.w3.org/TR/annotation-model/) to encode the information necessary, as shown in ["A Region of a Canvas in a Manifest"](https://iiif.io/api/content-state/1.0/#51-a-region-of-a-canvas-in-a-manifest) section of the standard. -However, before passing the data as a query parameter we must encode it as explained in the https://iiif.io/api/content-state/1.0/#6-content-state-encoding. +However, before passing the data as a query parameter, we must encode it as explained in the [content state encoding guidelines](https://iiif.io/api/content-state/1.0/#6-content-state-encoding). ## Example -In this example we want to highlight a portion of an image contained in a book. +In this example, we want to highlight a portion of an image contained in a book. -We will use the following manifest shown in the Simple Manifest -Book recipe which is available at the following link: [https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json](https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json) +We will use the following manifest shown in the Simple Manifest -Book recipe, which is available at the following link: [https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json](https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json) -We want to open the viewport to a specific region of a canvas using a viewer available at the following page https://example.org/viewer. +We want to open the viewport to a specific canvas region using a viewer available on the following page `https://example.org/viewer`. -First we create an Annotation: +First, we create an Annotation: -``` +{% include manifest_links.html manifest="annotation.json" %} + + +```json { "@context": "http://iiif.io/api/presentation/3/context.json", "id": "https://example.org/import/1", @@ -51,19 +52,17 @@ First we create an Annotation: "partOf": [{ "id": "https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json", "type": "Manifest" - }] - } + }] + } } ``` -We can create an Annotation with `motivation` set to `contentState` and a target `type` set to Canvas the `id` of the target will contain a fragment selector with the coordinates of the canvas we want to share, and a `partOf` element containing the `id` of the Manifest containing the Canvas. +We can create an Annotation with `motivation` set to `contentState` and a target `type` set to Canvas the `id` of the target will contain a fragment selector with the coordinates of the canvas we want to share, while the `partOf` element has the `id` of the Manifest containing the Canvas. -We can now use one of the methods listed in the [examples of content state encoding section](https://iiif.io/api/content-state/1.0/#63-examples-of-content-state-encoding) to generate a base64url string (**note: we removed new lines characters and white spaces for brevity before computing the base64url**). +We can now use one of the methods listed in the [examples of content state encoding section](https://iiif.io/api/content-state/1.0/#63-examples-of-content-state-encoding) to generate a base64url string (**note: for brevity, we removed new lines characters and white spaces before computing the base64url**). We can pass as the encoded value using the query parameter `iiif-content` of the viewer landing page the Manifest URL: -```html -https://example.org/viewer?iiif-content=JTdCJTIyJTQwY29udGV4dCUyMiUzQSUyMmh0dHAlM0ElMkYlMkZpaWlmLmlvJTJGYXBpJTJGcHJlc2VudGF0aW9uJTJGMyUyRmNvbnRleHQuanNvbiUyMiUyQyUyMmlkJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZleGFtcGxlLm9yZyUyRmltcG9ydCUyRjElMjIlMkMlMjJ0eXBlJTIyJTNBJTIyQW5ub3RhdGlvbiUyMiUyQyUyMm1vdGl2YXRpb24lMjIlM0ElNUIlMjJjb250ZW50U3RhdGUlMjIlNUQlMkMlMjJ0YXJnZXQlMjIlM0ElN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZjYW52YXMlMkZwMiUyM3h5d2glM0QxNTI4JTJDMzAyNCUyQzM0NCUyQzQwOCUyMiUyQyUyMnR5cGUlMjIlM0ElMjJDYW52YXMlMjIlMkMlMjJwYXJ0T2YlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZtYW5pZmVzdC5qc29uJTIyJTJDJTIydHlwZSUyMiUzQSUyMk1hbmlmZXN0JTIyJTdEJTVEJTdEJTdE -``` +[https://example.org/viewer?iiif-content=JTdCJTIyJTQwY29udGV4dCUyMiUzQSUyMmh0dHAlM0ElMkYlMkZpaWlmLmlvJTJGYXBpJTJGcHJlc2VudGF0aW9uJTJGMyUyRmNvbnRleHQuanNvbiUyMiUyQyUyMmlkJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZleGFtcGxlLm9yZyUyRmltcG9ydCUyRjElMjIlMkMlMjJ0eXBlJTIyJTNBJTIyQW5ub3RhdGlvbiUyMiUyQyUyMm1vdGl2YXRpb24lMjIlM0ElNUIlMjJjb250ZW50U3RhdGUlMjIlNUQlMkMlMjJ0YXJnZXQlMjIlM0ElN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZjYW52YXMlMkZwMiUyM3h5d2glM0QxNTI4JTJDMzAyNCUyQzM0NCUyQzQwOCUyMiUyQyUyMnR5cGUlMjIlM0ElMjJDYW52YXMlMjIlMkMlMjJwYXJ0T2YlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZtYW5pZmVzdC5qc29uJTIyJTJDJTIydHlwZSUyMiUzQSUyMk1hbmlmZXN0JTIyJTdEJTVEJTdEJTdE](https://example.org/) Eventually, we can create an anchor tag with the link as the `href` attribute to use in the web page: @@ -71,17 +70,11 @@ Eventually, we can create an anchor tag with the link as the `href` attribute to Link for visualizing the region of a Canvas using a viewer. ``` -**Mirador**: -Link of the viewer: https://projectmirador.org/embed - -Complete link: https://projectmirador.org/embed/?iiif-content=JTdCJTIyJTQwY29udGV4dCUyMiUzQSUyMmh0dHAlM0ElMkYlMkZpaWlmLmlvJTJGYXBpJTJGcHJlc2VudGF0aW9uJTJGMyUyRmNvbnRleHQuanNvbiUyMiUyQyUyMmlkJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZleGFtcGxlLm9yZyUyRmltcG9ydCUyRjElMjIlMkMlMjJ0eXBlJTIyJTNBJTIyQW5ub3RhdGlvbiUyMiUyQyUyMm1vdGl2YXRpb24lMjIlM0ElNUIlMjJjb250ZW50U3RhdGUlMjIlNUQlMkMlMjJ0YXJnZXQlMjIlM0ElN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZjYW52YXMlMkZwMiUyM3h5d2glM0QxNTI4JTJDMzAyNCUyQzM0NCUyQzQwOCUyMiUyQyUyMnR5cGUlMjIlM0ElMjJDYW52YXMlMjIlMkMlMjJwYXJ0T2YlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZtYW5pZmVzdC5qc29uJTIyJTJDJTIydHlwZSUyMiUzQSUyMk1hbmlmZXN0JTIyJTdEJTVEJTdEJTdE +Examples of viewers implementing this recipe: -**Clover**: -https://samvera-labs.github.io/clover-iiif/docs/viewer/demo?iiif-content=JTdCJTIyJTQwY29udGV4dCUyMiUzQSUyMmh0dHAlM0ElMkYlMkZpaWlmLmlvJTJGYXBpJTJGcHJlc2VudGF0aW9uJTJGMyUyRmNvbnRleHQuanNvbiUyMiUyQyUyMmlkJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZleGFtcGxlLm9yZyUyRmltcG9ydCUyRjElMjIlMkMlMjJ0eXBlJTIyJTNBJTIyQW5ub3RhdGlvbiUyMiUyQyUyMm1vdGl2YXRpb24lMjIlM0ElNUIlMjJjb250ZW50U3RhdGUlMjIlNUQlMkMlMjJ0YXJnZXQlMjIlM0ElN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZjYW52YXMlMkZwMiUyM3h5d2glM0QxNTI4JTJDMzAyNCUyQzM0NCUyQzQwOCUyMiUyQyUyMnR5cGUlMjIlM0ElMjJDYW52YXMlMjIlMkMlMjJwYXJ0T2YlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZtYW5pZmVzdC5qc29uJTIyJTJDJTIydHlwZSUyMiUzQSUyMk1hbmlmZXN0JTIyJTdEJTVEJTdEJTdE +None -**Glycerine** -https://demo.viewer.glycerine.io/viewer?iiif-content=iiif-content=JTdCJTIyJTQwY29udGV4dCUyMiUzQSUyMmh0dHAlM0ElMkYlMkZpaWlmLmlvJTJGYXBpJTJGcHJlc2VudGF0aW9uJTJGMyUyRmNvbnRleHQuanNvbiUyMiUyQyUyMmlkJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZleGFtcGxlLm9yZyUyRmltcG9ydCUyRjElMjIlMkMlMjJ0eXBlJTIyJTNBJTIyQW5ub3RhdGlvbiUyMiUyQyUyMm1vdGl2YXRpb24lMjIlM0ElNUIlMjJjb250ZW50U3RhdGUlMjIlNUQlMkMlMjJ0YXJnZXQlMjIlM0ElN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZjYW52YXMlMkZwMiUyM3h5d2glM0QxNTI4JTJDMzAyNCUyQzM0NCUyQzQwOCUyMiUyQyUyMnR5cGUlMjIlM0ElMjJDYW52YXMlMjIlMkMlMjJwYXJ0T2YlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZtYW5pZmVzdC5qc29uJTIyJTJDJTIydHlwZSUyMiUzQSUyMk1hbmlmZXN0JTIyJTdEJTVEJTdEJTdE ## Related Recipes From 5be9532bf5c72632447092c36932c376b13d7f90 Mon Sep 17 00:00:00 2001 From: giacomounivr Date: Fri, 9 Aug 2024 14:18:04 +0200 Subject: [PATCH 21/50] change viewers compatibility system --- recipe/0485-contentstate-canvas-region/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/recipe/0485-contentstate-canvas-region/index.md b/recipe/0485-contentstate-canvas-region/index.md index 06f5e885d..04db7f298 100644 --- a/recipe/0485-contentstate-canvas-region/index.md +++ b/recipe/0485-contentstate-canvas-region/index.md @@ -37,7 +37,7 @@ We want to open the viewport to a specific canvas region using a viewer availabl First, we create an Annotation: -{% include manifest_links.html manifest="annotation.json" %} + ```json @@ -70,9 +70,9 @@ Eventually, we can create an anchor tag with the link as the `href` attribute to Link for visualizing the region of a Canvas using a viewer. ``` -Examples of viewers implementing this recipe: +{% include manifest_links.html viewers="UV, Mirador, Curation" manifest="annotation.json" %} -None +{% include jsonviewer.html src="annotation.json" %} From 5944ad658cdb4fb805faec89622f2589b43c1bd5 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Tue, 13 Aug 2024 09:52:08 -0400 Subject: [PATCH 22/50] =?UTF-8?q?Converted=20type=20size=20to=20px=20from?= =?UTF-8?q?=20em=20=F0=9F=85=B0=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/recipe/0489-multimedia-canvas/manifest.json b/recipe/0489-multimedia-canvas/manifest.json index 89ad96822..cb800a27c 100644 --- a/recipe/0489-multimedia-canvas/manifest.json +++ b/recipe/0489-multimedia-canvas/manifest.json @@ -56,7 +56,7 @@ "body": { "type": "TextualBody", "format": "text/html", - "value": "

Press Play

", + "value": "

Press Play

", "language": "en" }, "target": "{{ id.path }}/canvas#xywh=30200,10200,15000,5000&t=0,1" @@ -68,7 +68,7 @@ "body": { "type": "TextualBody", "format": "text/html", - "value": "

In 10 seconds, this text will be replaced by a clock and an image. You will have 30 seconds (shown on the clock) in which to take notes on the image you see. After 30 seconds, the image will be replaced by the start screen. You will not be responsible for the part of the image covered by the clock.

", + "value": "

In 10 seconds, this text will be replaced by a clock and an image. You will have 30 seconds (shown on the clock) in which to take notes on the image you see. After 30 seconds, the image will be replaced by the start screen. You will not be responsible for the part of the image covered by the clock.

", "language": "en" }, "target": "{{ id.path }}/canvas#xywh=20220,5000,30000,5000&t=1,11" @@ -80,7 +80,7 @@ "body": { "type": "TextualBody", "format": "text/html", - "value": "

Close your browser

", + "value": "

Close your browser

", "language": "en" }, "target": "{{ id.path }}/canvas#xywh=27000,10200,25000,5000&t=42,180" From 53e17c6f1064087d06f373ce83bc9ab126f0facf Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Tue, 13 Aug 2024 09:54:11 -0400 Subject: [PATCH 23/50] =?UTF-8?q?Added=20summary=20=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 0145e9ddc..353f04092 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -3,7 +3,7 @@ title: Multimedia Canvas id: 499 layout: recipe tags: Complex Object -summary: "tbc" +summary: "Paint a still image, a video with sound, and text onto a single Canvas" viewers: topic: - annotation From 5d3bc67a5b01e5e7cc348f778a5f061445c8f86f Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Tue, 13 Aug 2024 10:29:01 -0400 Subject: [PATCH 24/50] =?UTF-8?q?Reworded=20sentence=20=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Edit means recipe readers don't have to go to the linked textual annotations recipe to understand what's different in this one --- recipe/0489-multimedia-canvas/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 353f04092..05a498195 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -17,7 +17,7 @@ You want to create a digital assignment by providing students with a IIIF image This recipe pulls together techniques and structures described in other recipes, and adds new elements. In other recipes, this cookbook shows [how to place multiple resources on a single Canvas][0036] and how to work with [a resource with different dimensions than its Canvas][0004]. In the Use Case for this recipe, the aim is to mix AV and image IIIF resources, set an image to be visible for an amount of time, and resize and position an AV resource on a Canvas. -While other recipes have discussed [simple textual annotations][0266], this recipe changes the motivation for its textual annotations to `painting` to include the text directly and visibly on the Canvas. Each of the annotations in this recipe is bound both by its placement on the Canvas and by its time of visibility. +While other recipes have discussed [simple textual annotations][0266], this recipe uses a `painting` motivation for its textual annotations (rather than `commenting` as in that recipe) to include the text directly and visibly on the Canvas. Each of the annotations in this recipe is bound both by its placement on the Canvas and by its time of visibility. When using timing for showing and hiding resources on a Canvas, a high degree of precision is not likely to be achieved for all people viewing the Canvas. Resources may load slowly for many reasons, including on the IIIF image server side, for network traffic reasons, or from customizations in a person's browser. Except in a very predictable environment, timing should be considered approximate From 60f2d2473149861dabb157b87ace43dafa40780f Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Tue, 13 Aug 2024 10:30:58 -0400 Subject: [PATCH 25/50] =?UTF-8?q?Edited=20sentence=20for=20readability=20?= =?UTF-8?q?=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 05a498195..87b7b42db 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -19,7 +19,7 @@ This recipe pulls together techniques and structures described in other recipes, While other recipes have discussed [simple textual annotations][0266], this recipe uses a `painting` motivation for its textual annotations (rather than `commenting` as in that recipe) to include the text directly and visibly on the Canvas. Each of the annotations in this recipe is bound both by its placement on the Canvas and by its time of visibility. -When using timing for showing and hiding resources on a Canvas, a high degree of precision is not likely to be achieved for all people viewing the Canvas. Resources may load slowly for many reasons, including on the IIIF image server side, for network traffic reasons, or from customizations in a person's browser. Except in a very predictable environment, timing should be considered approximate +When using timing for showing and hiding resources on a Canvas, a high degree of precision is not likely to be achieved for all people viewing the Canvas. Resources may load slowly for many reasons, including image server issues, network traffic, or browser and client customizations. Except in a very predictable environment, timing should be considered approximate ## Restrictions From 7e61c555ef93f4ac9e96b1bc7594fa001c03f49e Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Tue, 13 Aug 2024 10:32:10 -0400 Subject: [PATCH 26/50] =?UTF-8?q?Edited=20sentence=20for=20clarity=20?= =?UTF-8?q?=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 87b7b42db..a2241bf86 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -17,7 +17,7 @@ You want to create a digital assignment by providing students with a IIIF image This recipe pulls together techniques and structures described in other recipes, and adds new elements. In other recipes, this cookbook shows [how to place multiple resources on a single Canvas][0036] and how to work with [a resource with different dimensions than its Canvas][0004]. In the Use Case for this recipe, the aim is to mix AV and image IIIF resources, set an image to be visible for an amount of time, and resize and position an AV resource on a Canvas. -While other recipes have discussed [simple textual annotations][0266], this recipe uses a `painting` motivation for its textual annotations (rather than `commenting` as in that recipe) to include the text directly and visibly on the Canvas. Each of the annotations in this recipe is bound both by its placement on the Canvas and by its time of visibility. +While other recipes have discussed [simple textual annotations][0266], this recipe uses a `painting` motivation for its textual annotations (rather than `commenting` as the linked recipe does) to include the text directly and visibly on the Canvas. Each of the annotations in this recipe is bound both by its placement on the Canvas and by its time of visibility. When using timing for showing and hiding resources on a Canvas, a high degree of precision is not likely to be achieved for all people viewing the Canvas. Resources may load slowly for many reasons, including image server issues, network traffic, or browser and client customizations. Except in a very predictable environment, timing should be considered approximate From 5564d79e12474e82fd33aabb5bfb71a6b3316bdc Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Tue, 13 Aug 2024 10:41:48 -0400 Subject: [PATCH 27/50] =?UTF-8?q?Edited=20to=20reduce=20wordiness=20?= =?UTF-8?q?=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index a2241bf86..b5757b320 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -15,9 +15,9 @@ You want to create a digital assignment by providing students with a IIIF image ## Implementation Notes -This recipe pulls together techniques and structures described in other recipes, and adds new elements. In other recipes, this cookbook shows [how to place multiple resources on a single Canvas][0036] and how to work with [a resource with different dimensions than its Canvas][0004]. In the Use Case for this recipe, the aim is to mix AV and image IIIF resources, set an image to be visible for an amount of time, and resize and position an AV resource on a Canvas. +This recipe pulls together techniques and structures described in other recipes, and adds new elements. In other recipes, this cookbook shows [how to place multiple resources on a single Canvas][0036] and how to work with [a resource with different dimensions than its Canvas][0004]. Here, the aim is to mix AV and image IIIF resources, restrict Annotations' visibility by time ranges, and resize and position an AV resource on a Canvas. -While other recipes have discussed [simple textual annotations][0266], this recipe uses a `painting` motivation for its textual annotations (rather than `commenting` as the linked recipe does) to include the text directly and visibly on the Canvas. Each of the annotations in this recipe is bound both by its placement on the Canvas and by its time of visibility. +Likewise, while other recipes have discussed [simple textual annotations][0266], this recipe uses a `painting` motivation for its textual annotations (rather than `commenting` as the linked recipe does) to include the text directly and visibly on the Canvas. When using timing for showing and hiding resources on a Canvas, a high degree of precision is not likely to be achieved for all people viewing the Canvas. Resources may load slowly for many reasons, including image server issues, network traffic, or browser and client customizations. Except in a very predictable environment, timing should be considered approximate From 7732ceed75285a4a00cadbd9464547884623b7b7 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Tue, 13 Aug 2024 15:46:57 +0100 Subject: [PATCH 28/50] Adding Content State encode --- _includes/content-state-viewers.html | 39 +++++++++++++++++++ _includes/viewer_link.html | 2 +- .../0485-contentstate-canvas-region/index.md | 4 +- 3 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 _includes/content-state-viewers.html diff --git a/_includes/content-state-viewers.html b/_includes/content-state-viewers.html new file mode 100644 index 000000000..7f66c23b4 --- /dev/null +++ b/_includes/content-state-viewers.html @@ -0,0 +1,39 @@ +{% if include.viewers %} +{% assign viewers = include.viewers | split: "," %} +{% else %} +{% assign viewers = page.viewers %} +{% endif %} +[JSON-LD]({{ include.iiif-content }}) {% for viewerTxt in viewers %}{% assign viewer = viewerTxt | strip %}| {% include viewer_link.html type=viewer manifest=include.iiif-content class="content-state" %}{% endfor %} + +{% if page.code %} +{% include code_links.html %} +{% endif %} + + \ No newline at end of file diff --git a/_includes/viewer_link.html b/_includes/viewer_link.html index a9615f41a..5bba00c55 100644 --- a/_includes/viewer_link.html +++ b/_includes/viewer_link.html @@ -59,4 +59,4 @@ {% else %} {% capture default_text %}Unknown Viewer type '{{ include.type}}'{% endcapture %} {% capture viewer_url %}{{manifest_url |strip}}{% endcapture %} -{% endif %}{{ include.text | default: default_text }} +{% endif %}{{ include.text | default: default_text }} diff --git a/recipe/0485-contentstate-canvas-region/index.md b/recipe/0485-contentstate-canvas-region/index.md index 04db7f298..c8ab902b7 100644 --- a/recipe/0485-contentstate-canvas-region/index.md +++ b/recipe/0485-contentstate-canvas-region/index.md @@ -70,12 +70,10 @@ Eventually, we can create an anchor tag with the link as the `href` attribute to Link for visualizing the region of a Canvas using a viewer. ``` -{% include manifest_links.html viewers="UV, Mirador, Curation" manifest="annotation.json" %} +{% include content-state-viewers.html iiif-content="annotation.json" viewers="UV, Mirador, Curation" %} {% include jsonviewer.html src="annotation.json" %} - - ## Related Recipes * [Simplest Manifest - Image][0001] shows the basic structure of a IIIF Manifest using presentation API 3.0. From 748220de5279126d503682fc17a30c27607080a5 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Tue, 13 Aug 2024 16:58:15 +0100 Subject: [PATCH 29/50] Adding clover removing UV and Curation Viewer --- recipe/0485-contentstate-canvas-region/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/0485-contentstate-canvas-region/index.md b/recipe/0485-contentstate-canvas-region/index.md index c8ab902b7..e646db76c 100644 --- a/recipe/0485-contentstate-canvas-region/index.md +++ b/recipe/0485-contentstate-canvas-region/index.md @@ -70,7 +70,7 @@ Eventually, we can create an anchor tag with the link as the `href` attribute to Link for visualizing the region of a Canvas using a viewer. ``` -{% include content-state-viewers.html iiif-content="annotation.json" viewers="UV, Mirador, Curation" %} +{% include content-state-viewers.html iiif-content="annotation.json" viewers="Mirador, Clover" %} {% include jsonviewer.html src="annotation.json" %} From 221c611188121ecd176dec5557d7de190bf41b2e Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Tue, 13 Aug 2024 18:17:28 +0100 Subject: [PATCH 30/50] Update preview.yml Turnning on validation --- .github/workflows/preview.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 36d624717..79e41ad02 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -70,8 +70,8 @@ jobs: python -m pip install --upgrade pip pip install -r scripts/requirements.txt -# - name: validate -# run: scripts/validate.sh + - name: validate + run: scripts/validate.sh - name: add URL to config run: .github/bin/addURL.sh From fcdf7d7b3a65cbb09e24bb30fbe11eae00b3dd4e Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 16 Aug 2024 08:28:06 -0400 Subject: [PATCH 31/50] =?UTF-8?q?Changed=20recipe=20title=20per=20editors?= =?UTF-8?q?=20=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _includes/links.md | 2 +- index.md | 2 +- recipe/0489-multimedia-canvas/index.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/_includes/links.md b/_includes/links.md index b8b0bd4d7..5a59ae11d 100644 --- a/_includes/links.md +++ b/_includes/links.md @@ -75,7 +75,7 @@ [0466]: {{ site.cookbook_url | absolute_url }}/recipe/0466-link-for-loading-manifest/ "Loading a manifest with a viewer using a link" [0434]: {{ site.cookbook_url | absolute_url }}/recipe/0434-choice-av/ "Multiple Choice of Audio Formats in a Single View (Canvas)" -[0489]: {{ site.cookbook_url | absolute_url }}/recipe/0489-multimedia-canvas/ "Complex Multimedia Canvas" +[0489]: {{ site.cookbook_url | absolute_url }}/recipe/0489-multimedia-canvas/ "Teaching with a Multimedia Canvas" [cookbook-process]: {{site.cookbook_url | absolute_url }}/recipe diff --git a/index.md b/index.md index 80f922c9a..4c479986a 100644 --- a/index.md +++ b/index.md @@ -114,7 +114,7 @@ _(leading on to segmentation examples later)_ * [Multiple choice of images in a single view][0033] (29) * [Foldouts, Flaps, and Maps][0035] * [Composition from Multiple Images][0036] (30,31) -* [Complex Multimedia Canvas][0489] +* [Teaching with a Multimedia Canvas][0489] * Multiple images and multiple choices (32,33,34) * [Annotating part of an image to a Canvas][recipe-segment-image-part] (e.g., crop out scanner) (35,36,37,38) * [Image Rotation Two Ways][0040] diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index b5757b320..7376dd639 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -1,5 +1,5 @@ --- -title: Multimedia Canvas +title: Teaching with a Multimedia Canvas id: 499 layout: recipe tags: Complex Object From b5795edf0fa527ce27e3bf93d75a50ec229e9184 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 16 Aug 2024 08:35:08 -0400 Subject: [PATCH 32/50] =?UTF-8?q?Moved=20graf=20and=20expanded=20it=20per?= =?UTF-8?q?=20editors=20=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Editors considered timing limitations to be restrictions and requested additional text noting that manifests cannot strictly dictate what people can do with the Manifest because those capabilities are dependent as much on the viewer as on the Manifest. --- recipe/0489-multimedia-canvas/index.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 7376dd639..0459e08b9 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -19,11 +19,9 @@ This recipe pulls together techniques and structures described in other recipes, Likewise, while other recipes have discussed [simple textual annotations][0266], this recipe uses a `painting` motivation for its textual annotations (rather than `commenting` as the linked recipe does) to include the text directly and visibly on the Canvas. -When using timing for showing and hiding resources on a Canvas, a high degree of precision is not likely to be achieved for all people viewing the Canvas. Resources may load slowly for many reasons, including image server issues, network traffic, or browser and client customizations. Except in a very predictable environment, timing should be considered approximate - ## Restrictions -No restrictions known. +When using timing for showing and hiding resources on a Canvas, a high degree of precision is not likely to be achieved for all people viewing the Canvas. Resources may load slowly for many reasons, including image server issues, network traffic, or browser and client customizations. Except in a very predictable environment, timing should be considered approximate. As well, people interacting with a multimedia Canvas may have greater or lesser control over the Canvas timeline. Consequently, creators cannot assume rigid implementation of timeline manipulation restrictions, even implied ones as in this recipe. ## Example From 55461cca4ac072e1d88862dbe5f41e32b93ccbe9 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 16 Aug 2024 08:36:22 -0400 Subject: [PATCH 33/50] =?UTF-8?q?Removed=20bounding=20parens=20per=20edito?= =?UTF-8?q?rs=20=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 0459e08b9..1b66cb7e1 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -27,7 +27,7 @@ When using timing for showing and hiding resources on a Canvas, a high degree of In this example, a still image, a video, and plaintext annotations are combined on a single Canvas to simulate a classroom assignment designed to introduce students to image study and notetaking in a compressed period of time. Note that this example contains material pedagogical design flaws and is not to be used as is for a classroom assignment. -A person using a viewer that supports this recipe is presented first with the instruction to "Press Play", added using a time-bound plaintext annotation. After pressing play, additional instructions appear, also created using a time-bound plaintext annotation. When the time elapses on this annotation, the person is presented with a clock video overlaid on top of a still image. In the hypothetical assignment, a student would follow the instructions and take notes on the still image while the clock counts up the time allotted. After 30 seconds passes, the still image and clock video disappear, replaced by text instructions to close the browser. (These final instructions stay visible for approximately 2-1/2 minutes to avoid an immediate return to the initial instructions.) +A person using a viewer that supports this recipe is presented first with the instruction to "Press Play", added using a time-bound plaintext annotation. After pressing play, additional instructions appear, also created using a time-bound plaintext annotation. When the time elapses on this annotation, the person is presented with a clock video overlaid on top of a still image. In the hypothetical assignment, a student would follow the instructions and take notes on the still image while the clock counts up the time allotted. After 30 seconds passes, the still image and clock video disappear, replaced by text instructions to close the browser. These final instructions stay visible for approximately 2-1/2 minutes to avoid an immediate return to the initial instructions. [Theseus Viewer temporary link](https://theseus-viewer.netlify.app/?iiif-content=http://localhost:4000//recipe/0489-multimedia-canvas/manifest.json) From 0750ded27a4a2bb3aa8082180cfe85a53fef64e4 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 16 Aug 2024 08:40:21 -0400 Subject: [PATCH 34/50] =?UTF-8?q?Swapped=20temp=20Theseus=20viewer=20link?= =?UTF-8?q?=20for=20anticipated=20format=20=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 1b66cb7e1..89ff3ca3a 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -5,6 +5,7 @@ layout: recipe tags: Complex Object summary: "Paint a still image, a video with sound, and text onto a single Canvas" viewers: + - Theseus topic: - annotation --- @@ -29,8 +30,6 @@ In this example, a still image, a video, and plaintext annotations are combined A person using a viewer that supports this recipe is presented first with the instruction to "Press Play", added using a time-bound plaintext annotation. After pressing play, additional instructions appear, also created using a time-bound plaintext annotation. When the time elapses on this annotation, the person is presented with a clock video overlaid on top of a still image. In the hypothetical assignment, a student would follow the instructions and take notes on the still image while the clock counts up the time allotted. After 30 seconds passes, the still image and clock video disappear, replaced by text instructions to close the browser. These final instructions stay visible for approximately 2-1/2 minutes to avoid an immediate return to the initial instructions. -[Theseus Viewer temporary link](https://theseus-viewer.netlify.app/?iiif-content=http://localhost:4000//recipe/0489-multimedia-canvas/manifest.json) - {% include manifest_links.html manifest="manifest.json" %} {% include jsonviewer.html src="manifest.json" %} From 6e66cbcc365ebebb2733be569b06636b4d79eccc Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 16 Aug 2024 09:12:52 -0400 Subject: [PATCH 35/50] =?UTF-8?q?Added=20discussion=20around=20time-based?= =?UTF-8?q?=20resources=20per=20editors=20=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 89ff3ca3a..6ed10ed45 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -20,6 +20,10 @@ This recipe pulls together techniques and structures described in other recipes, Likewise, while other recipes have discussed [simple textual annotations][0266], this recipe uses a `painting` motivation for its textual annotations (rather than `commenting` as the linked recipe does) to include the text directly and visibly on the Canvas. +Once there is an AV resource included on a Canvas, there exists a notional timeline whose duration and time range can then be used in targeting resources to the Canvas. When resources' appearance on a Manifest are governed in part by time, they can be entered in in the Manifest in any order. If a `target` value includes a `t` parameter, the associated resource can be expected to be shown only for that span of time on the timeline. (See "Restrictions" below for caveats.) + +The `t` parameter of the `target` value can also serve to trim an AV resource to be displayed for something other than its whole duration. An AV resource can thus have a `target` that governs its placement on the Canvas, its dimensions relative to the Canvas, its appearance duration, and the amount of its total running time that is used. AV resources can also take [a `timeMode` property](https://iiif.io/api/presentation/3.0/#timemode) that governs its rendering in conjunction with the `t` parameter of the target. + ## Restrictions When using timing for showing and hiding resources on a Canvas, a high degree of precision is not likely to be achieved for all people viewing the Canvas. Resources may load slowly for many reasons, including image server issues, network traffic, or browser and client customizations. Except in a very predictable environment, timing should be considered approximate. As well, people interacting with a multimedia Canvas may have greater or lesser control over the Canvas timeline. Consequently, creators cannot assume rigid implementation of timeline manipulation restrictions, even implied ones as in this recipe. From 54ab4ccfad68693418bf1d022c16fd8043156980 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 16 Aug 2024 09:13:25 -0400 Subject: [PATCH 36/50] =?UTF-8?q?Added=20layering=20order=20note=20?= =?UTF-8?q?=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 6ed10ed45..a16386287 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -32,6 +32,8 @@ When using timing for showing and hiding resources on a Canvas, a high degree of In this example, a still image, a video, and plaintext annotations are combined on a single Canvas to simulate a classroom assignment designed to introduce students to image study and notetaking in a compressed period of time. Note that this example contains material pedagogical design flaws and is not to be used as is for a classroom assignment. +The simultaneously visible resources are listed in the Manifest from the foreground to the background. The timer video comes first in the Manifest, as the only currently capable viewer places resources on the Canvas so that the first resource is the most foregrounded. + A person using a viewer that supports this recipe is presented first with the instruction to "Press Play", added using a time-bound plaintext annotation. After pressing play, additional instructions appear, also created using a time-bound plaintext annotation. When the time elapses on this annotation, the person is presented with a clock video overlaid on top of a still image. In the hypothetical assignment, a student would follow the instructions and take notes on the still image while the clock counts up the time allotted. After 30 seconds passes, the still image and clock video disappear, replaced by text instructions to close the browser. These final instructions stay visible for approximately 2-1/2 minutes to avoid an immediate return to the initial instructions. {% include manifest_links.html manifest="manifest.json" %} From fff3e89e69df80f5a3250c2ac4ad5caf74ecfc54 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 16 Aug 2024 09:13:52 -0400 Subject: [PATCH 37/50] =?UTF-8?q?Added=20related=20recipe=20for=20simple?= =?UTF-8?q?=20time=20range=20=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index a16386287..051727fa9 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -43,6 +43,7 @@ A person using a viewer that supports this recipe is presented first with the in ## Related Recipes * [Image and Canvas with Differing Dimensions][0004] for relative dimensioning of a resource and a Canvas +* [Table of Contents for Multiple A/V Files on a Single Canvas][0064] for time ranges in `target`s * [Simplest Annotation][0266] for a basic textual annotation * [Composition from Multiple Images][0036] for using multiple IIIF resources on a single Canvas From 82077a03e988b9c577d601d73371425f9e435387 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Mon, 19 Aug 2024 15:12:49 +0100 Subject: [PATCH 38/50] Addressing editor comments --- .../0485-contentstate-canvas-region/index.md | 45 ++++++++++-------- .../0485-contentstate-canvas-region/page.jpg | Bin 0 -> 106829 bytes 2 files changed, 26 insertions(+), 19 deletions(-) create mode 100644 recipe/0485-contentstate-canvas-region/page.jpg diff --git a/recipe/0485-contentstate-canvas-region/index.md b/recipe/0485-contentstate-canvas-region/index.md index e646db76c..5fa6a5cfa 100644 --- a/recipe/0485-contentstate-canvas-region/index.md +++ b/recipe/0485-contentstate-canvas-region/index.md @@ -11,35 +11,24 @@ topic: ## Use Case -I want to share a link to highlight a detail in a specific region of an image. I want to share a portion of a digitized manuscript text, allowing the user easy access to the rest of the manuscript. +I want to share a link to highlight a detail in a specific region of an image to share a portion of a digitized manuscript text, allowing the user easy access to the rest of the manuscript. Institutions might want to use this recipe to share portions of their object through social media, allowing a direct link to the viewer to improve the user's interaction with the digitized content. A scholar who finds a relevant passage in a manuscript might want to share the precise location with other colleagues, allowing them to check the original source. ## Implementation Notes -To implement this feature, we must create a request to an entry point of a viewer instance with the necessary information for the viewer to open the Manifest, retrieve the Canvas and set the viewport to the desired region. - -[Image API](https://iiif.io/api/image/3.0/#41-region) allows users to share a specific region of an image. However, the context from which the region is extracted is not easily accessible. Instead, sharing a link to open the specific region with a viewer allows the users to explore another part of the image or related content and metadata in the Manifest. - This request can be implemented in a standardized manner using the [IIIF Content State API](https://iiif.io/api/content-state), providing the data as values of the `iiif-content` query string parameter as explained in the [API section](https://iiif.io/api/content-state/1.0/#initialization-mechanisms-link). We can use the [Web Annotation Data Model](https://www.w3.org/TR/annotation-model/) to encode the information necessary, as shown in ["A Region of a Canvas in a Manifest"](https://iiif.io/api/content-state/1.0/#51-a-region-of-a-canvas-in-a-manifest) section of the standard. However, before passing the data as a query parameter, we must encode it as explained in the [content state encoding guidelines](https://iiif.io/api/content-state/1.0/#6-content-state-encoding). - -## Example -In this example, we want to highlight a portion of an image contained in a book. - -We will use the following manifest shown in the Simple Manifest -Book recipe, which is available at the following link: [https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json](https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json) +In this example, we want to highlight a portion of an image contained in a book. We will use the following manifest shown in the Simple Manifest Book recipe, which is available at the following link: [https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json](https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json) We want to open the viewport to a specific canvas region using a viewer available on the following page `https://example.org/viewer`. First, we create an Annotation: - - - ```json { "@context": "http://iiif.io/api/presentation/3/context.json", @@ -59,18 +48,38 @@ First, we create an Annotation: We can create an Annotation with `motivation` set to `contentState` and a target `type` set to Canvas the `id` of the target will contain a fragment selector with the coordinates of the canvas we want to share, while the `partOf` element has the `id` of the Manifest containing the Canvas. -We can now use one of the methods listed in the [examples of content state encoding section](https://iiif.io/api/content-state/1.0/#63-examples-of-content-state-encoding) to generate a base64url string (**note: for brevity, we removed new lines characters and white spaces before computing the base64url**). +We can now use one of the methods listed in the [examples of content state encoding section](https://iiif.io/api/content-state/1.0/#63-examples-of-content-state-encoding) to generate a base64url string (**note: for brevity, we removed new lines characters and white spaces before computing the base64url**). -We can pass as the encoded value using the query parameter `iiif-content` of the viewer landing page the Manifest URL: +We can pass the encoded value, using the `iiif-content` query parameter of the viewer landing page: [https://example.org/viewer?iiif-content=JTdCJTIyJTQwY29udGV4dCUyMiUzQSUyMmh0dHAlM0ElMkYlMkZpaWlmLmlvJTJGYXBpJTJGcHJlc2VudGF0aW9uJTJGMyUyRmNvbnRleHQuanNvbiUyMiUyQyUyMmlkJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZleGFtcGxlLm9yZyUyRmltcG9ydCUyRjElMjIlMkMlMjJ0eXBlJTIyJTNBJTIyQW5ub3RhdGlvbiUyMiUyQyUyMm1vdGl2YXRpb24lMjIlM0ElNUIlMjJjb250ZW50U3RhdGUlMjIlNUQlMkMlMjJ0YXJnZXQlMjIlM0ElN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZjYW52YXMlMkZwMiUyM3h5d2glM0QxNTI4JTJDMzAyNCUyQzM0NCUyQzQwOCUyMiUyQyUyMnR5cGUlMjIlM0ElMjJDYW52YXMlMjIlMkMlMjJwYXJ0T2YlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZtYW5pZmVzdC5qc29uJTIyJTJDJTIydHlwZSUyMiUzQSUyMk1hbmlmZXN0JTIyJTdEJTVEJTdEJTdE](https://example.org/) -Eventually, we can create an anchor tag with the link as the `href` attribute to use in the web page: +We can also create an anchor tag with the link as the `href` attribute for use in a web page: ```html Link for visualizing the region of a Canvas using a viewer. ``` -{% include content-state-viewers.html iiif-content="annotation.json" viewers="Mirador, Clover" %} +An alternive way of sharing a region of an image is to use the [Image API](https://iiif.io/api/image/3.0/#41-region). However, the context from which the region is extracted is not easily accessible. Instead, sharing a link to open the specific region with a viewer allows the users to explore another part of the image or related content and metadata in the Manifest. + +## Restrictions + +Note content state does not define how the viewer should bring the regsion of the canvas to the attention of the user. It only mentions: + +"This data structure can be used by clients to load the resource required, present a particular part of the resource to the user." https://iiif.io/api/content-state/1.0/#content-state + +Viewers may set the viewport to the region or highlight the region with an annotation. + +## Example + +In this example we are aiming to highlight the bug that is on the second page of the Book in receip []. The part of the image we are highlighting is as follows: + +![Image of a bug](https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f19/1528,3024,344,408/pct:50/0/default.jpg) + +and this is located in the following region of the second image: + +![Location of the region to be highlighted.](page.jpg) + +{% include content-state-viewers.html iiif-content="annotation.json" viewers="" %} {% include jsonviewer.html src="annotation.json" %} @@ -80,8 +89,6 @@ Eventually, we can create an anchor tag with the link as the `href` attribute to * [A simple book][0009] shows the manifest structure. * [Link for loading a manifest][0466] another example of content state API. - - {% include acronyms.md %} {% include links.md %} diff --git a/recipe/0485-contentstate-canvas-region/page.jpg b/recipe/0485-contentstate-canvas-region/page.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d3846825f2b910ce1820a586691fa47628f3c4a8 GIT binary patch literal 106829 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 z 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Т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 z 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 z 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

4M)+H%Po>@K{tLB9 z^-U6IT|-Trq=w}HGARgKU<7>8uplu7Nf|itD83wgH`Kf^x}JjrPiW;9M7EI6G%G&> zSrt#3H#s9_*N7k+SYrpE@F$8qNuoii_>W4}<+#3kbN0)NcWlO0wH$RR2%>a z#s^%#2HAK*=TJ>YS=O&@H3XhlmdUrquCJE;+?JspA`i{S9;3ZyDOQ4Q)NRJwdTN^O z*yp7vb9^>WxxMgLK-ctnf8kldsA#uZdkG+d$5yg$CTLUx_J6jZA{QU?%1ET#qxWP5 z+B$EIJ{$PM;~iSx!aozPEU$Fk38T5wboaZG`r6$tA}YwuBoRq=j02-P?aDcaAY`6; zKN{$_R`w%gL1)owJU-8u~v)@V(!RbQ7vgs!e@)J(rU# zdsL)}5Z(4{$@sA8V59I0gbN!-iz(mUkX?DaUMqs!NyKd2j>GD6rPm2El7d{32O0@Bx z!p(B?MAp1D=gnGQ)HpDums$^n4jB+$)-VSvF{D-T=IJYC?Qgg!c(#Y+X&uY09L zfLQ69rMG!xP3P@1Ov;Ppu>qop6-fcfBw&53{{RH({h|I4{4D*T7vsOi%@*cOOINVe zY;{Y0I>EIWgqPyRI3j}DGVwy){ekW=<~=B~qnLe@=(= zRsR44$^QU?jCe2p3JLJnQ@*x>+fMOUh299YTT5Gr?jV{gi1$N(X|=cgnpRhghf%U< z2tG8^elc43CrhyLHIytZ^%$(u(*79c+RqETI~!># zzGO~H7EzE&f<4((0shaS?_U{Nrum|*eH|p!Qe&eoNEps37>x7K^~F1)5uAa^9cYnR zR|NIqv1W*X?HMcin#;Q&##fBvwQ3a`NIZd9*Ni}Jm@DdYpZ@?=bJllS9TcIhncyuj z{?*i#P7j!$mfEA`#r^UAe+qF2`*%}fc;1;&jFYyLd>`Jg%_l)E5K|aBI0sE$Dc2L`^|he62F7yeFjpsk-V(Q z5p)EF2l4zXN+3)@&j+q5sw8h2T;;hOcKmBbIF1*ddRNXuJx@|^ps1&AGyY9VgE&5& zswGD+laM`sm03ZR-H)g^?Z;}+&cY3wzEU~#t6cv8`sxoTuRLa_9CJm0WPp_nazOMo z5mh}#YRhdAl1Tc~3Wk(QI)Q=D13h@44Eb!LxKnL1f|8Amlb#=g`WpT;z8rWP_B{A? zs(6RPmon%O-@&Qs+Ggp zC2IaH@m8l};wvT6_4`?t&ME9e&tp4Uq!6S|rBPx@M7IwrkF-eA1TGdesH;KLhbneG z%!fClgR1IQrR_Ab*4FdcpUds%!avzxR{Le#KNGZBbsw<#lErPNNgdtAye?T{cV}pj zBQeXl+s`=%74nzFpM_UGBZ|`F!8bZ(v=+AWku3V0HxGsjw(IwA8YHn5U;?i>!T0{J zJ|uq5e-w1R7eS9j)FkmUXc~pitsK(DZr5zd99~Vdi?%T;VPsS)L+*X7LKByG%iu5V z4gUZVuMk0hr|Ks_m+kh^MW;h8-1kIH50fj&1aURJ!c4o#SlZPU!nBRHMd+O>lc((6 zO+7#0p0!RTz&9y8D{c3m`6c+D$^QU}ymPB~_s9BgigdpcSdC{)hT0fnvX;xqcCm8s z$+AZB<3P+=`!^ZR1$I9Y^$jz}Q)z4QPsJ&&Yf)RZnyA!awvWlUZSJ|X!mMo~a2%#c z+s76CFlZha{iN@FcmDtgrk~;u3V4#j%gkHbn6#LWk-p|Yf=RLEnbI<#LYXRvOXRYX z@`sB50N|b9622k+&>A1b?-(wPXX2H)vDGy=?JT8l4qty}wX}gJw$Bo(Z?=wQb@OEj zJHW{YmRnPVB^qiknd^VeEp_do=HhdlC2ERt!`j|!UsrBxd0ySqKL;+p4&C^M3q3B+ zShbxEu(W7jP_n^=2{>0`^F@_zRSzQ@c9C9J@v}(M{0FB^sd$TA()Qex0c5+jFeSyT zO!1jzk+23iSk5=N1N*@L09zhA)V?uzhxV4$zh>_dd?1EjhMp?2mevm#X+jm2&Ka!S z%PrAxp&7<9CIaT>*U6F=wvA+;%U#n2K;;kxz#kR<(tZH_l71L!z6SlVe`dcDEtDG0k!|Bo z4CpiH^KDC81w_hUG?9O2+uZJ9aFdB1P4gA|%ttJFsPjsr(QcF1U7Np_-FsZ~pAvJZ z)2B|*?7F_~>v#Ai(EOFM*8DYZbq)R0kXfr*Jd^#RSs;#QMnfb_z`SlAP+CtdRAlg3 zNe7O<)O3g~HH+q=+$)%dOL=;hWg^hMN92Kuw8=6)G_Fg^CS-J#hS2H zp%?C^uWMZ--nQ-Q=ce6GTt;;{({Ozq_K$08WUv1K1o-wTEDhPyJV1j^vDB?rOF^it z)7(Mj{{YXv@~lZ`2kwxpFi9jR(Y3$1(C&1pCb81iBqk{>Ws?vWnRYjrzdqQdizy^Z z$WUzSri{l@_&l`L$@m{N-c;?PKO*$Q4P`CR<)!mKlu$O5t7|pcrByTmS z7ZHnukBt1G#?j~UN{jZ;y_Wm`0K@HV?WyI`sj5##eCcbf&8#iO{*@D~P}xfy*0yrn zn{Z{$5yXhuk19Y?&nawV0C~>8eKOm_x-Oxn&XODHEAd!G+zx0m*FY0=^-o(Pn*eOSDpGe~1*2g?POw;J<@ zx7SiH?5LyiZLe+~1ayv9wVp{f8#awH&okUea=$hluwR%FoTG}3Npn4R`-!VfyQ`TV z5?vVDCyKQOwU%2?+%#8F?~W+uECCTH5|B!P<|u8ycafZSH}dLaUfRwigG+mep7`6K zOE`;#+an1S%&D{nbm@=@!kU}nUw}2whkhrx@Q1{!5A4lrLbv|Rz0xHyPjRObf@SjV z94f0al_|4!P=cQ*Bwz6E&2IkyPSiBpWt!1e&`Tu6Y;DpRSjQd2@kY{@SR}*9#aYw_ z+Ju0u72^4wOKZ2Mm#I_|*|Uqc(=;3PgF%U=nm@H&S=-&RODr;?Yyd1t!oeB_+@okR z0&uC#K2HWuCbj*StN#F{%1c1nouKb#BVyaQkv$Av)TDS zUH|J^PN1Uwvr|?$8i*Zg$TuSjvW+`;0# zzuDeo?_q5_TtEa8+q9ef#YKzvOuk~XyMRMy6s$fSd`Z(ao1X(kZ*l#n3`QMB&I?3nLvB8n%_; zm_F0u0j=3VWvD^+cQe5u^5*+lcPtIWl0=cns#D}y0a9^ZHRD|qR?>AXUM)vRlS`7z zaJ#UY<~iC6$fgin`RlaEl0?n}DzG0m@K_LQ>Hh$N9u4p$`d^K7PmCG^Xt3$}SKFjk zu}h6s9cJ3<28ww6=7L*mcM(Q~dr1f}G&G3Pk@O_L5r4`Y&F(_jkX`aaF6U z?fz$hPvV^teIoZswtqKLxbqCxN@R_0l0@FH+(9Bg@0adIyf9Ia!=+7fHH{NjztsFb z_fcKm=_Xq^Y@IKBV+oQ-?T(poJ&q-rWrOVD^8FQzjs2%|ABe}qn!kX&Q}Dw> z@Z7#0)h-qbj}Lfc=x!rT_STYLYA~}wI>6Ga#~@gtl(3RC&&n?mRYEtZYgsE=>RKnh zi%$OliZ9x8=^yewM32Kd?ww-}rC|(^+UhaMa}2F8v|Go8l2Fh>2y}FWG6KV>47-RR z^p@-5WY=2HPPmrb-JrahTcIr8T&@b1CMW?_CusT95ORAQ{lD>(O8u6#e}*3h{CVMD zhNHk19w1xGKNkN0XIk5fTbJW`T$!ug$jOx333(o+29`JvQ z_0QTjNuR?$F7Pg^s_HsLjg^h9%re{EURpigmuYjRT>Y47O>G~NU7Fw}$|(`XT5zeJ zCY>g=S6X^mtG3^7_y)Yn-tE!(Pp|wmp7+H~EEiH;we)fQqTDx=b|+8=lM^8kjmmci z$y8Oz&frI+-S`7WztF9<@3WZf^((1uqkly6NR)R4T6F zutq+h@K^j3U*d1XsG;yLg1kRqd5$+Bs;}LRBRIa6kvlJYDePN6_T8yVPwiZLO|jNbV&Q#@6mON|Hzzf2(OE z+7xk;7y*vI)Q84T_$7CabpHT=9}P5LgI1m!)jV_Hq>|rPyL))_`>+x8DB%gR}D3;>ALosPcT5<@le+RMFkoX;7Vg zBzdjjMUGpjOftR~n=g?n4S*)$sTDSXX zg35TLj!lbmX8WUH%EEN*Ind4!|(|+;tlgp-^t)cl5n}mU~;PiK2{Mz|w&OISKp86^e%5pP;(G{1LbIk?k(nTa}erVV~DnTlzDk`pR7f+Ha$lnE&T72~{<+1D*GMR0X zSrMaWKuR_XDIgN3X(KDp;E|q$inLH3bM*$0>`#>XbOWV5e)mpIcn@>w81eIU$ReSX zXN=?nQUKg9r7@1|gW8ZS%91bx8OJj7*9KKk1nN02;UUX8!U2 z0KUKa)%lFo=Py&~;`BfN)&9eQZ!rMpk)O`Kf76-T;^39!&mrXC51iM~ZlMSx)PFkg z8z-0T_Z#p(e=i*|^P2c>Bw9n}eHL51j)_W@^A339gV0u#D#ddrBiB8?m6ar}h*=k> zBe&~{y%dZq%V{{ZXP&cW$pz4@AHw6<9H@7|;eHx1nhs$VtTK#`)3$ch4}`UX2o)AFSz6#_NRYgY^&Di=x%t8SNBC#<Ja**7AVSIaTeHQjyYcq^4IiE@E68c zr$JR(*XIBz+@Ow~kH5WRTM5jq%lr~DnRYfi1T>VF{r02KcKW&Z#Ycx&RNuk7pl zK=}6l))gv(^uv*SR9$l(Dkp`AYB=VDv^Y%sfN$@-3 z&5y2WUT9jwYcpw(*iB-V+J3Dg-6RZRH#1&&@t$s>jyVIcg>ogw^$&gU zx8e4u<2z4@dWMN%FNo|RHrCpkTSoVhLd26APFH%N$>1I`ag5d7JHuWS&~^KrM@iDH z?JqS#CA_+~w~jd{C_n~zQA0Zn@wk)Lx#5>6$u(^}o6^?rzfVmA>kiERJv?Qme$AI( zv(z6K^gj;j9uU-^@e|qUdZgNuYEkP}F=;~T_Tv6I{>f%;Ezqn%to+1T5fC{=lr3M3 zAG62pAMi(4(Dbbb!TPt0q0&Cfu6TRIR#=N!hr_n^(8#v8)^^RGH%PdaM@2{;Xpp3F ztjb$&>(Thv@xS18_lvcE_$Y6Oq}Dt+sCbB4cpl0dT`uNfd%EgS+E7+NmhkEEEapq1 zvWY{1oP-}ZX&>%+emwarsO(`+ofLf3~#i0gM2)~)73VVFrA(O%BZ z(Oxv{(Ku%ehzk?L>>{Ih#`-I*BGt5SuKV=c%-PiD)xYbp`DgK8;SY>_Ver!5_RaXy z;tMf%@e^Ft)5F%5Y|~45e`+osX>|*^%uz!ag4m+@X!022UoBO4pp#no6Kn9##2ysz zri-f0tazsCdmU=ePKRxz7BK2I?R{$+++34&bEu@T3zs4#g<}{yoi`uVkJ=mKckM;{ zaBJ6}1wID&O5arYd#v4C$!!_35M0D9AP;#4p?fK4Ear;sgKba@keHs@Sp&Y`sC*&e zzuNx*M);@TkAi<6`~#-=!%o%wIcuQnUNy0{Pq(3-(rE9dI-&@+eVz8lv+VGR6~vKX z9IQ!gb0kkC#AzC}t;NebNTNp!)BIofU#EOM@PCJOpBk(eelGEc+M;x~ z)!NB)yK6SLx{AhVAeE!I)HNFmgLR9ELAAFSiE?C;y8i$Pd?U5-r^By}Ujei&D*ME` zo{i#NK1ZGiqlZ+}E$n8w(xqk}yLhgy?QNnG1lt_8?9Un~A=}pe4*V1U0D_wQHSnFM zjWo{;N3QAqI-Wc0i#Ht;L!AA-8a#b4WF;hp@qKNB0nUMBc)1M61T`mN2~mBjuY zzqb-jTK3Xad7DqWi3}I4B*YKoNSSXm{YUUW_GbN}zi2;+cAvH-uwMZ9lf!z|oVT$i zoFIo>O+FwcmrjZ~)LUF!z(2EYyvCN&U8yu`rAoI0@RP*<01tIdN8%U8uYo@WuB`qf zSZVS_s`y50o4frc9Vf&$O1iwMrWCiA?P2Y~meXhqq2#v=U6s19@rsq}OGztPr>eF3 zb<^{+cR6Z7tJ6zW_-c5@kNabMPyM6*Ab0}HTktN67PaEdIzNZs@RhxcEw9|)>Nau> zMp!N`9w}_(wYJ5~kxgvyGKYy|d1ORic=$*A75>;C3ip1@wmv4%{7>MWYW1vqTj5O` zP=YwE^xKfO)7;$0BBjhyPi#fPHMxzVxJ29}EY4EL_6gB`EPl&3AG9Cr`{5mH!Ja$P ze9LywZl$=?6Hz*C!aNdKNviC*h(b3#nB1Q**mJcWzR>-Wzh+zCia#E0{{U{k9O+um z!~Xyj+iDkIY|*5*NNn{F8qfY|5j1AA#7do;^N!|5L+RuNp z_ou$ThEh>U+xqN&c>dG>0JAT^Z`n7&*S`35E+HWo`r;#LzKPjhy8_Gmv0=}B@hwNRed^Yg^0EzxHd`kGss$P66)jT-yO>oI~ zHmdPoSwm}U7_%lzXJwaZhs%i{X;?~@FC%@~@K^o`$MCD*r^nwCd}-3JUs1C03S4Z_ zZtb9WVtcEhcO%Oo1+ENJZ)LG2LHzc%#A|81cu4Z@e4hJwD%4(zQq$+V0Nk zF(ea0;{_cXf~V8+tsYpa#!#yj%h7s0K3#l=?d@isr}D4+KK{%f6z{c-KgYkb%$6S% zyfGcq=pHHX?A9%&#{iNfGRJ$T>Nf>eIpC1bZ*gpQ$0@pxWqKbhACovD&E~Y|ntwNX%K?hyZ1YAOHpcuTl^wY@fp%(Mu(UlAiwn z*3Ii+c&C4K{I>XA`w09=_)GgwTzo+Azl}_v4sR}Q=eY3g+gwhq4a&16khYPU&0~gU z5<@g`qoOE}Zc8(MpvMYF5M86>0C9|Q$4^gcy0GUdxbx36&o8Jaul281h8{GNQR}JC zIk`KsCWuLe$8O%0z<7h7y@-|@tH;zEY>ykQ)2_yu9T+rjRFykO%9c_v z#2-l5+etX%q0KX4C(K|DIL{xQbi(AceDmTz*_+_MjBM@nuM=qI>e|wExky^(;bJqz za4z7L(If%nwzwX3v$k3Z0C>u<1auca1N;G~BSou2b$Vr&&1bs2xSh)gWVaZ39hpMM zG=K!hELi;9*RuIh^VoJYjTCK@jzP{%T<0rpD-S%rZV}dQmdu)wD zu1`{M22WGgwFr352qa@C9V*hU6!D*WV|jbIIM1&Yi+33bQqhnO2?wS)C(@f3xgUL$ zfHA--f2jUdFga2P&-A2kGiEyGkP-nWbDv6pggl;yxvLDLX;OOCDRKN*{HPk-W40Ks z-aTs`^s^}-^V>D6F>GTP_dPRN7n{sxW5@uU0ngLku&iwMK5w{%(_YjVj%Ayt(NtES z*ku0l{&efu+xuGdw_i6n&-*Kyc5VLvz5f7?*XK$LnqH^UUdehN|JMG)jB6+`zajV| z*zsRJX_midnrI@UU>Ga@kT=Pf(HO`SrEyFQcf~G@miw_!JDAt9Y0$6xGfI$?pP84 z2yTB4l=gf!>>PKf6pt{D_|IBZQ!8`F{{ULFaS>p$oSb#%=x7C*PEYCDk)vK;2kAgS zpzR#{o+&k85K5~UL%=)_UTMIVVvaFDVpN{}DZXJJDD?W!m=7mt59o3DQlZ>3F^u-j zM9sVo4h1xp+&wCivjT8)!0q0e>$wPialsWH?h3E}0IHg&AAIJi>!1n%$O-vV5Bkl$ zea$?8qYc~grgqBl@79i6AQ8p@8UFz53QQ}UgMca~8N(hp>S^OA2RQ@ZkHVMP0OQy4 zs`4_gAPzg`rWgS9U3OSRn9e={2+UKoU;XwnRtufexxR9c%I{{JR z!(mP__~+W9DvB|HTCMHiuN^WfJPt58^{HTaFU477J)p!vxq?0 zBiZup#xY&Uh9suolk;(p#;28Dqm7ST~tWl&%xsJ%uQE;jSdecWFFytxYs`otc&ri;-HVYQ(j`Z>Jq25S1=qjSR zAWH93lDp~%?e+o4Z0k4W5#L@Vg_+G%#S}mL~MDQd4!)&hMcZCwp!0l-muvG@T4~QNv z@ZX01F5lXC(nzheYmc+VaV$nbBAH5%CyfxGhj3D5knNB;Lz29EZ^W+>_zU3I!;kn$ zyg@m&)AVJED|A_kJg!JsU=5O6dt*7sz$D}f^J%zBQk=fc{{R!~F^APU07ONl;a-9i=5Y0aWkLa>(s8Q(q*5M>Q6NpAzbeHm~^X;A~D^@N8wD_ zlb*oWOi|`osHd(#l`{alr0r6?U8yGieV&t&B^xbOCq>TC?uZ1)oBw8k&%ws=l=k&Pz0c}1G}F5 z`qc5Z@Jbw2B>)aGeKGv1>PkX^j^4BZAYHjX#rgh~PF@_hAo^6GDf@$uN@T&LB^kY*~gtub&{cNHq({ zBOfZ<&9vj7-gw1*0OXY*kLqi{qq>4^LiM2`fx4Fjf4)KeYvOp8KI|Wv?`3JHBW?q* z3=#nDD^&*Zx-tf9E<6~608jq_UbPjre5-;0^c+{s!(-HuJV}g$(0+8_p@x4dY9{6R zM^1k~dSa0IVZj{!Rc^$Vm_FUu3-mP!AOJX0dh?p2JkiA4Lg16@$KooWcV%TcAoTA@ z4R13z!({WCrgvj3aZm(eGspn(#Y(6@5ziC=^_y-Aw(x4gNLZZqs?n+6@(*)T1q#QW z4`Ejnw*uZmU(=qHNCt{%mxdbo&gRT@#Vc+ujXlFQUOIE z6WnpdDJvisso?NBig6)=f_d+rKl;?pow1ryK2ibu)Ik70C*>H=;Y{0;&p8zF&mP{r z#Wh&AK^)S0yPzN|Chf`q9X;vTQ}TiHXRR*c3hzAPm7lomds1z^0E;=#7#xh|qQfaW zKMJ2LI9{FTW5Ca?RMo(*$zl`p6yqBnG5u&N!GK;h&8< zDrx$xk8LzkMLf(9-d-Dj zEj+D|LeQyHk$z_{BQQKK%U;Edoy1cLvHQ*XcC4p|il0ALdMh=r?3EVomfl{EbV9J8 zP^t#efCo%^Q_&QBtTFo3*GcU@=r(;{CWoCKp-&RJ*qp0K_d*k|0vMD|J z?rFy)U>p)URAx6gB=S86AC+fo>>@zQScL%b>E5Aj-+8-IU^DF;_X3Ak-Ph_fTQ4vo zldd`(`cD#y-6&00Q(qDgz{vHMwkeSHDc8V?EAzuMtaVtaUr+ zAyA4gWncl%EO#H&*TwN4!4v3m=~_(Jw_L8%*SA6W){s)sVK71UteDB02s(^$TS~z` zTpwShe9SgI2|Kasr<0yZ$25$mJd!Etu>9xg?@=*T1P%>Qic@WQ%M1*R4_yBMT8svb z03#XejMdCW-*ofa)|#k61`@eB>%heTG%o;?%A8{+tdvdL@yMqth`?3tlg%S2Wdo@d zrIJ?xqz4;_aF{vusMM>k1KT|)O29a`8Bv;R08UtsUMb7C0IWYBT8DN| z%yW-ZO`s9GV8Z=vr~76dpwdvvET8*mRa)3ta!em#E* zdjPA&G^_=3TRYpgdV4rgkLCXW)~6AHl21HTY^tm2&%GAv1bcvNV1Pz?kI2)2%92NZ zpZ>a4z{dXL{N|+jus{U+(*hm8Feib{Il>LAo=K@3GYk$n%|_ApW73tnfgVU3jyvZx zqvsokKK}sYPEf^&1dn=*9qscRoZ^PA1Ifk+8P8v(M9Gicj&skgPqdD6(DbBGdW>h^ znn`y84Ww|~QHDZ5=y=6Wz>*dF{*@VG#|xA7rlVjZD#VgF&*myKgnyXi=A3x|FwPG( z2;La7t~mAM6u_Gxa5L@*sKMH~Qg)Jap4A?3+;{3~*3INLahe6K%4G4iIp(Y^LN(ZO z26^K>Y5O)fWH~(KQadX?Fmuv@l;mP?v4e_^IMgTiMtRTw0IsDmvaykY;AWc2i6-(1 zd}AKp%9Xl-A|`Odk<;*|G=(y_#!savVovn$!Ks1dlpvgSCW`@IE;kX+J#qah7kC*T znW@f4TnzeDaw|7E_r)nD1U^?Gv5&(v{5SxSfGS00=tBq~P@J_4cgGmLqXq+*X+b7{@(% ztlN#K7-Zz1$kbF?8+xBUYK<#vcZ#ckBm^Arco_rJAFW#Q;r{?2)qPEoHCv*@{LrGe{=+3){LSlL4P=_H+b>S5x9uNmpF27Q-gX{;*v5VH zUjG0lOBC)ouMgBDbK(t010TO&ar71Oyhguw7v_7pTeO-qVg#OW#CPZ`LL<3HLG%@c z4)Q^KoZudE2c>PoKwq5j2X3|U(0vbHYpHD>IT*ssGPuacOw?}6xVK)z9Y0Ee8Zj$K zgYS;K^MgZ@tAIXIFfmp`MA+Paz4-A+e7kfdxeP$S=aOj^M+2b1=}QoN^0*oH>-FhP z2(m%I&q_A73USjNYDLE&lS#BGB=+fw)+`7fB3EfXoZ_r6%7vFFJ+V=A2dzk~afRqA zfQghB{{T3lQy(mxlhYM0UApn>ifP8+sxl8+08)%VAm{w?ObS#VPKSzms}2F(>&IGZ zt_}d_KA4~d868Ih-kXIVcY{tUKsoxk2}%RI1-(BHYHs3iLFc_YUL+Kuascc6`*Du8p}r7=Sjz{w}^paF?vk<`<77DV$np%)*0PWz4VG@S`HdhBA{+!crxeK`U z>Fw!L<99xX9Q%J-07H?Sbr|QpGC*sH9X*n=M31xBkX0*4sS9^!x!JgS$^ zuS5R;>ZBb8Pig|NPc?_I#V|;7&&)lj09hSduQzk1Pl z*-+=Vtz}&DyW6O&XR)GpM~LdNm%h53fuA`40O%v9r6yPV$Nc^kKB8RQ-I$O3wor5E zRA&^PTYCPZ{43z$K3U26pFAL@8^

xDJ$Y^)b)#zlBd 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 Hd(8jY;C4b` literal 0 HcmV?d00001 From b501313ed0869eea5312515b7708d4b54cc9fb12 Mon Sep 17 00:00:00 2001 From: 2SC1815J <2SC1815J@users.noreply.github.com> Date: Wed, 28 Aug 2024 14:15:00 +0900 Subject: [PATCH 39/50] Add IIIF Curation Viewer --- recipe/0001-mvm-image/index.md | 1 + recipe/0004-canvas-size/index.md | 3 ++- recipe/0005-image-service/index.md | 3 ++- recipe/0006-text-language/index.md | 3 ++- recipe/0007-string-formats/index.md | 3 ++- recipe/0008-rights/index.md | 3 ++- recipe/0009-book-1/index.md | 3 ++- recipe/0010-book-2-viewing-direction/index.md | 3 ++- recipe/0029-metadata-anywhere/index.md | 3 ++- recipe/0118-multivalue/index.md | 3 ++- recipe/0283-missing-image/index.md | 1 + recipe/matrix.md | 1 + 12 files changed, 21 insertions(+), 9 deletions(-) diff --git a/recipe/0001-mvm-image/index.md b/recipe/0001-mvm-image/index.md index 9ac30a3c5..8044d2bf2 100644 --- a/recipe/0001-mvm-image/index.md +++ b/recipe/0001-mvm-image/index.md @@ -11,6 +11,7 @@ viewers: - Clover - Glycerine Viewer - Theseus + - Curation topic: - basic - image diff --git a/recipe/0004-canvas-size/index.md b/recipe/0004-canvas-size/index.md index 77a1a38b9..d4ecea891 100644 --- a/recipe/0004-canvas-size/index.md +++ b/recipe/0004-canvas-size/index.md @@ -9,6 +9,7 @@ viewers: - Mirador - Annona - Theseus + - Curation topic: image code: - iiif-prezi3 @@ -39,7 +40,7 @@ The aspect ratio should be consistent between your source image and Canvas. Othe This example shows a Manifest with a single Canvas that has height and width dimensions three times the pixel dimensions of the image in order to construct a Canvas with both dimensions greater than 1000px. -{% include manifest_links.html viewers="UV, Mirador, Annona, Theseus" manifest="manifest.json" %} +{% include manifest_links.html viewers="UV, Mirador, Annona, Theseus, Curation" manifest="manifest.json" %} {% include jsonviewer.html src="manifest.json" config="data-line='14-15,29-30'"%} # Related recipes diff --git a/recipe/0005-image-service/index.md b/recipe/0005-image-service/index.md index 18652404e..79d301401 100644 --- a/recipe/0005-image-service/index.md +++ b/recipe/0005-image-service/index.md @@ -10,6 +10,7 @@ viewers: - Clover - Glycerine Viewer - Theseus + - Curation topic: - basic - image @@ -37,7 +38,7 @@ Though a version 3 Manifest may specify a service using the version 2 `@id` and ## Example -{% include manifest_links.html viewers="Mirador, Annona, Clover, Glycerine Viewer, Theseus" manifest="manifest.json" %} +{% include manifest_links.html viewers="Mirador, Annona, Clover, Glycerine Viewer, Theseus, Curation" manifest="manifest.json" %} {% include jsonviewer.html src="manifest.json" config='data-line="36-42"' %} diff --git a/recipe/0006-text-language/index.md b/recipe/0006-text-language/index.md index 6f5f27531..b322c86f0 100644 --- a/recipe/0006-text-language/index.md +++ b/recipe/0006-text-language/index.md @@ -10,6 +10,7 @@ viewers: - Annona - Glycerine Viewer - Theseus + - Curation topic: basic property: label, summary, metadata, requiredStatement code: @@ -42,7 +43,7 @@ To see the language choice in the linked viewers, open the settings menu (gear i The image in this example was sourced via Wikimedia Commons and is public domain. -{% include manifest_links.html viewers="UV, Mirador, Annona, Glycerine Viewer, Theseus" manifest="manifest.json" %} +{% include manifest_links.html viewers="UV, Mirador, Annona, Glycerine Viewer, Theseus, Curation" manifest="manifest.json" %} {% include jsonviewer.html src="manifest.json" config='data-line="6-11, 16-21, 24-26, 31-36, 39-44, 49-54, 58-63, 66-68"' %} diff --git a/recipe/0007-string-formats/index.md b/recipe/0007-string-formats/index.md index 72fc67c7a..113d2cd11 100644 --- a/recipe/0007-string-formats/index.md +++ b/recipe/0007-string-formats/index.md @@ -11,6 +11,7 @@ viewers: - Clover - Glycerine Viewer - Theseus + - Curation topic: property property: label, summary, metadata, requiredStatement code: @@ -33,7 +34,7 @@ For security reasons, clients are expected to allow only `a`, `b`, `br`, `i`, `i ## Example -{% include manifest_links.html viewers="UV, Mirador, Annona, Clover, Glycerine Viewer, Theseus" manifest="manifest.json" %} +{% include manifest_links.html viewers="UV, Mirador, Annona, Clover, Glycerine Viewer, Theseus, Curation" manifest="manifest.json" %} {% include jsonviewer.html src="manifest.json" config='data-line="7,12,24,38"' %} diff --git a/recipe/0008-rights/index.md b/recipe/0008-rights/index.md index 7ff438e0f..e6a890cbd 100644 --- a/recipe/0008-rights/index.md +++ b/recipe/0008-rights/index.md @@ -11,6 +11,7 @@ viewers: - Clover - Glycerine Viewer - Theseus + - Curation topic: property property: rights, requiredStatement code: @@ -41,7 +42,7 @@ None known. ## Example -{% include manifest_links.html viewers="UV, Mirador, Annona, Clover, Glycerine Viewer, Theseus" manifest="manifest.json" %} +{% include manifest_links.html viewers="UV, Mirador, Annona, Clover, Glycerine Viewer, Theseus, Curation" manifest="manifest.json" %} {% include jsonviewer.html src="manifest.json" config='data-line="15-27"' %} diff --git a/recipe/0009-book-1/index.md b/recipe/0009-book-1/index.md index 1be820589..38c9ff3ad 100644 --- a/recipe/0009-book-1/index.md +++ b/recipe/0009-book-1/index.md @@ -11,6 +11,7 @@ viewers: - Clover - Glycerine Viewer - Theseus + - Curation topic: - image - basic @@ -38,7 +39,7 @@ You should also consider providing a [thumbnail][prezi3-thumbnail] for each Canv ## Example -{% include manifest_links.html viewers="UV, Mirador, Annona, Clover, Glycerine Viewer, Theseus" manifest="manifest.json" %} +{% include manifest_links.html viewers="UV, Mirador, Annona, Clover, Glycerine Viewer, Theseus, Curation" manifest="manifest.json" %} {% include jsonviewer.html src="manifest.json" %} diff --git a/recipe/0010-book-2-viewing-direction/index.md b/recipe/0010-book-2-viewing-direction/index.md index fb728035d..e9ba44f16 100644 --- a/recipe/0010-book-2-viewing-direction/index.md +++ b/recipe/0010-book-2-viewing-direction/index.md @@ -9,6 +9,7 @@ viewers: - Mirador - Annona - Theseus + - Curation topic: - image - property @@ -41,7 +42,7 @@ None known This Manifest shows the playbill for "Akiba gongen kaisen-banashi," "Futatsu chōchō kuruwa nikki", and "Godairiki koi no fūjime", kabuki performances at the Chikugo Theater in Osaka, from the fifth month of Kaei 2 (May, 1849). -{% include manifest_links.html viewers="UV, Mirador, Annona, Theseus" manifest="manifest-rtl.json" %} +{% include manifest_links.html viewers="UV, Mirador, Annona, Theseus, Curation" manifest="manifest-rtl.json" %} {% include jsonviewer.html src="manifest-rtl.json" config='data-line="15"' %} diff --git a/recipe/0029-metadata-anywhere/index.md b/recipe/0029-metadata-anywhere/index.md index 901f1cb0c..bf4606103 100644 --- a/recipe/0029-metadata-anywhere/index.md +++ b/recipe/0029-metadata-anywhere/index.md @@ -12,6 +12,7 @@ viewers: support: partial - Glycerine Viewer - Theseus + - Curation topic: property property: metadata --- @@ -38,7 +39,7 @@ Note: Clover supports Metadata at the Manifest level but not down at the Canvas. Credit: *John Dee performing an experiment before Queen Elizabeth I*. Oil painting by Henry Gillard Glindoni. Credit: Wellcome Collection. Attribution-NonCommercial 4.0 International (CC BY-NC 4.0) -{% include manifest_links.html viewers="UV, Mirador, Annona, Clover, Glycerine Viewer, Theseus" manifest="manifest.json" %} +{% include manifest_links.html viewers="UV, Mirador, Annona, Clover, Glycerine Viewer, Theseus, Curation" manifest="manifest.json" %} {% include jsonviewer.html src="manifest.json" config='data-line="10-59, 83-96, 136-149"' %} diff --git a/recipe/0118-multivalue/index.md b/recipe/0118-multivalue/index.md index 42024d447..849ab689b 100644 --- a/recipe/0118-multivalue/index.md +++ b/recipe/0118-multivalue/index.md @@ -10,6 +10,7 @@ viewers: - Annona - Glycerine Viewer - Theseus + - Curation topic: property property: label, summary, metadata, requiredStatement --- @@ -32,7 +33,7 @@ None In this example, the work has multiple titles in both English and French. The Manifest `label` provides a single title in French within a single-value array (lines 6–8). The alternative titles are provided in the `metadata` property in both English and French, each with variants contained within two separate arrays -- one array for English (lines 18–21) and one for French (lines 22–25). In the `summary` property (lines 30–32) the value is included as a single-string array. -{% include manifest_links.html viewers="UV, Mirador, Annona, Glycerine Viewer, Theseus" manifest="manifest.json" %} +{% include manifest_links.html viewers="UV, Mirador, Annona, Glycerine Viewer, Theseus, Curation" manifest="manifest.json" %} {% include jsonviewer.html src="manifest.json" config='data-line="6-8, 18-21, 22-25, 30-32"'%} diff --git a/recipe/0283-missing-image/index.md b/recipe/0283-missing-image/index.md index 6f36a1a88..7c55eae52 100644 --- a/recipe/0283-missing-image/index.md +++ b/recipe/0283-missing-image/index.md @@ -9,6 +9,7 @@ viewers: - Mirador - Glycerine Viewer - Theseus + - Curation topic: - image - basic diff --git a/recipe/matrix.md b/recipe/matrix.md index f12808cbd..4a70d9fde 100644 --- a/recipe/matrix.md +++ b/recipe/matrix.md @@ -14,6 +14,7 @@ viewers: - Aviary - Glycerine Viewer - Theseus + - Curation topics: - basic - property From 4d630c81b06082213b0d0b6c245d2a52dfd7a4a0 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Fri, 30 Aug 2024 15:23:21 +0100 Subject: [PATCH 40/50] Trying with ignoring the fontawsome issue --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index ef835893c..edbf8caf4 100644 --- a/Gemfile +++ b/Gemfile @@ -4,7 +4,7 @@ gem 'jekyll', '~> 4.1.1' # for local development, clone theme + use path loader # gem 'iiifc-theme', path: 'iiifc-theme' -gem 'iiifc-theme', github: 'iiif/iiifc-theme', branch: 'main' +gem 'iiifc-theme', github: 'iiif/iiifc-theme', branch: 'ignore-font-awsome' # For open graph and Twitter Card elements gem 'jekyll-seo-tag' From a0cac595a6a01db5382b7d0bd16e9c351bcf63d8 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Fri, 30 Aug 2024 15:25:09 +0100 Subject: [PATCH 41/50] Updating gem lock file --- Gemfile.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index bf1dc3143..6bb67cb30 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ GIT remote: https://github.com/iiif/iiifc-theme.git - revision: afff3ef39910d7454c58abf2b9c9e6a50cc7cb4c - branch: main + revision: a1a48285ca5bbf81d6967cf31fdcdb571da3068b + branch: ignore-font-awsome specs: iiifc-theme (0.1.0) html-proofer @@ -18,7 +18,7 @@ GEM addressable (2.8.7) public_suffix (>= 2.0.2, < 7.0) colorator (1.1.0) - concurrent-ruby (1.3.3) + concurrent-ruby (1.3.4) diff-lcs (1.5.1) em-websocket (0.5.3) eventmachine (>= 0.12.9) @@ -84,7 +84,7 @@ GEM racc (~> 1.4) nokogumbo (2.0.5) nokogiri (~> 1.8, >= 1.8.4) - parallel (1.25.1) + parallel (1.26.3) pathutil (0.16.2) forwardable-extended (~> 2.6) public_suffix (6.0.1) @@ -95,7 +95,7 @@ GEM rb-inotify (0.11.1) ffi (~> 1.0) redcarpet (3.6.0) - rexml (3.3.4) + rexml (3.3.6) strscan rouge (3.30.0) rspec (3.13.0) @@ -104,7 +104,7 @@ GEM rspec-mocks (~> 3.13.0) rspec-core (3.13.0) rspec-support (~> 3.13.0) - rspec-expectations (3.13.1) + rspec-expectations (3.13.2) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) rspec-mocks (3.13.1) From b2f826f109ccdb45e51478cae154ea170222ece6 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 27 Sep 2024 09:40:17 -0400 Subject: [PATCH 42/50] =?UTF-8?q?Added=20highlighting=20=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- recipe/0489-multimedia-canvas/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 051727fa9..80a1d2a2c 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -38,7 +38,7 @@ A person using a viewer that supports this recipe is presented first with the in {% include manifest_links.html manifest="manifest.json" %} -{% include jsonviewer.html src="manifest.json" %} +{% include jsonviewer.html src="manifest.json" config='data-line="16,40,49-51,54,59,66,71,78,83,90"' %} ## Related Recipes From e834b5265718f66de86dc3ff4f79f3ac901d53c5 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Fri, 27 Sep 2024 15:03:19 +0100 Subject: [PATCH 43/50] Adding context to Curation viewer link --- recipe/0006-text-language/index.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/recipe/0006-text-language/index.md b/recipe/0006-text-language/index.md index b322c86f0..d154110bc 100644 --- a/recipe/0006-text-language/index.md +++ b/recipe/0006-text-language/index.md @@ -39,7 +39,11 @@ In the `metadata` and `requiredStatement` properties, the `label` strings for "C Finally, the `summary` property (lines 49-54) has values in both English and French. -To see the language choice in the linked viewers, open the settings menu (gear icon) and choose either English or French. +With the Universal Viewer, Mirador and Glycerine you can open the settings menu (gear icon) and choose either English or French. + +For the Curation viewer you need to add a `lang=fr` parameter to access the French properties. You can see the French values on the [IIIF Curation Viewer](http://codh.rois.ac.jp/software/iiif-curation-viewer/demo/?manifest=https://iiif.io/api/cookbook/recipe/0006-text-language/manifest.json&lang=fr) demo site. + +Note the viewers included in this recipe are for the specific languages in the example of this recipe i.e. French and English. Not all viewers support all languages and users should check the viewers with their manifests to see if they need to configure the viewer to make the extra languages available. The image in this example was sourced via Wikimedia Commons and is public domain. From efa4ce7799dfd9a490168ba2b31a399595297fd4 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Fri, 27 Sep 2024 15:03:32 +0100 Subject: [PATCH 44/50] Setting Theseus and Curation to partial as they only support one manifest. --- recipe/0010-book-2-viewing-direction/index.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/recipe/0010-book-2-viewing-direction/index.md b/recipe/0010-book-2-viewing-direction/index.md index e9ba44f16..c9718246c 100644 --- a/recipe/0010-book-2-viewing-direction/index.md +++ b/recipe/0010-book-2-viewing-direction/index.md @@ -8,8 +8,10 @@ viewers: - UV - Mirador - Annona - - Theseus - - Curation + - id: Theseus + support: partial + - id: Curation + support: partial topic: - image - property From 9249c6416175a02f44b61f4f0fda309e00c62266 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 27 Sep 2024 10:55:20 -0400 Subject: [PATCH 45/50] =?UTF-8?q?Reworked=20some=20discussion=20about=20ti?= =?UTF-8?q?meline=20per=20TRC=20comments=20=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit h/t @kirschbombe --- recipe/0489-multimedia-canvas/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 80a1d2a2c..522e57e34 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -20,9 +20,9 @@ This recipe pulls together techniques and structures described in other recipes, Likewise, while other recipes have discussed [simple textual annotations][0266], this recipe uses a `painting` motivation for its textual annotations (rather than `commenting` as the linked recipe does) to include the text directly and visibly on the Canvas. -Once there is an AV resource included on a Canvas, there exists a notional timeline whose duration and time range can then be used in targeting resources to the Canvas. When resources' appearance on a Manifest are governed in part by time, they can be entered in in the Manifest in any order. If a `target` value includes a `t` parameter, the associated resource can be expected to be shown only for that span of time on the timeline. (See "Restrictions" below for caveats.) +A Canvas containing a `duration` property has a notional timeline that can be used to target resources to a time point or range of the Canvas. If a resource's `target` value includes a `t` parameter, the resource can be expected to be shown during only and all of that span of time on the timeline. (See "Restrictions" below for caveats and see [the Presentation specification][prezi3] for more detail about time and IIIF resources, including [the `duration` property][https://iiif.io/api/presentation/3.0/#duration].) -The `t` parameter of the `target` value can also serve to trim an AV resource to be displayed for something other than its whole duration. An AV resource can thus have a `target` that governs its placement on the Canvas, its dimensions relative to the Canvas, its appearance duration, and the amount of its total running time that is used. AV resources can also take [a `timeMode` property](https://iiif.io/api/presentation/3.0/#timemode) that governs its rendering in conjunction with the `t` parameter of the target. +The `t` parameter of the `target` value can also serve to trim an AV resource to be displayed for something other than its whole duration. An AV resource can thus have a `target` that governs its placement on the Canvas, its dimensions relative to the Canvas, its appearance duration, and the amount of its total running time that is used. An AV resource can also take [a `timeMode` property](https://iiif.io/api/presentation/3.0/#timemode) that governs its rendering in conjunction with the `t` parameter of its `target` and the `duration` property of a Canvas. ## Restrictions From 16030850320ccce184181cb6904eb8291148aad6 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 27 Sep 2024 10:57:12 -0400 Subject: [PATCH 46/50] =?UTF-8?q?Changed=20title=20per=20TRC=20comments=20?= =?UTF-8?q?=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit h/t @kirschbombe --- recipe/0489-multimedia-canvas/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index 522e57e34..fa4236294 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -1,5 +1,5 @@ --- -title: Teaching with a Multimedia Canvas +title: Rendering Multiple Media Types on a Time-Based Canvas id: 499 layout: recipe tags: Complex Object From 48dd5b578d4f2a04195f8e28179ee53f02535d25 Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 27 Sep 2024 11:00:32 -0400 Subject: [PATCH 47/50] =?UTF-8?q?Changed=20title=20per=20TRC=20comments=20?= =?UTF-8?q?=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit h/t @kirschbombe --- _includes/links.md | 2 +- index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_includes/links.md b/_includes/links.md index 5a59ae11d..de47259c0 100644 --- a/_includes/links.md +++ b/_includes/links.md @@ -75,7 +75,7 @@ [0466]: {{ site.cookbook_url | absolute_url }}/recipe/0466-link-for-loading-manifest/ "Loading a manifest with a viewer using a link" [0434]: {{ site.cookbook_url | absolute_url }}/recipe/0434-choice-av/ "Multiple Choice of Audio Formats in a Single View (Canvas)" -[0489]: {{ site.cookbook_url | absolute_url }}/recipe/0489-multimedia-canvas/ "Teaching with a Multimedia Canvas" +[0489]: {{ site.cookbook_url | absolute_url }}/recipe/0489-multimedia-canvas/ "Rendering Multiple Media Types on a Time-Based Canvas" [cookbook-process]: {{site.cookbook_url | absolute_url }}/recipe diff --git a/index.md b/index.md index 4c479986a..45b478a7c 100644 --- a/index.md +++ b/index.md @@ -114,7 +114,7 @@ _(leading on to segmentation examples later)_ * [Multiple choice of images in a single view][0033] (29) * [Foldouts, Flaps, and Maps][0035] * [Composition from Multiple Images][0036] (30,31) -* [Teaching with a Multimedia Canvas][0489] +* [Rendering Multiple Media Types on a Time-Based Canvas][0489] * Multiple images and multiple choices (32,33,34) * [Annotating part of an image to a Canvas][recipe-segment-image-part] (e.g., crop out scanner) (35,36,37,38) * [Image Rotation Two Ways][0040] From bb4e212549d390121b055ea9616ae749e1011cea Mon Sep 17 00:00:00 2001 From: Trip Kirkpatrick Date: Fri, 27 Sep 2024 11:01:36 -0400 Subject: [PATCH 48/50] =?UTF-8?q?Rework=20comment=20about=20resource=20ord?= =?UTF-8?q?er=20=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit h/t @zimeon --- recipe/0489-multimedia-canvas/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/0489-multimedia-canvas/index.md b/recipe/0489-multimedia-canvas/index.md index fa4236294..ee8aafc43 100644 --- a/recipe/0489-multimedia-canvas/index.md +++ b/recipe/0489-multimedia-canvas/index.md @@ -20,7 +20,7 @@ This recipe pulls together techniques and structures described in other recipes, Likewise, while other recipes have discussed [simple textual annotations][0266], this recipe uses a `painting` motivation for its textual annotations (rather than `commenting` as the linked recipe does) to include the text directly and visibly on the Canvas. -A Canvas containing a `duration` property has a notional timeline that can be used to target resources to a time point or range of the Canvas. If a resource's `target` value includes a `t` parameter, the resource can be expected to be shown during only and all of that span of time on the timeline. (See "Restrictions" below for caveats and see [the Presentation specification][prezi3] for more detail about time and IIIF resources, including [the `duration` property][https://iiif.io/api/presentation/3.0/#duration].) +A Canvas containing a `duration` property has a notional timeline that can be used to target resources to a time point or range of the Canvas. If a resource's `target` value includes a `t` parameter, the resource can be expected to be shown during only and all of that span of time on the timeline. The order in which resources appear on the Canvas is governed by the `t` parameter of the `target` when specified; they can be entered in the Manifest in any order. (See "Restrictions" below for caveats and see [the Presentation specification][prezi3] for more detail about time and IIIF resources, including [the `duration` property][https://iiif.io/api/presentation/3.0/#duration].) The `t` parameter of the `target` value can also serve to trim an AV resource to be displayed for something other than its whole duration. An AV resource can thus have a `target` that governs its placement on the Canvas, its dimensions relative to the Canvas, its appearance duration, and the amount of its total running time that is used. An AV resource can also take [a `timeMode` property](https://iiif.io/api/presentation/3.0/#timemode) that governs its rendering in conjunction with the `t` parameter of its `target` and the `duration` property of a Canvas. From 8650db6aa99e58c9e58601911936a4def75e3db3 Mon Sep 17 00:00:00 2001 From: giacomounivr Date: Fri, 27 Sep 2024 17:02:50 +0200 Subject: [PATCH 49/50] Post TRC corrections --- .../0485-contentstate-canvas-region/index.md | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/recipe/0485-contentstate-canvas-region/index.md b/recipe/0485-contentstate-canvas-region/index.md index 5fa6a5cfa..06b0ba56e 100644 --- a/recipe/0485-contentstate-canvas-region/index.md +++ b/recipe/0485-contentstate-canvas-region/index.md @@ -1,9 +1,9 @@ --- -title: Open a specific region of a canvas in a viewer +title: Open a specific region of a Canvas in a viewer id: 485 layout: recipe tags: [annotation, content-state] -summary: "Allows users to use content state API to open a specific region of a canvas by means of supported viewers." +summary: "Allows users to use Content State API to open a specific region of a Canvas by means of supported viewers." viewers: topic: - content-state @@ -21,11 +21,11 @@ This request can be implemented in a standardized manner using the [IIIF Content We can use the [Web Annotation Data Model](https://www.w3.org/TR/annotation-model/) to encode the information necessary, as shown in ["A Region of a Canvas in a Manifest"](https://iiif.io/api/content-state/1.0/#51-a-region-of-a-canvas-in-a-manifest) section of the standard. -However, before passing the data as a query parameter, we must encode it as explained in the [content state encoding guidelines](https://iiif.io/api/content-state/1.0/#6-content-state-encoding). +However, before passing the data as a query parameter, we must encode it as explained in the [Content State encoding guidelines](https://iiif.io/api/content-state/1.0/#6-content-state-encoding). In this example, we want to highlight a portion of an image contained in a book. We will use the following manifest shown in the Simple Manifest Book recipe, which is available at the following link: [https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json](https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json) -We want to open the viewport to a specific canvas region using a viewer available on the following page `https://example.org/viewer`. +We want to open the viewport to a specific Canvas region using a viewer available on the following page `https://example.org/viewer`. First, we create an Annotation: @@ -46,9 +46,9 @@ First, we create an Annotation: } ``` -We can create an Annotation with `motivation` set to `contentState` and a target `type` set to Canvas the `id` of the target will contain a fragment selector with the coordinates of the canvas we want to share, while the `partOf` element has the `id` of the Manifest containing the Canvas. +We can create an Annotation with `motivation` set to `contentState` and a target `type` set to Canvas. The `id` of the target will contain a fragment selector (`#xywh=1528,3024,344,408`) with the coordinates of the Canvas we want to share, while the `partOf` element has the `id` of the Manifest containing the Canvas. -We can now use one of the methods listed in the [examples of content state encoding section](https://iiif.io/api/content-state/1.0/#63-examples-of-content-state-encoding) to generate a base64url string (**note: for brevity, we removed new lines characters and white spaces before computing the base64url**). +We can now use one of the methods listed in the [examples of Content State encoding section](https://iiif.io/api/content-state/1.0/#63-examples-of-content-state-encoding) to generate a base64url string (**note: for brevity, we removed new line characters and white space before computing the base64url**). We can pass the encoded value, using the `iiif-content` query parameter of the viewer landing page: [https://example.org/viewer?iiif-content=JTdCJTIyJTQwY29udGV4dCUyMiUzQSUyMmh0dHAlM0ElMkYlMkZpaWlmLmlvJTJGYXBpJTJGcHJlc2VudGF0aW9uJTJGMyUyRmNvbnRleHQuanNvbiUyMiUyQyUyMmlkJTIyJTNBJTIyaHR0cHMlM0ElMkYlMkZleGFtcGxlLm9yZyUyRmltcG9ydCUyRjElMjIlMkMlMjJ0eXBlJTIyJTNBJTIyQW5ub3RhdGlvbiUyMiUyQyUyMm1vdGl2YXRpb24lMjIlM0ElNUIlMjJjb250ZW50U3RhdGUlMjIlNUQlMkMlMjJ0YXJnZXQlMjIlM0ElN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZjYW52YXMlMkZwMiUyM3h5d2glM0QxNTI4JTJDMzAyNCUyQzM0NCUyQzQwOCUyMiUyQyUyMnR5cGUlMjIlM0ElMjJDYW52YXMlMjIlMkMlMjJwYXJ0T2YlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGaWlpZi5pbyUyRmFwaSUyRmNvb2tib29rJTJGcmVjaXBlJTJGMDAwOS1ib29rLTElMkZtYW5pZmVzdC5qc29uJTIyJTJDJTIydHlwZSUyMiUzQSUyMk1hbmlmZXN0JTIyJTdEJTVEJTdEJTdE](https://example.org/) @@ -59,11 +59,11 @@ We can also create an anchor tag with the link as the `href` attribute for use i Link for visualizing the region of a Canvas using a viewer. ``` -An alternive way of sharing a region of an image is to use the [Image API](https://iiif.io/api/image/3.0/#41-region). However, the context from which the region is extracted is not easily accessible. Instead, sharing a link to open the specific region with a viewer allows the users to explore another part of the image or related content and metadata in the Manifest. +An alternative way of sharing a region of an image is to use the [Image API](https://iiif.io/api/image/3.0/#41-region). However, the context from which the region is extracted is not easily accessible. Instead, sharing a link to open the specific region with a viewer allows the users to explore another part of the image or related content and metadata in the Manifest. ## Restrictions -Note content state does not define how the viewer should bring the regsion of the canvas to the attention of the user. It only mentions: +Note Content State does not define how the viewer should bring the regions of the Canvas to the attention of the user. It only mentions: "This data structure can be used by clients to load the resource required, present a particular part of the resource to the user." https://iiif.io/api/content-state/1.0/#content-state @@ -71,7 +71,7 @@ Viewers may set the viewport to the region or highlight the region with an annot ## Example -In this example we are aiming to highlight the bug that is on the second page of the Book in receip []. The part of the image we are highlighting is as follows: +In this example we are aiming to highlight the bug that is on the second page of the [Book in recipe][0009]. The part of the image we are highlighting is as follows: ![Image of a bug](https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f19/1528,3024,344,408/pct:50/0/default.jpg) @@ -85,9 +85,10 @@ and this is located in the following region of the second image: ## Related Recipes -* [Simplest Manifest - Image][0001] shows the basic structure of a IIIF Manifest using presentation API 3.0. +* [Simplest Manifest - Image][0001] shows the basic structure of a IIIF Manifest using Presentation API 3.0. * [A simple book][0009] shows the manifest structure. -* [Link for loading a manifest][0466] another example of content state API. +* [Link for loading a manifest][0466] another example of Content State API. +* [Addressing a Spatial Region][0299] an example of sharing a region of a Canvas creating a new Manifest. {% include acronyms.md %} {% include links.md %} From b7dec5eab3b8bc067329f4e23aee7f1433473830 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Fri, 27 Sep 2024 16:40:25 +0100 Subject: [PATCH 50/50] Addressing cookbook authors comments. --- recipe/0006-text-language/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipe/0006-text-language/index.md b/recipe/0006-text-language/index.md index d154110bc..24ca762fe 100644 --- a/recipe/0006-text-language/index.md +++ b/recipe/0006-text-language/index.md @@ -39,11 +39,11 @@ In the `metadata` and `requiredStatement` properties, the `label` strings for "C Finally, the `summary` property (lines 49-54) has values in both English and French. -With the Universal Viewer, Mirador and Glycerine you can open the settings menu (gear icon) and choose either English or French. +With the Universal Viewer, Mirador, and Glycerine you can open the settings menu (gear icon) and choose either English or French. For the Curation viewer you need to add a `lang=fr` parameter to access the French properties. You can see the French values on the [IIIF Curation Viewer](http://codh.rois.ac.jp/software/iiif-curation-viewer/demo/?manifest=https://iiif.io/api/cookbook/recipe/0006-text-language/manifest.json&lang=fr) demo site. -Note the viewers included in this recipe are for the specific languages in the example of this recipe i.e. French and English. Not all viewers support all languages and users should check the viewers with their manifests to see if they need to configure the viewer to make the extra languages available. +Note not all viewers support all languages and users should check the viewers with their manifests to see if they need to configure the viewer to make the extra languages available. The image in this example was sourced via Wikimedia Commons and is public domain.