You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
4.6 KiB

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