diff --git a/src/components/library/useGetVisibleLibraryMangas.ts b/src/components/library/useGetVisibleLibraryMangas.ts index fb6a78e9..af1beece 100644 --- a/src/components/library/useGetVisibleLibraryMangas.ts +++ b/src/components/library/useGetVisibleLibraryMangas.ts @@ -13,6 +13,7 @@ import { useLibraryOptionsContext } from '@/components/context/LibraryOptionsCon import { useMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts'; import { ChapterType, MangaType, TrackRecordType } from '@/lib/graphql/generated/graphql.ts'; import { MangaIdInfo } from '@/lib/data/Mangas.ts'; +import { baseCleanup, enhancedCleanup } from '@/lib/data/Strings.ts'; const triStateFilter = ( triState: NullAndUndefined, @@ -46,14 +47,27 @@ const triStateFilterBoolean = (triState: NullAndUndefined, status?: boo type TMangaQueryFilter = Pick; const queryFilter = (query: NullAndUndefined, { title }: TMangaQueryFilter): boolean => { if (!query) return true; - return title.toLowerCase().includes(query.toLowerCase()); + + const cleanupQuery = baseCleanup(query); + + return baseCleanup(title).includes(cleanupQuery) || enhancedCleanup(title).includes(cleanupQuery); }; type TMangaQueryGenreFilter = Pick; -const queryGenreFilter = (query: NullAndUndefined, { genre }: TMangaQueryGenreFilter): boolean => { +const queryGenreFilter = (query: NullAndUndefined, { genre: mangaGenres }: TMangaQueryGenreFilter): boolean => { if (!query) return true; - const queries = query.split(',').map((str) => str.toLowerCase().trim()); - return queries.every((element) => genre.map((el) => el.toLowerCase()).includes(element)); + + const genreQueries = query.split(',').map(baseCleanup); + const genres = mangaGenres + .map((genre) => { + const baseCleanedUpGenre = baseCleanup(genre); + const fullyCleanedUpGenre = enhancedCleanup(baseCleanedUpGenre); + + return `${baseCleanedUpGenre}, ${fullyCleanedUpGenre}`; + }) + .join(', '); + + return genreQueries.every((genreQuery) => genres.includes(genreQuery)); }; type TMangaTrackerFilter = { trackRecords: { nodes: Pick[] } }; diff --git a/src/lib/data/Strings.ts b/src/lib/data/Strings.ts new file mode 100644 index 00000000..8c5dfbfa --- /dev/null +++ b/src/lib/data/Strings.ts @@ -0,0 +1,11 @@ +/* + * Copyright (C) Contributors to the Suwayomi project + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +export const baseCleanup = (str: string) => str.toLowerCase().trim(); + +export const enhancedCleanup = (str: string): string => baseCleanup(str).replace(/[^a-zA-Z0-9]/g, ''); diff --git a/src/screens/settings/LibraryDuplicates.tsx b/src/screens/settings/LibraryDuplicates.tsx index e4ffc67a..e2572ebb 100644 --- a/src/screens/settings/LibraryDuplicates.tsx +++ b/src/screens/settings/LibraryDuplicates.tsx @@ -35,17 +35,12 @@ import { GET_MANGAS_DUPLICATES } from '@/lib/graphql/queries/MangaQuery.ts'; import { BaseMangaGrid } from '@/components/source/BaseMangaGrid.tsx'; import { IMangaGridProps } from '@/components/MangaGrid.tsx'; import { StyledGroupItemWrapper } from '@/components/virtuoso/StyledGroupItemWrapper.tsx'; - -const cleanupTitle = (title: string): string => - title - .toLowerCase() - .trim() - .replace(/[^a-zA-Z0-9]/g, ''); +import { enhancedCleanup } from '@/lib/data/Strings.ts'; const findDuplicatesByTitle = >( libraryMangas: Manga[], ): Record => { - const titleToMangas = Object.groupBy(libraryMangas, ({ title }) => cleanupTitle(title)); + const titleToMangas = Object.groupBy(libraryMangas, ({ title }) => enhancedCleanup(title)); return Object.fromEntries( Object.entries(titleToMangas) @@ -62,7 +57,7 @@ const findDuplicatesByTitleAndAlternativeTitles = > = {}; libraryMangas.forEach((mangaToCheck) => { - const titleToCheck = cleanupTitle(mangaToCheck.title); + const titleToCheck = enhancedCleanup(mangaToCheck.title); titleToMangas[titleToCheck] ??= new Set(); titleToMangas[titleToCheck].add(mangaToCheck); @@ -76,8 +71,8 @@ const findDuplicatesByTitleAndAlternativeTitles =