From 58041aa23a68d4e34b7b2423968fed00625f5d7a Mon Sep 17 00:00:00 2001 From: jojohoch <joachim.hoch@iqb.hu-berlin.de> Date: Thu, 6 Jan 2022 08:40:38 +0100 Subject: [PATCH] [player] Remove unused code for underlining text This disables the possibility of nested markers --- .../marking-bar/marking-bar.component.ts | 2 +- .../common/ui-elements/text/text.component.ts | 2 +- .../element-container.component.ts | 2 +- .../src/app/services/marking.service.ts | 78 ++++++------------- 4 files changed, 27 insertions(+), 57 deletions(-) diff --git a/projects/common/components/marking-bar/marking-bar.component.ts b/projects/common/components/marking-bar/marking-bar.component.ts index f325874c8..5b76b20fe 100644 --- a/projects/common/components/marking-bar/marking-bar.component.ts +++ b/projects/common/components/marking-bar/marking-bar.component.ts @@ -43,7 +43,7 @@ export class MarkingBarComponent { @Input() element!: HTMLElement; @Input() elementModel!: TextElement; @Output() applySelection = new EventEmitter<{ - mode: 'mark' | 'underline' | 'delete', + mode: 'mark' | 'delete', color: string, element: HTMLElement }>(); diff --git a/projects/common/ui-elements/text/text.component.ts b/projects/common/ui-elements/text/text.component.ts index 3e652ce6d..be5b2d981 100644 --- a/projects/common/ui-elements/text/text.component.ts +++ b/projects/common/ui-elements/text/text.component.ts @@ -49,7 +49,7 @@ export class TextComponent extends ElementComponent { @Output() elementValueChanged = new EventEmitter<ValueChangeElement>(); @Output() startSelection = new EventEmitter<MouseEvent>(); @Output() applySelection = new EventEmitter<{ - mode: 'mark' | 'underline' | 'delete', + mode: 'mark' | 'delete', color: string, element: HTMLElement }>(); diff --git a/projects/player/src/app/components/element-container/element-container.component.ts b/projects/player/src/app/components/element-container/element-container.component.ts index 6c1192a88..9dbe5b3da 100644 --- a/projects/player/src/app/components/element-container/element-container.component.ts +++ b/projects/player/src/app/components/element-container/element-container.component.ts @@ -187,7 +187,7 @@ export class ElementContainerComponent implements OnInit { .pipe(takeUntil(this.ngUnsubscribe)) .subscribe((selection: { - mode: 'mark' | 'underline' | 'delete', + mode: 'mark' | 'delete', color: string; element: HTMLElement; }) => { diff --git a/projects/player/src/app/services/marking.service.ts b/projects/player/src/app/services/marking.service.ts index 74754ef2f..345434184 100644 --- a/projects/player/src/app/services/marking.service.ts +++ b/projects/player/src/app/services/marking.service.ts @@ -6,9 +6,8 @@ import { TextComponent } from '../../../../common/ui-elements/text/text.componen }) export class MarkingService { private static readonly MARKING_TAG = 'ASPECT-MARKED'; - private static readonly UNDERLINE_TAG = 'ASPECT-UNDERLINED'; - applySelection(mode: 'mark' | 'underline' | 'delete', + applySelection(mode: 'mark' | 'delete', color: string, element: HTMLElement, textComponent: TextComponent): void { @@ -17,8 +16,7 @@ export class MarkingService { const range = selection.getRangeAt(0); if (this.isDescendantOf(range.startContainer, element) && this.isDescendantOf(range.endContainer, element)) { - const markMode = mode === 'mark' ? 'marked' : 'underlined'; - this.applyRange(range, selection, mode === 'delete', color, markMode); + this.applyRange(range, selection, mode === 'delete', color); textComponent.elementValueChanged.emit({ id: textComponent.elementModel.id, values: [this.getMarkingData(textComponent.elementModel.text as string), @@ -102,13 +100,13 @@ export class MarkingService { } private applyRange( - range: Range, selection: Selection, clear: boolean, color: string, markMode: 'marked' | 'underlined' + range: Range, selection: Selection, clear: boolean, color: string ): void { if (range.startContainer === range.endContainer) { if (clear) { this.clearMarkingFromNode(range); } else { - this.markNode(range, color, markMode); + this.markNode(range, color); } } else { // When the user finishes selecting between paragraphs and the selection happens from @@ -117,16 +115,15 @@ export class MarkingService { const nodes: Node[] = [range.startContainer]; this.findNodes(range.commonAncestorContainer.childNodes, nodes, selection); if (clear) { - this.clearMarkingFromNodes(nodes, range); + this.clearNodes(nodes, range); } else { - this.markNodes(nodes, range, color, markMode); + this.markNodes(nodes, range, color); } } } private clearMarkingFromNode(range: Range): void { - if (range.startContainer.parentElement?.tagName?.toUpperCase() === MarkingService.MARKING_TAG || - range.startContainer.parentElement?.tagName?.toUpperCase() === MarkingService.UNDERLINE_TAG) { + if (range.startContainer.parentElement?.tagName?.toUpperCase() === MarkingService.MARKING_TAG) { const previousText = range.startContainer.nodeValue?.substring(0, range.startOffset) || ''; const text = range.startContainer.nodeValue?.substring(range.startOffset, range.endOffset) || ''; const nextText = range.startContainer.nodeValue?.substring(range.endOffset) || ''; @@ -136,31 +133,14 @@ export class MarkingService { } } - private clearMarkingFromNodes(nodes: Node[], range: Range): void { - const nestedMarkedNodes = nodes - .filter(node => node.parentElement?.parentElement?.tagName.toUpperCase() === MarkingService.MARKING_TAG); - const nestedUnderLinedNodes = nodes - .filter(node => node.parentElement?.parentElement?.tagName.toUpperCase() === MarkingService.UNDERLINE_TAG); - if (nestedUnderLinedNodes.length) { - this.clearNodes(nestedUnderLinedNodes, range, nodes); - } else if (nestedMarkedNodes.length) { - this.clearNodes(nestedMarkedNodes, range, nodes); - } else { - this.clearNodes(nodes, range, nodes); - } - } - private clearMarking(node: Node, text: string, previousText: string, nextText: string) { const textElement = document.createTextNode(text as string); if (node.parentNode) { const { parentNode } = node.parentNode; - const markMode = - node.parentElement?.tagName.toUpperCase() === MarkingService.MARKING_TAG ? 'marked' : 'underlined'; - const color = - markMode === 'underlined' ? 'black' : (node.parentNode as HTMLElement).style.backgroundColor || 'none'; + const color = (node.parentNode as HTMLElement).style.backgroundColor || 'none'; parentNode?.replaceChild(textElement, node.parentNode); if (previousText) { - const prev = this.createMarkedElement(color, markMode); + const prev = this.createMarkedElement(color); prev.append(document.createTextNode(previousText)); parentNode?.insertBefore(prev, textElement); } @@ -170,18 +150,17 @@ export class MarkingService { // In Firefox this always (in Chrome sometimes) leads // to a misinterpretation of the selection. Therefore, the offset // is manipulated. - const end = this.createMarkedElement(color, markMode); + const end = this.createMarkedElement(color); end.append(document.createTextNode(nextText)); parentNode?.insertBefore(end, textElement.nextSibling); } } } - private clearNodes(nodes: Node[], range: Range, allNodes: Node[]): void { + private clearNodes(nodes: Node[], range: Range): void { nodes.forEach((node: Node) => { - const index = allNodes.findIndex(rangeNode => rangeNode === node); - if (node.parentElement?.tagName.toUpperCase() === MarkingService.MARKING_TAG || - node.parentElement?.tagName.toUpperCase() === MarkingService.UNDERLINE_TAG) { + const index = nodes.findIndex(rangeNode => rangeNode === node); + if (node.parentElement?.tagName.toUpperCase() === MarkingService.MARKING_TAG) { const nodeValues = this.getNodeValues(node, nodes, index, range); if (nodeValues.text) { this.clearMarking(node, nodeValues.text, nodeValues.previousText, nodeValues.nextText); @@ -194,9 +173,9 @@ export class MarkingService { } private mark( - node: Node, text: string, previousText: string, nextText: string, color: string, markMode: 'marked' | 'underlined' + node: Node, text: string, previousText: string, nextText: string, color: string ): void { - const markedElement: HTMLElement = this.createMarkedElement(color, markMode); + const markedElement: HTMLElement = this.createMarkedElement(color); markedElement.append(document.createTextNode(text)); // important! const { parentNode } = node; @@ -233,34 +212,25 @@ export class MarkingService { return { text, previousText, nextText }; }; - private markNode(range: Range, color: string, markMode: 'marked' | 'underlined'): void { - if (range.startContainer.parentElement?.tagName.toUpperCase() !== MarkingService.MARKING_TAG || - range.startContainer.parentElement?.tagName.toUpperCase() !== MarkingService.UNDERLINE_TAG) { - const markedElement: HTMLElement = this.createMarkedElement(color, markMode); + private markNode(range: Range, color: string): void { + if (range.startContainer.parentElement?.tagName.toUpperCase() !== MarkingService.MARKING_TAG) { + const markedElement: HTMLElement = this.createMarkedElement(color); range.surroundContents(markedElement); } } - private markNodes(nodes: Node[], range: Range, color: string, markMode: 'marked' | 'underlined'): void { + private markNodes(nodes: Node[], range: Range, color: string): void { nodes.forEach((node, index) => { const nodeValues = this.getNodeValues(node, nodes, index, range); - if (nodeValues.text && node.parentElement?.tagName.toUpperCase() !== MarkingService.MARKING_TAG && - (nodeValues.text && node.parentElement?.tagName.toUpperCase() !== MarkingService.UNDERLINE_TAG) - ) { - this.mark(node, nodeValues.text, nodeValues.previousText, nodeValues.nextText, color, markMode); + if (nodeValues.text && node.parentElement?.tagName.toUpperCase() !== MarkingService.MARKING_TAG) { + this.mark(node, nodeValues.text, nodeValues.previousText, nodeValues.nextText, color); } }); } - private createMarkedElement = (color: string, markMode: 'marked' | 'underlined'): HTMLElement => { - let markedElement; - if (markMode === 'marked') { - markedElement = document.createElement(MarkingService.MARKING_TAG); - markedElement.style.backgroundColor = color; - } else { - markedElement = document.createElement(MarkingService.UNDERLINE_TAG); - markedElement.style.textDecoration = `underline solid ${color}`; - } + private createMarkedElement = (color: string): HTMLElement => { + const markedElement = document.createElement(MarkingService.MARKING_TAG); + markedElement.style.backgroundColor = color; return markedElement; }; -- GitLab