Spaces:
Runtime error
Runtime error
from typing import List, Union | |
def parse_page_ranges(page_string: str, num_pages:int, max_pages: int) -> List[int]: | |
""" | |
Parse a string of page ranges and return a list of valid page numbers. | |
Args: | |
page_string (str): A string containing page ranges (e.g., "1-3,5,7-9"). | |
max_pages (int): The maximum number of pages allowed. | |
Returns: | |
List[int]: A sorted list of unique, valid page numbers. | |
Raises: | |
TypeError: If page_string is not a string or max_pages is not an integer. | |
ValueError: If max_pages is not positive or if the input string is invalid. | |
""" | |
def validate_and_parse_range(range_str: str) -> List[int]: | |
""" | |
Validate and parse a single range string. | |
Args: | |
range_str (str): A string representing a single range (e.g., "1-3" or "5"). | |
Returns: | |
List[int]: A list of page numbers in the range. | |
Raises: | |
ValueError: If the range string is invalid. | |
""" | |
try: | |
if '-' in range_str: | |
start, end = map(int, range_str.split('-')) | |
if start > end: | |
raise ValueError(f"Invalid range: {range_str}") | |
return list(range(max(0, start), end+1)) | |
else: | |
page = int(range_str) | |
return [page] | |
except ValueError as e: | |
raise ValueError(f"Invalid input: {range_str}") from e | |
try: | |
# Input validation | |
if not isinstance(page_string, str): | |
raise TypeError("page_string must be a string") | |
if not isinstance(max_pages, int): | |
raise TypeError("max_pages must be an integer") | |
if max_pages <= 0: | |
raise ValueError("max_pages must be a positive integer") | |
# Remove whitespace and split into individual ranges | |
page_ranges = page_string.replace(' ', '').split(',') | |
result = [] | |
for page_range in page_ranges: | |
pages = validate_and_parse_range(page_range) | |
for page in pages: | |
if page not in result and page>=0 and page <= num_pages: | |
result.append(page-1) | |
# If no valid pages were found, return the default range | |
return sorted(result[:max_pages]) if result else list(range(0, min(max_pages, num_pages))) | |
except (TypeError, ValueError) as e: | |
# Log the error (you might want to use a proper logging system here) | |
print(f"Error parsing page ranges: {str(e)}") | |
# Return default list in case of any exception | |
return list(range(0, min(num_pages,max_pages))) |