@allmaps/iiif-parser
This is a JavaScript module that parser IIIF Collections, Manifests and Images. This is a core module of Allmaps and is used in all its apps and components.
Note: this module parses IIIF data to an intermediate format that is used by Allmaps internally. It does not parse all properties defined by the IIIF Image and Presentation APIs, only properties that are needed for Allmaps to function. See the files in the src/classes and src/schemas directories for details about these proeprties.
@allmaps/iiif-parser is written in TypeScript and is built using Zod.
Versions 1, 2 and 3 of the IIIF Image and Presentation APIs are supported.
This module has been tested on a wide variety of IIIF servers. Run npm test to run all tests.
Installation
Section titled “Installation”This is an ESM-only module that works in browsers and Node.js.
Node.js:
First, run npm install @allmaps/iiif-parser to add this module to your project.
import { IIIF } from '@allmaps/iiif-parser'Browser:
<script type="module"> import { IIIF } from 'https://unpkg.com/@allmaps/iiif-parser?module'</script>import { IIIF } from '@allmaps/iiif-parser'
const manifestUrl = 'https://collections.leventhalmap.org/search/commonwealth:wd376720z/manifest'const manifest = await fetch(manifestUrl).then((response) => response.json())const parsedManifest = IIIF.parse(manifest)console.log(parsedManifest)This will log parsedManifest to the console:
{ "embedded": false, "type": "manifest", "uri": "https://ark.digitalcommonwealth.org/ark:/50959/wd376720z/manifest", "majorVersion": 2, "label": { "none": [ "Map of Boston and vicinity showing tracks operated by the Boston Elevated Railway Co., surface lines" ] }, "canvases": [ { "type": "canvas", "width": 7486, "height": 9138, "uri": "https://ark.digitalcommonwealth.org/ark:/50959/wd376720z/canvas/wd3767217", "label": { "none": ["image 1"] }, "image": { "embedded": true, "type": "image", "uri": "https://iiif.digitalcommonwealth.org/iiif/2/commonwealth:wd3767217", "majorVersion": 2, "supportsAnyRegionAndSize": true, "width": 7486, "height": 9138 } } ], "metadata": [ { "label": { "none": ["Title"] }, "value": { "none": [ "Map of Boston and vicinity showing tracks operated by the Boston Elevated Railway Co., surface lines" ] } }, { "label": { "none": ["Date"] }, "value": { "none": ["1898"] } }, { "label": { "none": ["Publisher"] }, "value": { "none": ["Boston, Mass : [Geo. H. Walker & Co.]"] } }, { "label": { "none": ["Type of Resource"] }, "value": { "none": ["Cartographic"] } }, { "label": { "none": ["Format"] }, "value": { "none": ["Maps"] } }, { "label": { "none": ["Language"] }, "value": { "none": ["English"] } }, { "label": { "none": ["Subjects"] }, "value": { "none": [ "Boston Elevated Railway Company", "Street-railroads--Massachusetts--Boston--Maps", "Boston (Mass.)--Maps", "Massachusetts--Maps" ] } }, { "label": { "none": ["Location"] }, "value": { "none": ["Boston Public Library"] } }, { "label": { "none": ["Collection (local)"] }, "value": { "none": ["Norman B. Leventhal Map Center Collection"] } }, { "label": { "none": ["Identifier"] }, "value": { "none": [ "https://ark.digitalcommonwealth.org/ark:/50959/wd376720z", "06_01_003041", "G3764.B6P33 1898 .M3", "39999058997337" ] } }, { "label": { "none": ["Terms of Use"] }, "value": { "none": [ "No known copyright restrictions.", "No known restrictions on use." ] } } ]}You can also call the parse function on a specific IIIF class:
import { Image } from '@allmaps/iiif-parser'
const imageUrl = 'https://iiif.digitalcommonwealth.org/iiif/2/commonwealth:wd3767217'const image = await fetch(`${imageUrl}/info.json`).then((response) => response.json())const parsedImage = Image.parse(image)console.log(parsedImage)This will log parsedImage to the console:
{ "embedded": false, "type": "image", "uri": "https://iiif.digitalcommonwealth.org/iiif/2/commonwealth:wd3767217", "majorVersion": 2, "supportsAnyRegionAndSize": true, "width": 7486, "height": 9138, "tileZoomLevels": [ { "scaleFactor": 1, "width": 1024, "height": 1024, "originalWidth": 1024, "originalHeight": 1024, "columns": 8, "rows": 9 }, { "scaleFactor": 2, "width": 1024, "height": 1024, "originalWidth": 2048, "originalHeight": 2048, "columns": 4, "rows": 5 }, { "scaleFactor": 4, "width": 1024, "height": 1024, "originalWidth": 4096, "originalHeight": 4096, "columns": 2, "rows": 3 }, { "scaleFactor": 8, "width": 1024, "height": 1024, "originalWidth": 8192, "originalHeight": 8192, "columns": 1, "rows": 2 }, { "scaleFactor": 16, "width": 1024, "height": 1024, "originalWidth": 16384, "originalHeight": 16384, "columns": 1, "rows": 1 }, { "scaleFactor": 32, "width": 1024, "height": 1024, "originalWidth": 32768, "originalHeight": 32768, "columns": 1, "rows": 1 }, { "scaleFactor": 64, "width": 1024, "height": 1024, "originalWidth": 65536, "originalHeight": 65536, "columns": 1, "rows": 1 } ], "sizes": [ { "width": 117, "height": 143 }, { "width": 234, "height": 286 }, { "width": 468, "height": 571 }, { "width": 936, "height": 1142 }, { "width": 1872, "height": 2285 }, { "width": 3743, "height": 4569 }, { "width": 7486, "height": 9138 } ]}You can check if a parsed IIIF resource object is of a specific class by using the instanceof operator or checking the type property:
import { IIIF } from '@allmaps/iiif-parser'
const url = 'https://collections.leventhalmap.org/search/commonwealth:wd376720z/manifest'const iiif = await fetch(url).then((response) => response.json())const parsedIiif = IIIF.parse(manifest)
if (parsedIiif.type === 'manifest') { console.log('This is a IIIF Manifest!')}Parsing IIIF resources is also possible using the Allmaps CLI.
For example:
curl https://collections.leventhalmap.org/search/commonwealth:wd376720z/manifest | allmaps iiif parseLicense
Section titled “License”MIT
new Canvas(parsedCanvas)
Section titled “new Canvas(parsedCanvas)”Parameters
Section titled “Parameters”parsedCanvas({ '@id': string; width: number; height: number; '@type': "sc:Canvas"; images: Array<{ resource: { service: { '@id': string; profile: string | ValidImage2ProfileArray; '@context'?: string | undefined; width?: number | undefined; height?: number | undefined; '@type'?: "ImageService2" | ... 2 more ... | undefined; } | ...)
Returns
Section titled “Returns”Canvas.
Canvas#annotations?
Section titled “Canvas#annotations?”Array<{id: string; type: 'AnnotationPage'}>Canvas#description?
Section titled “Canvas#description?”{[language: string]: Array<string | number | boolean>}Canvas#height
Section titled “Canvas#height”numberCanvas#homepage?
Section titled “Canvas#homepage?”Array<{ id: string type?: string label?: LanguageString format?: string language?: string | string[]}>Canvas#image
Section titled “Canvas#image”Image | EmbeddedImageCanvas#label?
Section titled “Canvas#label?”{[language: string]: Array<string | number | boolean>}Canvas#metadata?
Section titled “Canvas#metadata?”Array<MetadataItem>Canvas#navDate?
Section titled “Canvas#navDate?”DateCanvas#navPlace?
Section titled “Canvas#navPlace?”objectCanvas#rendering?
Section titled “Canvas#rendering?”Array<{ id: string type?: string label?: LanguageString format?: string}>Canvas#requiredStatement?
Section titled “Canvas#requiredStatement?”{label: LanguageString; value: LanguageString}Canvas#seeAlso?
Section titled “Canvas#seeAlso?”Array<{id: string; type?: string; format?: string; profile?: string}>Canvas#summary?
Section titled “Canvas#summary?”{[language: string]: Array<string | number | boolean>}Canvas#thumbnail?
Section titled “Canvas#thumbnail?”Array<{ id: string type?: string format?: string width?: number height?: number}>Canvas#type
Section titled “Canvas#type”CanvasTypeStringCanvas#uri
Section titled “Canvas#uri”stringCanvas#width
Section titled “Canvas#width”numbernew Collection(parsedCollection, options)
Section titled “new Collection(parsedCollection, options)”Parameters
Section titled “Parameters”parsedCollection(Collection2 | Collection3)options?(Partial<ConstructorOptions> | undefined)
Returns
Section titled “Returns”Collection.
Extends
Section titled “Extends”EmbeddedCollection
Collection#annotations?
Section titled “Collection#annotations?”Array<{id: string; type: 'AnnotationPage'}>Collection#canvases
Section titled “Collection#canvases”Array<Canvas>Collection#embedded
Section titled “Collection#embedded”falseCollection#fetchAllItems(options)
Section titled “Collection#fetchAllItems(options)”Parameters
Section titled “Parameters”options?(Partial<FetchNextItemOptions> | undefined)
Returns
Section titled “Returns”Promise<Array<FetchNextItemResults<Image | Manifest | Collection>>>.
Collection#fetchItemWithId(id, fetchFn)
Section titled “Collection#fetchItemWithId(id, fetchFn)”Parameters
Section titled “Parameters”id(string)fetchFn(| ((input: RequestInfo | URL, init?: RequestInit) => Promise<Response>) | undefined)
Returns
Section titled “Returns”Promise<EmbeddedManifest | EmbeddedCollection | undefined>.
Collection#fetchItemWithIndex(index, fetchFn)
Section titled “Collection#fetchItemWithIndex(index, fetchFn)”Parameters
Section titled “Parameters”index(number)fetchFn(| ((input: RequestInfo | URL, init?: RequestInit) => Promise<Response>) | undefined)
Returns
Section titled “Returns”Promise<Manifest | EmbeddedManifest | Collection | EmbeddedCollection>.
Collection#fetchNextItem(options, depth)
Section titled “Collection#fetchNextItem(options, depth)”Parameters
Section titled “Parameters”options?(Partial<FetchNextItemOptions> | undefined)depth(number | undefined)
Returns
Section titled “Returns”AsyncGenerator< FetchNextItemResults<Image | Manifest | Collection>, void, void >.
Collection#fetchUntilPath(path)
Section titled “Collection#fetchUntilPath(path)”Parameters
Section titled “Parameters”path(Array<number>)
Returns
Section titled “Returns”Promise<void>.
Collection#getItemAtPath(path)
Section titled “Collection#getItemAtPath(path)”Parameters
Section titled “Parameters”path(Array<number>)
Returns
Section titled “Returns”EmbeddedManifest | EmbeddedCollection | Canvas | undefined.
Collection#homepage?
Section titled “Collection#homepage?”Array<{ id: string type?: string label?: LanguageString format?: string language?: string | string[]}>Collection#images
Section titled “Collection#images”Array<Image | EmbeddedImage>Collection#items
Section titled “Collection#items”Array<never>Collection#rendering?
Section titled “Collection#rendering?”Array<{ id: string type?: string label?: LanguageString format?: string}>Collection#requiredStatement?
Section titled “Collection#requiredStatement?”{label: LanguageString; value: LanguageString}Collection#seeAlso?
Section titled “Collection#seeAlso?”Array<{id: string; type?: string; format?: string; profile?: string}>Collection#source?
Section titled “Collection#source?”unknownCollection#summary?
Section titled “Collection#summary?”{[language: string]: Array<string | number | boolean>}Collection.parse(iiifCollection, options)
Section titled “Collection.parse(iiifCollection, options)”Parses a IIIF Collection and returns a Collection containing the parsed version
Parameters
Section titled “Parameters”iiifCollection(unknown)- Source data of IIIF Collection
options?(Partial<ParseOptions> | undefined)
Returns
Section titled “Returns”Parsed IIIF Collection (Collection).
new EmbeddedCollection(parsedCollection)
Section titled “new EmbeddedCollection(parsedCollection)”Parameters
Section titled “Parameters”parsedCollection(Collection2 | Collection3 | EmbeddedCollectionType)
Returns
Section titled “Returns”EmbeddedCollection.
EmbeddedCollection#description?
Section titled “EmbeddedCollection#description?”{[language: string]: Array<string | number | boolean>}EmbeddedCollection#embedded
Section titled “EmbeddedCollection#embedded”trueEmbeddedCollection#label?
Section titled “EmbeddedCollection#label?”{[language: string]: Array<string | number | boolean>}EmbeddedCollection#majorVersion
Section titled “EmbeddedCollection#majorVersion”1 | 2 | 3EmbeddedCollection#metadata?
Section titled “EmbeddedCollection#metadata?”Array<MetadataItem>EmbeddedCollection#navDate?
Section titled “EmbeddedCollection#navDate?”DateEmbeddedCollection#navPlace?
Section titled “EmbeddedCollection#navPlace?”objectEmbeddedCollection#thumbnail?
Section titled “EmbeddedCollection#thumbnail?”Array<{ id: string type?: string format?: string width?: number height?: number}>EmbeddedCollection#type
Section titled “EmbeddedCollection#type”CollectionTypeStringEmbeddedCollection#uri
Section titled “EmbeddedCollection#uri”stringEmbeddedCollection.parse(iiifCollection, options)
Section titled “EmbeddedCollection.parse(iiifCollection, options)”Parses a IIIF Collection and returns a Collection containing the parsed version
Parameters
Section titled “Parameters”iiifCollection(unknown)- Source data of IIIF Collection
options?(Partial<ParseOptions> | undefined)
Returns
Section titled “Returns”Parsed IIIF Collection (Collection).
new EmbeddedImage(parsedImage, options)
Section titled “new EmbeddedImage(parsedImage, options)”Parameters
Section titled “Parameters”parsedImage({ '@context': "http://library.stanford.edu/iiif/image-api/1.1/context.json"; '@id': string; width: number; height: number; profile?: string | undefined; scale_factors?: Array<number> | undefined; tile_width?: number | undefined; tile_height?: number | undefined; } | { ...; } | { ...; } | EmbeddedImageType)options?(Partial<ImageConstructorOptions> | undefined)
Returns
Section titled “Returns”EmbeddedImage.
EmbeddedImage#embedded
Section titled “EmbeddedImage#embedded”trueEmbeddedImage#getImageRequest(size, mode)
Section titled “EmbeddedImage#getImageRequest(size, mode)”Parameters
Section titled “Parameters”size({width: number; height: number})mode(Fit | undefined)
Returns
Section titled “Returns”ImageRequest | Array<Array<ImageRequest>>.
EmbeddedImage#getImageUrl(imageRequest)
Section titled “EmbeddedImage#getImageUrl(imageRequest)”Generates a IIIF Image API URL for the requested region and size
Parameters
Section titled “Parameters”imageRequest({region?: Region; size?: SizeObject})- Image request object containing the desired region and size of the requested image
Returns
Section titled “Returns”Image API URL that can be used to fetch the requested image (string).
EmbeddedImage#height
Section titled “EmbeddedImage#height”numberEmbeddedImage#majorVersion
Section titled “EmbeddedImage#majorVersion”1 | 2 | 3EmbeddedImage#maxArea
Section titled “EmbeddedImage#maxArea”number | undefinedEmbeddedImage#maxHeight
Section titled “EmbeddedImage#maxHeight”number | undefinedEmbeddedImage#maxWidth
Section titled “EmbeddedImage#maxWidth”number | undefinedEmbeddedImage#supportsAnyRegionAndSize
Section titled “EmbeddedImage#supportsAnyRegionAndSize”booleanEmbeddedImage#type
Section titled “EmbeddedImage#type”ImageTypeStringEmbeddedImage#uri
Section titled “EmbeddedImage#uri”stringEmbeddedImage#width
Section titled “EmbeddedImage#width”numbernew EmbeddedManifest(parsedManifest)
Section titled “new EmbeddedManifest(parsedManifest)”Parameters
Section titled “Parameters”parsedManifest({ '@id': string; '@type': "sc:Manifest"; sequences: Array<{ canvases: [{ '@id': string; width: number; height: number; '@type': "sc:Canvas"; images: Array<{ resource: { service: { '@id': string; profile: string | ValidImage2ProfileArray; '@context'?: string | undefined; width?: number | undefined; height?: number | ...)
Returns
Section titled “Returns”EmbeddedManifest.
EmbeddedManifest#description?
Section titled “EmbeddedManifest#description?”{[language: string]: Array<string | number | boolean>}EmbeddedManifest#embedded
Section titled “EmbeddedManifest#embedded”trueEmbeddedManifest#label?
Section titled “EmbeddedManifest#label?”{[language: string]: Array<string | number | boolean>}EmbeddedManifest#majorVersion
Section titled “EmbeddedManifest#majorVersion”1 | 2 | 3EmbeddedManifest#metadata?
Section titled “EmbeddedManifest#metadata?”Array<MetadataItem>EmbeddedManifest#navDate?
Section titled “EmbeddedManifest#navDate?”DateEmbeddedManifest#navPlace?
Section titled “EmbeddedManifest#navPlace?”objectEmbeddedManifest#thumbnail?
Section titled “EmbeddedManifest#thumbnail?”Array<{ id: string type?: string format?: string width?: number height?: number}>EmbeddedManifest#type
Section titled “EmbeddedManifest#type”ManifestTypeStringEmbeddedManifest#uri
Section titled “EmbeddedManifest#uri”stringnew IIIF()
Section titled “new IIIF()”Base class that contains a static parse function for IIIF resources
Parameters
Section titled “Parameters”There are no parameters.
Returns
Section titled “Returns”IIIF.
IIIF.parse(iiifResource, options)
Section titled “IIIF.parse(iiifResource, options)”Parses as IIIF resource and returns a class containing the parsed version
Parameters
Section titled “Parameters”iiifResource(unknown)- Source data of a IIIF resource
options?(Partial<ParseOptions> | undefined)
Returns
Section titled “Returns”Parsed IIIF resource (Image | Manifest | Collection).
new Image(parsedImage, options)
Section titled “new Image(parsedImage, options)”Parameters
Section titled “Parameters”parsedImage({ '@context': "http://library.stanford.edu/iiif/image-api/1.1/context.json"; '@id': string; width: number; height: number; profile?: string | undefined; scale_factors?: Array<number> | undefined; tile_width?: number | undefined; tile_height?: number | undefined; } | { ...; } | { ...; })options?(Partial<ConstructorOptions> | undefined)
Returns
Section titled “Returns”Image.
Extends
Section titled “Extends”EmbeddedImage
Image#embedded
Section titled “Image#embedded”falseImage#getImageRequest(size, mode)
Section titled “Image#getImageRequest(size, mode)”Returns a Image request object for the requested region and size
Parameters
Section titled “Parameters”size({width: number; height: number})- Size of the requested thumbnail
mode(Fit | undefined)- Desired fit mode of the requested thumbnail
Returns
Section titled “Returns”Image request object that can be used to fetch the requested thumbnail (ImageRequest | Array<Array<ImageRequest>>).
Image#getTileImageRequest(zoomLevel, column, row)
Section titled “Image#getTileImageRequest(zoomLevel, column, row)”Returns a Image request object for a tile with the requested zoom level, column, and row
Parameters
Section titled “Parameters”zoomLevel({ scaleFactor: number width: number height: number originalWidth: number originalHeight: number columns: number rows: number })- Desired zoom level of the requested tile
column(number)- Column of the requested tile
row(number)- Row of the requested tile
Returns
Section titled “Returns”Image request object that can be used to fetch the requested tile ({region?: Region; size?: SizeObject}).
Image#sizes?
Section titled “Image#sizes?”Array<SizeObject>Image#source?
Section titled “Image#source?”unknownImage#tileZoomLevels
Section titled “Image#tileZoomLevels”Array<TileZoomLevel>Image.parse(iiifImage, parseOptions)
Section titled “Image.parse(iiifImage, parseOptions)”Parses a IIIF image and returns a Image containing the parsed version
Parameters
Section titled “Parameters”iiifImage(unknown)- Source data of IIIF Image
parseOptions?(Partial<ParseOptions> | undefined)
Returns
Section titled “Returns”Parsed IIIF Image (Image).
ImageRequest
Section titled “ImageRequest”Fields
Section titled “Fields”region?({x: number; y: number; width: number; height: number})size?({width: number; height: number})
LanguageString
Section titled “LanguageString”Fields
Section titled “Fields”[language: string](Array<string | number | boolean>)
MajorVersion
Section titled “MajorVersion”1 | 2 | 3new Manifest(parsedManifest, options)
Section titled “new Manifest(parsedManifest, options)”Parameters
Section titled “Parameters”parsedManifest({ '@id': string; '@type': "sc:Manifest"; sequences: Array<{ canvases: [{ '@id': string; width: number; height: number; '@type': "sc:Canvas"; images: Array<{ resource: { service: { '@id': string; profile: string | ValidImage2ProfileArray; '@context'?: string | undefined; width?: number | undefined; height?: number | ...)options?(Partial<ConstructorOptions> | undefined)
Returns
Section titled “Returns”Manifest.
Extends
Section titled “Extends”EmbeddedManifest
Manifest#annotations?
Section titled “Manifest#annotations?”Array<{id: string; type: 'AnnotationPage'}>Manifest#canvases
Section titled “Manifest#canvases”Array<never>Manifest#embedded
Section titled “Manifest#embedded”falseManifest#fetchAllItems(fetchFn)
Section titled “Manifest#fetchAllItems(fetchFn)”Parameters
Section titled “Parameters”fetchFn(| ((input: RequestInfo | URL, init?: RequestInit) => Promise<Response>) | undefined)
Returns
Section titled “Returns”Promise<Array<FetchNextItemResults<Image>>>.
Manifest#fetchImageByUri(imageUri, fetchFn)
Section titled “Manifest#fetchImageByUri(imageUri, fetchFn)”Parameters
Section titled “Parameters”imageUri(string)fetchFn(| ((input: RequestInfo | URL, init?: RequestInit) => Promise<Response>) | undefined)
Returns
Section titled “Returns”Promise<Image | undefined>.
Manifest#fetchNextItem(fetchFn, depth)
Section titled “Manifest#fetchNextItem(fetchFn, depth)”Parameters
Section titled “Parameters”fetchFn(| ((input: RequestInfo | URL, init?: RequestInit) => Promise<Response>) | undefined)depth(number | undefined)
Returns
Section titled “Returns”AsyncGenerator<FetchNextItemResults<Image>, void, void>.
Manifest#homepage?
Section titled “Manifest#homepage?”Array<{ id: string type?: string label?: LanguageString format?: string language?: string | string[]}>Manifest#images
Section titled “Manifest#images”Array<Image | EmbeddedImage>Manifest#rendering?
Section titled “Manifest#rendering?”Array<{ id: string type?: string label?: LanguageString format?: string}>Manifest#requiredStatement?
Section titled “Manifest#requiredStatement?”{label: LanguageString; value: LanguageString}Manifest#seeAlso?
Section titled “Manifest#seeAlso?”Array<{id: string; type?: string; format?: string; profile?: string}>Manifest#source?
Section titled “Manifest#source?”unknownManifest#summary?
Section titled “Manifest#summary?”{[language: string]: Array<string | number | boolean>}Manifest.parse(iiifManifest, options)
Section titled “Manifest.parse(iiifManifest, options)”Parses a IIIF resource and returns a Manifest containing the parsed version
Parameters
Section titled “Parameters”iiifManifest(unknown)- Source data of IIIF Manifest
options?(Partial<ParseOptions> | undefined)
Returns
Section titled “Returns”Parsed IIIF Manifest (Manifest).
Metadata
Section titled “Metadata”Array<MetadataItem>ProfileProperties
Section titled “ProfileProperties”Fields
Section titled “Fields”maxArea?(number)maxHeight?(number)maxWidth?(number)supportsAnyRegionAndSize(boolean)
Region
Section titled “Region”Fields
Section titled “Fields”height(number)width(number)x(number)y(number)
Two numbers indicating the size of a Bbox as [width, height] or [xSize, ySize] ([number, number]).
Alternatively, two numbers indicating the minimum and maximum of, for example, an array of numbers
Alternatively, two numbers indicating the dimensions of a matrix: rows, cols (which is a different handedness!)
TileZoomLevel
Section titled “TileZoomLevel”Fields
Section titled “Fields”columns(number)height(number)originalHeight(number)originalWidth(number)rows(number)scaleFactor(number)width(number)
Tileset
Section titled “Tileset”{ width: number scaleFactors: Array<number> height?: number | undefined}