UNPKG

cozy-iiif

Version:

A developer-friendly collection of abstractions and utilities built on top of @iiif/presentation-3 and @iiif/parser

427 lines (426 loc) 17 kB
import { imageSize as e } from "image-size"; //#region node_modules/@iiif/parser/dist/remove-undefined-properties-DKmVdOaS.js function t(e) { "@babel/helpers - typeof"; return t = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) { return typeof e; } : function(e) { return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; }, t(e); } function n(e, n) { if (t(e) != "object" || !e) return e; var r = e[Symbol.toPrimitive]; if (r !== void 0) { var i = r.call(e, n || "default"); if (t(i) != "object") return i; throw TypeError("@@toPrimitive must return a primitive value."); } return (n === "string" ? String : Number)(e); } function r(e) { var r = n(e, "string"); return t(r) == "symbol" ? r : r + ""; } function i(e, t, n) { return (t = r(t)) in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; } function a(e) { return Array.isArray(e) ? e : e ? [e] : []; } function o(e) { for (let t in e) (e[t] === void 0 || e[t] === null) && delete e[t]; return e; } //#endregion //#region node_modules/@iiif/parser/dist/traverse-BDmGe7EO.js function s(e) { return typeof e == "string" ? !1 : e && !e.type && "source" in e ? (e.type = "SpecificResource", !0) : !!e && e.type === "SpecificResource"; } function c(...e) { return (t) => e.reduce((e, t) => t(e), t); } var l = [ "Collection", "Manifest", "Canvas", "AnnotationPage", "AnnotationCollection", "Annotation", "ContentResource", "Range", "Service", "Selector", "Agent" ]; function u(e, t) { if (e == null) throw Error("Null or undefined is not a valid entity."); if (Array.isArray(e)) throw Error("Array is not a valid entity"); if (typeof e != "object") { if (t) return t; throw Error(`${typeof e} is not a valid entity`); } if (typeof e.type == "string") { let t = l.indexOf(e.type); if (t !== -1) return l[t]; } if (e.profile) return "Service"; throw Error("Resource type is not known"); } var d = class e { constructor(e, t = {}) { i(this, "traversals", void 0), i(this, "options", void 0), i(this, "_traverseManifest", c(this.traverseManifestItems.bind(this), this.traverseNavPlace.bind(this), this.traverseLinking.bind(this), this.traverseDescriptive.bind(this), this.traverseLinkedCanvases.bind(this), this.traverseManifestStructures.bind(this), this.traverseInlineAnnotationPages.bind(this))), i(this, "_traverseCanvas", c(this.traverseCanvasItems.bind(this), this.traverseLinking.bind(this), this.traverseDescriptive.bind(this), this.traverseLinkedCanvases.bind(this), this.traverseInlineAnnotationPages.bind(this))), i(this, "_traverseAnnotationPage", c(this.traverseAnnotationPageItems.bind(this), this.traverseLinking.bind(this), this.traverseDescriptive.bind(this))), i(this, "_traverseRange", c(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, ...t }; } static all(t) { return new e({ collection: [t], manifest: [t], canvas: [t], annotationCollection: [t], annotationPage: [t], annotation: [t], contentResource: [t], choice: [t], range: [t], service: [t], geoJson: [t], specificResource: [t], agent: [t] }); } traverseDescriptive(e) { return e.thumbnail &&= a(e.thumbnail).map((t) => this.traverseType(t, { parent: e }, this.traversals.contentResource)), e.provider &&= e.provider.map((t) => this.traverseAgent(t, e)), e; } traverseLinking(e) { return e.seeAlso &&= a(e.seeAlso).map((t) => this.traverseType(t, { parent: e }, this.traversals.contentResource)), e.service &&= a(e.service).map((e) => this.traverseService(e)), e.services &&= a(e.services).map((t) => this.traverseService(t, e)), e.logo &&= a(e.logo).map((t) => this.traverseType(t, { parent: e }, this.traversals.contentResource)), e.homepage &&= a(e.homepage).map((t) => this.traverseType(t, { parent: e }, this.traversals.contentResource)), e.partOf &&= e.partOf.map((t) => typeof t == "string" || !t.type ? this.traverseType(t, { parent: e }, this.traversals.contentResource) : t.type === "Canvas" ? this.traverseType(t, { parent: e }, this.traversals.canvas) : t.type === "AnnotationCollection" ? this.traverseType(t, { parent: e }, this.traversals.annotationCollection) : t.type === "Collection" ? this.traverseType(t, { parent: e }, this.traversals.collection) : this.traverseType(t, { parent: e }, this.traversals.contentResource)), e.start && (s(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.map((t) => this.traverseType(t, { parent: e }, this.traversals.contentResource)), e.supplementary &&= e.supplementary.map((t) => this.traverseType(t, { parent: e }, this.traversals.contentResource)), e; } traverseCollectionItems(e) { return e.items && e.items.map((e) => e.type === "Collection" ? this.traverseCollection(e) : this.traverseManifest(e)), e; } traverseCollection(e, t) { return this.traverseType(this.traverseDescriptive(this.traverseNavPlace(this.traverseInlineAnnotationPages(this.traverseLinking(this.traverseLinkedCanvases(this.traverseCollectionItems(e)))))), { parent: t }, this.traversals.collection); } traverseGeoJson(e, t) { return this.traverseType(e, { parent: t }, this.traversals.geoJson); } traverseNavPlace(e) { return e.navPlace &&= this.traverseGeoJson(e.navPlace, e), e; } traverseManifestItems(e) { return e.items &&= e.items.map((e) => this.traverseCanvas(e)), e; } traverseManifestStructures(e) { return e.structures &&= e.structures.map((e) => this.traverseRange(e)), e; } traverseManifest(e, t) { return this.traverseType(this._traverseManifest(e), { parent: t }, this.traversals.manifest); } traverseCanvasItems(e) { return e.items = (e.items || []).map((t) => this.traverseAnnotationPage(t, e)), e; } traverseInlineAnnotationPages(e) { return typeof e == "string" || !e || (e.annotations &&= e.annotations.map((t) => this.traverseAnnotationPage(t, e))), e; } traverseCanvas(e, t) { return this.traverseType(this._traverseCanvas(e), { parent: t }, this.traversals.canvas); } traverseAnnotationPageItems(e) { return e.items &&= e.items.map((t) => this.traverseAnnotation(t, e)), e; } traverseAnnotationPage(e, t) { return this.traverseType(this._traverseAnnotationPage(e), { parent: t }, this.traversals.annotationPage); } traverseAnnotationBody(e) { return Array.isArray(e.body) ? e.body = e.body.map((t) => this.traverseContentResource(t, e)) : e.body &&= this.traverseContentResource(e.body, e), e; } traverseLinkedCanvases(e) { return e.placeholderCanvas &&= this.traverseCanvas(e.placeholderCanvas), e.accompanyingCanvas &&= this.traverseCanvas(e.accompanyingCanvas), e; } traverseAnnotation(e, t) { return this.traverseType(this.traverseLinking(this.traverseAnnotationBody(this.traverseDescriptive(e))), { parent: t }, this.traversals.annotation); } traverseContentResourceLinking(e) { return typeof e == "string" || !e || e && e.service && (e.service = a(e.service || []).map((t) => this.traverseService(t, e))), e; } traverseContentResource(e, t) { return e.type === "Choice" && (e.items = e.items.map((t) => this.traverseContentResource(t, e))), s(e) ? this.traverseSpecificResource(e, "ContentResource") : this.traverseType(this.traverseInlineAnnotationPages(this.traverseContentResourceLinking(e)), { parent: t }, this.traversals.contentResource); } traverseSpecificResource(e, t, n) { let r = e.source; return typeof e.source == "string" && (r = { id: e.source, type: t || "unknown" }), this.traverseType({ ...e, source: t === "Canvas" || r.type === "Canvas" ? this.traverseType(r, { parent: n }, this.traversals.canvas) : t === "ContentResource" ? this.traverseContentResource(r, { parent: n }) : this.traverseUnknown(r, { parent: n, typeHint: t }) }, { parent: n }, this.traversals.specificResource); } traverseRangeRanges(e) { return e.items &&= e.items.map((t) => typeof t == "string" ? this.traverseCanvas({ id: t, type: "Canvas" }, e) : s(t) ? this.traverseSpecificResource(t, "Canvas", e) : t.type === "Manifest" ? this.traverseManifest(t, e) : this.traverseRange(t, e)), e; } traverseRange(e, t) { return this.traverseType(this._traverseRange(e), { parent: t }, this.traversals.range); } traverseAgent(e, t) { return this.traverseType(this.traverseDescriptive(this.traverseLinking(e)), { parent: t }, this.traversals.agent); } traverseType(e, t, n) { return n.reduce((e, n) => { let r = n(e, t); return r === void 0 && !this.options.allowUndefinedReturn ? e : r; }, e); } traverseService(e, t) { let n = Object.assign({}, e); return n && n.service && (n.service = a(n.service).map((e) => this.traverseService(e))), this.traverseType(n, { parent: t }, this.traversals.service); } traverseUnknown(e, { parent: t, typeHint: n } = {}) { let r = u(e, n); switch (r) { case "Collection": return this.traverseCollection(e, t); case "Manifest": return this.traverseManifest(e, t); case "Canvas": return this.traverseCanvas(e, t); case "AnnotationPage": return this.traverseAnnotationPage(e, t); case "Annotation": return this.traverseAnnotation(e, t); case "ContentResource": return this.traverseContentResource(e, t); case "Range": return this.traverseRange(e, t); case "Service": return this.traverseService(e, t); case "Agent": return this.traverseAgent(e, t); default: throw Error(`Unknown or unsupported resource type of ${r}`); } } }, f = (e, t) => { let n = e[t]; return n ||= e[`@${t}`], n; }, p = (e, t = "en") => { if (typeof e == "string") return e; let n = e[t]; if (n) return n[0]; { let t = Object.values(e).reduce((e, t) => Array.isArray(t) ? [...e, ...t] : [...e, t], []); return t.length > 0 ? t[0] : void 0; } }, m = (e) => (t = "en") => { let n = f(e, "label"); return n ? p(n, t) : void 0; }, h = (e) => (t) => { let n = f(e, "metadata"); return n ? n.map(({ label: e, value: n }) => ({ label: p(e, t), value: p(n, t) })) : []; }, g = (e) => e.endsWith("/info.json") ? e : `${e.endsWith("/") ? e : `${e}/`}info.json`, _ = (e) => f(e, "type")?.startsWith("ImageService") || e.profile?.toString().includes("iiif.io/api/image/"), v = (e) => { let t = f(e, "type"), n = f(e, "context"); if (t === "ImageService2" || n?.includes("image/2")) { let t = f(e, "profile"), n = [ "level0", "level1", "level2" ]; return { majorVersion: 2, profileLevel: (Array.isArray(t) ? t : t ? [t] : []).map((e) => n.findIndex((t) => e.toString().includes(t))).filter((e) => e > -1).sort((e, t) => t - e)[0] }; } else if (t || n) return { majorVersion: 3, profileLevel: parseInt(e.profile) }; }, y = (t) => () => { let n = typeof window < "u"; return fetch(t).then((e) => e.blob()).then((t) => n ? createImageBitmap(t).then((e) => { let { width: t, height: n } = e; return e.close(), { width: t, height: n }; }) : t.arrayBuffer().then((t) => e(new Uint8Array(t)))); }, b = (e, t, n, r = 0) => { let i = f(e, "id"), a = e.profile || ""; if (typeof a == "string" && (a.includes("level0") || a.includes("level:0"))) { if ("sizes" in e && Array.isArray(e.sizes)) { let r = e.sizes.sort((e, t) => t.width * t.height - e.width * e.height).filter((e) => e.width * e.height >= t * n)[0]; if (r) return `${i}/full/${r.width},${r.height}/0/default.jpg`; } return `${i}/full/full/0/default.jpg`; } return `${i}/full/!${t},${n}/${r}/default.jpg`; }, x = (e, t, n = 0, r = { minSize: 400 }) => { let i = f(e, "id"), a = e.profile || ""; if (typeof a == "string" && (a.includes("level0") || a.includes("level:0"))) { console.warn(`Level 0 image service does not support custom region URLs: ${i}`); return; } let { x: o, y: s, w: c, h: l } = t, { minSize: u = 400, maxSize: d } = r, p = u / Math.min(c, l), m = d ? Math.max(p, d / Math.max(c, l)) : p, h = Math.round(c * m), g = Math.round(l * m), _ = (n % 360 + 360) % 360; return `${i}/${`${Math.round(o)},${Math.round(s)},${Math.round(c)},${Math.round(l)}`}/!${h},${g}/${_}/default.jpg`; }, S = (e) => (t, n = 0, r = { minSize: 400 }) => { if (e.type === "dynamic") return x(e.service, t, n, r); console.error("Level 0 or static image canvas: unsupported"); }, C = (e, t, n) => (r = 800, i = 0) => { if (!e || !t) return; let a = e / t, o = a < 1, s = Math.ceil(o ? r / a : r); return b(n, Math.ceil(o ? r : r / a), s, i); }, w = (e) => () => fetch(e).then((e) => e.json()).then((e) => { let t = e.width, n = e.height; return t !== void 0 && n !== void 0 ? { width: t, height: n } : void 0; }), T = (e, t = []) => (n = 400) => { let { width: r, height: i } = e; if (!r || !i) return; let a = r / i, o = a < 1, s = Math.ceil(o ? n / a : n), c = Math.ceil(o ? n : n / a); if (e.thumbnail && e.thumbnail.length > 0) { let t = e.thumbnail[0]; if ("service" in t && Array.isArray(t.service)) { let e = t.service.find((e) => _(e)); if (e) return b(e, c, s); } if ("id" in t) return t.id; } for (let e of t) if (e.type === "dynamic" || e.type === "level0") return b(e.service, c, s); else if (e.type === "static") return e.url; }, E = (e, t) => { let { format: n, height: r, width: i } = e, a = f(e, "id"), o = (e.service || []).find(_), s = o ? v(o) : void 0; if (o && s) { let n = g(f(o, "id")), a = { source: e, type: s.profileLevel === 0 ? "level0" : "dynamic", service: o, width: i, height: r, majorVersion: s.majorVersion, serviceUrl: n, target: t, getImageURL: C(i, r, o), getPixelSize: w(n) }; return s.profileLevel === 0 ? a : { ...a, getRegionURL: S(a) }; } else return { source: e, type: "static", width: i, height: r, url: a, format: n, getImageURL: () => a, getPixelSize: y(a) }; }, D = (e) => { let t = (e) => { let t = e.replace("xywh=", "").split(",").map(Number); if (t.length === 4 && t.every((e) => !isNaN(e))) { let [e, n, r, i] = t; return { x: e, y: n, w: r, h: i }; } }; if (e && typeof e == "object") { let n = Array.isArray(e.selector) ? e.selector.find((e) => e.type === "FragmentSelector") : e.selector?.type === "FragmentSelector" ? e.selector : null; if (n?.value) return t(n.value); } if (typeof e == "string") { let n = e.split("#")[1]; if (n?.startsWith("xywh=")) return t(n); } }, O = (e) => { let t = []; return new d({ annotation: [(e) => { if (e.motivation === "painting" || !e.motivation) { let n = e.body ? Array.isArray(e.body) ? e.body : [e.body] : [], r = D(e.target), i = n.filter((e) => e.type === "Image"); t.push(...i.map((e) => E(e, r))); } }] }).traverseCanvas(e), t; }, k = (e) => () => { let t = /* @__PURE__ */ new Map(), n = (e, r, i = 0) => { let a = { id: e.id, type: "range", source: e, children: [], navItems: [], navSections: [], parent: r, level: i, getLabel: e.getLabel }; e.items && e.items.length > 0 && e.items.forEach((e) => { if (e.source.type === "Range") { let t = n(e, a, i + 1); a.children.push(t); } else { let n = { id: e.id, type: "canvas", source: e, children: [], navItems: [], navSections: [], parent: a, level: i + 1, getLabel: e.getLabel }; a.children.push(n), t.set(n.id, n); } }); let o = a.children.map((e) => e.type === "canvas" ? e.source : e.children.length === 1 && e.children[0].type === "canvas" ? e.children[0].source : e.source), s = o.filter((e) => e.source.type === "Canvas"), c = o.filter((e) => e.source.type === "Range"); return a.navItems.push(...s), a.navSections.push(...c), t.set(a.id, a), a; }; return { root: e.filter((e) => e.source.behavior?.includes("top")).map((e) => n(e, void 0)), enumerateNodes: (e) => { let n = Array.from(t.values()); return e ? n.filter((t) => t.type === e) : n; }, getBreadcrumbs: (e) => { let n = t.get(e); if (!n) return []; let r = (e, t = []) => e.parent ? r(e.parent, [e, ...t]) : [e, ...t]; return r(n); }, getNavParent: (e) => { let n = t.get(e); if (!n || n.type !== "canvas" || n.parent?.type !== "range") return; let { parent: r } = n; return r.children.length === 1 && r.children[0].type === "canvas" ? r.parent?.type === "range" ? r.parent.source : void 0 : r.source; }, getNode: (e) => t.get(e) }; }; //#endregion export { d as _, b as a, i as b, x as c, g as d, v as f, p as g, f as h, C as i, y as l, h as m, O as n, w as o, m as p, T as r, S as s, k as t, _ as u, o as v, a as y };