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
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
|
|
|