diff --git a/docs/release-notes-player.md b/docs/release-notes-player.md index ee7edd466667fd4c9ffe9a030560981bba46628a..6d5a81482261747489274d3c963f571d7c65e1f5 100644 --- a/docs/release-notes-player.md +++ b/docs/release-notes-player.md @@ -1,5 +1,9 @@ Player ====== +## 2.6.4 +### Fehlerbehebungen +- Fasst aufeinanderfolgende markierte Wörter in den Antwortdaten von Texten zu Bereichen zusammen + ## 2.6.0 ### Neue Funktionen - Unterstützt Verona API 6.0 diff --git a/projects/player/src/app/classes/markable-support.ts b/projects/player/src/app/classes/markable-support.ts index b03c4b36af891efaa979d1c97d203ebf93f1bba6..f3f61d183e8fb27f7bfdd6b9a3fd4394e37390d9 100644 --- a/projects/player/src/app/classes/markable-support.ts +++ b/projects/player/src/app/classes/markable-support.ts @@ -25,12 +25,25 @@ export class MarkableSupport { createMarkables(savedMarks: string[], elementComponent: TextComponent): void { const nodes = MarkableSupport.getNodes(elementComponent.textContainerRef.nativeElement.childNodes); - const markablesContainers = MarkableSupport.getMarkablesContainers(nodes, savedMarks); + const markablesContainers = MarkableSupport + .getMarkablesContainers(nodes, MarkableSupport.expandSavedMarks(savedMarks)); const markables = markablesContainers .flatMap((markablesContainer: MarkablesContainer) => markablesContainer.markables); this.createComponents(markablesContainers, elementComponent, markables); } + private static expandSavedMarks(savedMarks: string[]): string[] { + return savedMarks.flatMap(range => { + const [start, end, color] = range.split('-'); + const startIndex = parseInt(start, 10); + const endIndex = parseInt(end, 10); + return Array.from({ length: endIndex - startIndex + 1 }, (_, i) => { + const currentIdx = startIndex + i; + return `${currentIdx}-${currentIdx}-${color}`; + }); + }); + } + private createComponents(markablesContainers: MarkablesContainer[], elementComponent: TextComponent, markables: Markable[]): void { diff --git a/projects/player/src/app/services/element-model-element-code-mapping.service.ts b/projects/player/src/app/services/element-model-element-code-mapping.service.ts index 616c0cb4b6d72c040a652bd3af633b6c7a03ae2b..e53144c95e14fdc3baec54effdd33c822bb04b3c 100644 --- a/projects/player/src/app/services/element-model-element-code-mapping.service.ts +++ b/projects/player/src/app/services/element-model-element-code-mapping.service.ts @@ -101,7 +101,7 @@ export class ElementModelElementCodeMappingService { } if (options && (options.markingMode === 'word' || options.markingMode === 'range')) { return ElementModelElementCodeMappingService - .getMarkedMarkables(elementModelValue as Markable[]); + .getMarkedMarkablesInSelectionFormat(elementModelValue as Markable[]); } return []; case 'radio': @@ -119,14 +119,22 @@ export class ElementModelElementCodeMappingService { return this.dragNDropValueObjects.find(dropListValue => dropListValue.alias === alias); } - static getMarkedMarkables(markables: Markable[]): string[] { + static getMarkedMarkablesInSelectionFormat(markables: Markable[]): string[] { return markables .filter((markable: Markable) => !!markable.color) - .map((markable: Markable) => ElementModelElementCodeMappingService - .mapToTextSelectionFormat(markable, markable.color)); - } - - private static mapToTextSelectionFormat(markable: Markable, color: string | null): string { - return `${markable.id}-${markable.id}-${color}`; + .reduce((acc: [number, number, (string | null)][], markable: Markable) => { + const [start, end, color] = [markable.id, markable.id, markable.color]; + const lastEntry = acc[acc.length - 1]; + if (lastEntry) { + const [lastStart, lastEnd, lastColor] = lastEntry; + if (lastColor === color && +lastEnd + 1 === +start) { + acc[acc.length - 1] = [lastStart, end, color]; + return acc; + } + } + acc.push([start, end, color]); + return acc; + }, []) + .map(e => `${e[0]}-${e[1]}-${e[2]}`); } }