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 CHANGED
@@ -1,21 +1,21 @@
1
- import { g as h, a as $, b as w } from "./resource-DS2brz47.js";
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 u(t) {
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 b(t) {
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), U = ["sc:Collection", "sc:Manifest", "sc:Canvas", "sc:AnnotationList", "oa:Annotation", "sc:Range", "sc:Layer", "sc:Sequence", "oa:Choice", "Service", "ContentResource"];
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 = U.indexOf(t["@type"]);
18
- if (e !== -1) return U[e];
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
- }, Ue = "http://library.stanford.edu/iiif/image-api/compliance.html#level1", De = "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, Ue, De, Ee, Ne, qe, _e, Ve, Fe, We, Be, He, Je, Ge, ze, Ke, Qe, Xe, Ye], M = { attributionLabel: "Attribution", providerId: "http://example.org/provider", providerName: "Unknown" };
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 R(t, e = "none") {
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 D(t) {
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 k(t) {
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 c = a ? ot(a) : void 0;
286
- if (c && (c.indexOf("creativecommons.org") !== -1 || c.indexOf("rightsstatements.org") !== -1)) {
287
- c.startsWith("https://") ? i = `http://${c.slice(8)}` : i = c;
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
- c && s.push({ label: { [r]: [e] }, value: { [r]: [c] } });
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: R(e.label), value: R(e.value) })) : [];
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(D) : t.motivation && (r = D(t.motivation)), { "@context": t["@context"] ? pt(t["@context"]) : void 0, id: (t["@id"] || Z(t)).trim(), type: k(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 };
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 ? R(t.label) : void 0, requiredStatement: t.attribution ? { label: R(M.attributionLabel), value: R(t.attribution) } : void 0, navDate: t.navDate, summary: t.description ? R(t.description) : void 0, thumbnail: ht(t.thumbnail) };
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: k(i) });
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: M.providerId, type: "Agent", homepage: e.length ? [e[0]] : void 0, logo: t.logo ? Array.isArray(t.logo) ? t.logo : [t.logo] : void 0, label: R(M.providerName) }] : void 0, partOf: ut(t), rendering: t.rendering, seeAlso: t.seeAlso, start: t.startCanvas, service: t.service ? b(t.service) : void 0, supplementary: r ? [r] : void 0 };
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 u({ ...d(t), ...y(t), ...C(t), items: t.members });
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 n of t.sequences || []) n.canvases.length && e.push(...n.canvases), n.behavior && r.push(...n.behavior), n.startCanvas && (i = n.startCanvas);
348
- let s = d(t);
349
- return r.length && (s.behavior ? s.behavior.push(...r) : s.behavior = r), u({ ...s, ...y(t), ...C(t), start: i, items: e, structures: dt(t.structures) });
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 u({ ...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 });
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 u({ ...d(t), ...y(t), ...C(t), items: t.resources && t.resources.length ? t.resources : void 0 });
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: j(r.selector) };
384
+ return { type: "SpecificResource", source: i, selector: k(r.selector) };
385
385
  } else return encodeURI(r["@id"]).trim();
386
386
  }
387
- return u({ ...d(t), ...y(t), ...C(t), target: e(t.on), body: Array.isArray(t.resource) ? t.resource.map(N) : N(t.resource) });
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 u({ ...d(e), ...y(e), ...C(e), ...ft(e) });
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), u({ ...d(t), ...y(t), items: e });
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 u({ ...d(t), ...y(t), ...C(t), items: t.members });
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"] = k(t), a["@type"] === "unknown" && (i && i.length && (a["@context"] = i), a["@type"] = "Service"), s && (a.profile = Y(s)), u({ ...a, ...n });
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 u({ ...d(t), ...y(t), ...C(t) });
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 j(t) {
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 [j(t.default), ...(Array.isArray(t.item) ? t.item : [t.item]).map(j)];
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 x(t) {
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 S(...t) {
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 P = class re {
442
+ var O = class re {
443
443
  constructor(e, r = {}) {
444
- A(this, "traversals"), A(this, "options"), A(this, "_traverseManifest", S(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", S(this.traverseCanvasItems.bind(this), this.traverseLinking.bind(this), this.traverseDescriptive.bind(this), this.traverseLinkedCanvases.bind(this), this.traverseInlineAnnotationPages.bind(this))), A(this, "_traverseAnnotationPage", S(this.traverseAnnotationPageItems.bind(this), this.traverseLinking.bind(this), this.traverseDescriptive.bind(this))), A(this, "_traverseRange", S(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 };
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 = b(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;
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 = b(e.service).map((r) => this.traverseService(r))), e.services && (e.services = b(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 = b(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 && (x(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;
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 = b(e.service || []).map((r) => this.traverseService(r, e))), e;
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))), x(e) ? this.traverseSpecificResource(e, "ContentResource") : this.traverseType(this.traverseInlineAnnotationPages(this.traverseContentResourceLinking(e)), { parent: r }, this.traversals.contentResource);
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) : x(r) ? this.traverseSpecificResource(r, "Canvas", e) : r.type === "Manifest" ? this.traverseManifest(r, e) : this.traverseRange(r, e))), 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 = b(i.service).map((s) => this.traverseService(s))), this.traverseType(i, { parent: r }, this.traversals.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) => h(t, "type").startsWith("ImageService") || t.profile && t.profile.toString().includes("iiif.io/api/image/"), se = (t) => {
556
- const e = h(t, "type"), r = h(t, "context");
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((c) => s.findIndex((l) => c.toString().includes(l))).filter((c) => c > -1).sort((c, l) => l - c)[0] };
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 = h(t, "id"), s = t.profile || "";
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((c, l) => l.width * l.height - c.width * c.height).filter((c) => c.width * c.height >= e * r)[0];
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 = h(t, "id"), s = t.profile || "";
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: c, w: l, h: p } = e, v = l / p, f = v < 1, L = Math.ceil(f ? r / v : r), o = Math.ceil(f ? r : r / v), m = `${Math.round(a)},${Math.round(c)},${Math.round(l)},${Math.round(p)}`;
577
- return `${i}/${m}/!${o},${L}/0/default.jpg`;
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, c = Math.ceil(a ? r / n : r), l = Math.ceil(a ? r : r / n);
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 p = t.thumbnail[0];
588
- if ("service" in p && Array.isArray(p.service)) {
589
- const v = p.service.find((f) => ie(f));
590
- if (v)
591
- return _(v, l, c);
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 p) return p.id;
593
+ if ("id" in h) return h.id;
594
594
  }
595
- for (const p of e) {
596
- if (p.type === "dynamic" || p.type === "level0")
597
- return _(p.service, l, c);
598
- if (p.type === "static")
599
- return p.url;
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 = h(t, "id"), n = (t.service || []).find(ie), a = n ? se(n) : void 0;
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 c = {
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(h(n, "id"))
611
+ serviceUrl: ne(f(n, "id"))
612
612
  };
613
- return a.profileLevel === 0 ? c : {
614
- ...c,
615
- getRegionURL: $t(c)
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 P({
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 = (a, c, l = 0) => {
637
+ const e = /* @__PURE__ */ new Map(), r = (o, c, h = 0) => {
638
638
  const p = {
639
- id: a.id,
639
+ id: o.id,
640
640
  type: "range",
641
- source: a,
641
+ source: o,
642
642
  children: [],
643
643
  navItems: [],
644
644
  navSections: [],
645
645
  parent: c,
646
- level: l,
647
- getLabel: a.getLabel
646
+ level: h,
647
+ getLabel: o.getLabel
648
648
  };
649
- a.items && a.items.length > 0 && a.items.forEach((o) => {
650
- if (o.source.type === "Range") {
651
- const I = r(o, p, l + 1);
652
- p.children.push(I);
653
- } else
654
- p.children.push({
655
- id: o.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: o,
657
+ source: v,
658
658
  children: [],
659
659
  navItems: [],
660
660
  navSections: [],
661
661
  parent: p,
662
- level: l + 1,
663
- getLabel: o.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 v = p.children.map((o) => o.type === "canvas" ? o.source : o.children.length === 1 && o.children[0].type === "canvas" ? o.children[0].source : o.source), f = v.filter((o) => o.source.type === "Canvas"), L = v.filter((o) => o.source.type === "Range");
667
- return p.navItems.push(...f), p.navSections.push(...L), e.set(p.id, p), p;
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((a) => {
671
+ return { root: t.filter((o) => {
670
672
  var c;
671
- return (c = a.source.behavior) == null ? void 0 : c.includes("top");
672
- }).map((a) => r(a, void 0)), getNode: (a) => e.get(a) };
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 = h(t, "id");
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 h(t, "type").includes("Collection") ? {
743
+ return f(t, "type").includes("Collection") ? {
737
744
  type: "collection",
738
745
  url: e || i,
739
- resource: Ut(t, s)
746
+ resource: Dt(t, s)
740
747
  } : {
741
748
  type: "manifest",
742
749
  url: e || i,
743
- resource: Dt(t, s)
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
- }, Ut = (t, e) => {
770
+ }, Dt = (t, e) => {
764
771
  const r = (n) => {
765
772
  const a = [];
766
- return new P({
767
- manifest: [(l) => a.push(l)]
768
- }).traverseCollection(n), a.map((l) => ({
769
- id: l.id,
770
- type: l.type,
771
- getLabel: w(l),
772
- source: l
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: w(i),
781
- getMetadata: $(i)
787
+ getLabel: I(i),
788
+ getMetadata: M(i)
782
789
  };
783
- }, Dt = (t, e) => {
790
+ }, Ut = (t, e) => {
784
791
  const r = (a) => {
785
- const c = [], l = [];
786
- new P({
787
- canvas: [(o) => {
788
- o.items && c.push(o);
792
+ const o = [], c = [];
793
+ new O({
794
+ canvas: [(l) => {
795
+ l.items && o.push(l);
789
796
  }],
790
- range: [(o) => {
791
- o.type === "Range" && l.push(o);
797
+ range: [(l) => {
798
+ l.type === "Range" && c.push(l);
792
799
  }]
793
800
  }).traverseManifest(a);
794
- const v = c.map((o) => {
795
- const m = kt(o);
801
+ const p = o.map((l) => {
802
+ const v = kt(l);
796
803
  return {
797
- source: o,
798
- id: o.id,
799
- width: o.width,
800
- height: o.height,
801
- images: m,
802
- annotations: o.annotations || [],
803
- getLabel: w(o),
804
- getMetadata: $(o),
805
- getThumbnailURL: Mt(o, m)
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
- }), f = (o) => {
808
- const m = o.items || [], I = m.filter((g) => g.type === "Canvas").map((g) => v.find((T) => T.id === g.id)).filter(Boolean), O = m.filter((g) => g.type === "Range").map((g) => f(g)), oe = [...I, ...O];
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: o,
811
- id: o.id,
817
+ source: l,
818
+ id: l.id,
812
819
  // Maintain original order
813
- items: m.map((g) => oe.find((T) => T.id === g.id)),
814
- canvases: I,
815
- ranges: O,
816
- getLabel: w(o)
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
- }, L = l.map((o) => f(o));
819
- return { canvases: v, ranges: L };
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: w(i),
828
- getMetadata: $(i),
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(h(t, "id"))
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
- w as getLabel,
848
- $ as getMetadata,
849
- h as getPropertyValue,
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
@@ -71,6 +71,7 @@ export interface CozyMetadata {
71
71
  }
72
72
  export interface CozyTOC {
73
73
  root: CozyTOCNode[];
74
+ getBreadcrumbs(id: string): CozyTOCNode[];
74
75
  getNode(id: string): CozyTOCNode | undefined;
75
76
  }
76
77
  export interface CozyTOCNode {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cozy-iiif",
3
- "version": "0.2.1",
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.2.5",
32
- "vite-plugin-dts": "^4.5.3",
33
- "vitest": "^3.1.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.7",
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"
@@ -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
- node.children.push({
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
- return { root, getNode };
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
@@ -119,6 +119,8 @@ export interface CozyTOC {
119
119
 
120
120
  root: CozyTOCNode[];
121
121
 
122
+ getBreadcrumbs(id: string): CozyTOCNode[];
123
+
122
124
  getNode(id: string): CozyTOCNode | undefined;
123
125
 
124
126
  }
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 strctures in presentation manifests', async () => {
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,2 @@
1
+ export const WITH_STRUCTURES =
2
+ 'https://lib.is/IE19255085/manifest';
@@ -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 = Cozy.Helpers.importAnnotations(firstCanvas, annotations)
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 = Cozy.Helpers.importAnnotations(manifest, annotations, 'cozy');
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