diff --git a/src/service/FilenameParser.js b/src/service/FilenameParser.js index 77b580f..b79b8bd 100644 --- a/src/service/FilenameParser.js +++ b/src/service/FilenameParser.js @@ -37,6 +37,27 @@ const namePos = { dn: 2 }; +/** + * Remove leading zeroes + * from canvas and image file + * name segments (parts) + * @see getCanvasName() + * @see ManifestBuilder.getImageName() + * @param {String} segment + */ +const normaliseSegment = (segment) => { + segment.replaceAll(/^([a-z]+)?0*(\d+)/ig, '$1$2'); +} +/** + * Normalize a full canvas name + * @param {String} name + */ +const normaliseName = (name) => { + // Account for separate parts in name + // and rejoin them after normalisation + name.split('&').map(normaliseSegment).join('&'); +} + /** * @param {string} imgFilename * @returns {ParsedMetadata} @@ -180,15 +201,31 @@ export function getCanvasName(imgFilename, technique) { canvasName += imgFilename.split('_')[3].replace(/\..*$/,''); } - // Check if name is of `fr01&02` type... - let names = canvasName.split('&'); + return normaliseName(canvasName); +} +/** + * Get image name for given canvas + * @param {Canvas} canvas The Canvas object + * @returns {string} + */ +async function getImageName(canvas) { + const images = await getImageList(canvas.resourceId); + let adjustedCanvasName = canvas.name; - // Remove leading zeroes everywhere - names = names.map(name => name.replaceAll(/^([a-z]+)?0*(\d+)/ig, '$1$2')); - // Rejoin if needed... - canvasName = names.join('&'); + // Adjust canvas name for HSI with PCA... + if (/pc(1|3)/.test(canvas.name)) { + adjustedCanvasName = canvas.name.replace( + /pc((1|3))/, + function (match, group1) { + return `_HSI_PC${group1}`; + } + ); + } - return canvasName; + return images.filter(i => { + const segment = i.split('_')[namePos[canvas.technique]]; + return normaliseName(segment) === adjustedCanvasName; + }); } /** * Generate canvas label from canvasName diff --git a/src/service/ManifestBuilder.js b/src/service/ManifestBuilder.js index 494d8fd..d729bd5 100644 --- a/src/service/ManifestBuilder.js +++ b/src/service/ManifestBuilder.js @@ -52,7 +52,7 @@ export async function buildManifest(manifestId) { export async function buildCanvas(manifestId, name) { const manifest = new Manifest(IIIF_API_VERSION, BASE_URL); manifest.generateID(manifestId); - let filename = await getImageName(name, manifestId); + let filename = await getImageName(name, manifest); return createCanvas(manifest, filename); } @@ -143,7 +143,6 @@ async function populateCanvases (manifest, images) { } /** * Get image name for given canvas - * @todo Use regex in filter!! * @param {String} name The canvas name * @param {String} manifestId The manifest (resource) id * @returns {string}