gen-slides / utils.py
imkhan107's picture
Upload 8 files
6787477 verified
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)))