cozy-iiif 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +149 -142
- package/dist/types.d.ts +1 -0
- package/package.json +5 -5
- package/src/core/manifest.ts +22 -3
- package/src/types.ts +2 -0
- package/test/Cozy.test.ts +3 -3
- package/test/core/fixtures.ts +2 -0
- package/test/core/manifest.test.ts +26 -0
- package/test/{annotations → helpers}/import-annotations.test.ts +3 -2
- /package/test/{annotations → helpers}/fixtures.ts +0 -0
package/dist/index.js
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
import { g as
|
1
|
+
import { g as f, a as M, b as I } from "./resource-DS2brz47.js";
|
2
2
|
import { c as Ft } from "./resource-DS2brz47.js";
|
3
3
|
var ce = "http://library.stanford.edu/iiif/image-api/compliance.html#level0", le = "http://library.stanford.edu/iiif/image-api/compliance.html#level1", V = "http://library.stanford.edu/iiif/image-api/compliance.html#level2", pe = "http://library.stanford.edu/iiif/image-api/conformance.html#level0", ve = "http://library.stanford.edu/iiif/image-api/conformance.html#level1", F = "http://library.stanford.edu/iiif/image-api/conformance.html#level2", he = "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0", ue = "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level1", W = "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level2", fe = "http://library.stanford.edu/iiif/image-api/1.1/conformance.html#level0", me = "http://library.stanford.edu/iiif/image-api/1.1/conformance.html#level1", B = "http://library.stanford.edu/iiif/image-api/1.1/conformance.html#level2", ge = "http://iiif.io/api/image/1/level0.json", de = "http://iiif.io/api/image/1/profiles/level0.json", ye = "http://iiif.io/api/image/1/level1.json", Ae = "http://iiif.io/api/image/1/profiles/level1.json", H = "http://iiif.io/api/image/1/level2.json", J = "http://iiif.io/api/image/1/profiles/level2.json", Ce = "http://iiif.io/api/image/2/level0.json", be = "http://iiif.io/api/image/2/profiles/level0.json", Re = "http://iiif.io/api/image/2/level1.json", Le = "http://iiif.io/api/image/2/profiles/level1.json", G = "http://iiif.io/api/image/2/level2.json", z = "http://iiif.io/api/image/2/profiles/level2.json", we = "level0", Ie = "level1", K = "level2", Se = "http://iiif.io/api/image/2/level0", Te = "http://iiif.io/api/image/2/level1", Q = "http://iiif.io/api/image/2/level2", xe = [Q, V, F, W, B, H, J, G, z, K], $e = [Se, Te, Q, ce, le, V, pe, ve, F, he, ue, W, fe, me, B, ge, de, ye, Ae, H, J, Ce, be, Re, Le, G, z, we, Ie, K], Me = $e;
|
4
|
-
function
|
4
|
+
function m(t) {
|
5
5
|
for (let e in t) (typeof t[e] > "u" || t[e] === null) && delete t[e];
|
6
6
|
return t;
|
7
7
|
}
|
8
|
-
function
|
8
|
+
function R(t) {
|
9
9
|
return Array.isArray(t) ? t : t ? [t] : [];
|
10
10
|
}
|
11
|
-
var je = Object.defineProperty, ke = (t, e, r) => e in t ? je(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r, A = (t, e, r) => (ke(t, typeof e != "symbol" ? e + "" : e, r), r),
|
11
|
+
var je = Object.defineProperty, ke = (t, e, r) => e in t ? je(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r, A = (t, e, r) => (ke(t, typeof e != "symbol" ? e + "" : e, r), r), D = ["sc:Collection", "sc:Manifest", "sc:Canvas", "sc:AnnotationList", "oa:Annotation", "sc:Range", "sc:Layer", "sc:Sequence", "oa:Choice", "Service", "ContentResource"];
|
12
12
|
function Pe(t) {
|
13
13
|
if (typeof t > "u" || t === null) throw new Error("Null or undefined is not a valid entity.");
|
14
14
|
if (Array.isArray(t)) throw new Error("Array is not a valid entity");
|
15
15
|
if (typeof t != "object") throw new Error(`${typeof t} is not a valid entity`);
|
16
16
|
if (typeof t["@type"] == "string") {
|
17
|
-
let e =
|
18
|
-
if (e !== -1) return
|
17
|
+
let e = D.indexOf(t["@type"]);
|
18
|
+
if (e !== -1) return D[e];
|
19
19
|
}
|
20
20
|
if (t.profile) return "Service";
|
21
21
|
if (t.format || t["@type"]) return "ContentResource";
|
@@ -152,7 +152,7 @@ var Oe = class X {
|
|
152
152
|
return typeof n > "u" && !this.options.allowUndefinedReturn ? i : n;
|
153
153
|
}, e);
|
154
154
|
}
|
155
|
-
},
|
155
|
+
}, De = "http://library.stanford.edu/iiif/image-api/compliance.html#level1", Ue = "http://library.stanford.edu/iiif/image-api/compliance.html#level2", Ee = "http://library.stanford.edu/iiif/image-api/conformance.html#level1", Ne = "http://library.stanford.edu/iiif/image-api/conformance.html#level2", qe = "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level1", _e = "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level2", Ve = "http://library.stanford.edu/iiif/image-api/1.1/conformance.html#level1", Fe = "http://library.stanford.edu/iiif/image-api/1.1/conformance.html#level2", We = "http://iiif.io/api/image/1/level1.json", Be = "http://iiif.io/api/image/1/profiles/level1.json", He = "http://iiif.io/api/image/1/level2.json", Je = "http://iiif.io/api/image/1/profiles/level2.json", Ge = "http://iiif.io/api/image/2/level1.json", ze = "http://iiif.io/api/image/2/profiles/level1.json", Ke = "http://iiif.io/api/image/2/level2.json", Qe = "http://iiif.io/api/image/2/profiles/level2.json", Xe = "level1", Ye = "level2", Ze = "http://iiif.io/api/image/2/level1", et = "http://iiif.io/api/image/2/level2", tt = [Ze, et, De, Ue, Ee, Ne, qe, _e, Ve, Fe, We, Be, He, Je, Ge, ze, Ke, Qe, Xe, Ye], j = { attributionLabel: "Attribution", providerId: "http://example.org/provider", providerName: "Unknown" };
|
156
156
|
function rt(t) {
|
157
157
|
if (typeof t == "string") return [t];
|
158
158
|
if (!t) return [];
|
@@ -166,7 +166,7 @@ function rt(t) {
|
|
166
166
|
}
|
167
167
|
return r;
|
168
168
|
}
|
169
|
-
function
|
169
|
+
function L(t, e = "none") {
|
170
170
|
if (!t) return { none: [""] };
|
171
171
|
let r = rt(t), i = {};
|
172
172
|
for (let s of r) {
|
@@ -232,12 +232,12 @@ function st(t) {
|
|
232
232
|
return "AutoCompleteService1";
|
233
233
|
}
|
234
234
|
}
|
235
|
-
function
|
235
|
+
function U(t) {
|
236
236
|
for (let e of ["sc", "oa", "dcterms", "dctypes", "iiif"]) if (t.startsWith(`${e}:`)) return t.slice(e.length + 1);
|
237
237
|
return t;
|
238
238
|
}
|
239
239
|
var nt = ["Collection", "Manifest", "Annotation", "AnnotationPage", "Range", "Service"];
|
240
|
-
function
|
240
|
+
function P(t) {
|
241
241
|
let e = t["@id"] || t.id, r = t["@type"] || t.type, i = t.profile || void 0, s = t["@context"] || void 0;
|
242
242
|
if (i) {
|
243
243
|
let n = st(i);
|
@@ -282,12 +282,12 @@ function ot(t) {
|
|
282
282
|
function ct(t, e = "Rights/License", r = "none") {
|
283
283
|
let i = null, s = [], n = Array.isArray(t) ? t : [t];
|
284
284
|
for (let a of n) {
|
285
|
-
let
|
286
|
-
if (
|
287
|
-
|
285
|
+
let o = a ? ot(a) : void 0;
|
286
|
+
if (o && (o.indexOf("creativecommons.org") !== -1 || o.indexOf("rightsstatements.org") !== -1)) {
|
287
|
+
o.startsWith("https://") ? i = `http://${o.slice(8)}` : i = o;
|
288
288
|
continue;
|
289
289
|
}
|
290
|
-
|
290
|
+
o && s.push({ label: { [r]: [e] }, value: { [r]: [o] } });
|
291
291
|
}
|
292
292
|
return [i, s];
|
293
293
|
}
|
@@ -300,7 +300,7 @@ function pt(t) {
|
|
300
300
|
}
|
301
301
|
}
|
302
302
|
function vt(t) {
|
303
|
-
return t ? t.map((e) => ({ label:
|
303
|
+
return t ? t.map((e) => ({ label: L(e.label), value: L(e.value) })) : [];
|
304
304
|
}
|
305
305
|
var E = 0;
|
306
306
|
function Z(t, e) {
|
@@ -311,11 +311,11 @@ function d(t) {
|
|
311
311
|
let e = [...t.behavior || []];
|
312
312
|
t.viewingHint && e.push(t.viewingHint);
|
313
313
|
let r;
|
314
|
-
return Array.isArray(t.motivation) ? r = t.motivation.map(
|
314
|
+
return Array.isArray(t.motivation) ? r = t.motivation.map(U) : t.motivation && (r = U(t.motivation)), { "@context": t["@context"] ? pt(t["@context"]) : void 0, id: (t["@id"] || Z(t)).trim(), type: P(t), behavior: e.length ? e : void 0, height: t.height ? t.height : void 0, width: t.width ? t.width : void 0, motivation: r, viewingDirection: t.viewingDirection, profile: t.profile, format: t.format ? t.format : void 0, duration: void 0, timeMode: void 0 };
|
315
315
|
}
|
316
316
|
function y(t) {
|
317
317
|
let [e, r] = ct(t.license), i = [...t.metadata ? vt(t.metadata) : [], ...r];
|
318
|
-
return { rights: e, metadata: i.length ? i : void 0, label: t.label ?
|
318
|
+
return { rights: e, metadata: i.length ? i : void 0, label: t.label ? L(t.label) : void 0, requiredStatement: t.attribution ? { label: L(j.attributionLabel), value: L(t.attribution) } : void 0, navDate: t.navDate, summary: t.description ? L(t.description) : void 0, thumbnail: ht(t.thumbnail) };
|
319
319
|
}
|
320
320
|
function ht(t) {
|
321
321
|
return t && (Array.isArray(t) ? t : [t]).map((e) => typeof e == "string" ? { id: e, type: "Image" } : (e.type === "unknown" && (e.type = "Image"), e));
|
@@ -329,24 +329,24 @@ function ut(t) {
|
|
329
329
|
r.push({ id: i, type: "Collection" });
|
330
330
|
break;
|
331
331
|
}
|
332
|
-
} else i["@id"] && r.push({ id: i["@id"], type:
|
332
|
+
} else i["@id"] && r.push({ id: i["@id"], type: P(i) });
|
333
333
|
return r.length ? r : void 0;
|
334
334
|
}
|
335
335
|
function C(t) {
|
336
336
|
let e = t.related ? Array.isArray(t.related) ? t.related : [t.related] : [], r = t.contentLayer;
|
337
|
-
return { provider: t.logo || e.length ? [{ id:
|
337
|
+
return { provider: t.logo || e.length ? [{ id: j.providerId, type: "Agent", homepage: e.length ? [e[0]] : void 0, logo: t.logo ? Array.isArray(t.logo) ? t.logo : [t.logo] : void 0, label: L(j.providerName) }] : void 0, partOf: ut(t), rendering: t.rendering, seeAlso: t.seeAlso, start: t.startCanvas, service: t.service ? R(t.service) : void 0, supplementary: r ? [r] : void 0 };
|
338
338
|
}
|
339
339
|
function ft(t) {
|
340
340
|
return { chars: t.chars, format: t.format ? t.format : void 0, language: t.language };
|
341
341
|
}
|
342
342
|
function mt(t) {
|
343
|
-
return
|
343
|
+
return m({ ...d(t), ...y(t), ...C(t), items: t.members });
|
344
344
|
}
|
345
345
|
function gt(t) {
|
346
|
-
let e = [], r = [], i;
|
347
|
-
for (let
|
348
|
-
let
|
349
|
-
return r.length && (
|
346
|
+
let e = [], r = [], i, s;
|
347
|
+
for (let a of t.sequences || []) console.log(a), a.canvases.length && e.push(...a.canvases), a.behavior && r.push(...a.behavior), a.viewingDirection && (s = a.viewingDirection), a.startCanvas && (i = a.startCanvas);
|
348
|
+
let n = d(t);
|
349
|
+
return r.length && (n.behavior ? n.behavior.push(...r) : n.behavior = r), m({ ...n, ...y(t), ...C(t), viewingDirection: s, start: i, items: e, structures: dt(t.structures) });
|
350
350
|
}
|
351
351
|
function dt(t) {
|
352
352
|
if (!t) return t;
|
@@ -360,13 +360,13 @@ function dt(t) {
|
|
360
360
|
return t.filter((i) => r.indexOf(i.id) === -1);
|
361
361
|
}
|
362
362
|
function yt(t) {
|
363
|
-
return
|
363
|
+
return m({ ...d(t), ...y(t), ...C(t), annotations: t.otherContent && t.otherContent.length ? t.otherContent : void 0, items: t.images && t.images.length ? [{ id: Z(t, "annotation-page"), type: "AnnotationPage", items: t.images }] : void 0 });
|
364
364
|
}
|
365
365
|
function At(t) {
|
366
|
-
return
|
366
|
+
return m({ ...d(t), ...y(t), ...C(t), items: t.resources && t.resources.length ? t.resources : void 0 });
|
367
367
|
}
|
368
368
|
function Ct(t) {
|
369
|
-
return !t.canvases || t.canvases.length === 0 ? { canvases: [], behavior: [] } : { canvases: t.canvases, behavior: t.viewingHint ? [t.viewingHint] : [], startCanvas: t.startCanvas };
|
369
|
+
return !t.canvases || t.canvases.length === 0 ? { canvases: [], behavior: [] } : { canvases: t.canvases, behavior: t.viewingHint ? [t.viewingHint] : [], viewingDirection: t.viewingDirection, startCanvas: t.startCanvas };
|
370
370
|
}
|
371
371
|
function bt(t) {
|
372
372
|
function e(r) {
|
@@ -381,47 +381,47 @@ function bt(t) {
|
|
381
381
|
else if (r.full["@type"] === "dctypes:Image") i = { id: r.full["@id"], type: "Image" };
|
382
382
|
else if (r.full["@type"] === "sc:Canvas") i = { id: r.full["@id"], type: "Canvas" };
|
383
383
|
else throw new Error(`Unsupported source type on annotation: ${r.full["@type"]}`);
|
384
|
-
return { type: "SpecificResource", source: i, selector:
|
384
|
+
return { type: "SpecificResource", source: i, selector: k(r.selector) };
|
385
385
|
} else return encodeURI(r["@id"]).trim();
|
386
386
|
}
|
387
|
-
return
|
387
|
+
return m({ ...d(t), ...y(t), ...C(t), target: e(t.on), body: Array.isArray(t.resource) ? t.resource.map(N) : N(t.resource) });
|
388
388
|
}
|
389
389
|
function N(t) {
|
390
390
|
return t.type === "Choice" ? t : ee(t);
|
391
391
|
}
|
392
392
|
function ee(t) {
|
393
393
|
let e = t;
|
394
|
-
return
|
394
|
+
return m({ ...d(e), ...y(e), ...C(e), ...ft(e) });
|
395
395
|
}
|
396
396
|
function Rt(t) {
|
397
397
|
let e = [];
|
398
|
-
return t.default && t.default !== "rdf:nil" && e.push(t.default), t.item && t.item !== "rdf:nil" && e.push(...t.item),
|
398
|
+
return t.default && t.default !== "rdf:nil" && e.push(t.default), t.item && t.item !== "rdf:nil" && e.push(...t.item), m({ ...d(t), ...y(t), items: e });
|
399
399
|
}
|
400
400
|
function Lt(t) {
|
401
|
-
return
|
401
|
+
return m({ ...d(t), ...y(t), ...C(t), items: t.members });
|
402
402
|
}
|
403
403
|
function wt(t) {
|
404
404
|
let { "@id": e, "@type": r, "@context": i, profile: s, ...n } = t, a = {};
|
405
|
-
return e && (a["@id"] = e), a["@type"] =
|
405
|
+
return e && (a["@id"] = e), a["@type"] = P(t), a["@type"] === "unknown" && (i && i.length && (a["@context"] = i), a["@type"] = "Service"), s && (a.profile = Y(s)), m({ ...a, ...n });
|
406
406
|
}
|
407
407
|
function It(t) {
|
408
|
-
return
|
408
|
+
return m({ ...d(t), ...y(t), ...C(t) });
|
409
409
|
}
|
410
410
|
var St = new Oe({ collection: [mt], manifest: [gt], canvas: [yt], annotationList: [At], sequence: [Ct], annotation: [bt], contentResource: [ee], choice: [Rt], range: [Lt], service: [wt], layer: [It] });
|
411
411
|
function te(t) {
|
412
412
|
return t && t["@context"] && (t["@context"] === "http://iiif.io/api/presentation/2/context.json" || t["@context"].indexOf("http://iiif.io/api/presentation/2/context.json") !== -1 || t["@context"] === "http://www.shared-canvas.org/ns/context.json") || t["@context"] === "http://iiif.io/api/image/2/context.json" ? St.traverseUnknown(t) : t;
|
413
413
|
}
|
414
|
-
function
|
414
|
+
function k(t) {
|
415
415
|
if ((Array.isArray(t["@type"]) && t["@type"].includes("oa:SvgSelector") || t["@type"] == "oa:SvgSelector") && ("chars" in t || "value" in t)) return { type: "SvgSelector", value: "chars" in t ? t.chars : t.value };
|
416
416
|
if (t["@type"] === "oa:FragmentSelector") return { type: "FragmentSelector", value: t.value };
|
417
|
-
if (t["@type"] === "oa:Choice") return [
|
417
|
+
if (t["@type"] === "oa:Choice") return [k(t.default), ...(Array.isArray(t.item) ? t.item : [t.item]).map(k)];
|
418
418
|
if (t["@type"] == "iiif:ImageApiSelector") return { type: "ImageApiSelector", region: "region" in t ? t.region : void 0, rotation: "rotation" in t ? t.rotation : void 0 };
|
419
419
|
throw new Error(`Unsupported selector type: ${t["@type"]}`);
|
420
420
|
}
|
421
|
-
function
|
421
|
+
function $(t) {
|
422
422
|
return typeof t == "string" ? !1 : t && !t.type && "source" in t ? (t.type = "SpecificResource", !0) : !!t && t.type === "SpecificResource";
|
423
423
|
}
|
424
|
-
function
|
424
|
+
function T(...t) {
|
425
425
|
return (e) => t.reduce((r, i) => i(r), e);
|
426
426
|
}
|
427
427
|
var q = ["Collection", "Manifest", "Canvas", "AnnotationPage", "AnnotationCollection", "Annotation", "ContentResource", "Range", "Service", "Selector", "Agent"];
|
@@ -439,18 +439,18 @@ function Tt(t, e) {
|
|
439
439
|
if (t.profile) return "Service";
|
440
440
|
throw new Error("Resource type is not known");
|
441
441
|
}
|
442
|
-
var
|
442
|
+
var O = class re {
|
443
443
|
constructor(e, r = {}) {
|
444
|
-
A(this, "traversals"), A(this, "options"), A(this, "_traverseManifest",
|
444
|
+
A(this, "traversals"), A(this, "options"), A(this, "_traverseManifest", T(this.traverseManifestItems.bind(this), this.traverseLinking.bind(this), this.traverseDescriptive.bind(this), this.traverseLinkedCanvases.bind(this), this.traverseManifestStructures.bind(this), this.traverseInlineAnnotationPages.bind(this))), A(this, "_traverseCanvas", T(this.traverseCanvasItems.bind(this), this.traverseLinking.bind(this), this.traverseDescriptive.bind(this), this.traverseLinkedCanvases.bind(this), this.traverseInlineAnnotationPages.bind(this))), A(this, "_traverseAnnotationPage", T(this.traverseAnnotationPageItems.bind(this), this.traverseLinking.bind(this), this.traverseDescriptive.bind(this))), A(this, "_traverseRange", T(this.traverseRangeRanges.bind(this), this.traverseLinking.bind(this), this.traverseDescriptive.bind(this), this.traverseLinkedCanvases.bind(this))), this.traversals = { collection: [], manifest: [], canvas: [], annotationCollection: [], annotationPage: [], annotation: [], contentResource: [], choice: [], range: [], service: [], agent: [], specificResource: [], geoJson: [], ...e }, this.options = { allowUndefinedReturn: !1, ...r };
|
445
445
|
}
|
446
446
|
static all(e) {
|
447
447
|
return new re({ collection: [e], manifest: [e], canvas: [e], annotationCollection: [e], annotationPage: [e], annotation: [e], contentResource: [e], choice: [e], range: [e], service: [e], geoJson: [e], specificResource: [e], agent: [e] });
|
448
448
|
}
|
449
449
|
traverseDescriptive(e) {
|
450
|
-
return e.thumbnail && (e.thumbnail =
|
450
|
+
return e.thumbnail && (e.thumbnail = R(e.thumbnail).map((r) => this.traverseType(r, { parent: e }, this.traversals.contentResource))), e.provider && (e.provider = e.provider.map((r) => this.traverseAgent(r, e))), e;
|
451
451
|
}
|
452
452
|
traverseLinking(e) {
|
453
|
-
return e.seeAlso && (e.seeAlso = e.seeAlso.map((r) => this.traverseType(r, { parent: e }, this.traversals.contentResource))), e.service && (e.service =
|
453
|
+
return e.seeAlso && (e.seeAlso = e.seeAlso.map((r) => this.traverseType(r, { parent: e }, this.traversals.contentResource))), e.service && (e.service = R(e.service).map((r) => this.traverseService(r))), e.services && (e.services = R(e.services).map((r) => this.traverseService(r, e))), e.logo && (e.logo = e.logo.map((r) => this.traverseType(r, { parent: e }, this.traversals.contentResource))), e.homepage && (e.homepage = R(e.homepage).map((r) => this.traverseType(r, { parent: e }, this.traversals.contentResource))), e.partOf && (e.partOf = e.partOf.map((r) => typeof r == "string" || !r.type ? this.traverseType(r, { parent: e }, this.traversals.contentResource) : r.type === "Canvas" ? this.traverseType(r, { parent: e }, this.traversals.canvas) : r.type === "AnnotationCollection" ? this.traverseType(r, { parent: e }, this.traversals.annotationCollection) : r.type === "Collection" ? this.traverseType(r, { parent: e }, this.traversals.collection) : this.traverseType(r, { parent: e }, this.traversals.contentResource))), e.start && ($(e.start) ? e.start = this.traverseSpecificResource(e.start, "Canvas", e) : e.start = this.traverseType(e.start, { parent: e }, this.traversals.canvas)), e.rendering && (e.rendering = e.rendering.map((r) => this.traverseType(r, { parent: e }, this.traversals.contentResource))), e.supplementary && (e.supplementary = e.supplementary.map((r) => this.traverseType(r, { parent: e }, this.traversals.contentResource))), e;
|
454
454
|
}
|
455
455
|
traverseCollectionItems(e) {
|
456
456
|
return e.items && e.items.map((r) => r.type === "Collection" ? this.traverseCollection(r) : this.traverseManifest(r)), e;
|
@@ -498,17 +498,17 @@ var P = class re {
|
|
498
498
|
return this.traverseType(this.traverseLinking(this.traverseAnnotationBody(this.traverseDescriptive(e))), { parent: r }, this.traversals.annotation);
|
499
499
|
}
|
500
500
|
traverseContentResourceLinking(e) {
|
501
|
-
return typeof e == "string" || !e || e && e.service && (e.service =
|
501
|
+
return typeof e == "string" || !e || e && e.service && (e.service = R(e.service || []).map((r) => this.traverseService(r, e))), e;
|
502
502
|
}
|
503
503
|
traverseContentResource(e, r) {
|
504
|
-
return e.type === "Choice" && (e.items = e.items.map((i) => this.traverseContentResource(i, e))),
|
504
|
+
return e.type === "Choice" && (e.items = e.items.map((i) => this.traverseContentResource(i, e))), $(e) ? this.traverseSpecificResource(e, "ContentResource") : this.traverseType(this.traverseInlineAnnotationPages(this.traverseContentResourceLinking(e)), { parent: r }, this.traversals.contentResource);
|
505
505
|
}
|
506
506
|
traverseSpecificResource(e, r, i) {
|
507
507
|
let s = e.source;
|
508
508
|
return typeof e.source == "string" && (s = { id: e.source, type: r || "unknown" }), this.traverseType({ ...e, source: r === "Canvas" || s.type === "Canvas" ? this.traverseType(s, { parent: i }, this.traversals.canvas) : r === "ContentResource" ? this.traverseContentResource(s, { parent: i }) : this.traverseUnknown(s, { parent: i, typeHint: r }) }, { parent: i }, this.traversals.specificResource);
|
509
509
|
}
|
510
510
|
traverseRangeRanges(e) {
|
511
|
-
return e.items && (e.items = e.items.map((r) => typeof r == "string" ? this.traverseCanvas({ id: r, type: "Canvas" }, e) :
|
511
|
+
return e.items && (e.items = e.items.map((r) => typeof r == "string" ? this.traverseCanvas({ id: r, type: "Canvas" }, e) : $(r) ? this.traverseSpecificResource(r, "Canvas", e) : r.type === "Manifest" ? this.traverseManifest(r, e) : this.traverseRange(r, e))), e;
|
512
512
|
}
|
513
513
|
traverseRange(e, r) {
|
514
514
|
return this.traverseType(this._traverseRange(e), { parent: r }, this.traversals.range);
|
@@ -524,7 +524,7 @@ var P = class re {
|
|
524
524
|
}
|
525
525
|
traverseService(e, r) {
|
526
526
|
let i = Object.assign({}, e);
|
527
|
-
return i && i.service && (i.service =
|
527
|
+
return i && i.service && (i.service = R(i.service).map((s) => this.traverseService(s))), this.traverseType(i, { parent: r }, this.traversals.service);
|
528
528
|
}
|
529
529
|
traverseUnknown(e, { parent: r, typeHint: i } = {}) {
|
530
530
|
let s = Tt(e, i);
|
@@ -552,18 +552,18 @@ var P = class re {
|
|
552
552
|
}
|
553
553
|
}
|
554
554
|
};
|
555
|
-
const ie = (t) =>
|
556
|
-
const e =
|
555
|
+
const ie = (t) => f(t, "type").startsWith("ImageService") || t.profile && t.profile.toString().includes("iiif.io/api/image/"), se = (t) => {
|
556
|
+
const e = f(t, "type"), r = f(t, "context");
|
557
557
|
if (e === "ImageService2" || r != null && r.includes("image/2")) {
|
558
558
|
const i = t, s = ["level0", "level1", "level2"];
|
559
|
-
return { majorVersion: 2, profileLevel: (Array.isArray(i.profile) ? i.profile : [i.profile]).map((
|
559
|
+
return { majorVersion: 2, profileLevel: (Array.isArray(i.profile) ? i.profile : [i.profile]).map((o) => s.findIndex((c) => o.toString().includes(c))).filter((o) => o > -1).sort((o, c) => c - o)[0] };
|
560
560
|
} else if (e || r)
|
561
561
|
return { majorVersion: 3, profileLevel: parseInt(t.profile) };
|
562
562
|
}, _ = (t, e, r) => {
|
563
|
-
const i =
|
563
|
+
const i = f(t, "id"), s = t.profile || "";
|
564
564
|
if (typeof s == "string" && (s.includes("level0") || s.includes("level:0"))) {
|
565
565
|
if ("sizes" in t && Array.isArray(t.sizes)) {
|
566
|
-
const a = t.sizes.sort((
|
566
|
+
const a = t.sizes.sort((o, c) => c.width * c.height - o.width * o.height).filter((o) => o.width * o.height >= e * r)[0];
|
567
567
|
if (a)
|
568
568
|
return `${i}/full/${a.width},${a.height}/0/default.jpg`;
|
569
569
|
}
|
@@ -571,10 +571,10 @@ const ie = (t) => h(t, "type").startsWith("ImageService") || t.profile && t.prof
|
|
571
571
|
}
|
572
572
|
return `${i}/full/!${e},${r}/0/default.jpg`;
|
573
573
|
}, xt = (t, e, r) => {
|
574
|
-
const i =
|
574
|
+
const i = f(t, "id"), s = t.profile || "";
|
575
575
|
if (typeof s == "string" && (s.includes("level0") || s.includes("level:0"))) return;
|
576
|
-
const { x: a, y:
|
577
|
-
return `${i}/${
|
576
|
+
const { x: a, y: o, w: c, h } = e, p = c / h, u = p < 1, w = Math.ceil(u ? r / p : r), l = Math.ceil(u ? r : r / p), v = `${Math.round(a)},${Math.round(o)},${Math.round(c)},${Math.round(h)}`;
|
577
|
+
return `${i}/${v}/!${l},${w}/0/default.jpg`;
|
578
578
|
}, $t = (t) => (e, r = 400) => {
|
579
579
|
if (t.type === "dynamic")
|
580
580
|
return xt(t.service, e, r);
|
@@ -582,37 +582,37 @@ const ie = (t) => h(t, "type").startsWith("ImageService") || t.profile && t.prof
|
|
582
582
|
}, Mt = (t, e = []) => (r = 400) => {
|
583
583
|
const { width: i, height: s } = t;
|
584
584
|
if (!i || !s) return;
|
585
|
-
const n = i / s, a = n < 1,
|
585
|
+
const n = i / s, a = n < 1, o = Math.ceil(a ? r / n : r), c = Math.ceil(a ? r : r / n);
|
586
586
|
if (t.thumbnail && t.thumbnail.length > 0) {
|
587
|
-
const
|
588
|
-
if ("service" in
|
589
|
-
const
|
590
|
-
if (
|
591
|
-
return _(
|
587
|
+
const h = t.thumbnail[0];
|
588
|
+
if ("service" in h && Array.isArray(h.service)) {
|
589
|
+
const p = h.service.find((u) => ie(u));
|
590
|
+
if (p)
|
591
|
+
return _(p, c, o);
|
592
592
|
}
|
593
|
-
if ("id" in
|
593
|
+
if ("id" in h) return h.id;
|
594
594
|
}
|
595
|
-
for (const
|
596
|
-
if (
|
597
|
-
return _(
|
598
|
-
if (
|
599
|
-
return
|
595
|
+
for (const h of e) {
|
596
|
+
if (h.type === "dynamic" || h.type === "level0")
|
597
|
+
return _(h.service, c, o);
|
598
|
+
if (h.type === "static")
|
599
|
+
return h.url;
|
600
600
|
}
|
601
601
|
}, ne = (t) => t.endsWith("/info.json") ? t : `${t.endsWith("/") ? t : `${t}/`}info.json`, jt = (t) => {
|
602
|
-
const { format: e, height: r, width: i } = t, s =
|
602
|
+
const { format: e, height: r, width: i } = t, s = f(t, "id"), n = (t.service || []).find(ie), a = n ? se(n) : void 0;
|
603
603
|
if (a) {
|
604
|
-
const
|
604
|
+
const o = {
|
605
605
|
source: t,
|
606
606
|
type: a.profileLevel === 0 ? "level0" : "dynamic",
|
607
607
|
service: n,
|
608
608
|
width: i,
|
609
609
|
height: r,
|
610
610
|
majorVersion: a.majorVersion,
|
611
|
-
serviceUrl: ne(
|
611
|
+
serviceUrl: ne(f(n, "id"))
|
612
612
|
};
|
613
|
-
return a.profileLevel === 0 ?
|
614
|
-
...
|
615
|
-
getRegionURL: $t(
|
613
|
+
return a.profileLevel === 0 ? o : {
|
614
|
+
...o,
|
615
|
+
getRegionURL: $t(o)
|
616
616
|
};
|
617
617
|
} else
|
618
618
|
return {
|
@@ -625,7 +625,7 @@ const ie = (t) => h(t, "type").startsWith("ImageService") || t.profile && t.prof
|
|
625
625
|
};
|
626
626
|
}, kt = (t) => {
|
627
627
|
const e = [];
|
628
|
-
return new
|
628
|
+
return new O({
|
629
629
|
annotation: [(i) => {
|
630
630
|
if (i.motivation === "painting" || !i.motivation) {
|
631
631
|
const n = (i.body ? Array.isArray(i.body) ? i.body : [i.body] : []).filter((a) => a.type === "Image");
|
@@ -634,42 +634,49 @@ const ie = (t) => h(t, "type").startsWith("ImageService") || t.profile && t.prof
|
|
634
634
|
}]
|
635
635
|
}).traverseCanvas(t), e;
|
636
636
|
}, Pt = (t) => () => {
|
637
|
-
const e = /* @__PURE__ */ new Map(), r = (
|
637
|
+
const e = /* @__PURE__ */ new Map(), r = (o, c, h = 0) => {
|
638
638
|
const p = {
|
639
|
-
id:
|
639
|
+
id: o.id,
|
640
640
|
type: "range",
|
641
|
-
source:
|
641
|
+
source: o,
|
642
642
|
children: [],
|
643
643
|
navItems: [],
|
644
644
|
navSections: [],
|
645
645
|
parent: c,
|
646
|
-
level:
|
647
|
-
getLabel:
|
646
|
+
level: h,
|
647
|
+
getLabel: o.getLabel
|
648
648
|
};
|
649
|
-
|
650
|
-
if (
|
651
|
-
const
|
652
|
-
p.children.push(
|
653
|
-
} else
|
654
|
-
|
655
|
-
id:
|
649
|
+
o.items && o.items.length > 0 && o.items.forEach((v) => {
|
650
|
+
if (v.source.type === "Range") {
|
651
|
+
const S = r(v, p, h + 1);
|
652
|
+
p.children.push(S);
|
653
|
+
} else {
|
654
|
+
const b = {
|
655
|
+
id: v.id,
|
656
656
|
type: "canvas",
|
657
|
-
source:
|
657
|
+
source: v,
|
658
658
|
children: [],
|
659
659
|
navItems: [],
|
660
660
|
navSections: [],
|
661
661
|
parent: p,
|
662
|
-
level:
|
663
|
-
getLabel:
|
664
|
-
}
|
662
|
+
level: h + 1,
|
663
|
+
getLabel: v.getLabel
|
664
|
+
};
|
665
|
+
p.children.push(b), e.set(b.id, b);
|
666
|
+
}
|
665
667
|
});
|
666
|
-
const
|
667
|
-
return p.navItems.push(...
|
668
|
+
const u = p.children.map((v) => v.type === "canvas" ? v.source : v.children.length === 1 && v.children[0].type === "canvas" ? v.children[0].source : v.source), w = u.filter((v) => v.source.type === "Canvas"), l = u.filter((v) => v.source.type === "Range");
|
669
|
+
return p.navItems.push(...w), p.navSections.push(...l), e.set(p.id, p), p;
|
668
670
|
};
|
669
|
-
return { root: t.filter((
|
671
|
+
return { root: t.filter((o) => {
|
670
672
|
var c;
|
671
|
-
return (c =
|
672
|
-
}).map((
|
673
|
+
return (c = o.source.behavior) == null ? void 0 : c.includes("top");
|
674
|
+
}).map((o) => r(o, void 0)), getBreadcrumbs: (o) => {
|
675
|
+
const c = e.get(o);
|
676
|
+
if (!c) return [];
|
677
|
+
const h = (p, u = []) => p.parent ? h(p.parent, [p, ...u]) : [p, ...u];
|
678
|
+
return h(c);
|
679
|
+
}, getNode: (o) => e.get(o) };
|
673
680
|
}, Ot = async (t) => {
|
674
681
|
try {
|
675
682
|
new URL(t);
|
@@ -724,7 +731,7 @@ const ie = (t) => h(t, "type").startsWith("ImageService") || t.profile && t.prof
|
|
724
731
|
code: "INVALID_MANIFEST",
|
725
732
|
message: "Missing @context"
|
726
733
|
};
|
727
|
-
const i =
|
734
|
+
const i = f(t, "id");
|
728
735
|
if (!i)
|
729
736
|
return {
|
730
737
|
type: "error",
|
@@ -733,14 +740,14 @@ const ie = (t) => h(t, "type").startsWith("ImageService") || t.profile && t.prof
|
|
733
740
|
};
|
734
741
|
if (r.includes("presentation/2") || r.includes("presentation/3")) {
|
735
742
|
const s = r.includes("presentation/2") ? 2 : 3;
|
736
|
-
return
|
743
|
+
return f(t, "type").includes("Collection") ? {
|
737
744
|
type: "collection",
|
738
745
|
url: e || i,
|
739
|
-
resource:
|
746
|
+
resource: Dt(t, s)
|
740
747
|
} : {
|
741
748
|
type: "manifest",
|
742
749
|
url: e || i,
|
743
|
-
resource:
|
750
|
+
resource: Ut(t, s)
|
744
751
|
};
|
745
752
|
}
|
746
753
|
if (r.includes("image/2") || r.includes("image/3")) {
|
@@ -760,16 +767,16 @@ const ie = (t) => h(t, "type").startsWith("ImageService") || t.profile && t.prof
|
|
760
767
|
code: "INVALID_MANIFEST",
|
761
768
|
message: "JSON resource is not a recognized IIIF format"
|
762
769
|
};
|
763
|
-
},
|
770
|
+
}, Dt = (t, e) => {
|
764
771
|
const r = (n) => {
|
765
772
|
const a = [];
|
766
|
-
return new
|
767
|
-
manifest: [(
|
768
|
-
}).traverseCollection(n), a.map((
|
769
|
-
id:
|
770
|
-
type:
|
771
|
-
getLabel:
|
772
|
-
source:
|
773
|
+
return new O({
|
774
|
+
manifest: [(c) => a.push(c)]
|
775
|
+
}).traverseCollection(n), a.map((c) => ({
|
776
|
+
id: c.id,
|
777
|
+
type: c.type,
|
778
|
+
getLabel: I(c),
|
779
|
+
source: c
|
773
780
|
}));
|
774
781
|
}, i = e === 2 ? te(t) : t, s = r(i);
|
775
782
|
return {
|
@@ -777,46 +784,46 @@ const ie = (t) => h(t, "type").startsWith("ImageService") || t.profile && t.prof
|
|
777
784
|
id: i.id,
|
778
785
|
majorVersion: e,
|
779
786
|
items: s,
|
780
|
-
getLabel:
|
781
|
-
getMetadata:
|
787
|
+
getLabel: I(i),
|
788
|
+
getMetadata: M(i)
|
782
789
|
};
|
783
|
-
},
|
790
|
+
}, Ut = (t, e) => {
|
784
791
|
const r = (a) => {
|
785
|
-
const
|
786
|
-
new
|
787
|
-
canvas: [(
|
788
|
-
|
792
|
+
const o = [], c = [];
|
793
|
+
new O({
|
794
|
+
canvas: [(l) => {
|
795
|
+
l.items && o.push(l);
|
789
796
|
}],
|
790
|
-
range: [(
|
791
|
-
|
797
|
+
range: [(l) => {
|
798
|
+
l.type === "Range" && c.push(l);
|
792
799
|
}]
|
793
800
|
}).traverseManifest(a);
|
794
|
-
const
|
795
|
-
const
|
801
|
+
const p = o.map((l) => {
|
802
|
+
const v = kt(l);
|
796
803
|
return {
|
797
|
-
source:
|
798
|
-
id:
|
799
|
-
width:
|
800
|
-
height:
|
801
|
-
images:
|
802
|
-
annotations:
|
803
|
-
getLabel:
|
804
|
-
getMetadata:
|
805
|
-
getThumbnailURL: Mt(
|
804
|
+
source: l,
|
805
|
+
id: l.id,
|
806
|
+
width: l.width,
|
807
|
+
height: l.height,
|
808
|
+
images: v,
|
809
|
+
annotations: l.annotations || [],
|
810
|
+
getLabel: I(l),
|
811
|
+
getMetadata: M(l),
|
812
|
+
getThumbnailURL: Mt(l, v)
|
806
813
|
};
|
807
|
-
}),
|
808
|
-
const
|
814
|
+
}), u = (l) => {
|
815
|
+
const v = l.items || [], b = v.filter((g) => g.type === "Canvas").map((g) => p.find((x) => x.id === g.id)).filter(Boolean), S = v.filter((g) => g.type === "Range").map((g) => u(g)), oe = [...b, ...S];
|
809
816
|
return {
|
810
|
-
source:
|
811
|
-
id:
|
817
|
+
source: l,
|
818
|
+
id: l.id,
|
812
819
|
// Maintain original order
|
813
|
-
items:
|
814
|
-
canvases:
|
815
|
-
ranges:
|
816
|
-
getLabel:
|
820
|
+
items: v.map((g) => oe.find((x) => x.id === g.id)),
|
821
|
+
canvases: b,
|
822
|
+
ranges: S,
|
823
|
+
getLabel: I(l)
|
817
824
|
};
|
818
|
-
},
|
819
|
-
return { canvases:
|
825
|
+
}, w = c.map((l) => u(l));
|
826
|
+
return { canvases: p, ranges: w };
|
820
827
|
}, i = e === 2 ? te(t) : t, { canvases: s, ranges: n } = r(i);
|
821
828
|
return {
|
822
829
|
source: i,
|
@@ -824,8 +831,8 @@ const ie = (t) => h(t, "type").startsWith("ImageService") || t.profile && t.prof
|
|
824
831
|
majorVersion: e,
|
825
832
|
canvases: s,
|
826
833
|
structure: n,
|
827
|
-
getLabel:
|
828
|
-
getMetadata:
|
834
|
+
getLabel: I(i),
|
835
|
+
getMetadata: M(i),
|
829
836
|
getTableOfContents: Pt(n)
|
830
837
|
};
|
831
838
|
}, Et = (t) => {
|
@@ -837,16 +844,16 @@ const ie = (t) => h(t, "type").startsWith("ImageService") || t.profile && t.prof
|
|
837
844
|
width: e,
|
838
845
|
height: r,
|
839
846
|
majorVersion: i.majorVersion,
|
840
|
-
serviceUrl: ne(
|
847
|
+
serviceUrl: ne(f(t, "id"))
|
841
848
|
};
|
842
849
|
}, qt = { parse: ae, parseURL: Ot };
|
843
850
|
export {
|
844
851
|
qt as Cozy,
|
845
852
|
_ as getImageURLFromService,
|
846
853
|
kt as getImages,
|
847
|
-
|
848
|
-
|
849
|
-
|
854
|
+
I as getLabel,
|
855
|
+
M as getMetadata,
|
856
|
+
f as getPropertyValue,
|
850
857
|
$t as getRegionURL,
|
851
858
|
xt as getRegionURLFromService,
|
852
859
|
Ft as getStringValue,
|
package/dist/types.d.ts
CHANGED
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "cozy-iiif",
|
3
|
-
"version": "0.2.
|
3
|
+
"version": "0.2.3",
|
4
4
|
"description": "A developer-friendly collection of abstractions and utilities built on top of @iiif/presentation-3 and @iiif/parser",
|
5
5
|
"license": "MIT",
|
6
6
|
"author": "Rainer Simon",
|
@@ -28,12 +28,12 @@
|
|
28
28
|
"./level-0": "./dist/level-0/index.js"
|
29
29
|
},
|
30
30
|
"devDependencies": {
|
31
|
-
"vite": "^6.
|
32
|
-
"vite-plugin-dts": "^4.5.
|
33
|
-
"vitest": "^3.1.
|
31
|
+
"vite": "^6.3.5",
|
32
|
+
"vite-plugin-dts": "^4.5.4",
|
33
|
+
"vitest": "^3.1.4"
|
34
34
|
},
|
35
35
|
"dependencies": {
|
36
|
-
"@iiif/parser": "^2.1.
|
36
|
+
"@iiif/parser": "^2.1.8",
|
37
37
|
"@iiif/presentation-3": "^2.2.3",
|
38
38
|
"p-throttle": "^7.0.0",
|
39
39
|
"uuid": "^11.1.0"
|
package/src/core/manifest.ts
CHANGED
@@ -26,7 +26,7 @@ export const getTableOfContents = (ranges: CozyRange[]) => (): CozyTOC => {
|
|
26
26
|
} else {
|
27
27
|
// This child is Canvas, i.e. a TOCNode with
|
28
28
|
// no further children.
|
29
|
-
|
29
|
+
const canvasChild: CozyTOCNode = {
|
30
30
|
id: item.id,
|
31
31
|
type: 'canvas',
|
32
32
|
source: item as CozyCanvas,
|
@@ -36,7 +36,11 @@ export const getTableOfContents = (ranges: CozyRange[]) => (): CozyTOC => {
|
|
36
36
|
parent: node,
|
37
37
|
level: level + 1,
|
38
38
|
getLabel: item.getLabel
|
39
|
-
}
|
39
|
+
};
|
40
|
+
|
41
|
+
// Add leaf node to children & lookup index
|
42
|
+
node.children.push(canvasChild);
|
43
|
+
index.set(canvasChild.id, canvasChild);
|
40
44
|
}
|
41
45
|
});
|
42
46
|
}
|
@@ -71,5 +75,20 @@ export const getTableOfContents = (ranges: CozyRange[]) => (): CozyTOC => {
|
|
71
75
|
|
72
76
|
const getNode = (id: string) => index.get(id);
|
73
77
|
|
74
|
-
|
78
|
+
const getBreadcrumbs = (id: string) => {
|
79
|
+
const thisNode = index.get(id);
|
80
|
+
if (!thisNode) return [];
|
81
|
+
|
82
|
+
const addParent = (node: CozyTOCNode, breadcrumbs: CozyTOCNode[] = []) => {
|
83
|
+
if (node.parent) {
|
84
|
+
return addParent(node.parent, [node, ...breadcrumbs]);
|
85
|
+
} else {
|
86
|
+
return [node, ...breadcrumbs];
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
return addParent(thisNode);
|
91
|
+
}
|
92
|
+
|
93
|
+
return { root, getBreadcrumbs, getNode };
|
75
94
|
}
|
package/src/types.ts
CHANGED
package/test/Cozy.test.ts
CHANGED
@@ -10,7 +10,7 @@ describe('Cozy', () => {
|
|
10
10
|
expect(result.type).toBe('collection');
|
11
11
|
});
|
12
12
|
|
13
|
-
it('should parse
|
13
|
+
it('should parse structures in presentation manifests', async () => {
|
14
14
|
const result = await Cozy.parseURL(WITH_STRUCTURES);
|
15
15
|
expect(result.type).toBe('manifest');
|
16
16
|
expect('resource' in result).toBeTruthy();
|
@@ -19,8 +19,8 @@ describe('Cozy', () => {
|
|
19
19
|
expect(manifest.structure.length > 0).toBeTruthy();
|
20
20
|
|
21
21
|
const tableOfContents = manifest.getTableOfContents();
|
22
|
-
expect(tableOfContents.length).toBe(1);
|
23
|
-
expect(tableOfContents[0].children.length).toBe(14);
|
22
|
+
expect(tableOfContents.root.length).toBe(1);
|
23
|
+
expect(tableOfContents.root[0].children.length).toBe(14);
|
24
24
|
});
|
25
25
|
|
26
26
|
});
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
2
|
+
import { Cozy, CozyManifest } from '../../src';
|
3
|
+
|
4
|
+
import { WITH_STRUCTURES } from './fixtures';
|
5
|
+
|
6
|
+
describe('manifest', () => {
|
7
|
+
|
8
|
+
it('should generate proper ToC breadcrumbs', async () => {
|
9
|
+
const result = await Cozy.parseURL(WITH_STRUCTURES);
|
10
|
+
expect(result.type).toBe('manifest');
|
11
|
+
expect('resource' in result).toBeTruthy();
|
12
|
+
|
13
|
+
const manifest = (result as any).resource as CozyManifest;
|
14
|
+
expect(manifest.structure.length > 0).toBeTruthy();
|
15
|
+
|
16
|
+
const toc = manifest.getTableOfContents();
|
17
|
+
|
18
|
+
const breadcrumbs = toc.getBreadcrumbs('https://lib.is/IE19255085/range/range-0-12-0.json');
|
19
|
+
|
20
|
+
expect(breadcrumbs.length).toBe(3);
|
21
|
+
expect(breadcrumbs[0].getLabel()).toBe('Table of Contents');
|
22
|
+
expect(breadcrumbs[1].getLabel()).toBe('Woodcuts full');
|
23
|
+
expect(breadcrumbs[2].getLabel()).toBe('f. X2v-f. X3r: woodcut full ')
|
24
|
+
});
|
25
|
+
|
26
|
+
});
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
2
2
|
import { Annotation } from '@iiif/presentation-3';
|
3
3
|
import { Cozy, CozyManifest } from '../../src';
|
4
|
+
import { importAnnotations } from '../../src/helpers';
|
4
5
|
|
5
6
|
import {
|
6
7
|
ANNOTATIONS,
|
@@ -21,7 +22,7 @@ describe('import-annotations', () => {
|
|
21
22
|
|
22
23
|
const annotations = ANNOTATIONS as Annotation[];
|
23
24
|
|
24
|
-
const modified =
|
25
|
+
const modified = importAnnotations(firstCanvas, annotations)
|
25
26
|
expect(modified.annotations.length).toBe(1);
|
26
27
|
});
|
27
28
|
|
@@ -37,7 +38,7 @@ describe('import-annotations', () => {
|
|
37
38
|
|
38
39
|
const annotations = ANNOTATIONS as Annotation[];
|
39
40
|
|
40
|
-
const modified =
|
41
|
+
const modified = importAnnotations(manifest, annotations, 'cozy');
|
41
42
|
expect(modified.canvases[0].annotations.length).toBe(1);
|
42
43
|
expect(modified.canvases[1].annotations.length).toBe(1);
|
43
44
|
});
|
File without changes
|