GithubHelp home page GithubHelp logo

iiif / presentation-validator Goto Github PK

View Code? Open in Web Editor NEW
39.0 39.0 36.0 397 KB

Validator for the Presentation API

Home Page: http://iiif.io/api/presentation/validator/

Python 86.63% HTML 12.78% Dockerfile 0.41% Shell 0.18%

presentation-validator's People

Contributors

acdha avatar azaroth42 avatar calvinbutcher avatar conorsheehan1 avatar giacomomarchioro avatar glenrobson avatar irv avatar jonhartzler avatar kenlt avatar magoni avatar minusdavid avatar oyvindlgjesdal avatar stephenwf avatar waynegraham avatar workergnome avatar zimeon avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

presentation-validator's Issues

no response in ui when manifest cannot be fetched

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

https://iiif.io/api/presentation/validator/service/validate?format=json&version=2.0&url=http://127.0.0.1:8887/manifest.json

{"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.

if (data.warnings.length){

Maybe errors when fetching the resource could be added to warnings too?

What does "Metadata API Base URI is not set " mean ?

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.

Possible pattern improvement in format pattern of the JSON schema?

Hello,
thanks again for this schema, extremely helpful, just wondering the following regex pattern:

"pattern": "^[a-z][a-z]*/.*$"

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

Validate separately for version 2.X

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.

integers can be quoted in jsonld

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.

Possible improvement: including https version of licences links?

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.

"rights": {
"title": "Rights URI isn't from either Creative Commons or RightsStatements.org. Both require http links.",
"oneOf": [
{
"type": "string",
"format": "uri",
"pattern": "http://creativecommons.org/licenses/.*"
},
{
"type": "string",
"format": "uri",
"pattern": "http://creativecommons.org/publicdomain/mark/.*"
},
{
"type": "string",
"format": "uri",
"pattern": "http://rightsstatements.org/vocab/.*"
}
]
},

Maybe the https version could be added to the JSON schema?

2.0 manifest throws 500 error and UX changes

From slack, the following manifest:

https://iiif.io/api/presentation/validator/service/validate?url=https://metascripta.org/iiif/VFL_VTL_03199_01.json&version=3.0

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”"

Error 413 "Request Entity Too Large" when validating via POST

For some manifests the server returns the following error message when validating via POST: "Error 413: Request Entity Too Large".

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.

Validation warnings

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.

Output is difficult to read

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"]}

Current live presentation validator isn't working

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:

http://iiif.io/api/presentation/validator/service/validate/?url=https://www.e-manuscripta.ch/i3f/v21/742334/manifest&version=2.1

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

Potential feature: support custom headers / or Prezi3 headers for urls

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:

  • automatically send Accept header supported for v3

or

  • provide the ability to send a custom header (I know some implementations want this for language selection)

Example:

v2

curl -v https://purl.stanford.edu/st808xq5141/iiif/manifest

v3

curl -v -H "Accept: application/ld+json;profile=\"http://iiif.io/api/presentation/3/context.json\"" https://purl.stanford.edu/st808xq5141/iiif/manifest

Validator balks at lack of @type on some resources

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).

Validation error: Parse error at 1:19 near token ]

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 ] (])".

https://iiif.io/api/presentation/validator/service/validate?format=json&version=3.0&url=https://marcus-manifest-api.vercel.app/api/iiif/manifest/ubb-ms-0003

Any clues to what is happening?

Validator should support empty-text annotations

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"
}

Validator should not die on div

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.

Validator works only with python 2.x and _not_ python 3.x

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

Validation error even if it seems ok

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
                }
            ]
        }
    ]
}

Validator does not test for label in v3 manifests

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:

Cannot fetch url

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"}

https://iiif.io/api/presentation/validator/service/validate?format=json&version=2.0&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)

validation does not test all API requirements

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.

Validating Manifests throws a Validation Error

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 *`

Support validation of local manifests

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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.