It looks like there are two different ways of creating a table of contents in IIIF Version 2.0 of the presentation API. One that uses members and one that uses ranges. members was introduced in Presentation 2.1 and it looks like Mirador 2 only supports the use of ranges option not the members. The UV seems to support both.
There are various examples below including:
members method and the ranges methodranges method which works on Mirador 2, Mirador 3 and the UVLatest version from training: https://training.iiif.io/iiif-bl-workshop/day-three/ranges/
"structures": [
{
"@id": "http://example.org/iiif/book1/range/top",
"@type": "sc:Range",
"label": "Table of Content",
"viewingHint": "top",
"ranges": [
"http://example.org/iiif/book1/range/intro"
]
},
{
"@id": "http://example.org/iiif/book1/range/intro",
"@type": "sc:Range",
"label": "Introduction",
"canvases": [
"http://164799eb-2304-4b4a-aac4-6e13357fb6ad"
]
}
]
Previous version from: https://training.iiif.io/iiif-bl-workshop/day-three/ranges/
"structures": [
{
"@id": "http://example.org/iiif/book1/range/r0",
"@type": "sc:Range",
"label": "Table of Contents",
"members": [
{
"@id": "http://example.org/iiif/book1/range/r1",
"@type": "sc:Range",
"label": "Introduction"
}
]
},
{
"@id": "http://example.org/iiif/book1/range/r1",
"@type": "sc:Range",
"label": "Introduction",
"canvases": ["$YOUR_CANVAS_ID"]
}
]
TOC Structure:
structures": [
{
"@id": "http://example.org/iiif/book1/range/r0",
"@type": "sc:Range",
"label": "Intro",
"viewingHint": "top",
"ranges": [
"http://example.org/iiif/book1/range/r1",
"http://example.org/iiif/book1/range/r2",
"http://example.org/iiif/book1/range/r8"
]
},
{
"@id": "http://example.org/iiif/book1/range/r1",
"@type": "sc:Range",
"label": "Act 1",
"ranges": [
"http://example.org/iiif/book1/range/r3",
"http://example.org/iiif/book1/range/r4",
"http://example.org/iiif/book1/range/r5"
]
},
{
"@id": "http://example.org/iiif/book1/range/r2",
"@type": "sc:Range",
"label": "Act 2",
"ranges": [
"http://example.org/iiif/book1/range/r6",
"http://example.org/iiif/book1/range/r7"
]
},
{
"@id": "http://example.org/iiif/book1/range/r3",
"@type": "sc:Range",
"label": "Act 1 Scene 1",
"canvases": [
"http://aae88280-7b83-4f04-a948-498e64b7cc60"
]
},
{
"@id": "http://example.org/iiif/book1/range/r4",
"@type": "sc:Range",
"label": "Act 1 Scene 2",
"canvases": [
"http://6afb7742-37a5-4e91-8c76-01260b36a557"
]
},
...
structures": [
{
"@id": "http://example.org/iiif/book1/range/r1",
"@type": "sc:Range",
"label": "Act 1",
"members": [
{
"@id": "http://example.org/iiif/book1/range/r3",
"@type": "sc:Range",
"label": "Act 1 Scene 1",
"canvases": [
"http://aae88280-7b83-4f04-a948-498e64b7cc60"
]
},
{
"@id": "http://example.org/iiif/book1/range/r4",
"@type": "sc:Range",
"label": "Act 1 Scene 2",
"canvases": [
"http://6afb7742-37a5-4e91-8c76-01260b36a557"
]
},
{
"@id": "http://example.org/iiif/book1/range/r5",
"@type": "sc:Range",
"label": "Act 1 Scene 3",
"canvases": [
"http://f93bc184-9299-4399-867d-5c393214fbc9"
]
}
]
},
...
"structures": [
{
"@id": "https://iiif.wellcomecollection.org/presentation/b18035723/ranges/LOG_0001",
"@type": "sc:Range",
"label": "Front Cover",
"canvases": [
"https://iiif.wellcomecollection.org/presentation/b18035723/canvases/b18035723_0001.JP2"
],
"within": ""
},
{
"@id": "https://iiif.wellcomecollection.org/presentation/b18035723/ranges/LOG_0003",
"@type": "sc:Range",
"label": "Title Page",
"canvases": [
"https://iiif.wellcomecollection.org/presentation/b18035723/canvases/b18035723_0004.JP2"
],
"within": ""
},
{
"@id": "https://iiif.wellcomecollection.org/presentation/b18035723/ranges/LOG_0002",
"@type": "sc:Range",
"label": "Back Cover",
"canvases": [
"https://iiif.wellcomecollection.org/presentation/b18035723/canvases/b18035723_0002.JP2"
],
"within": ""
}
],
Desired structure:
"structures": [
{
"@id": "http://example.org/range/root",
"@type": "sc:Range",
"label": "This range is not shown",
"viewingHint": "top",
"ranges": [
"http://example.org/range/toc"
]
},
{
"@id": "http://example.org/range/toc",
"@type": "sc:Range",
"label": "Table of Contents",
"ranges": [
"http://example.org/range/intro",
"http://example.org/range/criminals"
]
},
{
"@id": "http://example.org/range/intro",
"@type": "sc:Range",
"label": "Intro",
"ranges": [
"http://example.org/range/covers",
"http://example.org/range/other_pages"
]
},
{
"@id": "http://example.org/range/covers",
"@type": "sc:Range",
"label": "Covers",
"canvases": [
"https://damsssl.llgc.org.uk/iiif/2.0/4389767/canvas/4389768.json",
"https://damsssl.llgc.org.uk/iiif/2.0/4389767/canvas/4389769.json"
]
},
{
"@id": "http://example.org/range/other_pages",
"@type": "sc:Range",
"label": "Other Pages",
"canvases": [
"https://damsssl.llgc.org.uk/iiif/2.0/4389767/canvas/4389770.json"
]
},
{
"@id": "http://example.org/range/criminals",
"@type": "sc:Range",
"label": "Criminals",
"ranges": [
"http://example.org/range/p4",
"http://example.org/range/upside_down"
]
},
{
"@id": "http://example.org/range/p4",
"@type": "sc:Range",
"label": "Page 4",
"canvases": [
"https://damsssl.llgc.org.uk/iiif/2.0/4389767/canvas/4389771.json"
]
}, {
"@id": "http://example.org/range/upside_down",
"@type": "sc:Range",
"label": "Upside down (page 3)",
"canvases": [
"https://damsssl.llgc.org.uk/iiif/2.0/4389767/canvas/4389770.json"
]
}
]