iiif / presentation-validator Goto Github PK
View Code? Open in Web Editor NEWValidator for the Presentation API
Home Page: http://iiif.io/api/presentation/validator/
Validator for the Presentation API
Home Page: http://iiif.io/api/presentation/validator/
The validator schema only accepts Creative Commons 4.0 licenses as valid. Plenty of resources out there use prior versions.
As it should not have canvases, thus not a warning.
With Pypi and distutils and all that lovely stuff. Any takers?
Thanks to @schwemmer!
Using the following manifest:
https://www.e-manuscripta.ch/i3f/v21/742334/manifest
It returns:
"WARNING: Setting non-standard field 'members' on resource of type 'sc:Range' "
which is allowed: http://iiif.io/api/presentation/2.1/#members
While going through the iiif workshop on monday, I think I found a bug in the validator.
Submitting a manifest hosted locally using the URL format returns the correct error
{"url": "http://127.0.0.1:8887/manifest.json", "okay": 0, "error": "Cannot fetch url"}
but submitting it using the UI, doesn't display any response, but throws an error in the console:
(index):152 Uncaught TypeError: Cannot read property 'length' of undefined
at Object.handleValidationResponse [as success] ((index):152)
at i (jquery-2.2.3.min.js:2)
at Object.fireWith [as resolveWith] (jquery-2.2.3.min.js:2)
at z (jquery-2.2.3.min.js:4)
at XMLHttpRequest.<anonymous> (jquery-2.2.3.min.js:4)
The problem seems to be that data.warnings is undefined, so calling length on it throws an error.
presentation-validator/index.html
Line 144 in e620780
Maybe errors when fetching the resource could be added to warnings too?
I try to implement IIIF Presentation API for @MyCoRe-Org .
I tried to use the Validator: http://iiif.io/api/presentation/validator/service/validate?format=json&version=2.0&url=link
My manifest looks like (i replaced my ip with <my_url>):
{ "label": "Neuer Artikel", "sequences": [ { "canvases": [ { "label": "1", "height": 6451, "width": 4131, "images": [ { "resource": { "service": { "profile": { "supports": [ "baseUriRedirect", "jsonldMediaType", "rotationArbitrary", "cors", "sizeByWhListed", "mirroring", "sizeByW", "profileLinkHeader", "sizeByH", "sizeByWh", "canonicalLinkHeader", "rotationBy90s", "sizeByForcedWh", "sizeByPct", "regionByPx", "sizeAboveFull", "regionByPct" ], "formats": [ "jpg", "tif", "tiff", "bmp", "gif", "pgm", "png", "wbmp", "jpeg", "pbm", "ppm", "jp2" ], "qualities": [ "bitonal", "gray", "color" ], "@context": "http://iiif.io/api/image/2/context.json", "@type": "iiif:ImageProfile" }, "@context": "http://iiif.io/api/image/2/context.json", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B1_001.tif" }, "width": 4131, "height": 6451, "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "dctypes:Image", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B1_001.tif" }, "motivation": "sc:painting", "on": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_001.tif", "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "@oa:Annotation",<my_url> "@id": "mir_derivate_00000005/JVB_19150101_001_167758667_B1_001.tif" } ], "metadata": [], "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "sc:Canvas", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_001.tif" }, { "label": "2", "height": 6451, "width": 4131, "images": [ { "resource": { "service": { "profile": { "supports": [ "baseUriRedirect", "jsonldMediaType", "rotationArbitrary", "cors", "sizeByWhListed", "mirroring", "sizeByW", "profileLinkHeader", "sizeByH", "sizeByWh", "canonicalLinkHeader", "rotationBy90s", "sizeByForcedWh", "sizeByPct", "regionByPx", "sizeAboveFull", "regionByPct" ], "formats": [ "jpg", "tif", "tiff", "bmp", "gif", "pgm", "png", "wbmp", "jpeg", "pbm", "ppm", "jp2" ], "qualities": [ "bitonal", "gray", "color" ], "@context": "http://iiif.io/api/image/2/context.json", "@type": "iiif:ImageProfile" }, "@context": "http://iiif.io/api/image/2/context.json", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B1_002.tif" }, "width": 4131, "height": 6451, "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "dctypes:Image", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B1_002.tif" }, "motivation": "sc:painting", "on": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_002.tif", "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "@oa:Annotation", "@id": "mir_derivate_00000005/JVB_19150101_001_167758667_B1_002.tif" } ], "metadata": [], "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "sc:Canvas", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_002.tif" }, { "label": "3", "height": 6451, "width": 4131, "images": [ { "resource": { "service": { "profile": { "supports": [ "baseUriRedirect", "jsonldMediaType", "rotationArbitrary", "cors", "sizeByWhListed", "mirroring", "sizeByW", "profileLinkHeader", "sizeByH", "sizeByWh", "canonicalLinkHeader", "rotationBy90s", "sizeByForcedWh", "sizeByPct", "regionByPx", "sizeAboveFull", "regionByPct" ], "formats": [ "jpg", "tif", "tiff", "bmp", "gif", "pgm", "png", "wbmp", "jpeg", "pbm", "ppm", "jp2" ], "qualities": [ "bitonal", "gray", "color" ], "@context": "http://iiif.io/api/image/2/context.json", "@type": "iiif:ImageProfile" }, "@context": "http://iiif.io/api/image/2/context.json", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B1_003.tif" }, "width": 4131, "height": 6451, "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "dctypes:Image", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B1_003.tif" }, "motivation": "sc:painting", "on": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_003.tif", "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "@oa:Annotation", "@id": "mir_derivate_00000005/JVB_19150101_001_167758667_B1_003.tif" } ], "metadata": [], "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "sc:Canvas", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_003.tif" }, { "label": "4", "height": 6460, "width": 4131, "images": [ { "resource": { "service": { "profile": { "supports": [ "baseUriRedirect", "jsonldMediaType", "rotationArbitrary", "cors", "sizeByWhListed", "mirroring", "sizeByW", "profileLinkHeader", "sizeByH", "sizeByWh", "canonicalLinkHeader", "rotationBy90s", "sizeByForcedWh", "sizeByPct", "regionByPx", "sizeAboveFull", "regionByPct" ], "formats": [ "jpg", "tif", "tiff", "bmp", "gif", "pgm", "png", "wbmp", "jpeg", "pbm", "ppm", "jp2" ], "qualities": [ "bitonal", "gray", "color" ], "@context": "http://iiif.io/api/image/2/context.json", "@type": "iiif:ImageProfile" }, "@context": "http://iiif.io/api/image/2/context.json", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B1_004.tif" }, "width": 4131, "height": 6460, "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "dctypes:Image", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B1_004.tif" }, "motivation": "sc:painting", "on": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_004.tif", "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "@oa:Annotation", "@id": "mir_derivate_00000005/JVB_19150101_001_167758667_B1_004.tif" } ], "metadata": [], "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "sc:Canvas", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_004.tif" }, { "label": "5", "height": 6451, "width": 4131, "images": [ { "resource": { "service": { "profile": { "supports": [ "baseUriRedirect", "jsonldMediaType", "rotationArbitrary", "cors", "sizeByWhListed", "mirroring", "sizeByW", "profileLinkHeader", "sizeByH", "sizeByWh", "canonicalLinkHeader", "rotationBy90s", "sizeByForcedWh", "sizeByPct", "regionByPx", "sizeAboveFull", "regionByPct" ], "formats": [ "jpg", "tif", "tiff", "bmp", "gif", "pgm", "png", "wbmp", "jpeg", "pbm", "ppm", "jp2" ], "qualities": [ "bitonal", "gray", "color" ], "@context": "http://iiif.io/api/image/2/context.json", "@type": "iiif:ImageProfile" }, "@context": "http://iiif.io/api/image/2/context.json", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B2_001.tif" }, "width": 4131, "height": 6451, "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "dctypes:Image", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B2_001.tif" }, "motivation": "sc:painting", "on": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_001.tif", "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "@oa:Annotation", "@id": "mir_derivate_00000005/JVB_19150101_001_167758667_B2_001.tif" } ], "metadata": [], "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "sc:Canvas", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_001.tif" }, { "label": "6", "height": 6451, "width": 4131, "images": [ { "resource": { "service": { "profile": { "supports": [ "baseUriRedirect", "jsonldMediaType", "rotationArbitrary", "cors", "sizeByWhListed", "mirroring", "sizeByW", "profileLinkHeader", "sizeByH", "sizeByWh", "canonicalLinkHeader", "rotationBy90s", "sizeByForcedWh", "sizeByPct", "regionByPx", "sizeAboveFull", "regionByPct" ], "formats": [ "jpg", "tif", "tiff", "bmp", "gif", "pgm", "png", "wbmp", "jpeg", "pbm", "ppm", "jp2" ], "qualities": [ "bitonal", "gray", "color" ], "@context": "http://iiif.io/api/image/2/context.json", "@type": "iiif:ImageProfile" }, "@context": "http://iiif.io/api/image/2/context.json", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B2_002.tif" }, "width": 4131, "height": 6451, "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "dctypes:Image", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B2_002.tif" }, "motivation": "sc:painting", "on": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_002.tif", "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "@oa:Annotation", "@id": "mir_derivate_00000005/JVB_19150101_001_167758667_B2_002.tif" } ], "metadata": [], "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "sc:Canvas", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_002.tif" }, { "label": "7", "height": 6451, "width": 4131, "images": [ { "resource": { "service": { "profile": { "supports": [ "baseUriRedirect", "jsonldMediaType", "rotationArbitrary", "cors", "sizeByWhListed", "mirroring", "sizeByW", "profileLinkHeader", "sizeByH", "sizeByWh", "canonicalLinkHeader", "rotationBy90s", "sizeByForcedWh", "sizeByPct", "regionByPx", "sizeAboveFull", "regionByPct" ], "formats": [ "jpg", "tif", "tiff", "bmp", "gif", "pgm", "png", "wbmp", "jpeg", "pbm", "ppm", "jp2" ], "qualities": [ "bitonal", "gray", "color" ], "@context": "http://iiif.io/api/image/2/context.json", "@type": "iiif:ImageProfile" }, "@context": "http://iiif.io/api/image/2/context.json", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B2_003.tif" }, "width": 4131, "height": 6451, "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "dctypes:Image", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B2_003.tif" }, "motivation": "sc:painting", "on": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_003.tif", "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "@oa:Annotation", "@id": "mir_derivate_00000005/JVB_19150101_001_167758667_B2_003.tif" } ], "metadata": [], "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "sc:Canvas", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_003.tif" }, { "label": "8", "height": 6451, "width": 4131, "images": [ { "resource": { "service": { "profile": { "supports": [ "baseUriRedirect", "jsonldMediaType", "rotationArbitrary", "cors", "sizeByWhListed", "mirroring", "sizeByW", "profileLinkHeader", "sizeByH", "sizeByWh", "canonicalLinkHeader", "rotationBy90s", "sizeByForcedWh", "sizeByPct", "regionByPx", "sizeAboveFull", "regionByPct" ], "formats": [ "jpg", "tif", "tiff", "bmp", "gif", "pgm", "png", "wbmp", "jpeg", "pbm", "ppm", "jp2" ], "qualities": [ "bitonal", "gray", "color" ], "@context": "http://iiif.io/api/image/2/context.json", "@type": "iiif:ImageProfile" }, "@context": "http://iiif.io/api/image/2/context.json", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B2_004.tif" }, "width": 4131, "height": 6451, "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "dctypes:Image", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_B2_004.tif" }, "motivation": "sc:painting", "on": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_004.tif", "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "@oa:Annotation", "@id": "mir_derivate_00000005/JVB_19150101_001_167758667_B2_004.tif" } ], "metadata": [], "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "sc:Canvas", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_004.tif" }, { "label": "9", "height": 6458, "width": 4131, "images": [ { "resource": { "service": { "profile": { "supports": [ "baseUriRedirect", "jsonldMediaType", "rotationArbitrary", "cors", "sizeByWhListed", "mirroring", "sizeByW", "profileLinkHeader", "sizeByH", "sizeByWh", "canonicalLinkHeader", "rotationBy90s", "sizeByForcedWh", "sizeByPct", "regionByPx", "sizeAboveFull", "regionByPct" ], "formats": [ "jpg", "tif", "tiff", "bmp", "gif", "pgm", "png", "wbmp", "jpeg", "pbm", "ppm", "jp2" ], "qualities": [ "bitonal", "gray", "color" ], "@context": "http://iiif.io/api/image/2/context.json", "@type": "iiif:ImageProfile" }, "@context": "http://iiif.io/api/image/2/context.json", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_Be_001.tif" }, "width": 4131, "height": 6458, "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "dctypes:Image", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_Be_001.tif" }, "motivation": "sc:painting", "on": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_Be_001.tif", "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "@oa:Annotation", "@id": "mir_derivate_00000005/JVB_19150101_001_167758667_Be_001.tif" } ], "metadata": [], "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "sc:Canvas", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_Be_001.tif" }, { "label": "10", "height": 6451, "width": 4131, "images": [ { "resource": { "service": { "profile": { "supports": [ "baseUriRedirect", "jsonldMediaType", "rotationArbitrary", "cors", "sizeByWhListed", "mirroring", "sizeByW", "profileLinkHeader", "sizeByH", "sizeByWh", "canonicalLinkHeader", "rotationBy90s", "sizeByForcedWh", "sizeByPct", "regionByPx", "sizeAboveFull", "regionByPct" ], "formats": [ "jpg", "tif", "tiff", "bmp", "gif", "pgm", "png", "wbmp", "jpeg", "pbm", "ppm", "jp2" ], "qualities": [ "bitonal", "gray", "color" ], "@context": "http://iiif.io/api/image/2/context.json", "@type": "iiif:ImageProfile" }, "@context": "http://iiif.io/api/image/2/context.json", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_Be_002.tif" }, "width": 4131, "height": 6451, "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "dctypes:Image", "@id": "http://<my_url>:8291/mir/rsc/iiif/image/Iview/mir_derivate_00000005%2FJVB_19150101_001_167758667_Be_002.tif" }, "motivation": "sc:painting", "on": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_Be_002.tif", "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "@oa:Annotation", "@id": "mir_derivate_00000005/JVB_19150101_001_167758667_Be_002.tif" } ], "metadata": [], "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "sc:Canvas", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_Be_002.tif" } ], "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "sc:Sequence", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/sequence/phys_4aa9dfc8-cc85-43d7-a8a7-123e680f44bf" } ], "metadata": [ { "label": "genre", "value": "article" }, { "label": "title", "value": "Neuer Artikel" } ], "structures": [ { "label": "Jenaer Volksblatt", "metadata": [ { "label": "genre", "value": "article" }, { "label": "title", "value": "Neuer Artikel" } ], "ranges": [ "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/range/log_6f9844d0-34bc-45e7-b54b-29124bbc2e87" ], "canvases": [ "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_001.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_002.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_003.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_004.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_001.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_002.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_003.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_004.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_Be_001.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_Be_002.tif" ], "@type": "sc:Range", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/range/log_65036b4c-23c6-43c2-b5b6-5a96d7710c80" }, { "label": "Freitag 1. Januar", "metadata": [], "ranges": [ "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/range/log_25c78b1d-c64e-4f69-8a43-141e43e03a83", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/range/log_b0c53b3b-a2cb-41ce-a32c-f205948abc39", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/range/log_7a4f861f-29d0-4813-804f-baf3e4e191e8", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/range/log_946d276d-7051-488a-9526-a5bc8fa2e410", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/range/log_c5ffed51-c2a1-4be7-9fbb-6e18d5fbae9c" ], "canvases": [ "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_001.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_002.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_003.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_004.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_001.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_002.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_003.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_004.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_Be_001.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_Be_002.tif" ], "@type": "sc:Range", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/range/log_6f9844d0-34bc-45e7-b54b-29124bbc2e87" }, { "label": "Text", "metadata": [], "ranges": [], "canvases": [ "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_001.tif" ], "@type": "sc:Range", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/range/log_25c78b1d-c64e-4f69-8a43-141e43e03a83" }, { "label": "Werbung", "metadata": [], "ranges": [], "canvases": [ "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_002.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_003.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B1_004.tif" ], "@type": "sc:Range", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/range/log_b0c53b3b-a2cb-41ce-a32c-f205948abc39" }, { "label": "Text2", "metadata": [], "ranges": [], "canvases": [ "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_001.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_002.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_003.tif" ], "@type": "sc:Range", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/range/log_7a4f861f-29d0-4813-804f-baf3e4e191e8" }, { "label": "Werbung2", "metadata": [], "ranges": [], "canvases": [ "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_B2_004.tif" ], "@type": "sc:Range", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/range/log_946d276d-7051-488a-9526-a5bc8fa2e410" }, { "label": "Text3", "metadata": [], "ranges": [], "canvases": [ "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_Be_001.tif", "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/canvas/mir_derivate_00000005/JVB_19150101_001_167758667_Be_002.tif" ], "@type": "sc:Range", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/range/log_c5ffed51-c2a1-4be7-9fbb-6e18d5fbae9c" } ], "@context": "http://iiif.io/api/presentation/2/context.json", "@type": "sc:manifest", "@id": "http://<my_url>:8291/mir/rsc/iiif/presentation/Mets/mir_derivate_00000005/manifest.json" }
It worked the first x times, but then i changed some things and now i get "Metadata API Base URI is not set" and i don't know how to fix it.
e.g. that they get different types, or are used for both image and canvas etc.
As per the spec:
http://iiif.io/api/presentation/2.0/#image-resources
Currently gives a warning.
The validator has an "okay" value of 0, but "error" is "u'value'" and warnings is an empty array (ie []).
Hello,
thanks again for this schema, extremely helpful, just wondering the following regex pattern:
matches image/format
and also image//format
is this the expected behaviour?
If it is correct I would consider escaping the forward-slash as suggested here because this could cause an error when using the pattern with Javascript. The resulting pattern would be:
"pattern": "^[a-z][a-z]*\/.*$"
Otherwise, the following pattern does not match image//format
but only image/format
^[a-z][a-z]*(?<!\/)\/(?!\/).*$
some tests here
Currently the validator can distinguish between 1.0 and 2.0 ... but the context will not be sufficient to distinguish 2.0 and 2.1. Need to be able to allow validation separately... which doesn't fit nicely with the current single factory approach.
That said, 2.1 will be 100% backwards compatible with 2.0. So we could validate only against the most recent 2.X release. The exception might be warnings ... if there's a new field that is recommended, it would generate a warning for previous versions where it did not exist.
The validator reports an error "Validation Error: sc:Canvas['height'] does not accept a unicode, only an integer" for quoted integers. This is a python issue, and probably not intended.
Json-ld uses type coercion to identify values. Whether or not a value is quoted does not indicate its type. See https://www.w3.org/TR/json-ld/#typed-values. Also, in RDF all literals are quoted, so an fromRDF transformation to JSON-LD would not arbitrarily remove the quotes for an integer.
Hello!
The example manifest response uses the HTTPS version of the licence page resulting in an invalid JSON for the current schema where these are not included.
presentation-validator/schema/iiif_3_0.json
Lines 217 to 236 in d4d376e
Maybe the https version could be added to the JSON schema?
From slack, the following manifest:
throws a hidden 500 error when validated as version 3.0. Also Ben noticed the following UX improvements:
"If I choose version 2.1 from the drop-down, it validates. As expected. If I then choose 2.0, I press GO - and I can’t tell if it has actually run another test, there is no apparent refresh. I would suggest even a minor version indicator on each result, for instance “Validated 2.0 successfully”"
I get the error message when trying to run the script on a windows machine, python 2.7 against a jp2 image.
Does ImageMagick or PIL need to be installed as no mention is made of this in the installation notes.
A manifest that does have an @id set is getting the following warning:
WARNING: Resource type 'sc:Sequence' should have '@id' set
sequence in the manifest:
"sequences": [
{
"@id": "http://70.112.74.2:3000/iiif/1/sequence/default",
"@type": "sc:Sequence",
or full manifest attached.
This is using http://iiif.io/api/presentation/validator/ as of today.
It looks like the validator does not like @id
and @type
being used for an IIIF 2 image service.
But the specification recommends:
service: [
{
"@id": "https://example.org/iiif2/image1/identifier",
"@type": "ImageService2",
"profile": "http://iiif.io/api/image/2/level2.json"
}
]
The manifest I am experimenting with can be grabbed here:
https://rosetest.library.jhu.edu/rosademo/iiif3/rose/SeldenSupra57/manifest
For some manifests the server returns the following error message when validating via POST: "Error 413: Request Entity Too Large".
Example manifest 1: http://iiif.biblissima.fr/manifests/ark:/12148/btv1b84539771/manifest.json
This manifest is 376 KB when downloaded.
Example manifest 2: http://dms-data.stanford.edu/data/manifests/Walters/qm670kv1873/manifest.json [469 KB]
Example manifest 3: http://www.e-codices.unifr.ch/metadata/iiif/kba-0003/manifest.json [212 KB]
Probably the web server (nginx or Apache) should be configured to accept a bigger body size for POST requests. For nginx, for example, this can be done by editing the client_max_body_size
in /etc/nginx/nginx.conf
.
I'm getting
WARNING: Setting non-standard field 'viewingDirection' on resource of type 'sc:Sequence'
WARNING: Setting non-standard field 'viewingHint' on resource of type 'sc:Sequence'
WARNING: Setting non-standard field 'seeAlso' on resource of type 'sc:Manifest'
WARNING: Resource type 'sc:Sequence' should have 'label' set
Warning seems like the wrong sentiment, since these are all optional in the spec. Also, the first three state that they are "non-standard," which is not correct.
When you submit a large manifest like:
https://www.e-manuscripta.ch/i3f/v21/742334/manifest
its a bit difficult to tell if the validator is working or if the validate button is just unresponsive.
With the example, this is the output I see using curl or wget:
{"received": "{\n \"@context\": \"http://iiif.io/api/presentation/2/context.json\", \n \"@id\": \"http://iiif.io/api/presentation/2.1/example/fixtures/1/manifest.json\", \n \"@type\": \"sc:Manifest\", \n
\"label\": \"Test 1 Manifest: Minimum Required Fields\", \n \"within\": \"http://iiif.io/api/presentation/2.1/example/fixtures/collection.json\", \n \"sequences\": [\n {\n \"@type\": \"sc:Sequence
\", \n \"canvases\": [\n {\n \"@id\": \"http://iiif.io/api/presentation/2.1/example/fixtures/canvas/1/c1.json\", \n \"@type\": \"sc:Canvas\", \n \"label\": \"Test 1 Can
vas: 1\", \n \"height\": 1800, \n \"width\": 1200, \n \"images\": [\n {\n \"@type\": \"oa:Annotation\", \n \"motivation\": \"sc:painting\", \n
\"resource\": {\n \"@id\": \"http://iiif.io/api/presentation/2.1/example/fixtures/resources/page1-full.png\", \n \"@type\": \"dctypes:Image\", \n \"h
eight\": 1800, \n \"width\": 1200\n }, \n \"on\": \"http://iiif.io/api/presentation/2.1/example/fixtures/canvas/1/c1.json\"\n }\n ]\n }\n
]\n }\n ]\n}", "error": "None", "okay": 1, "warnings": ["WARNING: Resource type 'sc:Manifest' should have 'description' set\n", "WARNING: Resource type 'oa:Annotation' should have '@id' set\n", "WARN
ING: Resource type 'dctypes:Image' should have 'format' set\n"]}
For 3.0 we should check the license value is one of the allowed types.
The following manifest is causing a 500 error on the validator:
https://purl.stanford.edu/hg676jb4964/iiif3/manifest
Version 3.0, full URL:
Julien commented that the validator doesn't seem to be working and I confirmed that it isn't. I had run the validation 15mins before and it worked OK. The error (not reported by the validator) is a 404
for:
Looking at the error page it says:
Error: 404 Not Found
Sorry, the requested URL 'http://presentation-validator.iiif.io/validate/?url=https://www.e-manuscripta.ch/i3f/v21/742334/manifest&version=2.1' caused an error:
Not found: '/validate/'
trying without the slash after validate seems to work:
http://presentation-validator.iiif.io/validate?url=https://www.e-manuscripta.ch/i3f/v21/742334/manifest&version=2.1
We currently provide IIIF manifests for v2 at the same URL as the v3 ones. v2 is set by default and v3 can be requested using content negotiation. It would be great if we could use this service and either:
Accept
header supported for v3or
Example:
curl -v https://purl.stanford.edu/st808xq5141/iiif/manifest
curl -v -H "Accept: application/ld+json;profile=\"http://iiif.io/api/presentation/3/context.json\"" https://purl.stanford.edu/st808xq5141/iiif/manifest
Reported by Ed, broken validator link:
Manifest:
https://www.rpm-api.io/records/5e78f06706f6190017c039f9?_format=iiif&version=3.0
It took somewhile to track down the cause of a problem. A range was referenciing a canvas which did not exist in the manifest. The proposal (endorsed by Ben) is that the validator should check that canvases exist, and logically a similar check can be made that any referenced ranges also exist. Thanks.
There may be a mismatch between spec and validator expectations. Getting an error on a (many) Stanford manifest that every resource must have @type: http://iiif.io/api/presentation/validator/service/validate?url=http%3A%2F%2Fpurl.stanford.edu%2Ffm590rc7316%2Fiiif%2Fmanifest.json&version=2.0&format=html
This seems to derive from the fact that thumbnail lacks @type (?) - but spec shows w/out: http://iiif.io/api/presentation/2.0/#manifest
Which is correct? if not thumbnail, this can be a feature request for more accurate error reporting for missing @type (as in, which resource(s) are missing a required something).
I get this error when trying to validate this manifest: https://marcus-manifest-api.vercel.app/api/iiif/manifest/ubb-ms-0003. The manifest validates as json-ld, but gives this error on the IIIF validator.
Validation Error: Presentation Validator bug: "Parse error at 1:19 near token ] (])".
Any clues to what is happening?
Using the following manifest:
https://www.e-manuscripta.ch/i3f/v21/742334/manifest
it says "Validation Error: Resource type 'sc:Canvas' requires 'label' to be set"
but you are a bit clueless which canvas is missing a label.
Our software often generates annotations like the following, with empty text as the content, representing a transcription line which hasn't been entered yet. The validator complains "Text must have either a URI or embedded text", but it should really accept this as valid.
{
"@id" : "http://t-pen.org/Paris%2C+Petrus+Plaoul+Reims+1/line/100173639",
"@type" : "oa:Annotation",
"motivation" : "sc:painting",
"resource" : {
"@type" : "cnt:ContentAsText",
"chars" : ""
},
"on" : "http://t-pen.org/Paris%2C+Petrus+Plaoul+Reims+1/canvas/R1r.jpg#xywh=89,125,248,15"
}
From Demian Katz:
<div>OC PS2394 .M642 1883 [xiv], 144, 126, [4] p. ; 18 cm. First set of unnumbered pages are a series list; second set are a publisher's catalog.</div>
Causes a 500 and should be fine.
Should issue a warning, even though the requirement is MUST, as the manifest might not yet be public and don't want to stop the other validation tests.
When run under python 3.x one gets errors like:
File "./iiif-presentation-validator.py", line 60, in do_POST_test
data = json.loads(b)
File "/Users/simeon/miniconda3/envs/py3/lib/python3.5/json/__init__.py", line 312, in loads
s.__class__.__name__))
TypeError: the JSON object must be str, not 'bytes'
from a request:
curl -X POST --data @../iiif-prezi/tests/testdata/2.0/example/fixtures/1/manifest.json http://localhost:8080/validate
I'm still getting the following error while my manifest seems ok:
Validation Error: sc:Canvas['label'] not present and required
It only returns one sequence with a single canvas which actually contains a label.
Below the canvas I'm trying to validate:
{
"@context": "http://iiif.io/api/presentation/2/context.json",
"@type": "sc:Manifest",
"@id": "http://localhost:8079/api/presentation/7d338e96-66c3-4f8a-95da-3b512a66bd87/manifest",
"label": "linly_simplifiee",
"metadata": [
{
"label": "altLanguage",
"value": "eng"
}
],
"sequences": [
{
"@context": "http://iiif.io/api/presentation/2/context.json",
"@id": "http://localhost:8079/api/presentation/7d338e96-66c3-4f8a-95da-3b512a66bd87/sequence/default",
"@type": "sc:Sequence",
"label": "default",
"canvases": [
{
"@context": "http://iiif.io/api/presentation/2/context.json",
"@id": "http://localhost:8079/api/presentation/7d338e96-66c3-4f8a-95da-3b512a66bd87/canvas/539f068a-1591-42e2-9583-1c3017e2875a",
"@type": "sc:Canvas",
"label": "linly_1160-6398_1872_num_18_1_C_0001_0000",
"thumbnail": [
{
"@id": "http://localhost:8079/api/image/539f068a-1591-42e2-9583-1c3017e2875a/full/100,/0/default.png",
"@type": "dctypes:Image",
"service": [
{
"@context": "http://iiif.io/api/image/2/context.json",
"@id": "http://localhost:8079/api/image/539f068a-1591-42e2-9583-1c3017e2875a",
"profile": [
{
"formats": [
"jpg",
"png"
],
"qualities": [
"default"
],
"@id": "http://iiif.io/api/image/2/level1.json",
"supports": [
"regionByPx",
"sizeByW",
"sizeByH",
"sizeByPct",
"baseUriRedirect",
"cors",
"jsonldMediaType"
]
}
],
"protocol": "http://iiif.io/api/image"
}
],
"format": {
"primaryType": "image",
"subType": "png",
"extensions": [
"png"
],
"typeName": "image/png"
}
}
],
"images": [
{
"@type": "oa:Annotation",
"motivation": "sc:painting",
"resource": {
"@id": "http://localhost:8079/api/image/539f068a-1591-42e2-9583-1c3017e2875a/full/1000,/0/default.png",
"@type": "dctypes:Image",
"service": [
{
"@context": "http://iiif.io/api/image/2/context.json",
"@id": "http://localhost:8079/api/image/539f068a-1591-42e2-9583-1c3017e2875a",
"profile": [
{
"formats": [
"jpg",
"png"
],
"qualities": [
"default"
],
"@id": "http://iiif.io/api/image/2/level1.json",
"supports": [
"regionByPx",
"sizeByW",
"sizeByH",
"sizeByPct",
"baseUriRedirect",
"cors",
"jsonldMediaType"
]
}
],
"protocol": "http://iiif.io/api/image"
}
],
"format": {
"primaryType": "image",
"subType": "png",
"extensions": [
"png"
],
"typeName": "image/png"
}
},
"on": {
"@id": "http://localhost:8079/api/presentation/7d338e96-66c3-4f8a-95da-3b512a66bd87/canvas/539f068a-1591-42e2-9583-1c3017e2875a",
"@type": "sc:Canvas"
}
}
],
"otherContent": [
{
"@id": "http://localhost:8079/api/presentation/7d338e96-66c3-4f8a-95da-3b512a66bd87/list/default",
"@type": "sc:AnnotationList",
"label": "default"
}
],
"width": 150,
"height": 100
}
]
}
]
}
The spec states that A Manifest must have the label property with at least one entry. Currently the validator does not test for the presence of the label
element in 3.0 manifests.
To reproduce:
label
element exists for the manifest itself.... to prevent abuse by robots, possibly as part of a DDOS attack.
I am attempting to validate a manifest file (https://www.qdl.qa/en/iiif/81055/vdc_100000000193.0x000064/manifest) which returns
{"okay": 0, "error": "Cannot fetch url", "url": "https://www.qdl.qa/en/iiif/81055/vdc_100000000193.0x000064/manifest"}
If I copy the manifest to another server, this validates as expected.
I verified this behavior on the master
branch with python3.
Digging into this a bit further, urllib.error.HTTPError
returns HTTP Error 403: Forbidden
.
from urllib.request import urlopen, HTTPError, Request
req = Request('https://www.qdl.qa/en/iiif/81055/vdc_100000000193.0x000064/manifest')
print(wh = urlopen(req))
I'm reaching out to colleagues at the institution to double-check if the intention is to block these requests, but I did a quick test with Requests and the data was accessed as expected:
import requests
r = requests.get('https://www.qdl.qa/en/iiif/81055/vdc_100000000193.0x000064/manifest')
print(r.content)
In the Presentation 2.1 API spec, there are 157 "MUSTS". I think that a proper API validation tool should have a test for each MUST. For example, "A reference to the Image API context document must be included". WIth this method, this is now expected in Mirador 2.5.1.
Yet this tool does not test for this and "validates" manifests that are not valid.
I believe that a real IIIF manifest test suite is needed, so that implementers (and client developers) can actually validate manifests against the current API specification. I would suggest using EARL and modelling it after the jsonld test suite.
Validation Error: Presentation Validator bug: "". Please create a Validator Issue, including a link to the manifest.
Testing this v3 manifest: https://raw.githubusercontent.com/WeAreAVP/aviary-iiif-test-samples/master/buffalo_trace_interview/manifest.json
{
"@context": [
"http://iiif.io/api/presentation/2/context.json",
"http://wellcomelibrary.org/ld/iiif-ext/0/context.json"
],
That gives "Validation Error: Top level @context is not known"
...but surely this is OK?
Test: http://wellcomelibrary.org/iiif/b18035978/manifest
(there are some other issues with that manifest)
Discovered through the work on:
currently the validator only allows strings but it should also allow an array of strings.
The validator throws this error on 2.1 Manifests, even though they do seem to validate (and be valid):
Validation Error: ('Dereferencing a URL did not result in a valid JSON-LD object. Possible causes are an inaccessible URL perhaps due to a same-origin policy (ensure the server uses CORS if you are using client-side JavaScript), too many redirects, a non-JSON response, or more than one HTTP Link Header was provided for a remote context.',) Type: jsonld.InvalidUrl Code: loading remote context failed Details: {'url': 'http://iiif.io/api/presentation/2/context.json', 'cause': TypeError('load_document_local() takes 1 positional argument but 2 were given',)}
Examples:
Moreover, I noticed another issue while validating this 3.0 Manifest: https://preview.iiif.io/cookbook/0009-book-1/recipe/0009-book-1/manifest.json
Validation Error: Top level @context is not known
even though the @context
seems ok.
There is also a warning indicating a potential CORS issue on fixtures.iiif.io manifests:
Warnings:URL does not have correct access-control-allow-origin header: got "", expected *`
In HTML such as
As it's MAY, or MUST only with multiple sequences.
And link to iiif-prezi/iiif-prezi for the library
Right now, the two options to validate a manifest are
a) use a GET request (so the manifest URI needs to be publicly available) or
b) download the validator code and host it yourself
It would be great to have another option:
c) send local manifest JSON to validator
so we could validate manifests before making them public and without having to install the validator locally.
A use case would be if we were to build a stand-alone web application that creates manifests. The application could run locally and still support validation of IIIF manifests by sending the JSON to the validator (perhaps via POST).
The W3C Markup validator supports validating local HTML. A number of browser add-ons such as the web developer add-on allow you to send your local HTML to the W3C validator.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.