from .data import pokemon_generations, main_line_games, shiftable_forms import unicodedata import re def format_pokemon_id(national_dex: int, region_code: int, form_index: int, gender_code: int) -> str: return f"{national_dex:04d}-{region_code:02d}-{form_index:03d}-{gender_code}" def parse_pfic(pfic): parts = pfic.split('-') return tuple(int(part) if part.isdigit() else part for part in parts) def compare_pokemon_forms(a, b): if a == b: return True if a == None or b == None: return False temp_a = a.lower().replace("forme", "").replace("form", "").replace("é", "e").strip() temp_b = b.lower().replace("forme", "").replace("form", "").replace("é", "e").strip() # Common spelling mistakes temp_a = temp_a.replace("deputante", "debutante").replace("p'au", "pa'u").replace("blood moon", "bloodmoon") temp_b = temp_b.replace("deputante", "debutante").replace("p'au", "pa'u").replace("blood moon", "bloodmoon") if temp_a == temp_b: return True return False def get_generation_from_national_dex(national_dex_number): generation = 1 for gen in pokemon_generations: if pokemon_generations[gen]["min"] <= national_dex_number <= pokemon_generations[gen]["max"]: generation = gen break return generation def sanitise_pokemon_name_for_url(pokemon_name): pokemon_url_name = pokemon_name.replace("♀", "-f").replace("♂", "-m").replace("'", "").replace(".", "").replace('é', 'e').replace(':', '') pokemon_url_name = pokemon_url_name.replace(" ", "-") return pokemon_url_name def remove_accents(input_str): nfkd_form = unicodedata.normalize('NFKD', input_str) return u"".join([c for c in nfkd_form if not unicodedata.combining(c)]) def find_game_generation(game_name: str) -> int: game_name = game_name.lower() for game in main_line_games: if game_name == game["Name"].lower() or game_name in (name.lower() for name in game["AltNames"]): return game["Generation"] return None def is_mainline_game(game_name: str): game_name = game_name.lower() for game in main_line_games: if game_name == game["Name"].lower() or game_name in (name.lower() for name in game["AltNames"]): return game return None def find_match_in_string_array(search_string, string_array): return next((item for item in string_array if item.lower() == search_string.lower()), None) def sanitize_filename(filename): # Define a dictionary of symbol replacements symbol_replacements = { '?': 'questionmark', '*': 'asterisk', ':': 'colon', '/': 'slash', '\\': 'backslash', '|': 'pipe', '<': 'lessthan', '>': 'greaterthan', '"': 'quote', ' ': '_' } # Replace symbols with their word equivalents for symbol, word in symbol_replacements.items(): filename = filename.replace(symbol, word) # Remove any remaining invalid characters return re.sub(r'[<>:"/\\|?*]', '', filename) def get_objects_by_number(array, target_number): return [obj for obj in array if obj['number'] == target_number] def get_display_name(pokemon, strip_gender = False): display_name = f"{pokemon["national_dex"]:04d} - {pokemon["name"]}" form = get_form_name(pokemon, strip_gender) if form: display_name += f" ({form})" return display_name def get_form_name(pokemon, strip_gender = False): if pokemon["form_name"]: form = pokemon["form_name"] if strip_gender: form = form.replace("Female", "").replace("Male", "").strip() if form != "": return form return None def extract_bracketed_text(string): results = [] stack = [] start_index = -1 for i, char in enumerate(string): if char == '(': if not stack: start_index = i stack.append(i) elif char == ')': if stack: stack.pop() if not stack: results.append(string[start_index + 1:i]) start_index = -1 else: #logger.warning(f"Warning: Unmatched closing parenthesis at position {i}") pass # Handle any remaining unclosed brackets if stack: #logger.warning(f"Warning: {len(stack)} unmatched opening parentheses") for unmatched_start in stack: results.append(string[unmatched_start + 1:]) return results def get_shiftable_forms(pfic): forms = [] for form_pair in shiftable_forms: if pfic == form_pair["from_pfic"]: forms.append(form_pair) return forms def get_shiftable_forms_bidirectional(pfic): forms = [] for form_pair in shiftable_forms: if pfic == form_pair["from_pfic"] or pfic == form_pair["to_pfic"]: forms.append(form_pair) return forms