Skip to content

Commit 2d9c425

Browse files
Mattia VianelliMattia Vianelli
authored andcommitted
DSC-2212 Updated rendering for the item-search-result-list-element.component.ts to use a pipe for the html escaping
1 parent 889bace commit 2d9c425

4 files changed

Lines changed: 32 additions & 8 deletions

File tree

src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323
<ds-truncatable [id]="dso.id" *ngIf="object !== undefined && object !== null">
2424
<a *ngIf="linkType !== linkTypes.None" [target]="(linkType === linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType === linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
2525
[routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out"
26-
[innerHTML]="dsoTitle" role="link" tabindex="0"></a>
26+
[innerHTML]="dsoTitle | dsEscapeHtml" role="link" tabindex="0"></a>
2727
<span *ngIf="linkType === linkTypes.None" class="lead item-list-title dont-break-out"
28-
[innerHTML]="dsoTitle"></span>
28+
[innerHTML]="dsoTitle | dsEscapeHtml"></span>
2929
<ds-in-workflow-statistics *ngIf="showWorkflowStatistics" [item]="dso"></ds-in-workflow-statistics>
3030
<span class="text-muted">
3131
<ds-truncatable-part [id]="dso.id" [minLines]="1">

src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import { MetricBadgesComponent } from '../../../../metric-badges/metric-badges.c
5757
import { MetricDonutsComponent } from '../../../../metric-donuts/metric-donuts.component';
5858
import { AdditionalMetadataComponent } from '../../../additional-metadata/additional-metadata.component';
5959
import { SearchResultListElementComponent } from '../../../search-result-list-element.component';
60+
import {EscapeHtmlPipe} from "../../../../../utils/escape-html.pipe";
6061

6162
@listableObjectComponent('PublicationSearchResult', ViewMode.ListElement)
6263
@listableObjectComponent(ItemSearchResult, ViewMode.ListElement)
@@ -66,7 +67,7 @@ import { SearchResultListElementComponent } from '../../../search-result-list-el
6667
styleUrls: ['./item-search-result-list-element.component.scss'],
6768
templateUrl: './item-search-result-list-element.component.html',
6869
standalone: true,
69-
imports: [NgIf, RouterLink, ThemedThumbnailComponent, NgClass, ThemedBadgesComponent, TruncatableComponent, TruncatablePartComponent, NgFor, AsyncPipe, TranslateModule, AdditionalMetadataComponent, MetadataLinkViewComponent, MetricBadgesComponent, MetricDonutsComponent, VarDirective, InWorkflowStatisticsComponent],
70+
imports: [NgIf, RouterLink, ThemedThumbnailComponent, NgClass, ThemedBadgesComponent, TruncatableComponent, TruncatablePartComponent, NgFor, AsyncPipe, TranslateModule, AdditionalMetadataComponent, MetadataLinkViewComponent, MetricBadgesComponent, MetricDonutsComponent, VarDirective, InWorkflowStatisticsComponent, EscapeHtmlPipe],
7071
})
7172
/**
7273
* The component for displaying a list element for an item search result of the type Publication
@@ -107,10 +108,6 @@ export class ItemSearchResultListElementComponent extends SearchResultListElemen
107108
ngOnInit(): void {
108109
super.ngOnInit();
109110
this.itemPageRoute = getItemPageRoute(this.dso);
110-
// Escape < and > in dsoTitle if it exists
111-
if (this.dsoTitle) {
112-
this.dsoTitle = this.dsoTitle.replace(/</g, '&lt;').replace(/>/g, '&gt;');
113-
}
114111
}
115112

116113
/**
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import {
2+
Pipe,
3+
PipeTransform,
4+
} from '@angular/core';
5+
6+
@Pipe({
7+
name: 'dsEscapeHtml',
8+
standalone: true,
9+
})
10+
export class EscapeHtmlPipe implements PipeTransform {
11+
/**
12+
* Escape HTML special characters and convert newlines to <br>
13+
* @param value - The string to escape
14+
* @returns The escaped string safe for innerHTML rendering
15+
*/
16+
transform(value: string): string {
17+
if (!value) {
18+
return value;
19+
}
20+
const newlineRegex = /\n/g;
21+
return value
22+
.replace(/>/g, '&gt;')
23+
.replace(/</g, '&lt;')
24+
.replace(newlineRegex, '<br>');
25+
}
26+
}

src/themes/custom/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { AdditionalMetadataComponent } from '../../../../../../../../../app/shar
2121
import { ItemSearchResultListElementComponent as BaseComponent } from '../../../../../../../../../app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component';
2222
import { TruncatableComponent } from '../../../../../../../../../app/shared/truncatable/truncatable.component';
2323
import { TruncatablePartComponent } from '../../../../../../../../../app/shared/truncatable/truncatable-part/truncatable-part.component';
24+
import { EscapeHtmlPipe } from '../../../../../../../../../app/shared/utils/escape-html.pipe';
2425
import { ThemedThumbnailComponent } from '../../../../../../../../../app/thumbnail/themed-thumbnail.component';
2526

2627
@listableObjectComponent('PublicationSearchResult', ViewMode.ListElement, Context.Any, 'custom')
@@ -32,7 +33,7 @@ import { ThemedThumbnailComponent } from '../../../../../../../../../app/thumbna
3233
// templateUrl: './item-search-result-list-element.component.html',
3334
templateUrl: '../../../../../../../../../app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html',
3435
standalone: true,
35-
imports: [NgIf, RouterLink, ThemedThumbnailComponent, NgClass, ThemedBadgesComponent, TruncatableComponent, TruncatablePartComponent, NgFor, AsyncPipe, TranslateModule, AdditionalMetadataComponent, MetadataLinkViewComponent, MetricBadgesComponent, MetricDonutsComponent, InWorkflowStatisticsComponent],
36+
imports: [NgIf, RouterLink, ThemedThumbnailComponent, NgClass, ThemedBadgesComponent, TruncatableComponent, TruncatablePartComponent, NgFor, AsyncPipe, TranslateModule, AdditionalMetadataComponent, MetadataLinkViewComponent, MetricBadgesComponent, MetricDonutsComponent, InWorkflowStatisticsComponent, EscapeHtmlPipe],
3637

3738
})
3839
export class ItemSearchResultListElementComponent extends BaseComponent {

0 commit comments

Comments
 (0)