Compare commits
3 Commits
refactor
...
c69fc1cbba
| Author | SHA1 | Date | |
|---|---|---|---|
| c69fc1cbba | |||
| 323dfb72d6 | |||
| 6ddbecee13 |
57
README.md
57
README.md
@@ -3,3 +3,60 @@
|
|||||||
This repository holds the code for a NodeJS/Express service that implements dynamic generation of IIIF manifests, compliant with version 2 of the Presentation API. Support for version 3 should be added in the future.
|
This repository holds the code for a NodeJS/Express service that implements dynamic generation of IIIF manifests, compliant with version 2 of the Presentation API. Support for version 3 should be added in the future.
|
||||||
|
|
||||||
The project uses `yarn` for dependency management and an `.env` file to set environment variables, an example of which can be found in `.env.example`.
|
The project uses `yarn` for dependency management and an `.env` file to set environment variables, an example of which can be found in `.env.example`.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
`GreekManifests` requires NodeJS v. >= 20 to be installed on the system, as well as `yarn` as a package manager, which can be installed globally via `npm`:
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install -g yarn
|
||||||
|
```
|
||||||
|
|
||||||
|
To install the service itself, clone this repository on the target host (replace `<target_dir>` with a suitable path, or remove to install in `./greek-manifests`):
|
||||||
|
|
||||||
|
```
|
||||||
|
git clone https://git.electricmandarine.cloud/nicolo/greek-manifests <target_dir>
|
||||||
|
```
|
||||||
|
|
||||||
|
then run the following commands from the root folder:
|
||||||
|
|
||||||
|
```
|
||||||
|
yarn
|
||||||
|
node app.mjs
|
||||||
|
```
|
||||||
|
|
||||||
|
This will start the [Express](https://expressjs.com) web server, which will remain attached to the terminal. This is suitable for testing purposes, for a production instance the Node process should be handled via a `systemd` unit or with [PM2](https://pm2.keymetrics.io), in addition to a reverse proxy like [Nginx](https://nginx.org/en/) or [Caddy](https://caddyserver.com/docs/).
|
||||||
|
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Automatic JSDoc documentation for the codebase can be generated by running the following command from the root folder:
|
||||||
|
|
||||||
|
```
|
||||||
|
jsdoc -c jsdoc.json
|
||||||
|
```
|
||||||
|
|
||||||
|
assuming that `jsdoc` is available globally (or locally for the user). The HTML documentation will be available in `docs/`, open `docs/index.html` with a browser to view it.
|
||||||
|
|
||||||
|
Here follows a basic description of the project's strcture and its main APIs.
|
||||||
|
|
||||||
|
### IIIF Resources
|
||||||
|
|
||||||
|
Relevant IIIF Resources are modeled as JavaScript classes in `src/iiif`, with an `IIIFResource` base class that provides a shared constructor. The classes are:
|
||||||
|
|
||||||
|
- `Manifest`: represents a IIIF manifest object
|
||||||
|
- `Canvas`: represents a IIIF canvas object
|
||||||
|
- `Image`: represent an image annotation associated with a canvas
|
||||||
|
- `Sequence`: a list of canvases, required by v2 of the IIIF Presentation API, it will be removed when moving to v3 (see also "[Presentation API support](#presentation-api-support)").
|
||||||
|
|
||||||
|
### Services
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
### Routes
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
### Presentation API support
|
||||||
|
|
||||||
|
Currently, the service only supports version 2 of the [IIIF Presentation API](https://iiif.io/api/presentation/2.0/), but support for version 3 is planned. It's possible that the manifest and canvas URIs will reflect the version number to keep both v2 and v3 functioning.
|
||||||
|
|||||||
@@ -6,14 +6,15 @@ export const authors = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const TECH_NAMES = {
|
export const TECH_NAMES = {
|
||||||
dn: "Disegni Napoletani",
|
dn: "Neapolitan drawing",
|
||||||
do: "Disegni Oxoniensi",
|
do: "Oxonian drawing",
|
||||||
nir: "Near Infrared Imaging 1000nm",
|
nir: "NIR 1000 nm",
|
||||||
visr: "Visible Raking Light",
|
visr: "Raking-light VIS",
|
||||||
hsi: "SWIR Hyperspectral Imaging",
|
hsi: "SWIR Hyperspectral Imaging",
|
||||||
uvf: "Technical Photography UVF",
|
uvf: "Technical Photography UVF",
|
||||||
mbi: "Multispectral Imaging",
|
mbi: "Multispectral Imaging",
|
||||||
hiroxnir: "HIROX Near Infrared",
|
hiroxnir: "HIROX NIR",
|
||||||
|
splitview: "Split view VISr/NIR",
|
||||||
};
|
};
|
||||||
|
|
||||||
export const COPYRIGHT = {
|
export const COPYRIGHT = {
|
||||||
|
|||||||
@@ -1,3 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @typedef MetadataTerms
|
||||||
|
* @property {String} papyrus,
|
||||||
|
* @property {String} author,
|
||||||
|
* @property {String} title,
|
||||||
|
* @property {String} edition,
|
||||||
|
* @property {String} technique,
|
||||||
|
* @property {String} techniqueAcronym,
|
||||||
|
* @property {String} pca,
|
||||||
|
* @property {String} date,
|
||||||
|
* @property {String} imageAuthor,
|
||||||
|
* @property {String} license,
|
||||||
|
* @property {String} copyright
|
||||||
|
*/
|
||||||
|
|
||||||
class ManifestMetadata {
|
class ManifestMetadata {
|
||||||
papyrus = '';
|
papyrus = '';
|
||||||
@@ -5,6 +19,7 @@ class ManifestMetadata {
|
|||||||
title = '';
|
title = '';
|
||||||
edition = '';
|
edition = '';
|
||||||
technique = '';
|
technique = '';
|
||||||
|
techniqueAcronym = '';
|
||||||
pca = null;
|
pca = null;
|
||||||
date = '';
|
date = '';
|
||||||
imageAuthor = '';
|
imageAuthor = '';
|
||||||
@@ -14,18 +29,7 @@ class ManifestMetadata {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @todo Maybe this doesn't make any sense??
|
* @todo Maybe this doesn't make any sense??
|
||||||
* @param {
|
* @param {MetadataTerms} metadata
|
||||||
* {papyrus,
|
|
||||||
* author,
|
|
||||||
* title,
|
|
||||||
* edition,
|
|
||||||
* technique,
|
|
||||||
* pca,
|
|
||||||
* date,
|
|
||||||
* imageAuthor,
|
|
||||||
* license,
|
|
||||||
* copyright}
|
|
||||||
* } metadata
|
|
||||||
*/
|
*/
|
||||||
constructor(metadata) {
|
constructor(metadata) {
|
||||||
this.papyrus = metadata.papyrus ?? this.papyrus;
|
this.papyrus = metadata.papyrus ?? this.papyrus;
|
||||||
@@ -35,6 +39,8 @@ class ManifestMetadata {
|
|||||||
// There should always be a technique value
|
// There should always be a technique value
|
||||||
// in the metadata param
|
// in the metadata param
|
||||||
this.technique = metadata.technique;
|
this.technique = metadata.technique;
|
||||||
|
// Return the key that corresponds to the technique value
|
||||||
|
this.techniqueAcronym = metadata.techniqueAcronym.toUpperCase();
|
||||||
this.date = metadata.date ?? this.date;
|
this.date = metadata.date ?? this.date;
|
||||||
this.imageAuthor = metadata.imageAuthor ?? this.imageAuthor
|
this.imageAuthor = metadata.imageAuthor ?? this.imageAuthor
|
||||||
this.license = metadata.license ?? this.license;
|
this.license = metadata.license ?? this.license;
|
||||||
@@ -52,6 +58,7 @@ class ManifestMetadata {
|
|||||||
{label:"Title", value: this.title},
|
{label:"Title", value: this.title},
|
||||||
{label:"Reference edition", value: this.edition},
|
{label:"Reference edition", value: this.edition},
|
||||||
{label:"Technique", value: this.technique},
|
{label:"Technique", value: this.technique},
|
||||||
|
{label:"Technique acronym", value: this.techniqueAcronym},
|
||||||
{label:"Date (Year)", value: this.date},
|
{label:"Date (Year)", value: this.date},
|
||||||
{label:"Image Author", value: this.imageAuthor},
|
{label:"Image Author", value: this.imageAuthor},
|
||||||
{label:"License", value: this.license},
|
{label:"License", value: this.license},
|
||||||
|
|||||||
@@ -171,6 +171,7 @@ async function getImageName(name, manifestId) {
|
|||||||
function createMetadata(manifest, imgFilename) {
|
function createMetadata(manifest, imgFilename) {
|
||||||
let metadata = parse(imgFilename, manifest.technique);
|
let metadata = parse(imgFilename, manifest.technique);
|
||||||
metadata.technique = TECH_NAMES[manifest.technique];
|
metadata.technique = TECH_NAMES[manifest.technique];
|
||||||
|
metadata.techniqueAcronym = manifest.technique;
|
||||||
|
|
||||||
return new ManifestMetadata(metadata);
|
return new ManifestMetadata(metadata);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user