diff --git a/src/app/core/data/dspace-rest-response-parsing.service.ts b/src/app/core/data/dspace-rest-response-parsing.service.ts index 81c432e31e..2fda0bf40a 100644 --- a/src/app/core/data/dspace-rest-response-parsing.service.ts +++ b/src/app/core/data/dspace-rest-response-parsing.service.ts @@ -15,7 +15,8 @@ import { Injectable } from '@angular/core'; import { ResponseParsingService } from './parsing.service'; import { ParsedResponse } from '../cache/response.models'; import { RestRequestMethod } from './rest-request-method'; -import { getUrlWithoutEmbedParams } from '../index/index.selectors'; +import { getUrlWithoutEmbedParams, getEmbedSizeParams } from '../index/index.selectors'; +import { URLCombiner } from '../url-combiner/url-combiner'; /* tslint:disable:max-classes-per-file */ @@ -86,6 +87,8 @@ export class DspaceRestResponseParsingService implements ResponseParsingService } public process(data: any, request: RestRequest, alternativeURL?: string): any { + const embedSizeParams = getEmbedSizeParams(request.href); + if (isNotEmpty(data)) { if (hasNoValue(data) || (typeof data !== 'object')) { return data; @@ -100,7 +103,13 @@ export class DspaceRestResponseParsingService implements ResponseParsingService .keys(data._embedded) .filter((property) => data._embedded.hasOwnProperty(property)) .forEach((property) => { - this.process(data._embedded[property], request, data._links[property].href); + let embedAltUrl = data._links[property].href; + const match = embedSizeParams + .find((param: { name: string, size: number }) => param.name === property); + if (hasValue(match)) { + embedAltUrl = new URLCombiner(embedAltUrl, `?size=${match.size}`).toString(); + } + this.process(data._embedded[property], request, embedAltUrl); }); } diff --git a/src/app/core/index/index.selectors.ts b/src/app/core/index/index.selectors.ts index 40c870b2d1..9b57064388 100644 --- a/src/app/core/index/index.selectors.ts +++ b/src/app/core/index/index.selectors.ts @@ -24,7 +24,7 @@ export const getUrlWithoutEmbedParams = (url: string): string => { if (isNotEmpty(parsed.query)) { const parts = parsed.query.split(/[?|&]/) .filter((part: string) => isNotEmpty(part)) - .filter((part: string) => !part.startsWith('embed=')); + .filter((part: string) => !(part.startsWith('embed=') || part.startsWith('embed.size='))); let args = ''; if (isNotEmpty(parts)) { args = `?${parts.join('&')}`; @@ -37,6 +37,27 @@ export const getUrlWithoutEmbedParams = (url: string): string => { return url; }; +/** + * Parse the embed size params from a url + * @param url The url to parse + */ +export const getEmbedSizeParams = (url: string): { name: string, size: number }[] => { + if (isNotEmpty(url)) { + const parsed = parse(url); + if (isNotEmpty(parsed.query)) { + return parsed.query.split(/[?|&]/) + .filter((part: string) => isNotEmpty(part)) + .map((part: string) => part.match(/^embed.size=([^=]+)=(\d+)$/)) + .filter((matches: RegExpMatchArray) => hasValue(matches) && hasValue(matches[1]) && hasValue(matches[2])) + .map((matches: RegExpMatchArray) => { + return { name: matches[1], size: Number(matches[2]) }; + }); + } + } + + return []; +}; + /** * Return the MetaIndexState based on the CoreSate *