in pathology/viewer/src/interfaces/dicomweb.ts [54:101]
export function parseDICOMwebUrl(url: string): DicomWebUrlConfig {
// This pattern allows for optional groups for the base URL, studyUID,
// seriesUID, and instanceUID
const baseUrlWhenResourcePresentRegex = /^([^?]*?)\/(?:studies|series|instances|rs)/; // *? -> non-greedy
const studyUIDRegex = /(?:^|\/)studies\/([0-9.]+)/;
const seriesUIDRegex = /(?:^|\/)series\/([0-9.]+)/;
const instanceUIDRegex = /(?:^|\/)instances\/([0-9.]+)/;
const queryParamsRegex = /\?(.*)$/;
// Match each part using the regex patterns
const baseUrlMatch = url.match(baseUrlWhenResourcePresentRegex);
const studyUIDMatch = url.match(studyUIDRegex);
const seriesUIDMatch = url.match(seriesUIDRegex);
const instanceUIDMatch = url.match(instanceUIDRegex);
const queryParamsMatch = url.match(queryParamsRegex);
// Extract the matched parts or set them as null if not found
const baseUrl =
baseUrlMatch ? baseUrlMatch[1] : url;
const studyUID = studyUIDMatch ? studyUIDMatch[1] : undefined;
const seriesUID = seriesUIDMatch ? seriesUIDMatch[1] : undefined;
const instanceUID = instanceUIDMatch ? instanceUIDMatch[1] : undefined;
const queryParamsString = queryParamsMatch ? queryParamsMatch[1] : undefined;
// Parse query params into an object
const queryParams = queryParamsString ?
queryParamsString.split('&').reduce(
(acc: { [k: string]: string }, param) => {
const [key, value] = param.split('=');
acc[key] = value;
return acc;
},
{}) :
undefined;
const path = {
...(studyUID && { studyUID }),
...(seriesUID && { seriesUID }),
...(instanceUID && { instanceUID })
};
// Return an object with the captured values, omitting unavailable
return {
...(baseUrl && { baseUrl }),
...(path && { path }),
...(queryParams && { queryParams })
};
}