From 5eecb737afdb2509eac4c4e41a7fc4c2cec5d239 Mon Sep 17 00:00:00 2001 From: EthanHealy01 Date: Wed, 17 Sep 2025 20:06:54 +0100 Subject: [PATCH] make a util for page selection --- .../tools/removePages/RemovePagesSettings.tsx | 24 +----------------- .../removePages/useRemovePagesParameters.ts | 24 +----------------- frontend/src/utils/pageSelection.ts | 25 +++++++++++++++++++ 3 files changed, 27 insertions(+), 46 deletions(-) create mode 100644 frontend/src/utils/pageSelection.ts diff --git a/frontend/src/components/tools/removePages/RemovePagesSettings.tsx b/frontend/src/components/tools/removePages/RemovePagesSettings.tsx index 3ffa115d9..99856e29c 100644 --- a/frontend/src/components/tools/removePages/RemovePagesSettings.tsx +++ b/frontend/src/components/tools/removePages/RemovePagesSettings.tsx @@ -1,6 +1,7 @@ import { Stack, TextInput } from "@mantine/core"; import { useTranslation } from "react-i18next"; import { RemovePagesParameters } from "../../../hooks/tools/removePages/useRemovePagesParameters"; +import { validatePageNumbers } from "../../../utils/pageSelection"; interface RemovePagesSettingsProps { parameters: RemovePagesParameters; @@ -8,29 +9,6 @@ interface RemovePagesSettingsProps { disabled?: boolean; } -// Validation function for page numbers (same as in parameters hook) -const validatePageNumbers = (pageNumbers: string): boolean => { - if (!pageNumbers.trim()) return false; - - // Normalize input for validation: remove spaces around commas and other spaces - const normalized = pageNumbers.replace(/\s*,\s*/g, ',').replace(/\s+/g, ''); - const parts = normalized.split(','); - - // Regular expressions for different page number formats - const singlePageRegex = /^\d+$/; // Single page: 1, 2, 3, etc. - const rangeRegex = /^\d+-\d*$/; // Range: 1-5, 10-, etc. - const negativeRegex = /^-\d+$/; // Negative: -3 (last 3 pages) - const mathRegex = /^\d*[n]\d*[+\-*/]\d+$/; // Mathematical: 2n+1, n-1, etc. - - return parts.every(part => { - if (!part) return false; - return singlePageRegex.test(part) || - rangeRegex.test(part) || - negativeRegex.test(part) || - mathRegex.test(part); - }); -}; - const RemovePagesSettings = ({ parameters, onParameterChange, disabled = false }: RemovePagesSettingsProps) => { const { t } = useTranslation(); diff --git a/frontend/src/hooks/tools/removePages/useRemovePagesParameters.ts b/frontend/src/hooks/tools/removePages/useRemovePagesParameters.ts index cdbb03eef..31484f54e 100644 --- a/frontend/src/hooks/tools/removePages/useRemovePagesParameters.ts +++ b/frontend/src/hooks/tools/removePages/useRemovePagesParameters.ts @@ -1,5 +1,6 @@ import { BaseParameters } from '../../../types/parameters'; import { useBaseParameters, BaseParametersHook } from '../shared/useBaseParameters'; +import { validatePageNumbers } from '../../../utils/pageSelection'; export interface RemovePagesParameters extends BaseParameters { pageNumbers: string; // comma-separated page numbers or ranges (e.g., "1,3,5-8") @@ -11,29 +12,6 @@ export const defaultParameters: RemovePagesParameters = { export type RemovePagesParametersHook = BaseParametersHook; -// Validation function for page numbers -const validatePageNumbers = (pageNumbers: string): boolean => { - if (!pageNumbers.trim()) return false; - - // Normalize input for validation: remove spaces around commas and other spaces - const normalized = pageNumbers.replace(/\s*,\s*/g, ',').replace(/\s+/g, ''); - const parts = normalized.split(','); - - // Regular expressions for different page number formats - const singlePageRegex = /^\d+$/; // Single page: 1, 2, 3, etc. - const rangeRegex = /^\d+-\d*$/; // Range: 1-5, 10-, etc. - const negativeRegex = /^-\d+$/; // Negative: -3 (last 3 pages) - const mathRegex = /^\d*[n]\d*[+\-*/]\d+$/; // Mathematical: 2n+1, n-1, etc. - - return parts.every(part => { - if (!part) return false; - return singlePageRegex.test(part) || - rangeRegex.test(part) || - negativeRegex.test(part) || - mathRegex.test(part); - }); -}; - export const useRemovePagesParameters = (): RemovePagesParametersHook => { return useBaseParameters({ defaultParameters, diff --git a/frontend/src/utils/pageSelection.ts b/frontend/src/utils/pageSelection.ts new file mode 100644 index 000000000..9684d9609 --- /dev/null +++ b/frontend/src/utils/pageSelection.ts @@ -0,0 +1,25 @@ +export const validatePageNumbers = (pageNumbers: string): boolean => { + if (!pageNumbers.trim()) return false; + + // Normalize input for validation: remove spaces around commas and other spaces + const normalized = pageNumbers.replace(/\s*,\s*/g, ',').replace(/\s+/g, ''); + const parts = normalized.split(','); + + // Regular expressions for different page number formats + const singlePageRegex = /^\d+$/; // Single page: 1, 2, 3, etc. + const rangeRegex = /^\d+-\d*$/; // Range: 1-5, 10-, etc. + const negativeRegex = /^-\d+$/; // Negative: -3 (last 3 pages) + const mathRegex = /^\d*[n]\d*[+\-*/]\d+$/; // Mathematical: 2n+1, n-1, etc. + + return parts.every(part => { + if (!part) return false; + return ( + singlePageRegex.test(part) || + rangeRegex.test(part) || + negativeRegex.test(part) || + mathRegex.test(part) + ); + }); +}; + +