diff --git a/src/app/components/shared/tag-cloud/tag-cloud.component.ts b/src/app/components/shared/tag-cloud/tag-cloud.component.ts index 9515eec1bae969a021716c2d6830d2c4a36b9aaa..73765a66b5e184e8b6def8046e1e7e28e543b9a0 100644 --- a/src/app/components/shared/tag-cloud/tag-cloud.component.ts +++ b/src/app/components/shared/tag-cloud/tag-cloud.component.ts @@ -23,7 +23,7 @@ import { ThemeService } from '../../../../theme/theme.service'; import { TopicCloudAdministrationComponent } from '../_dialogs/topic-cloud-administration/topic-cloud-administration.component'; import { WsCommentService } from '../../../services/websockets/ws-comment.service'; import { CreateCommentWrapper } from '../../../utils/create-comment-wrapper'; -import { TopicCloudAdminService } from '../../../services/util/topic-cloud-admin.service'; +import { regexMaskKeyword, TopicCloudAdminService } from '../../../services/util/topic-cloud-admin.service'; import { TagCloudPopUpComponent } from './tag-cloud-pop-up/tag-cloud-pop-up.component'; import { TagCloudDataService, TagCloudDataTagEntry } from '../../../services/util/tag-cloud-data.service'; import { WsRoomService } from '../../../services/websockets/ws-room.service'; @@ -318,7 +318,8 @@ export class TagCloudComponent implements OnInit, OnDestroy, AfterContentInit { if (rotation === null || this._currentSettings.randomAngles) { rotation = Math.floor(Math.random() * 30 - 15); } - const filteredTag = tag.replace(maskedCharsRegex, '').trim(); + const filteredTag = tag.replace(maskedCharsRegex, '') + .replace(regexMaskKeyword, '').replace(/ +/, ' ').trim(); newElements.push(new TagComment(filteredTag, tag, rotation, tagData.weight, tagData, newElements.length)); } } diff --git a/src/app/services/util/profanity-filter.service.ts b/src/app/services/util/profanity-filter.service.ts index c77e5bd5eb45437f03204879db9bea16ea08ad82..3d710236f1c748f182ee6de2f2463f3ed72e834b 100644 --- a/src/app/services/util/profanity-filter.service.ts +++ b/src/app/services/util/profanity-filter.service.ts @@ -70,34 +70,33 @@ export class ProfanityFilterService { censorPartialWordsCheck: boolean, censorLanguageSpecificCheck: boolean, lang?: string): [string, boolean] { - let filteredString = str; - let profWords = []; + let profWords: any[]; if (censorLanguageSpecificCheck) { profWords = BadWords[(lang !== 'AUTO' ? lang.toLowerCase() : localStorage.getItem('currentLang'))]; } else { profWords = this.profanityWords; } - str = str.replace(new RegExp(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi), ''); - const toCensoredString = censorPartialWordsCheck ? str.toLowerCase() : str.toLowerCase().split(/[\s,.]+/); + const list = profWords.concat(this.getProfanityListFromStorage()); + if (list.length < 1) { + return [str, false]; + } + const escapeRegex = /[.*+\-?^${}()|\[\]\\]/g; + const censoredWords = list + .reduce((acc, elem) => acc + (acc.length > 1 ? '|' : '') + elem.replace(escapeRegex, '\\$&'), '(') + ')'; + const regex = new RegExp(censorPartialWordsCheck ? censoredWords : '\\b' + censoredWords + '\\b', 'gmi'); + let result = ''; let censored = false; - profWords.concat(this.getProfanityListFromStorage()).forEach(word => { - if (toCensoredString.includes(word)) { - filteredString = this.replaceString(filteredString, word, this.generateCensoredWord(word.length)); - censored = true; + let m: RegExpExecArray; + let lastIndex = 0; + while ((m = regex.exec(str)) !== null) { + result += str.substring(lastIndex, m.index) + '*'.repeat(regex.lastIndex - m.index); + lastIndex = regex.lastIndex; + censored = true; + if (m.index === regex.lastIndex) { + regex.lastIndex++; } - }); - return [filteredString, censored]; - } - - private replaceString(str: string, search: string, replace: string) { - return str.replace(new RegExp(search, 'gi'), replace); - } - - private generateCensoredWord(count: number) { - let res = ''; - for (let i = 0; i < count; i++) { - res += '*'; } - return res; + result += str.substring(lastIndex); + return [result, censored]; } } diff --git a/src/app/services/util/topic-cloud-admin.service.ts b/src/app/services/util/topic-cloud-admin.service.ts index bcd43931b9af8300960728f5a55e255a05d755e3..0ab7787b47a6d2078eeb16671339589aa0daf15e 100644 --- a/src/app/services/util/topic-cloud-admin.service.ts +++ b/src/app/services/util/topic-cloud-admin.service.ts @@ -17,6 +17,8 @@ import { UserRole } from '../../models/user-roles.enum'; import { CloudParameters } from '../../utils/cloud-parameters'; import { RoomDataService } from './room-data.service'; +export const regexMaskKeyword = /\b(frage|antwort|aufgabe|hallo|test|bzw|muss|more to come)\b/gmi; + @Injectable({ providedIn: 'root', }) @@ -59,7 +61,6 @@ export class TopicCloudAdminService { roomDataService: RoomDataService, config: TopicCloudAdminData, keywordFunc: (SpacyKeyword, boolean) => void) { - const regexMaskKeyword = /\b(frage|antwort|aufgabe|hallo|test|bzw|muss|more to come)\b/gmi; let source = comment.keywordsFromQuestioner; let censored = roomDataService.getCensoredInformation(comment).userKeywordsCensored; let isFromQuestioner = true; @@ -80,8 +81,7 @@ export class TopicCloudAdminService { const wantedLabels = config.wantedLabels[comment.language.toLowerCase()]; for (let i = 0; i < source.length; i++) { const keyword = source[i]; - keyword.text = keyword.text.replace(regexMaskKeyword, '').replace(/ +/, ' '); - if (keyword.text.trim().length < 1) { + if (keyword.text.replace(regexMaskKeyword, '').replace(/ +/, ' ').trim().length < 3) { continue; } if (censored[i]) {