diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 824934f97..27687a32f 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -163,13 +163,20 @@ Timelines have an additional required property of `duration`, which gives the ex "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/annotation/t1", "type": "Annotation", "motivation": [ "painting" ], - "body": { - "id": "https://iiif.io/api/presentation/example-content-resources/audio/clip.mp3", - "type": "Audio", - "format": "audio/mp3", - "duration": 32.76 - }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-containers/timeline" + "body": [ + { + "id": "https://iiif.io/api/presentation/example-content-resources/audio/clip.mp3", + "type": "Audio", + "format": "audio/mp3", + "duration": 32.76 + } + ], + "target": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/timeline", + "type": "Timeline" + } + ] } ] } @@ -198,14 +205,21 @@ Canvases have two additional required properties: `height` and `width`, which gi "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/annotation/c1", "type": "Annotation", "motivation": [ "painting" ], - "body": { - "id": "https://iiif.io/api/presentation/example-content-resources/image/painting.jpg", - "type": "Image", - "format": "image/jpeg", - "width": 4000, - "height": 3000 - }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas" + "body": [ + { + "id": "https://iiif.io/api/presentation/example-content-resources/image/painting.jpg", + "type": "Image", + "format": "image/jpeg", + "width": 4000, + "height": 3000 + } + ], + "target": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas", + "type": "Canvas" + } + ] } ] } @@ -232,12 +246,19 @@ Scenes may also have the `duration` property in the same manner as Timelines. "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/annotation/s1", "type": "Annotation", "motivation": [ "painting" ], - "body": { - "id": "https://iiif.io/api/presentation/example-content-resources/models/astronaut.glb", - "type": "Model", - "format": "model/gltf-binary" - }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-containers/scene" + "body": [ + { + "id": "https://iiif.io/api/presentation/example-content-resources/models/astronaut.glb", + "type": "Model", + "format": "model/gltf-binary" + } + ], + "target": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/scene", + "type": "Scene" + } + ] } ] } @@ -291,14 +312,21 @@ There are different types of fragment based on the format of the resource. The m "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/comments/c1", "type": "Annotation", "motivation": [ "commenting" ], - "body": { - "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/bodies/koto-body", - "type": "TextualBody", - "value": "Koto with a cover being carried", - "language": "en", - "format": "text/plain" - }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas#xywh=6050,3220,925,1250" + "body": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/bodies/koto-body", + "type": "TextualBody", + "value": "Koto with a cover being carried", + "language": "en", + "format": "text/plain" + } + ], + "target": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas#xywh=6050,3220,925,1250", + "type": "Canvas" + } + ] } ``` @@ -320,26 +348,30 @@ The fragment example above can be expressed using a Specific Resource: "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/comments/c1", "type": "Annotation", "motivation": [ "commenting" ], - "body": { - "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/bodies/koto-body", - "type": "TextualBody", - "value": "Koto with a cover being carried", - "language": "en", - "format": "text/plain" - }, - "target": { - "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/resources/koto-sr", - "type": "SpecificResource", - "source": { - "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas", - "type": "Canvas" - }, - "selector": { - "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/selectors/koto-selector", - "type": "FragmentSelector", - "value": "xywh=6050,3220,925,1250" + "body": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/bodies/koto-body", + "type": "TextualBody", + "value": "Koto with a cover being carried", + "language": "en", + "format": "text/plain" } - } + ], + "target": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/resources/koto-sr", + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas", + "type": "Canvas" + }, + "selector": { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/selectors/koto-selector", + "type": "FragmentSelector", + "value": "xywh=6050,3220,925,1250" + } + } + ] } ``` @@ -509,22 +541,26 @@ The example demonstrates the use of the common descriptive properties `label` fo "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/annotation/c1", "type": "Annotation", "motivation": [ "painting" ], - "body": { - "id": "https://iiif.io/api/presentation/example/image/painting/full/max/0/default.jpg", - "type": "Image", - "format": "image/jpeg", - "width": 4000, - "height": 3000, - "service": [ - { - "id": "https://iiif.io/api/presentation/example/image/painting", - "profile": "level1", - "type": "ImageService3", - // etc - } - ] - }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas" + "body": [ + { + "id": "https://iiif.io/api/presentation/example/image/painting/full/max/0/default.jpg", + "type": "Image", + "format": "image/jpeg", + "width": 4000, + "height": 3000, + "service": [ + { + "id": "https://iiif.io/api/presentation/example/image/painting", + "profile": "level1", + "type": "ImageService3", + // etc + } + ] + } + ], + "target": [ + "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas" + ] } ] } @@ -599,14 +635,18 @@ This example is a Manifest with multiple Canvases, each of which represents a pa "id": "https://example.org/iiif/presentation/examples/manifest-with-book/annotation/a1", "type": "Annotation", "motivation": [ "painting" ], - "body": { + "body": [ + { "id": "https://iiif.io/api/presentation/example-content-resources/image/page1.jpg", "type": "Image", "format": "image/jpeg", "height": 4613, "width": 3204, - }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-book/canvas/c1" + } + ], + "target": [ + "https://example.org/iiif/presentation/examples/manifest-with-book/canvas/c1" + ] } ] } @@ -627,14 +667,18 @@ This example is a Manifest with multiple Canvases, each of which represents a pa "id": "https://example.org/iiif/presentation/examples/manifest-with-book/annotation/a2", "type": "Annotation", "motivation": [ "painting" ], - "body": { - "id": "https://iiif.io/api/presentation/example-content-resources/image/page2.jpg", - "type": "Image", - "format": "image/jpeg", - "height": 4613, - "width": 3204, - }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-book/canvas/c2" + "body": [ + { + "id": "https://iiif.io/api/presentation/example-content-resources/image/page2.jpg", + "type": "Image", + "format": "image/jpeg", + "height": 4613, + "width": 3204, + } + ], + "target": [ + "https://example.org/iiif/presentation/examples/manifest-with-book/canvas/c2" + ] } ] } @@ -655,14 +699,18 @@ This example is a Manifest with multiple Canvases, each of which represents a pa "id": "https://example.org/iiif/presentation/examples/manifest-with-book/annotation/a3", "type": "Annotation", "motivation": [ "painting" ], - "body": { - "id": "https://iiif.io/api/presentation/example-content-resources/image/page3.jpg", - "type": "Image", - "format": "image/jpeg", - "height": 4613, - "width": 3204, - }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-book/canvas/c3" + "body": [ + { + "id": "https://iiif.io/api/presentation/example-content-resources/image/page3.jpg", + "type": "Image", + "format": "image/jpeg", + "height": 4613, + "width": 3204, + } + ], + "target": [ + "https://example.org/iiif/presentation/examples/manifest-with-book/canvas/c3" + ] } ] } @@ -781,14 +829,18 @@ Manifest for the October 27, 1881 issue, with Ranges for table of contents: "id": "https://example.org/iiif/periodical/multi-part-collection/annotation/a1", "type": "Annotation", "motivation": [ "painting" ], - "body": { - "id": "https://example.org/image/page1.jpg", - "type": "Image", - "format": "image/jpeg", - "height": 4613, - "width": 3204, - }, - "target": "https://example.org/iiif/periodical/multi-part-collection/canvas/c1" + "body": [ + { + "id": "https://example.org/image/page1.jpg", + "type": "Image", + "format": "image/jpeg", + "height": 4613, + "width": 3204, + } + ], + "target": [ + "https://example.org/iiif/periodical/multi-part-collection/canvas/c1" + ] } ] } @@ -809,14 +861,18 @@ Manifest for the October 27, 1881 issue, with Ranges for table of contents: "id": "https://example.org/iiif/periodical/multi-part-collection/annotation/a2", "type": "Annotation", "motivation": [ "painting" ], - "body": { - "id": "https://example.org/image/page2.jpg", - "type": "Image", - "format": "image/jpeg", - "height": 4613, - "width": 3204, - }, - "target": "https://example.org/iiif/periodical/multi-part-collection/canvas/c2" + "body": [ + { + "id": "https://example.org/image/page2.jpg", + "type": "Image", + "format": "image/jpeg", + "height": 4613, + "width": 3204, + } + ], + "target": [ + "https://example.org/iiif/periodical/multi-part-collection/canvas/c2" + ] } ] } @@ -893,14 +949,18 @@ This example is a Manifest with two Timelines, each of which represent a tempora "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/accompany/c1/image", "type": "Annotation", "motivation": [ "painting" ], - "body": { - "id": "https://example.org/presentation/example-content-resources/image/cover.jpg", - "type": "Image", - "format": "image/jpeg", - "height": 900, - "width": 900 - }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-audio/accompany/ac1" + "body": [ + { + "id": "https://example.org/presentation/example-content-resources/image/cover.jpg", + "type": "Image", + "format": "image/jpeg", + "height": 900, + "width": 900 + } + ], + "target": [ + "https://example.org/iiif/presentation/examples/manifest-with-audio/accompany/ac1" + ] } ] } @@ -921,14 +981,18 @@ This example is a Manifest with two Timelines, each of which represent a tempora "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/annotation/a1", "type": "Annotation", "motivation": [ "painting" ], - "body": { - "id": "https://example.org/presentation/example-content-resources/audio/track1.mp4", - "type": "Sound", - "format": "audio/mp4", - "duration": 231, - "language": [ "de" ], - }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1" + "body": [ + { + "id": "https://example.org/presentation/example-content-resources/audio/track1.mp4", + "type": "Sound", + "format": "audio/mp4", + "duration": 231, + "language": [ "de" ], + } + ], + "target": [ + "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1" + ] } ] } @@ -948,14 +1012,18 @@ This example is a Manifest with two Timelines, each of which represent a tempora "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/annotation/a2", "type": "Annotation", "motivation": [ "painting" ], - "body": { - "id": "https://example.org/presentation/example-content-resources/audio/track2.mp4", - "type": "Sound", - "format": "audio/mp4", - "duration": 230.5, - "language": [ "en" ], - }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t2" + "body": [ + { + "id": "https://example.org/presentation/example-content-resources/audio/track2.mp4", + "type": "Sound", + "format": "audio/mp4", + "duration": 230.5, + "language": [ "en" ], + } + ], + "target": [ + "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t2" + ] } ] } @@ -982,14 +1050,18 @@ This example is a Manifest with two Timelines, each of which represent a tempora "id": "https://example.org/iiif/presentation/examples/external-anno/a1", "type": "Annotation", "motivation": [ "supplementing" ], - "body": { - "id": "https://example.org/presentation/example-content-resources/lyrics1.txt", - "type": "TextualBody", - "language": "de", - "format": "text/plain", - "value": "Hast du etwas Zeit für mich?" - }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1#t=3.5,6.8" + "body": [ + { + "id": "https://example.org/presentation/example-content-resources/lyrics1.txt", + "type": "TextualBody", + "language": "de", + "format": "text/plain", + "value": "Hast du etwas Zeit für mich?" + } + ], + "target": [ + "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1#t=3.5,6.8" + ] } ], // (annotations for the rest of the song lines) @@ -1041,14 +1113,18 @@ This example is a Manifest with one Canvas that represents the temporal extent o "id": "https://example.org/iiif/presentation/examples/manifest-with-movie/placeholder/image", "type": "Annotation", "motivation": "painting", - "body": { - "id": "https://example.org/image/placeholder.png", - "type": "Image", - "format": "image/png", - "height": 320, - "width": 400, - }, - "target": "https://iiif.io/api/cookbook/recipe/0013-placeholderCanvas/canvas/donizetti/placeholder" + "body": [ + { + "id": "https://example.org/image/placeholder.png", + "type": "Image", + "format": "image/png", + "height": 320, + "width": 400, + } + ], + "target": [ + "https://iiif.io/api/cookbook/recipe/0013-placeholderCanvas/canvas/donizetti/placeholder" + ] } ] } @@ -1063,32 +1139,36 @@ This example is a Manifest with one Canvas that represents the temporal extent o "id": "https://example.org/iiif/presentation/examples/manifest-with-movie/anno1", "type": "Annotation", "motivation": "painting", - "body": { - "type": "Choice", - "items": [ - { - "id": "https://example.org/video/movie-low.mp4", - "type": "Video", - "label": { "en": ["Low resolution (360 MB)" ]}, - "height": 360, - "width": 480, - "duration": 3600, - "format": "video/mp4", - "fileSize": 360553219 - }, - { - "id": "https://example.org/video/movie-hi.mp4", - "type": "Video", - "label": { "en": ["High resolution (1.3 GB)" ]}, - "height": 1080, - "width": 1440, - "duration": 3600, - "format": "video/mp4", - "fileSize": 1345876231 - } - ] - }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-movie/canvas" + "body": [ + { + "type": "Choice", + "items": [ + { + "id": "https://example.org/video/movie-low.mp4", + "type": "Video", + "label": { "en": ["Low resolution (360 MB)" ]}, + "height": 360, + "width": 480, + "duration": 3600, + "format": "video/mp4", + "fileSize": 360553219 + }, + { + "id": "https://example.org/video/movie-hi.mp4", + "type": "Video", + "label": { "en": ["High resolution (1.3 GB)" ]}, + "height": 1080, + "width": 1440, + "duration": 3600, + "format": "video/mp4", + "fileSize": 1345876231 + } + ] + } + ], + "target": [ + "https://example.org/iiif/presentation/examples/manifest-with-movie/canvas" + ] } ] } @@ -1102,19 +1182,23 @@ This example is a Manifest with one Canvas that represents the temporal extent o "id": "https://example.org/iiif/presentation/examples/manifest-with-movie/subtitles/anno", "type": "Annotation", "motivation": "supplementing", - "body": { - "id": "https://example.org/text/subtitles.vtt", - "type": "Text", - "format": "text/vtt", - "provides": [ "subtitles" ], - "label": { - "en": [ - "Subtitles in WebVTT format" - ] - }, - "language": "en" - }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-movie/canvas" + "body": [ + { + "id": "https://example.org/text/subtitles.vtt", + "type": "Text", + "format": "text/vtt", + "provides": [ "subtitles" ], + "label": { + "en": [ + "Subtitles in WebVTT format" + ] + }, + "language": "en" + } + ], + "target": [ + "https://example.org/iiif/presentation/examples/manifest-with-movie/canvas" + ] } ] } @@ -1208,12 +1292,16 @@ This example is a Manifest with a single Scene, with a single model of a space s "id": "https://example.org/iiif/3d/anno1", "type": "Annotation", "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/astronaut/astronaut.glb", - "type": "Model", - "format": "model/gltf-binary" - }, - "target": "https://example.org/iiif/scene1/page/p1/1" + "body": [ + { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/astronaut/astronaut.glb", + "type": "Model", + "format": "model/gltf-binary" + } + ], + "target": [ + "https://example.org/iiif/scene1/page/p1/1" + ] } ] } @@ -1263,27 +1351,31 @@ The Light is green and has a position, but has its default orientation of lookin "id": "https://example.org/iiif/3d/anno1", "type": "Annotation", "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/astronaut/astronaut.glb", - "type": "Model", - "format": "model/gltf-binary" - }, - "target": { - "type": "SpecificResource", - "source": + "body": [ { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "Scene" - }, - "selector": [ + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/astronaut/astronaut.glb", + "type": "Model", + "format": "model/gltf-binary" + } + ], + "target": [ + { + "type": "SpecificResource", + "source": { - "type": "PointSelector", - "x": -1.0, - "y": 1.0, - "z": 1.0 - } - ] - } + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene" + }, + "selector": [ + { + "type": "PointSelector", + "x": -1.0, + "y": 1.0, + "z": 1.0 + } + ] + } + ] }, { "id": "https://example.org/iiif/3d/anno2", @@ -1326,28 +1418,32 @@ The Light is green and has a position, but has its default orientation of lookin "id": "https://example.org/iiif/3d/anno2", "type": "Annotation", "motivation": ["painting"], - "body": [{ + "body": [ + { "id": "https://example.org/iiif/3d/lights/1", "type": "SpotLight", "label": {"en": ["Spot Light 1"]}, "angle": 90.0, "color": "#A0FFA0" - }], - "target": [{ - "type": "SpecificResource", - "source": { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "Scene" - }, - "selector": [ - { - "type": "PointSelector", - "x": 0.0, - "y": 3.0, - "z": 1.0 - } - ] - }] + } + ], + "target": [ + { + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene" + }, + "selector": [ + { + "type": "PointSelector", + "x": 0.0, + "y": 3.0, + "z": 1.0 + } + ] + } + ] } ] } @@ -1394,110 +1490,121 @@ This example is a Manifest with a single Scene with multiple models painted into "id": "https://example.org/iiif/3d/anno1", "type": "Annotation", "motivation": ["painting"], - "body": [{ - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/chess/pawn.glb", - "label": {"en": ["Pawn 1"]}, - "type": "Model", - "format": "model/gltf-binary" - }], - "target": [{ - "type": "SpecificResource", - "source": { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "Scene" - }, - "selector": [ - { - "type": "PointSelector", - "x": 1.0, - "y": 0.0, - "z": 0.0 - } - ] - }] - }, - { - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": [{ - "type": "SpecificResource", - "source": - { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/chess/pawn.glb", - "label": {"en": ["Pawn 2 tipped over"]}, - "type": "Model", - "format": "model/gltf-binary" - }, - "transform": [ - { - "type": "RotateTransform", - "x": 0.0, - "y": 0.0, - "z": -90.0 - }, - { - "type": "Translate Transform", - "x": 0.0, - "y": 1.0, - "z": 0.0 - } - ] - }], - "target": [{ - "type": "SpecificResource", - "source": { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "Scene" - }, - "selector": [ - { - "type": "PointSelector", - "x": 2.0, - "y": 0.0, - "z": 3.0 - } - ] - }] + "body": [ + { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/chess/pawn.glb", + "label": {"en": ["Pawn 1"]}, + "type": "Model", + "format": "model/gltf-binary" + } + ], + "target": [ + { + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene" + }, + "selector": [ + { + "type": "PointSelector", + "x": 1.0, + "y": 0.0, + "z": 0.0 + } + ] + } + ] }, { "id": "https://example.org/iiif/3d/anno1", "type": "Annotation", "motivation": ["painting"], - "exclude": ["Audio", "Lights"], - "body": [{ - "type": "SpecificResource", - "source": - { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/chess/queen.glb", - "label": {"en": ["Queen"]}, - "type": "Model", - "format": "model/gltf-binary" + "body": [ + { + "type": "SpecificResource", + "source": + { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/chess/pawn.glb", + "label": {"en": ["Pawn 2 tipped over"]}, + "type": "Model", + "format": "model/gltf-binary" + }, + "transform": [ + { + "type": "RotateTransform", + "x": 0.0, + "y": 0.0, + "z": -90.0 + }, + { + "type": "Translate Transform", + "x": 0.0, + "y": 1.0, + "z": 0.0 + } + ] + } + ], + "target": [ + { + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene" }, - "transform": [ - { - "type": "ScaleTransform", - "x": 1.5, - "y": 1.5, - "z": 1.5 + "selector": [ + { + "type": "PointSelector", + "x": 2.0, + "y": 0.0, + "z": 3.0 + } + ] + } + ] + }, + { + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "exclude": ["Audio", "Lights"], + "body": [ + { + "type": "SpecificResource", + "source": + { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/chess/queen.glb", + "label": {"en": ["Queen"]}, + "type": "Model", + "format": "model/gltf-binary" + }, + "transform": [ + { + "type": "ScaleTransform", + "x": 1.5, + "y": 1.5, + "z": 1.5 + }, + ] + } + ], + "target": [ + { + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene" }, - ] - }], - "target": [{ - "type": "SpecificResource", - "source": { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "Scene" - }, - "selector": [ - { - "type": "PointSelector", - "x": 1.0, - "y": 0.0, - "z": 2.0 - } - ] - } + "selector": [ + { + "type": "PointSelector", + "x": 1.0, + "y": 0.0, + "z": 2.0 + } + ] + } ] } ] @@ -1559,21 +1666,23 @@ In this example, the audio content resources have durations that do not match th "id": "https://example.org/iiif/3d/anno1", "type": "Annotation", "motivation": ["painting"], - "body": [{ - "id": "https://example.org/iiif/audio/1", - "type": "AmbientAudio", - "source": { - "id": "https://example.org/iiif/assets/symphony_hall_ambience.mp3", - "type": "Audio", - "format": "audio/mp3" - }, - "volume": { - "id": "https://example.org/iiif/quantity/1", - "type": "Quantity", - "unit": "relative", - "quantityValue": 0.1 + "body": [ + { + "id": "https://example.org/iiif/audio/1", + "type": "AmbientAudio", + "source": { + "id": "https://example.org/iiif/assets/symphony_hall_ambience.mp3", + "type": "Audio", + "format": "audio/mp3" + }, + "volume": { + "id": "https://example.org/iiif/quantity/1", + "type": "Quantity", + "unit": "relative", + "quantityValue": 0.1 + } } - }], + ], "target": [ { "id": "https://example.org/iiif/scene1", @@ -1586,67 +1695,73 @@ In this example, the audio content resources have durations that do not match th "type": "Annotation", "motivation": ["painting"], "timeMode": "trim", - "body": [{ - "id": "https://example.org/iiif/audio/2", - "type": "PointAudio", - "source": { - "id": "https://example.org/iiif/assets/orchestra_percussion_120s.mp3", - "type": "Audio", - "format": "audio/mp3" - }, - "volume": { - "id": "https://example.org/iiif/quantity/2", - "type": "Quantity", - "unit": "relative", - "quantityValue": 0.2 - } - }], - "target": [{ - "id": "https://example.org/iiif/selectors/anno2", - "type": "SpecificResource", - "source": - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" + "body": [ + { + "id": "https://example.org/iiif/audio/2", + "type": "PointAudio", + "source": { + "id": "https://example.org/iiif/assets/orchestra_percussion_120s.mp3", + "type": "Audio", + "format": "audio/mp3" }, - "selector": [ - { - "id": "https://example.org/uuid/9fbd580b-895b-41b9-974a-1553329037f2", - "type": "PointSelector", - "x": -3.0, - "y": 0.0, - "z": -2.0, - "refinedBy": { - "id": "https://example.org/uuid/3d0d097b-2b37-4a15-b6a5-506e417d5115", - "type": "FragmentSelector", - "value": "t=0,30" - } + "volume": { + "id": "https://example.org/iiif/quantity/2", + "type": "Quantity", + "unit": "relative", + "quantityValue": 0.2 } - ] - }] + } + ], + "target": [ + { + "id": "https://example.org/iiif/selectors/anno2", + "type": "SpecificResource", + "source": + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + }, + "selector": [ + { + "id": "https://example.org/uuid/9fbd580b-895b-41b9-974a-1553329037f2", + "type": "PointSelector", + "x": -3.0, + "y": 0.0, + "z": -2.0, + "refinedBy": { + "id": "https://example.org/uuid/3d0d097b-2b37-4a15-b6a5-506e417d5115", + "type": "FragmentSelector", + "value": "t=0,30" + } + } + ] + } + ] }, { "id": "https://example.org/iiif/3d/anno3", "type": "Annotation", "motivation": ["painting"], "timeMode": "loop", - "body": [{ - "id": "https://example.org/iiif/audio/3", - "type": "SpotAudio", - "source": { - "id": "https://example.org/iiif/assets/orchestra_tuba_10s.mp3", - "type": "Audio", - "format": "audio/mp3" - }, - "angle": 45.0, - "volume": { - "id": "https://example.org/iiif/quantity/3", - "type": "Quantity", - "unit": "relative", - "quantityValue": 0.3 - }, - "lookAt": "https://example.org/iiif/scene1" - }], + "body": [ + { + "id": "https://example.org/iiif/audio/3", + "type": "SpotAudio", + "source": { + "id": "https://example.org/iiif/assets/orchestra_tuba_10s.mp3", + "type": "Audio", + "format": "audio/mp3" + }, + "angle": 45.0, + "volume": { + "id": "https://example.org/iiif/quantity/3", + "type": "Quantity", + "unit": "relative", + "quantityValue": 0.3 + }, + "lookAt": "https://example.org/iiif/scene1" + } + ], "target": [ { "id": "https://example.org/iiif/scene1#xyz=3,0,-2&t=30,60", @@ -1666,21 +1781,23 @@ In this example, the audio content resources have durations that do not match th "value": "This is the point when the percussion stops playing and the tuba begins playing." } ], - "target": [{ - "type": "SpecificResource", - "source": - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - , - "selector": [ + "target": [ + { + "type": "SpecificResource", + "source": { - "type": "PointSelector", - "instant": 30.0 + "id": "https://example.org/iiif/scene1", + "type": "Scene" } - ] - }] + , + "selector": [ + { + "type": "PointSelector", + "instant": 30.0 + } + ] + } + ] } ] } @@ -1761,11 +1878,15 @@ A simple example painting one Scene into another: "id": "https://example.org/iiif/3d/anno1", "type": "Annotation", "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - }, - "target": "https://example.org/iiif/scene2" + "body": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "target": [ + "https://example.org/iiif/scene2" + ] } ``` @@ -1860,14 +1981,18 @@ This is an example of a commenting annotation that targets two-minute segment of "id": "https://example.org/iiif/presentation/examples/commenting/anno/1", "type": "Annotation", "motivation": [ "commenting" ], - "body": { - "id": "https://example.org/iiif/presentation/examples/commenting/anno/1/theme2", - "type": "TextualBody", - "language": "en", - "format": "text/plain", - "value": "The second theme of the concerto is introduced." - }, - "target": "https://example.org/iiif/presentation/examples/commenting/timeline/t1#t=38.0,158.0" + "body": [ + { + "id": "https://example.org/iiif/presentation/examples/commenting/anno/1/theme2", + "type": "TextualBody", + "language": "en", + "format": "text/plain", + "value": "The second theme of the concerto is introduced." + } + ], + "target": [ + "https://example.org/iiif/presentation/examples/commenting/timeline/t1#t=38.0,158.0" + ] } ``` @@ -1877,30 +2002,34 @@ A comment on a Canvas can target a non-rectangular area. This example uses a `S ```json { - "id": "https://example.org/iiif/presentation/examples/commenting/anno/2", - "type": "Annotation", - "motivation": [ "commenting" ], - "body": [{ - "id": "https://example.org/iiif/presentation/examples/commenting/anno/2/person2", - "type": "TextualBody", - "language": "en", - "format": "text/plain", - "value": "Note the expressive eyes of the subject of this painting." - }], - "target": [{ - "type": "SpecificResource", - "source": { - "id": "https://example.org/iiif/presentation/examples/commenting/canvas/2", - "type": "Canvas" - }, - "selector": [ - { - "id": "https://example.org/iiif/presentation/examples/commenting/anno2/selector2", - "type": "SvgSelector", - "value": " ... " - } - ] - }] + "id": "https://example.org/iiif/presentation/examples/commenting/anno/2", + "type": "Annotation", + "motivation": [ "commenting" ], + "body": [ + { + "id": "https://example.org/iiif/presentation/examples/commenting/anno/2/person2", + "type": "TextualBody", + "language": "en", + "format": "text/plain", + "value": "Note the expressive eyes of the subject of this painting." + } + ], + "target": [ + { + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/presentation/examples/commenting/canvas/2", + "type": "Canvas" + }, + "selector": [ + { + "id": "https://example.org/iiif/presentation/examples/commenting/anno2/selector2", + "type": "SvgSelector", + "value": " ... " + } + ] + } + ] } ``` @@ -1927,19 +2056,23 @@ In some cases it is desirable to influence the client's positioning of the comme "id": "https://example.org/iiif/scene/commenting/scene3/painting-annotation-pages/1", "type": "AnnotationPage", "items": [ - { - "id": "https://example.org/iiif/scene/commenting/scene3/sculpture", - "type": "Annotation", - "motivation": [ "painting"] , - "label": { - "en": [ "A 1st century Roman portait bust." ] - }, - "body": { - "id": "https://example.org/iiif/scene/commenting/models/portait.gltf", - "type": "Model" - }, - "target": "https://example.org/iiif/scene/commenting/scene3" - } + { + "id": "https://example.org/iiif/scene/commenting/scene3/sculpture", + "type": "Annotation", + "motivation": ["painting"] , + "label": { + "en": [ "A 1st century Roman portait bust." ] + }, + "body": [ + { + "id": "https://example.org/iiif/scene/commenting/models/portait.gltf", + "type": "Model" + } + ], + "target": [ + "https://example.org/iiif/scene/commenting/scene3" + ] + } ] } ] @@ -1954,31 +2087,35 @@ In some cases it is desirable to influence the client's positioning of the comme "id": "https://example.org/iiif/presentation/examples/commenting/anno/3", "type": "Annotation", "motivation": [ "commenting" ], - "body": { - "id": "https://example.org/iiif/presentation/examples/commenting/anno/3/comment1", - "type": "TextualBody", - "language": "en", - "format": "text/plain", - "value": "This marble portrait exemplifies the veristic tradition that dominated Roman Republican portraiture and persisted into the early Imperial period.", - "position": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene/commenting/scene3", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": 0.75, - "y": 1.5, - "z": 0.1 - } - ] + "body": [ + { + "id": "https://example.org/iiif/presentation/examples/commenting/anno/3/comment1", + "type": "TextualBody", + "language": "en", + "format": "text/plain", + "value": "This marble portrait exemplifies the veristic tradition that dominated Roman Republican portraiture and persisted into the early Imperial period.", + "position": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene/commenting/scene3", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": 0.75, + "y": 1.5, + "z": 0.1 + } + ] + } } - }, - "target": "https://example.org/iiif/scene/commenting/scene3/sculpture" + ], + "target": [ + "https://example.org/iiif/scene/commenting/scene3/sculpture" + ] } ] } @@ -2010,7 +2147,9 @@ The resource the user should be taken to is the `body` of the annotation, and th "type": "Text" } ], - "target": "https://example.com/canvas/p1#xywh=265,661,1260,1239" + "target": [ + "https://example.com/canvas/p1#xywh=265,661,1260,1239" + ] } ``` @@ -2054,21 +2193,28 @@ A resource with the `behavior` value "hidden" is not rendered by the client. A r "label": { "en": ["A light switch"] }, - "body": { + "body": [ + { "id": "https://example.org/iiif/model/models/lightswitch.gltf", "type": "Model" - }, - "target": "https://example.org/iiif/scene/switch/scene-1" + } + ], + "target": [ + "https://example.org/iiif/scene/switch/scene-1" + ] }, { "id": "https://example.org/iiif/scene/switch/scene-1/lights/point-light-4", "type": "Annotation", "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/scene/switch/scene-1/lights/4/body", - "type": "PointLight" - }, - "target": { + "body": [ + { + "id": "https://example.org/iiif/scene/switch/scene-1/lights/4/body", + "type": "PointLight" + } + ], + "target": [ + { "type": "SpecificResource", "source": "https://example.org/iiif/scene/switch/scene-1", "selector": [ @@ -2077,7 +2223,8 @@ A resource with the `behavior` value "hidden" is not rendered by the client. A r "x": 5, "y": 5, "z": 5 } ] - }, + } + ], "behavior": ["hidden"] } ] @@ -2091,22 +2238,24 @@ A resource with the `behavior` value "hidden" is not rendered by the client. A r { "id": "https://example.org/iiif/scene/switch/scene-1/annos/1/switch-comment-0", "type": "Annotation", - "motivation": [ - "commenting" - ], - "body": { + "motivation": ["commenting"], + "body": [ + { "type": "TextualBody", "value": "Click the switch to turn the light on or off" - }, - "target": "https://example.org/iiif/painting-annotation/lightswitch-1" + } + ], + "target": [ + "https://example.org/iiif/painting-annotation/lightswitch-1" + ] }, { "id": "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-on-2", "type": "Annotation", - "motivation": [ - "activating" + "motivation": ["activating"], + "target": [ + "https://example.org/iiif/painting-annotation/lightswitch-1" ], - "target": "https://example.org/iiif/painting-annotation/lightswitch-1", "body": [ { "type": "SpecificResource", @@ -2128,10 +2277,10 @@ A resource with the `behavior` value "hidden" is not rendered by the client. A r { "id": "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-off-3", "type": "Annotation", - "motivation": [ - "activating" + "motivation": ["activating"], + "target": [ + "https://example.org/iiif/painting-annotation/lightswitch-1" ], - "target": "https://example.org/iiif/painting-annotation/lightswitch-1", "body": [ { "type": "SpecificResource", @@ -2194,13 +2343,17 @@ The format of the `value` string is implementation-specific, and will depend on "id": "https://example.org/iiif/3d/painting-anno-for-music-box", "type": "Annotation", "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/music-box.glb", - "type": "Model" - }, - "target": { - // SpecificResource with PointSelector - } + "body": [ + { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/music-box.glb", + "type": "Model" + } + ], + "target": [ + { + // SpecificResource with PointSelector + } + ] } ], "annotations": [ @@ -2284,13 +2437,17 @@ It is possible to associate a particular camera with a particular commenting ann "id": "https://example.org/iiif/3d/anno1", "type": "Annotation", "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", - "type": "Model" - }, - "target": { - // SpecificResource with PointSelector - } + "body": [ + { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", + "type": "Model" + } + ], + "target": [ + { + // SpecificResource with PointSelector + } + ] }, { "id": "https://example.org/iiif/3d/anno-that-paints-desired-camera-to-view-tooth", @@ -2329,13 +2486,17 @@ It is possible to associate a particular camera with a particular commenting ann "id": "https://example.org/iiif/3d/anno2", "type": "Annotation", "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_cranium.glb", - "type": "Model" - }, - "target": { - // SpecificResource with PointSelector - } + "body": [ + { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_cranium.glb", + "type": "Model" + } + ], + "target": [ + { + // SpecificResource with PointSelector + } + ] } ] } @@ -2353,13 +2514,15 @@ It is possible to associate a particular camera with a particular commenting ann "motivation": ["commenting"], "body": [ { - "type": "TextualBody", - "value": "Mandibular tooth" + "type": "TextualBody", + "value": "Mandibular tooth" } ], - "target": { - // SpecificResource with PointSelector - } + "target": [ + { + // SpecificResource with PointSelector + } + ] }, { "id": "https://example.org/iiif/3d/commenting-anno-for-right-pterygoid-hamulus", @@ -2367,13 +2530,15 @@ It is possible to associate a particular camera with a particular commenting ann "motivation": ["commenting"], "body": [ { - "type": "TextualBody", - "value": "Right pterygoid hamulus" + "type": "TextualBody", + "value": "Right pterygoid hamulus" } ], - "target": { - // SpecificResource with PointSelector - } + "target": [ + { + // SpecificResource with PointSelector + } + ] }, { "id": "https://example.org/iiif/3d/anno9", @@ -2421,16 +2586,23 @@ The commenting annotation now looks like this: "id": "https://example.org/iiif/3d/commenting-anno-for-mandibular-tooth", "type": "Annotation", "motivation": ["commenting"], - "bodyValue": "Mandibular tooth", + "body": [ + { + "type": "TextualBody", + "value": "Mandibular tooth" + } + ], "scope": [ { "id": "https://example.org/iiif/3d/anno-that-paints-desired-camera-to-view-tooth", "type": "Annotation" } ], - "target": { - // SpecificResource with PointSelector - } + "target": [ + { + // SpecificResource with PointSelector + } + ] }, ``` @@ -2514,11 +2686,13 @@ An image might not be correctly aligned with the Canvas, and require rotation as "source": { "id": "http://example.org/iiif/book1-page1/my-image.jpg", "type": "Image", - "service": { - "id": "http://example.org/iiif/book1-page1", - "type": "ImageService3", - "profile": "level2" - } + "service": [ + { + "id": "http://example.org/iiif/book1-page1", + "type": "ImageService3", + "profile": "level2" + } + ] }, "selector": { "type": "ImageApiSelector", diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 06f8415d7..7ca142ab3 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -2321,6 +2321,11 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and } ``` +### selector +{: #selector} + +TODO + ### service {: #service} @@ -2432,7 +2437,7 @@ The value of the size parameter in the IIIF Image API URL structure, as recorded The `source` property refers to the URI of the resource that the Specific Resource is a more constrained version or representation of. -For more information about source and Specific Resources, see the [W3C Annotation Model](For more information about Annotation bodies, see the [W3C Annotation Model](https://www.w3.org/TR/annotation-model/#bodies-and-targets). +For more information about source and Specific Resources, see the [W3C Annotation Model](https://www.w3.org/TR/annotation-model/#specific-resources). The value _MUST_ be a string, and the value _MUST_ be a URI. The value _MUST NOT_ include a media fragment.