mirror of
https://github.com/veekun/pokedex.git
synced 2024-08-20 18:16:34 +00:00
105 lines
3.8 KiB
Python
105 lines
3.8 KiB
Python
|
#!/usr/bin/env python2
|
|||
|
# encoding: utf-8
|
|||
|
# Adds locations to the database from the text dump.
|
|||
|
#
|
|||
|
# Usage: python add-oras-locations.py | psql pokedex
|
|||
|
|
|||
|
import os
|
|||
|
import re
|
|||
|
import io
|
|||
|
|
|||
|
def make_identifier(name):
|
|||
|
"""Make a string safe to use as an identifier.
|
|||
|
|
|||
|
Valid characters are lowercase alphanumerics and "-". This function may
|
|||
|
raise ValueError if it can't come up with a suitable identifier.
|
|||
|
|
|||
|
This function is useful for scripts which add things with names.
|
|||
|
"""
|
|||
|
if isinstance(name, bytes):
|
|||
|
identifier = name.decode('utf-8')
|
|||
|
else:
|
|||
|
identifier = name
|
|||
|
identifier = identifier.lower()
|
|||
|
identifier = identifier.replace(u'+', u' plus ')
|
|||
|
identifier = re.sub(u'[ _–]+', u'-', identifier)
|
|||
|
identifier = re.sub(u"['./;’(),:]", u'', identifier)
|
|||
|
identifier = identifier.replace(u'é', u'e')
|
|||
|
|
|||
|
if identifier == '???':
|
|||
|
identifier = 'inside-of-truck'
|
|||
|
|
|||
|
if not identifier.replace(u"-", u"").isalnum():
|
|||
|
raise ValueError(identifier)
|
|||
|
return identifier
|
|||
|
|
|||
|
ROOT = os.path.expanduser("~/xy/orips/text")
|
|||
|
|
|||
|
en = io.open(os.path.join(ROOT, 'en/90'), encoding='utf-8')
|
|||
|
|
|||
|
lang_idents = {
|
|||
|
'ja-kana': 'ja-Hrkt',
|
|||
|
'ja-kanji': 'ja',
|
|||
|
}
|
|||
|
|
|||
|
foreign = []
|
|||
|
for lang in 'ja-kana', 'ja-kanji', 'en', 'fr', 'it', 'de', 'es', 'ko':
|
|||
|
f = io.open(os.path.join(ROOT, lang, '90'), encoding='utf-8')
|
|||
|
foreign.append((lang_idents.get(lang, lang), f))
|
|||
|
|
|||
|
REGION_ID = 3
|
|||
|
GENERATION_ID = 6
|
|||
|
START_LINE = 170 # locations before this line were from X/Y
|
|||
|
|
|||
|
import pokedex.db
|
|||
|
import pokedex.db.tables as t
|
|||
|
session = pokedex.db.connect("postgresql:///pokedex")
|
|||
|
existing_location_ids = set(x for x, in session.query(t.Location.identifier).all())
|
|||
|
#print(existing_location_ids)
|
|||
|
|
|||
|
print("BEGIN;")
|
|||
|
print("SELECT setval('locations_id_seq', max(id)) FROM locations;")
|
|||
|
for i, name in enumerate(en):
|
|||
|
foreign_names = [(lang, next(iter).strip()) for lang, iter in foreign]
|
|||
|
if i == 0:
|
|||
|
continue
|
|||
|
if i < START_LINE:
|
|||
|
continue
|
|||
|
if name == '\n':
|
|||
|
continue
|
|||
|
try:
|
|||
|
ident = make_identifier(name.strip())
|
|||
|
except ValueError:
|
|||
|
continue
|
|||
|
if ident == 'safari-zone':
|
|||
|
ident = 'hoenn-safari-zone'
|
|||
|
elif ident == 'victory-road':
|
|||
|
ident = 'hoenn-victory-road'
|
|||
|
elif ident == 'pokemon-league':
|
|||
|
ident = 'hoenn-pokemon-league'
|
|||
|
elif ident.startswith("route-"):
|
|||
|
ident = 'hoenn-' + ident
|
|||
|
|
|||
|
print("\echo '%s'" % ident)
|
|||
|
if ident in ('mystery-zone', 'faraway-place'):
|
|||
|
## standard locations
|
|||
|
pass
|
|||
|
elif ident in existing_location_ids:
|
|||
|
## location already exists from R/S,
|
|||
|
## so keep the existing location and just replace the names
|
|||
|
|
|||
|
print("""DELETE FROM location_names WHERE location_id = (SELECT id FROM locations where identifier = '%s');""" % ident)
|
|||
|
else:
|
|||
|
## new location
|
|||
|
print("""INSERT INTO locations (identifier, region_id) VALUES ('%s', %s) RETURNING id;""" % (ident, REGION_ID))
|
|||
|
|
|||
|
for lang, name in foreign_names:
|
|||
|
print("""INSERT INTO location_names (location_id, local_language_id, name) SELECT loc.id, lang.id, '%s' FROM locations loc, languages lang WHERE loc.identifier = '%s' AND (loc.region_id is NULL OR loc.region_id = %d) AND lang.identifier = '%s';""" % (name.encode("utf-8"), ident.encode("utf-8"), REGION_ID, lang))
|
|||
|
|
|||
|
print("""INSERT INTO location_game_indices (location_id, generation_id, game_index) SELECT id, %s, %s FROM locations WHERE identifier='%s' AND (region_id is NULL OR region_id = %d) ON CONFLICT DO NOTHING;""" % (GENERATION_ID, i, ident.encode("utf-8"), REGION_ID))
|
|||
|
|
|||
|
#for pokemon_id, location_identifier in (462, 'kalos-route-13'), (470, 'kalos-route-20'), (471, 'frost-cavern'), (476, 'kalos-route-13'):
|
|||
|
# print("UPDATE pokemon_evolution SET location_id = (SELECT id FROM locations WHERE identifier = '%s') WHERE location_id is NULL AND evolved_species_id = %d;" % (location_identifier, pokemon_id))
|
|||
|
|
|||
|
print("COMMIT;")
|