From 8fc7914eee929d4dd9efea6d44fa5f25e6e5d796 Mon Sep 17 00:00:00 2001 From: Dustin Davis Date: Tue, 30 May 2023 10:32:39 -0600 Subject: [PATCH 1/2] Fix search highlight phrases function --- src/helpers/highlight-phrases.test.ts | 22 ++++++++++++++++++++ src/helpers/highlight-phrases.ts | 29 +++++++++++++++------------ 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/helpers/highlight-phrases.test.ts b/src/helpers/highlight-phrases.test.ts index 90cfed1c..4f43a2ed 100644 --- a/src/helpers/highlight-phrases.test.ts +++ b/src/helpers/highlight-phrases.test.ts @@ -13,4 +13,26 @@ describe('Highlight Search Phrases Helper', () => { const empty = highlightSearchPhrases(searchPhrases); expect(empty).toEqual(''); }); + + it('should should not highlight span tags', () => { + const searchPhrases = ['pan', 'span', 'color']; + const desc = 'Peter Pan'; + const highlighted = highlightSearchPhrases(searchPhrases, desc); + expect(highlighted).toEqual('Peter Pan'); + const empty = highlightSearchPhrases(searchPhrases); + expect(empty).toEqual(''); + }); + + it('should escape html characters', () => { + const searchPhrases = ['dumb', 'and']; + const desc = 'Dumb & Dumber '; + const highlighted = highlightSearchPhrases(searchPhrases, desc); + expect(highlighted).toEqual( + 'Dumb ' + + '& ' + + 'Dumber <HD>', + ); + const empty = highlightSearchPhrases(searchPhrases); + expect(empty).toEqual(''); + }); }); diff --git a/src/helpers/highlight-phrases.ts b/src/helpers/highlight-phrases.ts index 64b26c3a..36ed2409 100644 --- a/src/helpers/highlight-phrases.ts +++ b/src/helpers/highlight-phrases.ts @@ -1,14 +1,17 @@ -export const highlightSearchPhrases = (searchPhrases: string[], matchAgainst?: string): string => { - let title = matchAgainst || ''; - title = title - .replace('&', '&') - .replace('<', '<') - .replace('>', '>'); - if (searchPhrases && searchPhrases.length > 0) { - searchPhrases.forEach(sp => { - const regEx = new RegExp(sp, 'gi'); - title = title.replace(regEx, '$&'); - }); +export function highlightSearchPhrases(searchPhrases: string[], desc: string = ''): string { + if (desc === '') { + return ''; } - return title; -}; + + const openTag = ''; + const closeTag = ''; + + let highlightedDesc = _.escape(desc); + + searchPhrases.forEach(phrase => { + const regex = new RegExp(`(${phrase})(?![^<]*>|[^<>]*<\/)`, 'gi'); + highlightedDesc = highlightedDesc.replace(regex, `${openTag}$1${closeTag}`); + }); + + return highlightedDesc; +} From b278d1153e3368de7c703c7afccfa32916ca1ac5 Mon Sep 17 00:00:00 2001 From: Dustin Davis Date: Tue, 30 May 2023 10:36:29 -0600 Subject: [PATCH 2/2] Update version --- dev-app/app.html | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-app/app.html b/dev-app/app.html index ce467aae..107e78fe 100644 --- a/dev-app/app.html +++ b/dev-app/app.html @@ -52,7 +52,7 @@ diff --git a/package.json b/package.json index 3382f48f..dbd588b1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@bindable-ui/bindable", "description": "An Aurelia component library", - "version": "1.12.0", + "version": "1.12.1", "repository": { "type": "git", "url": "https://github.com/bindable-ui/bindable"