├── .gitignore
├── source
├── favicon.ico
├── img
│ ├── icon-toc.png
│ ├── ajax-loader.gif
│ ├── bg-color-bar.png
│ ├── orcid_16x16.png
│ ├── text-bg-about.png
│ ├── icon-about-page.png
│ ├── logo-iiif-34x30.png
│ ├── text-bg-step-1.png
│ ├── text-bg-step-2.png
│ ├── text-bg-step-3.png
│ ├── icon-select-arrow.png
│ ├── interactive-img-bl.png
│ ├── text-bg-impl-demos.png
│ ├── text-bg-get-involved.png
│ ├── text-bg-img-servers.png
│ ├── text-bg-img-viewers.png
│ ├── text-bg-participants.png
│ ├── text-bg-quick-start.png
│ ├── icon-defined-apis-60x60.png
│ ├── icon-plug-n-play-60x60.png
│ ├── metadata-api
│ │ ├── optional.png
│ │ ├── required.png
│ │ ├── iiif-objects.png
│ │ ├── not_allowed.png
│ │ ├── recommended.png
│ │ ├── article2301242.jpg
│ │ ├── iiif-objects-all.png
│ │ ├── iiif-objects-metadata.png
│ │ ├── iiif-fields-cardinality.png
│ │ └── icons-metadata-requirements.png
│ ├── text-bg-tips-n-tricks.png
│ ├── interactive-img-e-codices.png
│ └── icon-community-driven-60x60.png
├── _includes
│ ├── acronyms.md
│ ├── sub-page_header.html
│ ├── copyright2017.md
│ ├── footer.html
│ ├── chromeframe.html
│ ├── doctype.html
│ ├── ga.html
│ ├── beta.md
│ ├── nav.html
│ └── spec-head.html
├── api
│ ├── import
│ │ └── 0.1
│ │ │ ├── iiif-dragndrop-100px.png
│ │ │ └── index.md
│ ├── notification
│ │ └── 0.1
│ │ │ └── index.md
│ └── harvest
│ │ └── 0.1
│ │ ├── activities.md
│ │ └── index.md
├── _data
│ ├── rfc_words.yml
│ ├── navigation.yml
│ ├── organization.yml
│ ├── acronyms.yml
│ ├── impl_demos.yml
│ ├── image_clients.yml
│ ├── image_servers.yml
│ ├── showcase.yml
│ └── institutions.yml
├── js
│ ├── anchor.js
│ ├── main.js
│ └── vendor
│ │ ├── jquery.iiif-demo.js
│ │ ├── anchor.min.js
│ │ ├── jquery.ddslick.min.js
│ │ ├── modernizr-2.6.2-respond-1.1.0.min.js
│ │ └── slick.min.js
├── _layouts
│ └── spec.html
└── css
│ ├── demo.scss
│ ├── vendor
│ └── slick.css
│ ├── normalize.min.css
│ ├── syntax.css
│ ├── spec-doc.scss
│ ├── spec-doc2.scss
│ ├── normalize.css
│ └── main.scss
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | _site
2 | node_modules/
3 |
4 |
--------------------------------------------------------------------------------
/source/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/favicon.ico
--------------------------------------------------------------------------------
/source/img/icon-toc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/icon-toc.png
--------------------------------------------------------------------------------
/source/img/ajax-loader.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/ajax-loader.gif
--------------------------------------------------------------------------------
/source/img/bg-color-bar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/bg-color-bar.png
--------------------------------------------------------------------------------
/source/img/orcid_16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/orcid_16x16.png
--------------------------------------------------------------------------------
/source/img/text-bg-about.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-about.png
--------------------------------------------------------------------------------
/source/img/icon-about-page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/icon-about-page.png
--------------------------------------------------------------------------------
/source/img/logo-iiif-34x30.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/logo-iiif-34x30.png
--------------------------------------------------------------------------------
/source/img/text-bg-step-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-step-1.png
--------------------------------------------------------------------------------
/source/img/text-bg-step-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-step-2.png
--------------------------------------------------------------------------------
/source/img/text-bg-step-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-step-3.png
--------------------------------------------------------------------------------
/source/img/icon-select-arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/icon-select-arrow.png
--------------------------------------------------------------------------------
/source/img/interactive-img-bl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/interactive-img-bl.png
--------------------------------------------------------------------------------
/source/img/text-bg-impl-demos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-impl-demos.png
--------------------------------------------------------------------------------
/source/img/text-bg-get-involved.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-get-involved.png
--------------------------------------------------------------------------------
/source/img/text-bg-img-servers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-img-servers.png
--------------------------------------------------------------------------------
/source/img/text-bg-img-viewers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-img-viewers.png
--------------------------------------------------------------------------------
/source/img/text-bg-participants.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-participants.png
--------------------------------------------------------------------------------
/source/img/text-bg-quick-start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-quick-start.png
--------------------------------------------------------------------------------
/source/img/icon-defined-apis-60x60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/icon-defined-apis-60x60.png
--------------------------------------------------------------------------------
/source/img/icon-plug-n-play-60x60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/icon-plug-n-play-60x60.png
--------------------------------------------------------------------------------
/source/img/metadata-api/optional.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/optional.png
--------------------------------------------------------------------------------
/source/img/metadata-api/required.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/required.png
--------------------------------------------------------------------------------
/source/img/text-bg-tips-n-tricks.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-tips-n-tricks.png
--------------------------------------------------------------------------------
/source/_includes/acronyms.md:
--------------------------------------------------------------------------------
1 | {% for acronym in site.data.acronyms %}
2 | *[{{ acronym[0] }}]: {{ acronym[1] }}
3 | {% endfor %}
4 |
--------------------------------------------------------------------------------
/source/img/interactive-img-e-codices.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/interactive-img-e-codices.png
--------------------------------------------------------------------------------
/source/img/metadata-api/iiif-objects.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/iiif-objects.png
--------------------------------------------------------------------------------
/source/img/metadata-api/not_allowed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/not_allowed.png
--------------------------------------------------------------------------------
/source/img/metadata-api/recommended.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/recommended.png
--------------------------------------------------------------------------------
/source/img/icon-community-driven-60x60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/icon-community-driven-60x60.png
--------------------------------------------------------------------------------
/source/img/metadata-api/article2301242.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/article2301242.jpg
--------------------------------------------------------------------------------
/source/img/metadata-api/iiif-objects-all.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/iiif-objects-all.png
--------------------------------------------------------------------------------
/source/api/import/0.1/iiif-dragndrop-100px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/api/import/0.1/iiif-dragndrop-100px.png
--------------------------------------------------------------------------------
/source/img/metadata-api/iiif-objects-metadata.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/iiif-objects-metadata.png
--------------------------------------------------------------------------------
/source/img/metadata-api/iiif-fields-cardinality.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/iiif-fields-cardinality.png
--------------------------------------------------------------------------------
/source/img/metadata-api/icons-metadata-requirements.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/icons-metadata-requirements.png
--------------------------------------------------------------------------------
/source/_data/rfc_words.yml:
--------------------------------------------------------------------------------
1 | - MUST
2 | - MUST NOT
3 | - REQUIRED
4 | - SHALL
5 | - SHALL NOT
6 | - SHOULD
7 | - SHOULD NOT
8 | - RECOMMENDED
9 | - NOT RECOMMENDED
10 | - MAY
11 | - OPTIONAL
12 | - MAY WISH TO
13 |
--------------------------------------------------------------------------------
/source/_includes/sub-page_header.html:
--------------------------------------------------------------------------------
1 | {% if page.title_override %}{{ page.title_override }}{% else %}{{ page.title }}{% endif %}
4 |
. 2 | - name: Stanford University Libraries - Mirador demo 3 | uri: http://showcase.iiif.io/viewer/mirador/ 4 | blurb: 5 | - > 6 | This demo of Mirador, developed by the Stanford University Libraries, allows 7 | the user to compare images from several different image repositories, 8 | including the Stanford Digital Repository, Yale University and Los Alamos 9 | National Labs. 10 | - name: Princeton University Libraries 11 | uri: https://libimages1.princeton.edu/osd-demo/?feedme=pudl0123/8172070/01/00000001.jp2 12 | blurb: 13 | - > 14 | This demonstration, hosted by the Princeton University Libraries, shows an 15 | image being served by Loris and viewed using OpenSeadragon. 16 | - name: The British Library 17 | uri: http://sanddragon.bl.uk/mirador/ 18 | blurb: 19 | - > 20 | The British Library deployed a demonstration of Mirador that allows the user 21 | to compare images from the British Library, Yale University and Stanford 22 | University. The BL adapted Mirador to display a YouTube video within the 23 | viewer that can be played while inspecting images. 24 | - name: Biblissima - Mirador Demo 25 | uri: http://demos.biblissima-condorcet.fr/mirador/ 26 | blurb: 27 | - > 28 | The [Biblissima Project](http://www.biblissima-condorcet.fr/) is a hub for 29 | digital humanities projects in France that is focused on the written cultural 30 | heritage of the Middle Ages and the Renaissance. They have an implementation 31 | of Mirador that currently shows content hosted at multiple institutions and 32 | will, increasingly, provide access to French content. 33 | - name: Europeana 34 | uri: http://europeana.eu 35 | blurb: 36 | - > 37 | [Europeana](http://europeana.eu), Europe's platform for digital cultural heritage, 38 | encourages its network of partners (libraries, archives, museums) to provide access 39 | to high-quality content. They have started to encourage data providers to adopt IIIF, 40 | and have adapted their infrastructure so that it can handle IIIF resources. The first 41 | IIIF datasets following the agreed Europeana guidelines for IIIF can be accessed on the 42 | [Europeana Collections portal](http://www.europeana.eu/portal/en/search?view=grid&q=sv_dcterms_conformsTo%3A*iiif*). 43 | -------------------------------------------------------------------------------- /source/css/vendor/slick.css: -------------------------------------------------------------------------------- 1 | /* Slider */ 2 | .slick-slider 3 | { 4 | position: relative; 5 | 6 | display: block; 7 | 8 | -moz-box-sizing: border-box; 9 | box-sizing: border-box; 10 | 11 | -webkit-user-select: none; 12 | -moz-user-select: none; 13 | -ms-user-select: none; 14 | user-select: none; 15 | 16 | -webkit-touch-callout: none; 17 | -khtml-user-select: none; 18 | -ms-touch-action: pan-y; 19 | touch-action: pan-y; 20 | -webkit-tap-highlight-color: transparent; 21 | } 22 | 23 | .slick-list 24 | { 25 | position: relative; 26 | 27 | display: block; 28 | overflow: hidden; 29 | 30 | margin: 0; 31 | padding: 0; 32 | } 33 | .slick-list:focus 34 | { 35 | outline: none; 36 | } 37 | .slick-list.dragging 38 | { 39 | cursor: pointer; 40 | cursor: hand; 41 | } 42 | 43 | .slick-slider .slick-track, 44 | .slick-slider .slick-list 45 | { 46 | -webkit-transform: translate3d(0, 0, 0); 47 | -moz-transform: translate3d(0, 0, 0); 48 | -ms-transform: translate3d(0, 0, 0); 49 | -o-transform: translate3d(0, 0, 0); 50 | transform: translate3d(0, 0, 0); 51 | } 52 | 53 | .slick-track 54 | { 55 | position: relative; 56 | top: 0; 57 | left: 0; 58 | 59 | display: block; 60 | } 61 | .slick-track:before, 62 | .slick-track:after 63 | { 64 | display: table; 65 | 66 | content: ''; 67 | } 68 | .slick-track:after 69 | { 70 | clear: both; 71 | } 72 | .slick-loading .slick-track 73 | { 74 | visibility: hidden; 75 | } 76 | 77 | .slick-slide 78 | { 79 | display: none; 80 | float: left; 81 | 82 | height: 100%; 83 | min-height: 1px; 84 | } 85 | [dir='rtl'] .slick-slide 86 | { 87 | float: right; 88 | } 89 | .slick-slide img 90 | { 91 | display: block; 92 | } 93 | .slick-slide.slick-loading img 94 | { 95 | display: none; 96 | } 97 | .slick-slide.dragging img 98 | { 99 | pointer-events: none; 100 | } 101 | .slick-initialized .slick-slide 102 | { 103 | display: block; 104 | } 105 | .slick-loading .slick-slide 106 | { 107 | visibility: hidden; 108 | } 109 | .slick-vertical .slick-slide 110 | { 111 | display: block; 112 | 113 | height: auto; 114 | 115 | border: 1px solid transparent; 116 | } 117 | .slick-arrow.slick-hidden { 118 | display: none; 119 | } -------------------------------------------------------------------------------- /source/css/normalize.min.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v1.1.2 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0} -------------------------------------------------------------------------------- /source/_data/image_clients.yml: -------------------------------------------------------------------------------- 1 | # Use Markdown in the blurb if necessary for links, etc. Each list entry in the blurb gets a
. 2 | - name: Diva.js 3 | uri: http://ddmal.github.io/diva.js/ 4 | blurb: 5 | - > 6 | Diva.js is an open-source document image viewer, especially suited for 7 | use in archival book digitization initiatives where viewing high-resolution 8 | images is a crucial part of the user experience. Using Diva, libraries, 9 | archives, and museums can present high-resolution document page images 10 | in a user-friendly “instant-on” interface that has been optimized for speed 11 | and flexibility. 12 | - name: IIPMooViewer 13 | uri: https://github.com/ruven/iipmooviewer 14 | blurb: 15 | - > 16 | IIPMooViewer is an open source, Javascript and HTML5 image streaming and 17 | zooming client. IIPMooViewer is IIIF-compatible and works with 18 | [IIPServer](https://github.com/ruven/iipsrv) or other IIIF 19 | compatible servers. Visit the 20 | [IIP demo page](http://iipimage.sourceforge.net/demo/) to see the IIP 21 | viewers in action. 22 | - name: Mirador 23 | uri: http://github.com/IIIF/mirador 24 | blurb: 25 | - > 26 | Mirador is an open source image, Javascript and HTML5 viewer that delivers 27 | high resolution images in a workspace that enables comparison of multiple 28 | images from multiple repositories. Mirador is fully IIIF-compatible. Visit 29 | the [Mirador demo](http://showcase.iiif.io/viewer/mirador/) to see it in 30 | action. 31 | - name: OpenSeadragon 32 | uri: http://openseadragon.github.io/ 33 | blurb: 34 | - > 35 | OpenSeadragon is an open-source, Javascript viewer enabling smooth deep 36 | zoom and pan of high resolution images. OpenSeadragon is IIIF compatible. 37 | A demo of OpenSeadragon in action can be seen on the 38 | [project homepage](http://openseadragon.github.io/). 39 | - name: Leaflet-IIIF 40 | uri: https://github.com/mejackreed/Leaflet-IIIF 41 | blurb: 42 | - > 43 | Leaflet-IIIF is a Leaflet plugin that enables zoomable IIIF images to be easily and quickly displayed. Leaflet + Leaflet-IIIF weigh in at just 35 KB and include great features like accessible keyboard controls and native touch/mobile support. 44 | [Check out the demo](http://mejackreed.github.io/Leaflet-IIIF/examples/example.html) 45 | - name: Universal Viewer 46 | uri: https://github.com/universalviewer 47 | blurb: 48 | - > 49 | The Universal Viewer is an open source project to enable cultural heritage institutions to present their digital artifacts in a IIIF-compliant and highly customisable user interface. 50 | -------------------------------------------------------------------------------- /source/api/notification/0.1/index.md: -------------------------------------------------------------------------------- 1 | # IIIF Notifications 2 | 3 | This information is extracted from the [Crawling](/api/harvest/) work, as it applies to notifications using the [ActivityStreams](https://www.w3.org/TR/activitystreams-core/) pattern. 4 | 5 | ## Notifications of Change 6 | 7 | [Linked Data Notifications](https://www.w3.org/TR/ldn/) allow for these notifications to be sent to and made available from an "inbox", and thus we would be consistent with section 3 of the charter around Notification. Further, the [ActivityPub](https://www.w3.org/TR/activitypub/) specification introduces the additional notion of an "outbox". 8 | 9 | Sending Manifests to an Inbox is not a "notification", it's just moving data around. Instead we send a description of the activity, which the reciever can process or not as it chooses. 10 | 11 | LDN provides a storage and publication mechanism, but clients are still expected to come and retrieve the set of changes in the same way as above. Assuming that either (a) systems register their interest in a resource, and the publisher notifies them directly or (b) the publisher writes to the inbox, and the inbox then auto-forwards the notification to the subscribers ... then there needs to be a method of subscribing to have the changes pushed to a remote inbox. 12 | 13 | ### Linked Data Notifications: Subscription 14 | 15 | While there is [WebSub](https://www.w3.org/TR/websub/), this does not interoperate with LDN and is from a service oriented mindset. WebSub makes various requirements that are not appropriate for Notifications (you MUST send the entire contents of the resource that you have subscribed to) which prevents subscribing either to binary resources (you don't want the entire gigabyte TIFF) or or aggregation-level containers (you don't want every change, every time, just the new one). 16 | 17 | ActivityPub is a method for transferring the notifications and subscribing, but does not follow REST patterns. Instead it uses side effects associated with particular activities. For example, the side effect of recieving a "Follow" activity is to add the sender to the "followers" of the resource. A REST based approach would be to create the subscription resource within the followers container. 18 | 19 | A more LOD / LDP / LDN appropriate pattern would be to use a REST pattern with Containers, that allow subscription to the inbox, manage filtering and the callback endpoint. One way to do this could be as [described here](https://docs.google.com/document/d/1JsQS1LVFt8wuJSYo_XsOzyP28pS8hfSLEhAC3BFuN6o/edit). 20 | 21 | For the purposes of IIIF discovery, the above decision is firmly in the Notification section of the charter and does not impact the publication of the ActivityStreams Collections as resources. 22 | -------------------------------------------------------------------------------- /source/_data/image_servers.yml: -------------------------------------------------------------------------------- 1 | # Use Markdown in the blurb if necessary for links, etc. Each list entry in the blurb gets a
.
2 | - name: ContentDM
3 | uri: http://www.contentdm.org/
4 | blurb:
5 | - >
6 | ContentDM is a full-featured digital collection management system
7 | supported by OCLC that includes image hosting and metadata management.
8 | CONTENTdm allows for easy building and showcasing of digital collections
9 | on personalized websites, making them more discoverable to people around the world.
10 | CONTENTdm also secures and monitors master files in a cloud-based preservation
11 | archive so they remain safe for the future.
12 | - >
13 | Digital repositories using CONTENTdm support the IIIF Image API. For more details see the [CONTENTdm IIIF Support page](http://oc.lc/IIIFandCONTENTdm).
14 | - name: Djatoka
15 | uri: http://sourceforge.net/projects/djatoka/
16 | blurb:
17 | - >
18 | Djatoka is an open source, Java-based image server that provides
19 | compression and region extraction of JPEG 2000 images, URI-addressability
20 | of regions, and support for multiple image formats (including., BMP, GIF,
21 | JPG, PNG, PNM, TIF, JPEG 2000). Djatoka comes with a plug-in framework that
22 | allows transformations to be applied to regions and resolutions (e.g.,
23 | watermarking).
24 | - >
25 | Djatoka is not natively IIIF-compatible. However, djatoka URI’s are easily
26 | translated to IIIF URI’s (for example see this
27 | [Ruby on Rails gem](https://github.com/jronallo/djatoka) that does the
28 | translation).
29 | - name: FSI Server
30 | uri: http://www.fsi-viewer.com/
31 | blurb:
32 | - >
33 | There is a [IIIF adaptor for FSI server](https://github.com/jhu-digital-manuscripts/rosa/tree/master/rosa-iiif-endpoint).
34 | - >
35 | FSI Server is a popular commercial solution for serving high resolution
36 | images in multiple formats. It accompanies the Flash-based FSI Viewer
37 | for zoom and pan.
38 | - name: IIPImage Server
39 | uri: http://iipimage.sourceforge.net/documentation/server/
40 | blurb:
41 | - >
42 | The IIPImage server is a high performance image server for streaming high
43 | resolution images. It supports advanced image features such as 16 and 32
44 | bit color depths, floating point data, CIELAB colorimetric images and
45 | scientific imagery such as multispectral or hyperspectral images.
46 | - >
47 | The server is an Fast CGI module written in C++ that is designed to be
48 | embedded within a host web server such as Apache, Lighttpd, MyServer or Nginx.
49 | - >
50 | IIPImage server is IIIF compatible (
51 | [GitHub repo](https://github.com/ruven/iipsrv) of the project).
52 | - name: Loris
53 | uri: https://github.com/pulibrary/loris
54 | blurb:
55 | - >
56 | Loris is an open source, Python-based image server that supports the IIIF
57 | Image API ver 1.1. Loris supports JPEG and TIFF sources as well as JPEG2000.
58 | - name: digilib
59 | uri: http://digilib.sourceforge.net/
60 | blurb:
61 | - >
62 | digilib is an open source, Java based image server for high resolution images.
63 | It supports the IIIF Image API and a native API that also allows brightness,
64 | contrast and color corrections and other operations.
65 | - >
66 | digilib supports JPEG, TIFF, PNG, JPEG2000 and other image formats via Java
67 | ImageIO. digilib also has a web client that offers continuous zoom,
68 | referenceable views, image annotations and other features for scholarly work.
69 |
--------------------------------------------------------------------------------
/source/css/syntax.css:
--------------------------------------------------------------------------------
1 | .highlight { background: #ffffff; }
2 | .highlight .c { color: #999988; font-style: italic } /* Comment */
3 | .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
4 | .highlight .k { font-weight: bold } /* Keyword */
5 | .highlight .o { font-weight: bold } /* Operator */
6 | .highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
7 | .highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
8 | .highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
9 | .highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
10 | .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
11 | .highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
12 | .highlight .ge { font-style: italic } /* Generic.Emph */
13 | .highlight .gr { color: #aa0000 } /* Generic.Error */
14 | .highlight .gh { color: #999999 } /* Generic.Heading */
15 | .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
16 | .highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
17 | .highlight .go { color: #888888 } /* Generic.Output */
18 | .highlight .gp { color: #555555 } /* Generic.Prompt */
19 | .highlight .gs { font-weight: bold } /* Generic.Strong */
20 | .highlight .gu { color: #aaaaaa } /* Generic.Subheading */
21 | .highlight .gt { color: #aa0000 } /* Generic.Traceback */
22 | .highlight .kc { font-weight: bold } /* Keyword.Constant */
23 | .highlight .kd { font-weight: bold } /* Keyword.Declaration */
24 | .highlight .kp { font-weight: bold } /* Keyword.Pseudo */
25 | .highlight .kr { font-weight: bold } /* Keyword.Reserved */
26 | .highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
27 | .highlight .m { color: #009999 } /* Literal.Number */
28 | .highlight .s { color: #5a5 } /* Literal.String */
29 | .highlight .na { color: #008080 } /* Name.Attribute */
30 | .highlight .nb { color: #0086B3 } /* Name.Builtin */
31 | .highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
32 | .highlight .no { color: #008080 } /* Name.Constant */
33 | .highlight .ni { color: #800080 } /* Name.Entity */
34 | .highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
35 | .highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
36 | .highlight .nn { color: #555555 } /* Name.Namespace */
37 | .highlight .nt { color: #3030b0 } /* Name.Tag */
38 | .highlight .nv { color: #008080 } /* Name.Variable */
39 | .highlight .ow { font-weight: bold } /* Operator.Word */
40 | .highlight .w { color: #bbbbbb } /* Text.Whitespace */
41 | .highlight .mf { color: #955 } /* Literal.Number.Float */
42 | .highlight .mh { color: #009999 } /* Literal.Number.Hex */
43 | .highlight .mi { color: #955 } /* Literal.Number.Integer */
44 | .highlight .mo { color: #009999 } /* Literal.Number.Oct */
45 | .highlight .sb { color: #5a5 } /* Literal.String.Backtick */
46 | .highlight .sc { color: #5a5 } /* Literal.String.Char */
47 | .highlight .sd { color: #5a5 } /* Literal.String.Doc */
48 | .highlight .s2 { color: #5a5 } /* Literal.String.Double */
49 | .highlight .se { color: #5a5 } /* Literal.String.Escape */
50 | .highlight .sh { color: #5a5 } /* Literal.String.Heredoc */
51 | .highlight .si { color: #5a5 } /* Literal.String.Interpol */
52 | .highlight .sx { color: #5a5 } /* Literal.String.Other */
53 | .highlight .sr { color: #009926 } /* Literal.String.Regex */
54 | .highlight .s1 { color: #5a5 } /* Literal.String.Single */
55 | .highlight .ss { color: #990073 } /* Literal.String.Symbol */
56 | .highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
57 | .highlight .vc { color: #008080 } /* Name.Variable.Class */
58 | .highlight .vg { color: #008080 } /* Name.Variable.Global */
59 | .highlight .vi { color: #008080 } /* Name.Variable.Instance */
60 | .highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
61 | .highlight .nx { color: #0086b3 } /* function in javascript? */
62 |
--------------------------------------------------------------------------------
/source/js/vendor/jquery.iiif-demo.js:
--------------------------------------------------------------------------------
1 | ;(function ($, window, document, undefined) {
2 | var pluginName = "iiifDemo",
3 | defaults = {
4 | selectOptions: {},
5 | roundToCutoff: 50,
6 | iiifImgInfo: {},
7 | };
8 |
9 | function Plugin(element, options) {
10 | this.$element = $(element);
11 | this.options = $.extend({}, defaults, options);
12 | this.regions = [];
13 | this.selectValues = {};
14 |
15 | this._defaults = defaults;
16 | this._name = pluginName;
17 |
18 | this.init();
19 | }
20 |
21 | Plugin.prototype = {
22 |
23 | init: function() {
24 | this.$imgContainer = this.$element.find('.iiif-image-container'),
25 | this.$iiifImg = this.$imgContainer.find('img'),
26 | this.$selectRegion = this.$element.find('.iiif-select-region'),
27 | this.$selectSize = this.$element.find('.iiif-select-size'),
28 | this.$selectRotation = this.$element.find('.iiif-select-rotation');
29 |
30 | this.calculateSelectValues();
31 | this.render();
32 | this.bindEvents();
33 | },
34 |
35 |
36 | render: function() {
37 | this.loadRegionSelectValues();
38 | },
39 |
40 |
41 | loadRegionSelectValues: function(region) {
42 | region = region || this.regions[0];
43 |
44 | this.updateOptions(this.$selectRegion, this.regions, region);
45 | this.loadSizeSelectValues(region);
46 | },
47 |
48 |
49 | loadSizeSelectValues: function(region, size) {
50 | var sizes = this.getSizesFor(region);
51 |
52 | size = size || sizes[0];
53 |
54 | this.updateOptions(this.$selectSize, sizes, size);
55 | this.loadRotationSelectValues(region, size);
56 | },
57 |
58 |
59 | loadRotationSelectValues: function(region, size, rotation) {
60 | var rotations = this.getRotationsFor(region, size);
61 |
62 | rotation = rotation || rotations[0];
63 |
64 | this.updateOptions(this.$selectRotation, rotations, rotation);
65 | this.renderIiifImg(region, size, rotation);
66 | },
67 |
68 |
69 | calculateSelectValues: function () {
70 | var w = this.$imgContainer.width(),
71 | h = this.$imgContainer.height(),
72 | regex = /([wh](\s*[-+]\s*\d+)?)/i, // matches 'w - 200,' and ',h'
73 | _this = this;
74 |
75 | $.each(this.options.selectOptions, function(region, values) {
76 | $.each(values, function(size, rotation) {
77 | // options like 'w - 200,' & ',h' are evaluated with image container dimensions
78 | size = size.replace(regex, function(match) {
79 | return _this.roundTo(parseInt(eval(match)), 10);
80 | });
81 |
82 | if (!_this.selectValues.hasOwnProperty(region)) {
83 | _this.selectValues[region] = {};
84 | _this.regions.push(region);
85 | }
86 |
87 | _this.selectValues[region][size] = rotation;
88 | });
89 | });
90 | },
91 |
92 |
93 | bindEvents: function() {
94 | var _this = this;
95 |
96 | $(window).resize(function() {
97 | _this.selectValues = {};
98 | _this.calculateSelectValues();
99 | _this.render();
100 | });
101 |
102 | this.$selectRegion.on('change', function() {
103 | _this.loadSizeSelectValues($(this).val());
104 | });
105 |
106 | this.$selectSize.on('change', function() {
107 | _this.loadRotationSelectValues(_this.$selectRegion.val(), $(this).val());
108 | });
109 |
110 | this.$selectRotation.on('change', function() {
111 | _this.renderIiifImg(_this.$selectRegion.val(), _this.$selectSize.val(), $(this).val());
112 | });
113 | },
114 |
115 |
116 | updateOptions: function($element, options, selected) {
117 | $element.html('');
118 |
119 | $.each(options, function(index, option) {
120 | $element.append('');
121 | });
122 |
123 | $element.val(selected).attr('selected', 'selected');
124 | },
125 |
126 |
127 | renderIiifImg: function(region, size, rotation) {
128 | this.$iiifImg
129 | .attr('src', '')
130 | .hide()
131 | .attr('src', this.getIiifUrl(region, size, rotation)).fadeIn(300);
132 | },
133 |
134 |
135 | getIiifUrl: function(region, size, rotation) {
136 | var info = this.options.iiifImgInfo;
137 |
138 | return [info.baseUrl, region, size, rotation, info.quality + '.' + info.format].join('/');
139 | },
140 |
141 | getSizesFor: function(region) {
142 | return $.map(this.selectValues[region], function(obj, size) { return size });
143 | },
144 |
145 |
146 | getRotationsFor: function(region, size) {
147 | return this.selectValues[region][size];
148 | },
149 |
150 |
151 | roundTo: function(value) {
152 | var cutoff = this.options.roundToCutoff || 0;
153 | return Math.max(value - (value % cutoff), cutoff);
154 | }
155 |
156 | };
157 |
158 | $.fn[pluginName] = function (options) {
159 | return this.each(function () {
160 | if (!$.data(this, "plugin_" + pluginName)) {
161 | $.data(this, "plugin_" + pluginName, new Plugin(this, options));
162 | }
163 | });
164 | };
165 |
166 | })(jQuery, window, document);
167 |
--------------------------------------------------------------------------------
/source/js/vendor/anchor.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * AnchorJS - v3.1.0 - 2016-02-12
3 | * https://github.com/bryanbraun/anchorjs
4 | * Copyright (c) 2016 Bryan Braun; Licensed MIT
5 | */
6 | function AnchorJS(A){"use strict";function e(A){A.icon=A.hasOwnProperty("icon")?A.icon:"",A.visible=A.hasOwnProperty("visible")?A.visible:"hover",A.placement=A.hasOwnProperty("placement")?A.placement:"right",A.class=A.hasOwnProperty("class")?A.class:"",A.truncate=A.hasOwnProperty("truncate")?Math.floor(A.truncate):64}function t(A){var e;if("string"==typeof A||A instanceof String)e=[].slice.call(document.querySelectorAll(A));else{if(!(Array.isArray(A)||A instanceof NodeList))throw new Error("The selector provided to AnchorJS was invalid.");e=[].slice.call(A)}return e}function n(){if(null===document.head.querySelector("style.anchorjs")){var A,e=document.createElement("style"),t=" .anchorjs-link { opacity: 0; text-decoration: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }",n=" *:hover > .anchorjs-link, .anchorjs-link:focus { opacity: 1; }",o=' @font-face { font-family: "anchorjs-icons"; font-style: normal; font-weight: normal; src: url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBTUAAAC8AAAAYGNtYXAWi9QdAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zgq29TcAAAF4AAABNGhlYWQEZM3pAAACrAAAADZoaGVhBhUDxgAAAuQAAAAkaG10eASAADEAAAMIAAAAFGxvY2EAKACuAAADHAAAAAxtYXhwAAgAVwAAAygAAAAgbmFtZQ5yJ3cAAANIAAAB2nBvc3QAAwAAAAAFJAAAACAAAwJAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpywPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6cv//f//AAAAAAAg6cv//f//AAH/4xY5AAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAACADEARAJTAsAAKwBUAAABIiYnJjQ/AT4BMzIWFxYUDwEGIicmND8BNjQnLgEjIgYPAQYUFxYUBw4BIwciJicmND8BNjIXFhQPAQYUFx4BMzI2PwE2NCcmNDc2MhcWFA8BDgEjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAEAAAABAACiToc1Xw889QALBAAAAAAA0XnFFgAAAADRecUWAAAAAAJTAsAAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAAlMAAQAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAACAAAAAoAAMQAAAAAACgAUAB4AmgABAAAABQBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIABwCfAAEAAAAAAAMADgBLAAEAAAAAAAQADgC0AAEAAAAAAAUACwAqAAEAAAAAAAYADgB1AAEAAAAAAAoAGgDeAAMAAQQJAAEAHAAOAAMAAQQJAAIADgCmAAMAAQQJAAMAHABZAAMAAQQJAAQAHADCAAMAAQQJAAUAFgA1AAMAAQQJAAYAHACDAAMAAQQJAAoANAD4YW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzVmVyc2lvbiAxLjAAVgBlAHIAcwBpAG8AbgAgADEALgAwYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzUmVndWxhcgBSAGUAZwB1AGwAYQByYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format("truetype"); }',i=" [data-anchorjs-icon]::after { content: attr(data-anchorjs-icon); }";e.className="anchorjs",e.appendChild(document.createTextNode("")),A=document.head.querySelector('[rel="stylesheet"], style'),void 0===A?document.head.appendChild(e):document.head.insertBefore(e,A),e.sheet.insertRule(t,e.sheet.cssRules.length),e.sheet.insertRule(n,e.sheet.cssRules.length),e.sheet.insertRule(i,e.sheet.cssRules.length),e.sheet.insertRule(o,e.sheet.cssRules.length)}}this.options=A||{},this.elements=[],e(this.options),this.isTouchDevice=function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)},this.add=function(A){var o,i,s,a,r,c,l,h,g,u,B,Q,f=[];if(e(this.options),Q=this.options.visible,"touch"===Q&&(Q=this.isTouchDevice()?"always":"hover"),A||(A="h1, h2, h3, h4, h5, h6"),o=t(A),0===o.length)return!1;for(n(),i=document.querySelectorAll("[id]"),s=[].map.call(i,function(A){return A.id}),r=0;r' : "") + (m.text ? '" : "") + (m.description ? '' + m.description + "" : "")) } else d.html(m.text); e.val(m.value); c.original.val(m.value); a.data("ddslick", c); i(a); j(a); if (typeof l.onSelected == "function") { l.onSelected.call(this, c) } } function h(b) { var c = b.find(".dd-select"), d = c.siblings(".dd-options"), e = c.find(".dd-pointer"), f = d.is(":visible"); a(".dd-click-off-close").not(d).slideUp(50); a(".dd-pointer").removeClass("dd-pointer-up"); if (f) { d.slideUp("fast"); e.removeClass("dd-pointer-up") } else { d.slideDown("fast"); e.addClass("dd-pointer-up") } k(b) } function i(a) { a.find(".dd-options").slideUp(50); a.find(".dd-pointer").removeClass("dd-pointer-up").removeClass("dd-pointer-up") } function j(a) { var b = a.find(".dd-select").css("height"); var c = a.find(".dd-selected-description"); var d = a.find(".dd-selected-image"); if (c.length <= 0 && d.length > 0) { a.find(".dd-selected-text").css("lineHeight", b) } } function k(b) { b.find(".dd-option").each(function () { var c = a(this); var d = c.css("height"); var e = c.find(".dd-option-description"); var f = b.find(".dd-option-image"); if (e.length <= 0 && f.length > 0) { c.find(".dd-option-text").css("lineHeight", d) } }) } a.fn.ddslick = function (c) { if (b[c]) { return b[c].apply(this, Array.prototype.slice.call(arguments, 1)) } else if (typeof c === "object" || !c) { return b.init.apply(this, arguments) } else { a.error("Method " + c + " does not exists.") } }; var b = {}, c = { data: [], keepJSONItemsOnTop: false, width: 260, height: null, background: "#eee", selectText: "", defaultSelectedIndex: null, truncateDescription: true, imagePosition: "left", showSelectedHTML: true, clickOffToClose: true, onSelected: function () { } }, d = '', e = '', f = '"; if (a("#css-ddslick").length <= 0) { a(f).appendTo("head") } b.init = function (b) { var b = a.extend({}, c, b); return this.each(function () { var c = a(this), f = c.data("ddslick"); if (!f) { var i = [], j = b.data; c.find("option").each(function () { var b = a(this), c = b.data(); i.push({ text: a.trim(b.text()), value: b.val(), selected: b.is(":selected"), description: c.description, imageSrc: c.imagesrc }) }); if (b.keepJSONItemsOnTop) a.merge(b.data, i); else b.data = a.merge(i, b.data); var k = c, l = a(''); c.replaceWith(l); c = l; c.addClass("dd-container").append(d).append(e); var i = c.find(".dd-select"), m = c.find(".dd-options"); m.css({ width: b.width }); i.css({ width: b.width, background: b.background }); c.css({ width: b.width }); if (b.height != null) m.css({ height: b.height, overflow: "auto" }); a.each(b.data, function (a, c) { if (c.selected) b.defaultSelectedIndex = a; m.append("
' : "") + (c.text ? ' " : "") + (c.description ? ' ' + c.description + "" : "") + "" + "
80 |
81 | ```
82 |
83 | The three components to this snippet: link target, link parameters, icon are described in the following sections.
84 |
85 | FIXME - Should probably rework this to use [HTML5 Drag and drop][html5-dnd].
86 | {: .warning}
87 |
88 | #### 4.1.1 Link Target
89 |
90 | A user following the hyperlink will be directed to the specified URI (`http://example.org/help?manifest=http://example.org/manifest1` in the example above). It is _RECOMMENDED_ that this resolve to a page that explains the drag and drop facility, or opens a particular viewer showing the image or manifest.
91 |
92 | FIXME - Is there community agreement on this behavior?
93 | {: .warning}
94 |
95 | #### 4.1.2 Link Parameters
96 |
97 | The query parameters of the link target (`manifest=http://example.org/manifest1`) provide the information necessary for the IIIF viewing application receiving the "drop" to open or add the specified resource. The query parameters _MAY_ include:
98 |
99 | * `manifest` - URI of an IIIF [Presentation API][prezi-api] Manifest (`http://example.org/manifest1` in the example snippet).
100 | * `canvas` - URI of currently selected Canvas within the Manifest. If no Canvas is specified then the target application will use its default behavior to present the Manifest. (The `canvas` parameter has no meaning unless a `manifest` parameter is given.)
101 | * `image` - URI of an IIIF [Image API][image-api] `info.json`. This is an alternative to specifying a Manifest for use in situations where the source implements only the Image API. It _SHOULD NOT_ be specified in addition to `manifest` or `canvas`.
102 |
103 | #### 4.1.3 Icon
104 |
105 | It is _RECOMMENDED_ that the following icon be used as a recognizable way to indicate an IIIF resource that may be dragged following the drag and drop pattern described in this section.
106 |
107 | 
108 |
109 | This icon may be freely reused according to the terms of [CC0][cc0]. The icon _MAY_ be scaled to fit in with other user interface design elements.
110 |
111 | FIXME - Need a real icon. The IIIF logo has been used in a number of implementations.
112 | {: .warning}
113 |
114 | ### 4.2 Copy Paste
115 |
116 | FIXME - Work out copy paste pattern.
117 | {: .warning}
118 |
119 | ## Appendices
120 |
121 | ### A. Versioning
122 |
123 | This specification follows [Semantic Versioning][semver]. See the note [Versioning of APIs][versioning] for details regarding how this is implemented.
124 |
125 | ### B. Acknowledgements
126 |
127 | Many thanks to the members of the [IIIF][iiif-community] for their engagement, ideas and feedback.
128 |
129 | ### C. Change Log
130 |
131 | | Date | Description |
132 | | ---------- | -------------------------------------------------- |
133 | | 2017-09-07 | Version 0.1.0 draft of drag-and-drop pattern only |
134 | | 2015-09-30 | Trial implementation of [drag-and-drop at IIIF Shimathon][shimathon-drag-and-drop] |
135 | {: .api-table}
136 |
137 |
138 | [cc-by]: http://creativecommons.org/licenses/by/4.0/ "Creative Commons — Attribution 4.0 International"
139 | [iiif-discuss]: mailto:iiif-discuss@googlegroups.com "Email Discussion List"
140 | [iiif-discovery-tsg]: http://iiif.io/community/groups/discovery/ "IIIF Discovery Technical Specification Group"
141 | [iiif-discovery-use-cases]: https://github.com/IIIF/iiif-stories/issues?q=is%3Aissue+is%3Aopen+label%3Adiscovery-import "IIIF Discovery Import Use Cases"
142 | [iiif-clients]: http://iiif.io/apps-demos/#implementation-demos "IIIF Viewing Clients"
143 | [versioning]: /api/annex/notes/semver/ "Versioning of APIs"
144 | [semver]: http://semver.org/spec/v2.0.0.html "Semantic Versioning 2.0.0"
145 | [iiif-community]: /community/ "IIIF Community"
146 |
147 | [image-api]: /api/image/2.0/ "Image API"
148 | [prezi-api]: /api/presentation/2.0/ "Presentation API"
149 | [rfc-2119]: http://tools.ietf.org/html/rfc2119
150 |
151 | [drag-and-drop]: https://en.wikipedia.org/wiki/Drag_and_drop "Drag and Drop"
152 | [shimathon-drag-and-drop]: https://zimeon.github.io/iiif-dragndrop/ "IIIF Drag-and-Drop Experiments"
153 | [cc0]: https://creativecommons.org/publicdomain/zero/1.0/ "CC0 1.0 Universal (CC0 1.0) Public Domain Dedication"
154 | [html5-dnd]: https://www.w3.org/TR/html/editing.html#drag-and-drop "HTML5 Drag and Drop"
155 |
156 | {% include acronyms.md %}
157 |
--------------------------------------------------------------------------------
/source/_data/institutions.yml:
--------------------------------------------------------------------------------
1 | - name: 4Science
2 | uri: https://www.4science.it/en/
3 | iiifc:
4 | - name: Art Institute of Chicago
5 | uri: http://www.artic.edu/
6 | iiifc:
7 | - name: ARTstor
8 | uri: http://www.ithaka.org
9 | iiifc: 1
10 | - name: Art Gallery of Ontario
11 | uri: http://boxwood.ago.ca
12 | iiifc:
13 | - name: Bayerische Staatsbibliothek (Bavarian State Library)
14 | uri: http://www.bsb-muenchen.de
15 | iiifc: 1
16 | - name: La Bibliothèque nationale de France
17 | uri: http://www.bnf.fr
18 | iiifc: 1
19 | - name: Biblissima
20 | uri: http://www.biblissima-condorcet.fr/
21 | iiifc:
22 | - name: Boston Public Library
23 | uri: https://digitalcommonwealth.org
24 | iiifc:
25 | - name: British Library
26 | uri: https://www.bl.uk/
27 | iiifc: 1
28 | - name: British Museum
29 | uri: http://www.britishmuseum.org/
30 | iiifc:
31 | - name: Brown University
32 | uri: https://repository.library.brown.edu
33 | iiifc: 2
34 | - name: Cambridge University
35 | uri: https://www.cam.ac.uk/
36 | iiifc: 2
37 | - name: Canadiana.org
38 | uri: http://canadiana.org
39 | iiifc:
40 | - name: Carnegie Museum of Art
41 | uri: http://records.cmoa.org
42 | iiifc:
43 | - name: Center for Open Data in the Humanities, Research Organization of Information and Systems, Japan
44 | uri: http://codh.rois.ac.jp/
45 | - name: Centre de Recherche et de Restauration des Musées de France (C2RMF)
46 | uri: http://c2rmf.fr/
47 | iiifc:
48 | - name: Chinese University of Hong Kong
49 | uri: http://lib.cuhk.edu.hk/
50 | iiifc: 2
51 | - name: Cogapp
52 | uri: http://www.cogapp.com
53 | iiifc:
54 | - name: Columbia University
55 | uri: http://www.columbia.edu/
56 | iiifc:
57 | - name: CONTENTdm
58 | uri: http://www.oclc.org/en-US/contentdm.html
59 | iiifc:
60 | - name: Cooper Hewitt Smithsonian Design Museum
61 | uri: http://www.cooperhewitt.org
62 | iiifc:
63 | - name: Cornell University
64 | uri: https://www.library.cornell.edu/
65 | iiifc: 1
66 | - name: Data Futures Project (University of Westminster)
67 | uri: https://www.data-futures.org/
68 | iiifc: 2
69 | - name: DPLA
70 | uri: http://dp.la/
71 | - name: Digital Image Archive of Medieval Music (DIAMM)
72 | uri: http://www.diamm.ac.uk/
73 | - name: Digirati Ltd
74 | uri: http://www.digirati.co.uk/
75 | - name: Durham University Library
76 | uri: https://www.dur.ac.uk/library/asc/
77 | - name: e-codices – Virtual Manuscript Library of Switzerland
78 | uri: http://www.e-codices.unifr.ch
79 | - name: École polytechnique fédérale de Lausanne (EPFL)
80 | uri: https://www.epfl.ch/index.en.html
81 | iiifc: 2
82 | - name: Europeana
83 | uri: http://europeana.eu/
84 | iiifc: 2
85 | - name: Folger Shakespeare Library
86 | uri: http://www.folger.edu/
87 | iiifc: 2
88 | - name: The J. Paul Getty Trust
89 | uri: http://getty.edu/
90 | iiifc: 2
91 | - name: Ghent University
92 | uri: https://www.ugent.be/en
93 | iiifc:
94 | - name: Gottingen State and University Library
95 | uri: https://textgrid.de/en/
96 | iiifc: 2
97 | - name: Harvard Art Museums
98 | uri: http://www.harvardartmuseums.org/
99 | iiifc:
100 | - name: Harvard University
101 | uri: http://iiif.harvard.edu
102 | iiifc: 2
103 | - name: Hill Museum & Manuscript Library (HMML)
104 | uri: https://www.vhmml.org/
105 | iiifc:
106 | - name: Holoscene
107 | uri: http://holoscene.io
108 | iiifc:
109 | - name: Huygens ING (KNAW)
110 | uri: https://www.huygens.knaw.nl/
111 | - name: Indiana University
112 | uri: https://www.iu.edu/
113 | iiifc: 2
114 | - name: Internet Archive
115 | uri: https://archive.org/index.php
116 | iiifc:
117 | - name: Johns Hopkins University
118 | uri: http://library.jhu.edu
119 | iiifc: 2
120 | - name: Keio University Libraries
121 | uri: http://www.lib.keio.ac.jp/en/
122 | - name: Klokan Technologies
123 | uri: http://www.klokantech.com/
124 | - name: KU Leuven - LIBIS+
125 | uri: http://libisplus.be/libisplus/mirador-iiif-en
126 | iiifc:
127 | - name: Kyoto University Library Network
128 | uri: http://www.kulib.kyoto-u.ac.jp/
129 | iiifc: 2
130 | - name: Leiden University
131 | uri: https://www.library.universiteitleiden.nl
132 | iiifc: 2
133 | - name: Leipzig University Library (Universitätsbibliothek Leipzig)
134 | uri: https://www.ub.uni-leipzig.de
135 | iiifc:
136 | - name: Library of Congress
137 | uri: https://www.wdl.org
138 | iiifc:
139 | - name: LUNA Imaging
140 | uri: http://www.lunaimaging.com/blog/2015/12/3/luna-and-iiif-1
141 | - name: Manuscriptorium - Digital Library of Written Cultural Heritage
142 | uri: http://www.manuscriptorium.com/
143 | - name: Max Planck Institute for European Legal History
144 | uri: http://www.rg.mpg.de/en
145 | - name: MIT Libraries
146 | uri: http://libraries.mit.edu
147 | iiifc: 2
148 | - name: Moravian Library (Moravská zemská knihovna)
149 | uri: https://www.mzk.cz/
150 | iiifc:
151 | - name: National Gallery of Art
152 | uri: http://www.nga.gov
153 | iiifc: 2
154 | - name: National Library of Austria
155 | uri: https://www.onb.ac.at/en/
156 | - name: Nasjonalbiblioteket (National Library of Norway)
157 | uri: http://www.nb.no/English
158 | iiifc: 1
159 | - name: National Library of Denmark
160 | uri: http://www.kb.dk/en/
161 | - name: National Library of Egypt
162 | uri: http://www.darelkotob.gov.eg/index.html
163 | iiifc:
164 | - name: National Library of Israel
165 | uri: http://www.nli.org.il
166 | iiifc: 2
167 | - name: National Library of New Zealand
168 | uri: https://natlib.govt.nz/
169 | - name: National Library of Poland
170 | uri: http://bn.org.pl
171 | iiifc: 2
172 | - name: National Library of Scotland
173 | uri: http://www.nls.uk/
174 | iiifc: 2
175 | - name: National Library of Serbia
176 | uri: https://www.nb.rs/?change_lang=en
177 | - name: National Library of Wales
178 | uri: https://www.llgc.org.uk/
179 | - name: Nationalmuseum Sweden
180 | uri: http://www.nationalmuseum.se
181 | - name: New York University Libraries
182 | uri: http://library.nyu.edu/
183 | iiifc: 2
184 | - name: North Carolina State University Libraries
185 | uri: https://www.lib.ncsu.edu/
186 | iiifc: 2
187 | - name: Ohio State University
188 | uri: https://www.osu.edu/
189 | iiifc: 2
190 | - name: Pennsylvania State University Libraries
191 | uri: https://libraries.psu.edu/
192 | iiifc: 2
193 | - name: Princeton University Library
194 | uri: http://library.princeton.edu
195 | iiifc: 1
196 | - name: Public Record Office Victoria
197 | uri: https://www.prov.vic.gov.au/
198 | - name: Qatar National Library
199 | uri: http://www.qnl.qa
200 | - name: Sirma Group
201 | uri: https://sirma.com/
202 | iiifc:
203 | - name: Smithsonian Institution
204 | uri: https://www.si.edu/
205 | iiifc: 2
206 | - name: "St. Louis University"
207 | uri: https://www.slu.edu/
208 | - name: St. Mary's University
209 | uri: http://jubilees.stmarytx.edu
210 | - name: Stanford University
211 | uri: http://library.stanford.edu/
212 | iiifc: 1
213 | - name: State Library of Queensland
214 | uri: http://www.slq.qld.gov.au/
215 | iiifc:
216 | - name: Synaptica
217 | uri: http://www.synaptica.com/
218 | - name: TextGrid
219 | uri: https://textgrid.de/en/
220 | - name: text & bytes
221 | uri: http://www.textandbytes.com/en
222 | - name: Trinity College Dublin
223 | uri: https://repository.dri.ie
224 | - name: United States Holocaust Memorial Museum
225 | uri: https://www.ushmm.org/
226 | - name: Universidad de la Habana, Biblioteca Nacional de Cuba José Martí
227 | uri: http://www.bnjm.cu/
228 | - name: University College Dublin
229 | uri: http://www.ucd.ie/library/
230 | iiifc:
231 | - name: University of Alberta Libraries
232 | uri: https://www.library.ualberta.ca
233 | iiifc:
234 | - name: University of Basel, Digital Humanities Lab
235 | uri: http://dhlab.unibas.ch/
236 | iiifc: 2
237 | - name: University of California, Los Angeles
238 | uri: http://www.ucla.edu/
239 | - name: University of California, Santa Barbara
240 | uri: http://www.ucsb.edu/
241 | - name: University of Edinburgh
242 | uri: http://www.ed.ac.uk/
243 | iiifc: 2
244 | - name: University of Glasgow
245 | uri: http://hms.scot/fiddle/copies/
246 | iiifc:
247 | - name: University of Hong Kong
248 | uri: http://www.hku.hk/
249 | iiifc: 2
250 | - name: University of Illinois at Urbana-Champaign
251 | uri: http://illinois.edu/
252 | iiifc:
253 | - name: University of Michigan
254 | uri: https://www.lib.umich.edu/digital-library-platform-services-dlps
255 | iiifc: 2
256 | - name: University of Notre Dame
257 | uri: http://library.nd.edu
258 | iiifc: 2
259 | - name: University of Oklahoma
260 | uri: https://www.ou.edu/
261 | iiifc: 2
262 | - name: University of Oxford (Bodleian Library)
263 | uri: http://www.bodleian.ox.ac.uk
264 | iiifc: 1
265 | - name: University of Pennsylvania
266 | uri: http://www.upenn.edu/
267 | iiifc: 2
268 | - name: University of Tokyo
269 | uri: http://21dzk.l.u-tokyo.ac.jp/DHI/
270 | iiifc: 2
271 | - name: University of Toronto
272 | uri: https://library.utoronto.ca
273 | iiifc: 2
274 | - name: University of Utah
275 | uri: https://lib.utah.edu/
276 | iiifc:
277 | - name: University of Virginia Library
278 | uri: http://www.library.virginia.edu/
279 | iiifc:
280 | - name: Vatican Library
281 | uri: https://www.vatlib.it
282 | iiifc: 2
283 | - name: Villanova University
284 | uri: https://digital.library.villanova.edu/
285 | iiifc:
286 | - name: Walter J. Ong, S.J. Center for Digital Humanities at Saint Louis University
287 | uri: https://www.slu.edu/center-for-digital-humanities
288 | iiifc: 2
289 | - name: The Walters Art Museum
290 | uri: http://thewalters.org
291 | iiifc:
292 | - name: Wellcome Trust
293 | uri: http://wellcomelibrary.org
294 | iiifc: 1
295 | - name: Wikipedia (Wikimedia Foundation)
296 | uri: http://www.wikipedia.org/
297 | iiifc:
298 | - name: World Digital Library
299 | uri: http://www.wdl.org
300 | - name: Yale Center for British Art
301 | uri: http://britishart.yale.edu/
302 | iiifc: 1
303 | - name: Yale University
304 | uri: https://www.yale.edu/
305 | iiifc: 1
306 | - name: Zegami
307 | uri: https://zegami.com/
308 |
--------------------------------------------------------------------------------
/source/api/harvest/0.1/activities.md:
--------------------------------------------------------------------------------
1 | # IIIF Resource Discovery: Activities
2 |
3 | This approach to the discovery of IIIF Resources uses standard, semantic technologies for easy optimization of crawling and indexing processes. The core technology choice, as agreed upon at the Toronto Working Groups meeting, is the W3C's [ActivityStreams 2.0](https://www.w3.org/TR/activitystreams-core/) specification.
4 |
5 | ## Types of Activity
6 |
7 | ### Single-Resource Publisher Operations
8 |
9 | #### Create
10 |
11 | Level: 1
12 |
13 | The object resource came into existence. Before this time it did not exist, and the state of the resource is the first state.
14 |
15 | __Use Case:__ As a content publisher, I want to alert search engines that I created a new Manifest, so that they can harvest and index it.
16 |
17 | ```json
18 | {
19 | "id": "http://example.org/iiif/discovery/event/54627",
20 | "type": "Create",
21 | "object": {
22 | "id": "https://example.org/iiif/museum/1/manifest.json",
23 | "type": "Manifest"
24 | },
25 | "endTime": "2017-06-08T00:00:00Z"
26 | }
27 | ```
28 |
29 |
30 | #### Update / Modify
31 |
32 | Level: 0
33 |
34 | A resource that was already created was changed, or was created and the activity is published by a system that cannot distinguish modification from creation. Any previous state may also be available at another URI.
35 |
36 | __Use Case:__ As a content publisher, I want to alert search engines that I updated a Manifest, so that they can re-harvest and update their indexes.
37 |
38 | ```json
39 | {
40 | "id": "http://example.org/iiif/discovery/event/100001",
41 | "type": "Update",
42 | "object": {
43 | "id": "https://example.org/iiif/museum/1/manifest.json",
44 | "type": "Manifest"
45 | },
46 | "endTime": "2017-09-19T20:00:00Z"
47 | }
48 | ```
49 |
50 | #### Delete
51 |
52 | Level: 2
53 |
54 | A resource that was already created was taken out of existence. After this time, the resource does not exist, and previous states may be available at other URIs.
55 |
56 | __Use Case:__ As a content publisher, I want to alert search engines that I deleted a Manifest, so that they can remove it from their indexes.
57 |
58 | ```json
59 | {
60 | "id": "http://example.org/iiif/discovery/event/8172645",
61 | "type": "Delete",
62 | "object": {
63 | "id": "https://example.org/iiif/museum/1/manifest.json",
64 | "type": "Manifest"
65 | },
66 | "endTime": "2017-09-19T20:00:00Z"
67 | }
68 | ```
69 |
70 |
71 | ### Multi-Resource Publisher Operations
72 |
73 | These operations are compositions of the above in terms of the effects on different resources, but should be treated as a single operation for the purpose of notification and replay. These are more appropriate for true synchronization systems, rather than simple crawling and discovery.
74 |
75 | The advantage to using them is that they frequently do not require the resources to be re-harvested, instead all of the necessary information about the change is included in the activity itself.
76 |
77 | #### Add
78 |
79 | Level: 4
80 |
81 | The `object` resource was added to the `target`, such as a Manifest being added to a Collection.
82 |
83 | For the purposes of discovery systems, the inclusion of the manifest in the collection might affect indexing, if there are per-collection indexes, even if there are no other changes to the Collection or Manifest. Instead of an Update to the Collection, this allows the actual change to be communicated so that the Collection document does not need to be re-harvested.
84 |
85 | __Use Case:__ As a content publisher, I want to alert search engines that I added a Manifest to a particular Collection, such that a Collection-specific index can be updated.
86 |
87 | ```json
88 | {
89 | "id": "http://example.org/iiif/discovery/event/123462",
90 | "type": "Add",
91 | "object": {
92 | "id": "https://example.org/iiif/museum/1/manifest.json",
93 | "type": "Manifest"
94 | },
95 | "target": {
96 | "id": "https://example.org/iiif/museum/paintings/collection.json",
97 | "type": "Collection"
98 | },
99 | "endTime": "2017-09-19T20:00:00Z"
100 | }
101 | ```
102 |
103 | #### Remove
104 |
105 | Level: 4
106 |
107 | The `object` resource was removed from the `origin` resource, such as removing a Manifest from a Collection.
108 |
109 | This is the inverse of `Add` for the indexing management of the membership of Collections.
110 |
111 | __Use Case:__ As a content publisher, I want to alert search engines that I removed a Manifest from a particular Collection, such that a Collection-specific index can be updated.
112 |
113 | ```json
114 | {
115 | "id": "http://example.org/iiif/discovery/event/123462",
116 | "type": "Remove",
117 | "object": {
118 | "id": "https://example.org/iiif/museum/1/manifest.json",
119 | "type": "Manifest"
120 | },
121 | "origin": {
122 | "id": "https://example.org/iiif/museum/paintings/collection.json",
123 | "type": "Collection"
124 | },
125 | "endTime": "2017-09-19T20:00:00Z"
126 | }
127 | ```
128 |
129 |
130 | #### Copy
131 |
132 | Minimum Level: 3
133 |
134 | The source resource was duplicated to create or modify the target resource. This activity is not a core ActivityStreams type.
135 |
136 | For the purposes of discovery, the object resource's representation can be treated as the target resource's representation, but the object resource should not (yet) be removed from the index. This does not require the target resource to be re-harvested.
137 |
138 | __Use Case:__ Needed for Copy to be included. Does anyone actually copy rather than move, under what circumstances, and why?
139 | {: .warning}
140 |
141 | ```json
142 | {
143 | "id": "http://example.org/iiif/discovery/event/123462",
144 | "type": "Copy",
145 | "object": {
146 | "id": "https://example.org/iiif/museum/1/manifest.json",
147 | "type": "Manifest"
148 | },
149 | "target": {
150 | "id": "https://example.org/iiif/publications/102314/manifest.json",
151 | "type": "Manifest"
152 | },
153 | "endTime": "2017-09-19T20:00:00Z"
154 | }
155 | ```
156 |
157 | #### Rename / Move
158 |
159 | Minimum Level: 4
160 |
161 | The object resource is duplicated to create or modify the target resource, and the original was deleted as part of the operation.
162 |
163 | For the purposes of discovery, the representation of the object resource should now be treated as the representation of the target resource, and the object resource removed from the index. This does not require the target resource to be reharvested.
164 |
165 | __Use Case:__ As a content publisher, I want to alert search engines that I have changed my URI patterns and thereby moved a Manifest to a different URI, such that the indexes can be updated to point to the new location.
166 |
167 | ```json
168 | {
169 | "id": "http://example.org/iiif/discovery/event/123462",
170 | "type": "Move",
171 | "object": {
172 | "id": "https://example.org/iiif/museum/1/manifest.json",
173 | "type": "Manifest"
174 | },
175 | "target": {
176 | "id": "https://example.org/iiif/publications/102314/manifest.json",
177 | "type": "Manifest"
178 | },
179 | "endTime": "2017-09-19T20:00:00Z"
180 | }
181 | ```
182 |
183 | #### Merge
184 |
185 | Minumum Level: 4
186 |
187 | Two or more source resources were combined to create or modify the target resource. This activity is not a core ActivityStreams type.
188 |
189 | For the purposes of discovery, as the merge is not necessarily complete, nor is it clear whether or not the merged resources were deleted or modified as part of the process, all of the resources should be reharvested. The user interface for the discovery system might wish to group them together in some way to visualize the merge to the user.
190 |
191 | __Use Case:__ Needed. While symmetrical with Split, we need an actual use case for when and why anyone would merge resources.
192 | {: .warning}
193 |
194 | ```json
195 | {
196 | "id": "http://example.org/iiif/discovery/event/123462",
197 | "type": "Merge",
198 | "object": [
199 | {
200 | "id": "https://example.org/iiif/museum/1/manifest.json",
201 | "type": "Manifest"
202 | },
203 | {
204 | "id": "https://example.org/iiif/museum/2/manifest.json",
205 | "type": "Manifest"
206 | }
207 | ],
208 | "target": {
209 | "id": "https://example.org/iiif/museum/1726/manifest.json",
210 | "type": "Manifest"
211 | },
212 | "endTime": "2017-09-19T20:00:00Z"
213 | }
214 | ```
215 |
216 | #### Split
217 |
218 | Minumum Level: 4
219 |
220 | A single source resource was divided to create or modify multiple target resources.
221 |
222 | For the purposes of discovery, as the split is not necessarily complete, nor is it clear whether or not the original resource was deleted or modified as part of the process, all of the resources should be reharvested.
223 |
224 | __Use Case:__ As a content publisher, I want to alert search engines that I split a Manifest representing a large archive into smaller pieces, where each piece better represents an object, and thus for search engines to reharvest all of the pieces. Note that there is no distinction between Split and Delete+Create+Create as everything needs to be harvested. Better use case required.
225 | {: .warning}
226 |
227 |
228 | ```json
229 | {
230 | "id": "http://example.org/iiif/discovery/event/123462",
231 | "type": "Split",
232 | "object": {
233 | "id": "https://example.org/iiif/museum/1726/manifest.json",
234 | "type": "Manifest"
235 | },
236 | "target": [
237 | {
238 | "id": "https://example.org/iiif/museum/1/manifest.json",
239 | "type": "Manifest"
240 | },
241 | {
242 | "id": "https://example.org/iiif/museum/2/manifest.json",
243 | "type": "Manifest"
244 | }
245 | ],
246 | "endTime": "2017-09-19T20:00:00Z"
247 | }
248 | ```
249 |
250 | ### Third Party Operations
251 |
252 | These operations are carried out by third parties, rather than the publisher. As such they would be written to the Inbox of the resource as either a request to modify the resource, or just notification that the resource was used.
253 |
254 |
255 | #### Reference
256 |
257 | Minimum Level: 3
258 |
259 | A remote source resource has a new reference or link to the target local resource.
260 |
261 | ```json
262 | {
263 | "id": "http://example.org/iiif/discovery/event/8172645",
264 | "type": "Reference",
265 | "object": {
266 | "id": "https://example.edu/iiif/9/manifest.json",
267 | "type": "Manifest"
268 | },
269 | "target": {
270 | "id": "https://example.org/iiif/museum/1/manifest.json",
271 | "type": "Manifest"
272 | },
273 | "endTime": "2017-09-19T20:00:00Z"
274 | }
275 | ```
276 |
277 |
278 | #### Use
279 |
280 | Minimum Level: 3
281 |
282 | The target resource was used by the remote agent in some way.
283 |
284 | ```json
285 | {
286 | "id": "http://example.org/iiif/discovery/event/8172645",
287 | "type": "Use",
288 | "object": {
289 | "id": "https://example.org/iiif/museum/1/manifest.json",
290 | "type": "Manifest"
291 | },
292 | "endTime": "2017-09-19T20:00:00Z"
293 | }
294 | ```
295 |
296 |
--------------------------------------------------------------------------------
/source/css/normalize.css:
--------------------------------------------------------------------------------
1 | /*! normalize.css v1.1.2 | MIT License | git.io/normalize */
2 |
3 | /* ==========================================================================
4 | HTML5 display definitions
5 | ========================================================================== */
6 |
7 | /**
8 | * Correct `block` display not defined in IE 6/7/8/9 and Firefox 3.
9 | */
10 |
11 | article,
12 | aside,
13 | details,
14 | figcaption,
15 | figure,
16 | footer,
17 | header,
18 | hgroup,
19 | main,
20 | nav,
21 | section,
22 | summary {
23 | display: block;
24 | }
25 |
26 | /**
27 | * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3.
28 | */
29 |
30 | audio,
31 | canvas,
32 | video {
33 | display: inline-block;
34 | *display: inline;
35 | *zoom: 1;
36 | }
37 |
38 | /**
39 | * Prevent modern browsers from displaying `audio` without controls.
40 | * Remove excess height in iOS 5 devices.
41 | */
42 |
43 | audio:not([controls]) {
44 | display: none;
45 | height: 0;
46 | }
47 |
48 | /**
49 | * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4.
50 | * Known issue: no IE 6 support.
51 | */
52 |
53 | [hidden] {
54 | display: none;
55 | }
56 |
57 | /* ==========================================================================
58 | Base
59 | ========================================================================== */
60 |
61 | /**
62 | * 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using
63 | * `em` units.
64 | * 2. Prevent iOS text size adjust after orientation change, without disabling
65 | * user zoom.
66 | */
67 |
68 | html {
69 | font-size: 100%; /* 1 */
70 | -ms-text-size-adjust: 100%; /* 2 */
71 | -webkit-text-size-adjust: 100%; /* 2 */
72 | }
73 |
74 | /**
75 | * Address `font-family` inconsistency between `textarea` and other form
76 | * elements.
77 | */
78 |
79 | html,
80 | button,
81 | input,
82 | select,
83 | textarea {
84 | font-family: sans-serif;
85 | }
86 |
87 | /**
88 | * Address margins handled incorrectly in IE 6/7.
89 | */
90 |
91 | body {
92 | margin: 0;
93 | }
94 |
95 | /* ==========================================================================
96 | Links
97 | ========================================================================== */
98 |
99 | /**
100 | * Address `outline` inconsistency between Chrome and other browsers.
101 | */
102 |
103 | a:focus {
104 | outline: thin dotted;
105 | }
106 |
107 | /**
108 | * Improve readability when focused and also mouse hovered in all browsers.
109 | */
110 |
111 | a:active,
112 | a:hover {
113 | outline: 0;
114 | }
115 |
116 | /* ==========================================================================
117 | Typography
118 | ========================================================================== */
119 |
120 | /**
121 | * Address font sizes and margins set differently in IE 6/7.
122 | * Address font sizes within `section` and `article` in Firefox 4+, Safari 5,
123 | * and Chrome.
124 | */
125 |
126 | h1 {
127 | font-size: 2em;
128 | margin: 0.67em 0;
129 | }
130 |
131 | h2 {
132 | font-size: 1.5em;
133 | margin: 0.83em 0;
134 | }
135 |
136 | h3 {
137 | font-size: 1.17em;
138 | margin: 1em 0;
139 | }
140 |
141 | h4 {
142 | font-size: 1em;
143 | margin: 1.33em 0;
144 | }
145 |
146 | h5 {
147 | font-size: 0.83em;
148 | margin: 1.67em 0;
149 | }
150 |
151 | h6 {
152 | font-size: 0.67em;
153 | margin: 2.33em 0;
154 | }
155 |
156 | /**
157 | * Address styling not present in IE 7/8/9, Safari 5, and Chrome.
158 | */
159 |
160 | abbr[title] {
161 | border-bottom: 1px dotted;
162 | }
163 |
164 | /**
165 | * Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome.
166 | */
167 |
168 | b,
169 | strong {
170 | font-weight: bold;
171 | }
172 |
173 | blockquote {
174 | margin: 1em 40px;
175 | }
176 |
177 | /**
178 | * Address styling not present in Safari 5 and Chrome.
179 | */
180 |
181 | dfn {
182 | font-style: italic;
183 | }
184 |
185 | /**
186 | * Address differences between Firefox and other browsers.
187 | * Known issue: no IE 6/7 normalization.
188 | */
189 |
190 | hr {
191 | -moz-box-sizing: content-box;
192 | box-sizing: content-box;
193 | height: 0;
194 | }
195 |
196 | /**
197 | * Address styling not present in IE 6/7/8/9.
198 | */
199 |
200 | mark {
201 | background: #ff0;
202 | color: #000;
203 | }
204 |
205 | /**
206 | * Address margins set differently in IE 6/7.
207 | */
208 |
209 | p,
210 | pre {
211 | margin: 1em 0;
212 | }
213 |
214 | /**
215 | * Correct font family set oddly in IE 6, Safari 4/5, and Chrome.
216 | */
217 |
218 | code,
219 | kbd,
220 | pre,
221 | samp {
222 | font-family: monospace, serif;
223 | _font-family: 'courier new', monospace;
224 | font-size: 1em;
225 | }
226 |
227 | /**
228 | * Improve readability of pre-formatted text in all browsers.
229 | */
230 |
231 | pre {
232 | white-space: pre;
233 | white-space: pre-wrap;
234 | word-wrap: break-word;
235 | }
236 |
237 | /**
238 | * Address CSS quotes not supported in IE 6/7.
239 | */
240 |
241 | q {
242 | quotes: none;
243 | }
244 |
245 | /**
246 | * Address `quotes` property not supported in Safari 4.
247 | */
248 |
249 | q:before,
250 | q:after {
251 | content: '';
252 | content: none;
253 | }
254 |
255 | /**
256 | * Address inconsistent and variable font size in all browsers.
257 | */
258 |
259 | small {
260 | font-size: 80%;
261 | }
262 |
263 | /**
264 | * Prevent `sub` and `sup` affecting `line-height` in all browsers.
265 | */
266 |
267 | sub,
268 | sup {
269 | font-size: 75%;
270 | line-height: 0;
271 | position: relative;
272 | vertical-align: baseline;
273 | }
274 |
275 | sup {
276 | top: -0.5em;
277 | }
278 |
279 | sub {
280 | bottom: -0.25em;
281 | }
282 |
283 | /* ==========================================================================
284 | Lists
285 | ========================================================================== */
286 |
287 | /**
288 | * Address margins set differently in IE 6/7.
289 | */
290 |
291 | dl,
292 | menu,
293 | ol,
294 | ul {
295 | margin: 1em 0;
296 | }
297 |
298 | dd {
299 | margin: 0 0 0 40px;
300 | }
301 |
302 | /**
303 | * Address paddings set differently in IE 6/7.
304 | */
305 |
306 | menu,
307 | ol,
308 | ul {
309 | padding: 0 0 0 40px;
310 | }
311 |
312 | /**
313 | * Correct list images handled incorrectly in IE 7.
314 | */
315 |
316 | nav ul,
317 | nav ol {
318 | list-style: none;
319 | list-style-image: none;
320 | }
321 |
322 | /* ==========================================================================
323 | Embedded content
324 | ========================================================================== */
325 |
326 | /**
327 | * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3.
328 | * 2. Improve image quality when scaled in IE 7.
329 | */
330 |
331 | img {
332 | border: 0; /* 1 */
333 | -ms-interpolation-mode: bicubic; /* 2 */
334 | }
335 |
336 | /**
337 | * Correct overflow displayed oddly in IE 9.
338 | */
339 |
340 | svg:not(:root) {
341 | overflow: hidden;
342 | }
343 |
344 | /* ==========================================================================
345 | Figures
346 | ========================================================================== */
347 |
348 | /**
349 | * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11.
350 | */
351 |
352 | figure {
353 | margin: 0;
354 | }
355 |
356 | /* ==========================================================================
357 | Forms
358 | ========================================================================== */
359 |
360 | /**
361 | * Correct margin displayed oddly in IE 6/7.
362 | */
363 |
364 | form {
365 | margin: 0;
366 | }
367 |
368 | /**
369 | * Define consistent border, margin, and padding.
370 | */
371 |
372 | fieldset {
373 | border: 1px solid #c0c0c0;
374 | margin: 0 2px;
375 | padding: 0.35em 0.625em 0.75em;
376 | }
377 |
378 | /**
379 | * 1. Correct color not being inherited in IE 6/7/8/9.
380 | * 2. Correct text not wrapping in Firefox 3.
381 | * 3. Correct alignment displayed oddly in IE 6/7.
382 | */
383 |
384 | legend {
385 | border: 0; /* 1 */
386 | padding: 0;
387 | white-space: normal; /* 2 */
388 | *margin-left: -7px; /* 3 */
389 | }
390 |
391 | /**
392 | * 1. Correct font size not being inherited in all browsers.
393 | * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5,
394 | * and Chrome.
395 | * 3. Improve appearance and consistency in all browsers.
396 | */
397 |
398 | button,
399 | input,
400 | select,
401 | textarea {
402 | font-size: 100%; /* 1 */
403 | margin: 0; /* 2 */
404 | vertical-align: baseline; /* 3 */
405 | *vertical-align: middle; /* 3 */
406 | }
407 |
408 | /**
409 | * Address Firefox 3+ setting `line-height` on `input` using `!important` in
410 | * the UA stylesheet.
411 | */
412 |
413 | button,
414 | input {
415 | line-height: normal;
416 | }
417 |
418 | /**
419 | * Address inconsistent `text-transform` inheritance for `button` and `select`.
420 | * All other form control elements do not inherit `text-transform` values.
421 | * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+.
422 | * Correct `select` style inheritance in Firefox 4+ and Opera.
423 | */
424 |
425 | button,
426 | select {
427 | text-transform: none;
428 | }
429 |
430 | /**
431 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
432 | * and `video` controls.
433 | * 2. Correct inability to style clickable `input` types in iOS.
434 | * 3. Improve usability and consistency of cursor style between image-type
435 | * `input` and others.
436 | * 4. Remove inner spacing in IE 7 without affecting normal text inputs.
437 | * Known issue: inner spacing remains in IE 6.
438 | */
439 |
440 | button,
441 | html input[type="button"], /* 1 */
442 | input[type="reset"],
443 | input[type="submit"] {
444 | -webkit-appearance: button; /* 2 */
445 | cursor: pointer; /* 3 */
446 | *overflow: visible; /* 4 */
447 | }
448 |
449 | /**
450 | * Re-set default cursor for disabled elements.
451 | */
452 |
453 | button[disabled],
454 | html input[disabled] {
455 | cursor: default;
456 | }
457 |
458 | /**
459 | * 1. Address box sizing set to content-box in IE 8/9.
460 | * 2. Remove excess padding in IE 8/9.
461 | * 3. Remove excess padding in IE 7.
462 | * Known issue: excess padding remains in IE 6.
463 | */
464 |
465 | input[type="checkbox"],
466 | input[type="radio"] {
467 | box-sizing: border-box; /* 1 */
468 | padding: 0; /* 2 */
469 | *height: 13px; /* 3 */
470 | *width: 13px; /* 3 */
471 | }
472 |
473 | /**
474 | * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
475 | * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
476 | * (include `-moz` to future-proof).
477 | */
478 |
479 | input[type="search"] {
480 | -webkit-appearance: textfield; /* 1 */
481 | -moz-box-sizing: content-box;
482 | -webkit-box-sizing: content-box; /* 2 */
483 | box-sizing: content-box;
484 | }
485 |
486 | /**
487 | * Remove inner padding and search cancel button in Safari 5 and Chrome
488 | * on OS X.
489 | */
490 |
491 | input[type="search"]::-webkit-search-cancel-button,
492 | input[type="search"]::-webkit-search-decoration {
493 | -webkit-appearance: none;
494 | }
495 |
496 | /**
497 | * Remove inner padding and border in Firefox 3+.
498 | */
499 |
500 | button::-moz-focus-inner,
501 | input::-moz-focus-inner {
502 | border: 0;
503 | padding: 0;
504 | }
505 |
506 | /**
507 | * 1. Remove default vertical scrollbar in IE 6/7/8/9.
508 | * 2. Improve readability and alignment in all browsers.
509 | */
510 |
511 | textarea {
512 | overflow: auto; /* 1 */
513 | vertical-align: top; /* 2 */
514 | }
515 |
516 | /* ==========================================================================
517 | Tables
518 | ========================================================================== */
519 |
520 | /**
521 | * Remove most spacing between table cells.
522 | */
523 |
524 | table {
525 | border-collapse: collapse;
526 | border-spacing: 0;
527 | }
528 |
--------------------------------------------------------------------------------
/source/api/harvest/0.1/index.md:
--------------------------------------------------------------------------------
1 |
2 | # IIIF Resource Discovery - OUT OF DATE
3 |
4 |
5 | __Previous Draft__
This document is a former draft of the discovery specification, currently available at [http://preview.iiif.io/api/discovery/api/discovery/0.1/](http://preview.iiif.io/api/discovery/api/discovery/0.1/). Please see that specification instead.
6 | {: .warning}
7 |
8 | This approach to the discovery of IIIF Resources uses standard, semantic technologies for easy optimization of crawling and indexing processes. The core technology choice, as agreed upon at the Toronto Working Groups meeting, is the W3C's [ActivityStreams 2.0](https://www.w3.org/TR/activitystreams-core/) specification.
9 |
10 |
11 | ## The Approach
12 |
13 | Following the [design principles](http://iiif.io/api/annex/notes/design_patterns/) of IIIF:
14 | * As Simple as Possible, and No Simpler
15 | * Intelligently Manage Ramping Up
16 | * Avoid Specific Technology implementations
17 | * Follow Resource-Oriented Design
18 | * Follow Linked Data
19 | * Design for JSON-LD First
20 | * Use Standards
21 | * Follow Best Practices
22 | * Loosely couple APIs
23 | * Define Success, not Failure
24 |
25 | And the useful patterns established by the [ResourceSync](http://openarchives.org/rs/1.1/resourcesync) effort:
26 | * List of Resources
27 | * List of Changes
28 | * Notification of Changes
29 |
30 | As scoped by the [IIIF Discovery charter](http://iiif.io/community/groups/discovery/charter/) and [use cases](https://github.com/iiif/iiif-stories/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Adiscovery), we have designed an approach towards solving the challenges faced by the community.
31 |
32 | ## Activity Streams
33 |
34 | [Activity Streams](https://www.w3.org/TR/activitystreams-core/) (AS2) is a "model for representing potential and completed activities". IIIF already uses the AS2 Collections and Paging model, as does the [Web Annotation](https://www.w3.org/TR/annotation-model/#collections) work that we depend on. AS2 is designed to be JSON-LD first while still respecting the Linked Open Data paradigm, and follows the best practices defined in the W3C.
35 |
36 | ### List of Resources
37 |
38 | The top level resource for managing the lists of IIIF resources is an AS2 Collection. This model is the same as the Web Annotation model for Annotation Collections and Annotation Pages. AS2 Collections for lists of this size will always be paged, and the Collection document a pointer to the first and last pages, along with metadata about the entire list.
39 |
40 | Therefore, the Collection does not directly contain any of the activities or resources, instead it refers to the `first` page of such a list. The pages are ordered both from page to page by following `next` relationships, and internally within the page in the `items` property. The number of entries in each page is up to the implementer, and cannot be requested by the client.
41 |
42 | ```json-doc
43 | {
44 | "@context": [
45 | "http://iiif.io/api/presentation/3/context.json",
46 | "https://www.w3.org/ns/activitystreams"],
47 | "id": "https://example.org/iiif/discovery.json",
48 | "type": "Collection",
49 | "label": "Example Big Collection",
50 | "total": 33000,
51 | "first": {
52 | "id": "https://example.org/iiif/discovery-1.json",
53 | "type": "CollectionPage"
54 | },
55 | "last": {
56 | "id": "https://data.getty.edu/iiif/discovery-10.json",
57 | "type": "CollectionPage"
58 | }
59 | }
60 | ```
61 |
62 | #### Level 0: Basic Resource List
63 |
64 | The basic information required, in order to provide a minimally effective set of links to Manifests to harvest is just the URIs of the Manifests. However, with the addition of just a little boilerplate in the JSON, we can be on the path towards a robust set of metadata that allows clients to optimize their harvesting.
65 |
66 | Starting with the Manifest links, we add an "Update" activity wrapper around the URIs. The order of the Manifests in the pages is unimportant, but each should only appear once. In terms of optimization, it provides no additional benefit over any other simpler list format, but is compatible with a system where optimization is possible, such as the following levels. This is the minimum level for interoperability, but further levels are significant improvements in terms of efficiency.
67 |
68 | __Usage:__ Crawl the entire set of pages and dereference each manifest to see if it has changed.
69 |
70 | ```json-doc
71 | {
72 | "@context": [
73 | "http://iiif.io/api/presentation/3/context.json",
74 | "https://www.w3.org/ns/activitystreams"],
75 | "id": "https://example.org/iiif/discovery-1.json",
76 | "type": "CollectionPage",
77 | "partOf": {
78 | "id": "https://example.org/iiif/discovery.json",
79 | "type": "Collection"
80 | },
81 | "next": {
82 | "id": "https://example.org/iiif/discovery-2.json",
83 | "type": "CollectionPage"
84 | },
85 | "items": [
86 | {
87 | "type": "Update",
88 | "object": {
89 | "id": "https://example.org/iiif/museum/1/manifest.json",
90 | "type": "Manifest",
91 | }
92 | },
93 | {
94 | "type": "Update",
95 | "object": {
96 | "id": "https://example.org/iiif/museum/2/manifest.json",
97 | "type": "Manifest"
98 | }
99 | }
100 | ]
101 | }
102 | ```
103 |
104 |
105 | #### Level 1: Basic Change List
106 |
107 | The most effective information to add is the datestamp at which the resource was last modified (including the initial modification that created it). If we know these dates, we can add them to the activities and order the list such that the most recent activities occur last. The timestamp is given in the `endTime` property -- the time at which the document update process finished. It is up to the implementer to decide whether the update process includes the publication online, or only the internal data modification, but the decision MUST be consistently applied.
108 |
109 | The rationale for crawling backwards is that the first pages, once finished, become static resources. If the list were ordered from most recent to least, then either the pages would change their URIs, reducing the ability to cache them or the first page would be constantly changing size rather than the last page, which is more familiar.
110 |
111 | Note that the Manifests MAY appear multiple times in the list, or only the most recent change might appear, depending on the implementation.
112 |
113 | __Usage:__ Record each time the list is crawled. Start from the `last` page and work backwards through the list until a datestamp in `endTime` is encountered before the previous time a crawl occurred, and has thus already been processed.
114 |
115 | ```json-doc
116 | {
117 | "@context": [
118 | "http://iiif.io/api/presentation/3/context.json",
119 | "https://www.w3.org/ns/activitystreams"],
120 | "id": "https://example.org/iiif/discovery-1.json",
121 | "type": "CollectionPage",
122 | "partOf": {
123 | "id": "https://example.org/iiif/discovery.json",
124 | "type": "Collection"
125 | },
126 | "next": {
127 | "id": "https://data.getty.edu/iiif/discovery-2.json",
128 | "type": "CollectionPage"
129 | },
130 | "items": [
131 | {
132 | "type": "Update",
133 | "object": {
134 | "id": "https://data.getty.edu/iiif/museum/1876/manifest.json",
135 | "type": "Manifest"
136 | },
137 | "endTime": "2017-09-20T00:00:00Z"
138 | },
139 | {
140 | "type": "Update",
141 | "object": {
142 | "id": "https://data.getty.edu/iiif/museum/33092/manifest.json",
143 | "type": "Manifest"
144 | },
145 | "endTime": "2017-09-21T00:00:00Z"
146 | }
147 | // ...
148 | ]
149 | }
150 | ```
151 |
152 |
153 | #### Level 1b: Change List with Metadata
154 |
155 | Additional metadata can be added to the basic change list without affecting the overall crawl behavior. This metadata can include:
156 |
157 | * An identifier for the activity, so it can be referenced externally, given in `id`.
158 | * The actor that performed the activity, given in `actor`.
159 | * The application, tool or service used to perform the activity, given in `instrument`.
160 | * The datestamp of when the activity started, given in `startTime`.
161 | * And any additional information about the Manifest, from the Presentation API.
162 |
163 | __Usage__: Record each time the list is crawled. Start from the `last` page and work backwards through the list until a datestamp before the previous time a crawl occurred is encountered.
164 |
165 | ```json-doc
166 | {
167 | "@context": [
168 | "http://iiif.io/api/presentation/3/context.json",
169 | "https://www.w3.org/ns/activitystreams"],
170 | "id": "https://example.org/iiif/discovery-1.json",
171 | "type": "CollectionPage",
172 | "partOf": {
173 | "id": "https://example.org/iiif/discovery.json",
174 | "type": "Collection"
175 | },
176 | "next": {
177 | "id": "https://data.getty.edu/iiif/discovery-2.json",
178 | "type": "CollectionPage"
179 | },
180 | "items": [
181 | {
182 | "id": "http://data.getty.edu/iiif/discovery/event/196421",
183 | "type": "Update",
184 | "actor": {
185 | "id": "http://example.org/museum",
186 | "type": "Organization"
187 | },
188 | "instrument": "http://github.com/example_org/iiif_museum_transformer",
189 | "object": {
190 | "id": "https://data.getty.edu/iiif/museum/33092/manifest.json",
191 | "type": "Manifest",
192 | "label": {"en": ["Example Museum Object"]},
193 | "within": "https://example.org/iiif/museum/collection/paintings.json"
194 | },
195 | "startTime": "2017-09-19T20:00:00Z",
196 | "endTime": "2017-09-19T20:01:00Z"
197 | }
198 | ]
199 | }
200 | ```
201 |
202 | #### Level 2: Complete Change List
203 |
204 | At the most complex level, a log of all of the activities that have taken place can be recorded, with multiple events per resource. This would include Deletes, allowing a synchronization process to remove resources as well as add them. This would also allow for the complete history of a resource to be reconstructed, if each version has an archived representation. The list might end up very long if there are many changes to resources, however this is not a typical situation as far as we know, and the cost is still not terrible as each entry is short and can be compressed both on disk and at the HTTP(S) transport layer.
205 |
206 | The core activity types are:
207 |
208 | * `Create`: The initial creation of the resource. Each resource must have at most one Create event in which it is the `object`.
209 | * `Update`: Any change to the resource. In a system that does not distinguish creation from modification, then all changes MAY be `Update`s.
210 | * `Delete`: The deletion of the resource, or its de-publication from the web.
211 |
212 | Additional activities which institutions may also find helpful are listed [in this annex](activities.md/).
213 |
214 | __Usage:__ Record each time the list is crawled. Start from the `last` page and work backwards through the list until a datestamp before the previous time a crawl occurred is encountered. Only process the most recent change per resource, including deleting resources.
215 |
216 | ```json-doc
217 | {
218 | "@context": [
219 | "http://iiif.io/api/presentation/3/context.json",
220 | "https://www.w3.org/ns/activitystreams"],
221 | "id": "https://example.org/iiif/discovery-1.json",
222 | "type": "CollectionPage",
223 | "partOf": {
224 | "id": "https://example.org/iiif/discovery.json",
225 | "type": "Collection"
226 | },
227 | "next": {
228 | "id": "https://example.org/iiif/discovery-2.json",
229 | "type": "CollectionPage"
230 | },
231 | "items": [
232 | {
233 | "id": "http://data.getty.edu/iiif/discovery/event/196421",
234 | "type": "Delete",
235 | "object": {
236 | "id": "https://data.getty.edu/iiif/museum/1/manifest.json",
237 | "type": "Manifest"
238 | },
239 | "endTime": "2017-09-25T20:00:01Z"
240 | },
241 | {
242 | "id": "http://data.getty.edu/iiif/discovery/event/100001",
243 | "type": "Update",
244 | "object": {
245 | "id": "https://data.getty.edu/iiif/museum/1/manifest.json",
246 | "type": "Manifest"
247 | },
248 | "endTime": "2017-09-19T20:01:00Z"
249 | },
250 | {
251 | "id": "http://data.getty.edu/iiif/discovery/event/54627",
252 | "type": "Create",
253 | "object": {
254 | "id": "https://data.getty.edu/iiif/museum/1/manifest.json",
255 | "type": "Manifest"
256 | },
257 | "endTime": "2017-06-07T08:00:30Z"
258 | }
259 | ]
260 | }
261 | ```
262 |
263 | ## Processing Algorithm
264 |
265 | The aim of the processing algorithm is to inform harvesters how to make best use of the available information, with an aim of finding "indexable content" -- the descriptive information that might be used to build an index of the resources to allow them to be discovered. For different types of resource, and for different domains, the "indexable content" will have different formats and semantics. At worst, the data in the Manifest and other IIIF resources might be used, despite its presentational intent.
266 |
267 | __Collection Algorithm__
268 |
269 | Given the URI of an ActivityStreams Collection (`collection`) as input, a conforming processor SHOULD:
270 |
271 | 1. Initialization:
272 | 1. Let `processedItems` be an empty array
273 | 2. Let `lastCrawl` be the timestamp of the previous time the algorithm was executed
274 | 2. Retrieve the representation of `collection` via HTTP(S)
275 | 3. Minimally validate that it conforms to the specification
276 | 4. Find the URI of the last page at `collection.last.id` (`pageN`)
277 | 5. Apply the results of the page algorithm to `pageN`
278 |
279 |
280 | __Page Algorithm__
281 |
282 | Given the URI of an ActivityStreams CollectionPage (`page`) and the date of last crawling (`lastCrawl`) as input, a conforming processor SHOULD:
283 |
284 | 1. Retrieve the representation of `page` via HTTP(S)
285 | 2. Minimally validate that it conforms to the specification
286 | 3. Find the set of updates of the page at `page.items` (`items`)
287 | 4. In reverse order, iterate through the activities (`activity`) in `items`
288 | 1. For each `activity`, if `activity.endTime` is before `lastCrawl`, then terminate ;
289 | 2. If the updated resource's uri at `activity.target.id` is in `processedItems`, then continue ;
290 | 3. Otherwise, if `activity.type` is `Update` or `Create`, then find the URI of the updated resource at `activity.target.id` (`target`) and apply the target resource algorithm ;
291 | 4. Otherwise, if `activity.type` is `Delete`, then find the URI of the deleted resource at `activity.target.id` and remove it from the index.
292 | 5. Add the processed resource's URI to `processedItems`
293 | 5. Finally, find the URI of the previous page at `collection.prev.id` (`pageN1`)
294 | 6. Apply the results of the page algorithm to `pageN1`
295 |
296 | __Target Resource Algorithm__
297 |
298 | Given the URI of a target resource (`target`), a conforming processor SHOULD:
299 |
300 | 1. Retrieve the representation of `target` via HTTP(S)
301 | 2. Minimally validate that it conforms to the appropriate specification
302 | 3. Find the URI of the resource at `target.id` (`targetId`)
303 | 4. If the resource has the `seeAlso` property, then for each resource referenced ('extref')
304 | 1. If the `format` and/or `profile` of `extref` is understood by the processor, then it should retrieve any representations that it can process to extract Indexable Content.
305 | 5. Otherwise, extract any indexable content from the resource's representation, using resource type specific functionality.
306 | 6. Index the content against `targetId`
307 |
308 |
309 | ## Ongoing Experiments
310 |
311 | * Digirati
312 | * Endpoint: https://mcgrattan.org/as/
313 | * Implementation: https://github.com/mattmcgrattan/iiif-activity-streams
314 |
315 | * OCLC
316 | * Endpoint: http://52.204.112.237:3051/activity-streams
317 | * Implementation: https://github.com/mixterj/iiif_activity_streams_creation
318 | * Consumer: https://github.com/mixterj/activity_streams_harvest
319 |
320 | * NCSU
321 | * Endpoint: https://d.lib.ncsu.edu/collections/iiif-discovery.json
322 |
323 | * IIIF
324 | * Endpoint: http://preview.iiif.io/root/discovery_list/community/groups/discovery/registry_as.json
325 |
--------------------------------------------------------------------------------
/source/js/vendor/modernizr-2.6.2-respond-1.1.0.min.js:
--------------------------------------------------------------------------------
1 | /* Modernizr 2.6.2 (Custom Build) | MIT & BSD
2 | * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load
3 | */
4 | ;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a){var e=a[d];if(!G(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function K(){e.input=function(c){for(var d=0,e=c.length;d