import re F = {'F': 'codex:federal:start', 'I': 'codex:imperial:start', 'A': 'codex:alliance:start'} C = {'ACH': 'achilles_corporation', 'SIR': 'sirius_corporation', 'FDL': 'faulcon_delacy', 'LAK': 'lakon_spaceways', 'ZP': 'zorgon_peterson', 'AZ': 'azimuth_biotech', 'BR': 'brewer_corporation', 'UC': 'universal_cartographics', 'GU': 'gutamaya', 'CD': 'core_dynamics', 'SUP': 'supratech', 'VG': 'vista_genomics', 'VO': 'vodel', 'WR': 'wreaken', 'MM': 'mastopolos_mining', 'RCI': 'rackham_capital_investments', 'TM': 'torval_mining', 'MAN': 'manticore', 'CMA': 'caine-massey', 'HM': 'herculean_machines'} C = {k: 'codex:corporations:' + v for k, v in C.items()} P = {'pa': 'aden_tanner', 'ad': 'aisling_duval', 'at': 'alba_tesreau', 'ald': 'arissa_lavigny-duval', 'del': 'archon_delaine', 'dp': 'denton_patreus', 'em': 'edmund_mahon', 'fw': 'felicia_winters', 'ip': 'ishmael_palin', 'ly': 'li_yong-rui', 'pan': 'pranav_antal', 'yg': 'yuri_grom', 'zh': 'zachary_hudson', 'zt': 'zemina_torval', 'ja': 'jerome_archer', 'nk': 'nakato_kaine', 'sj': 'seo_jin-ae', 'ir': 'isolde_rochester', 'mp': 'maxine_patro', 'tr': 'torben_rademaker', 'mt': 'madelyn_teague', 'tt': 'terri_tora', 'fr': 'frank_raddix', 'lo': 'lexi_october', 'zr': 'zachary_rackham', 'lz': 'lady_zi', 'sal': 'salvation', 'js': 'jade_sanderlyn', 'hd': 'hadrian_duval', 'fl': 'florence_lavigny', 'ac': 'angela_corcoran', 'mf': 'maximo_fonseca'} P = {k: 'codex:person:' + v for k, v in P.items()} P['rt'] = 'hangar:engineers:ram_tah' X = {'AE': 'codex:misc:aegis', 'TH': 'galaxy:aliens:thargoids:start', 'GD': 'galaxy:aliens:guardians:start', 'GU': 'galaxy:aliens:guardians:start', 'PF': 'codex:misc:pilotenvereinigung', 'UT': 'codex:misc:utopia', 'KC': 'codex:misc:kumo_crew', 'OC': 'codex:misc:october_consortium', 'FS': 'codex:misc:frontline_solutions', 'COLO': 'codex:misc:colonia', 'FG': 'codex:misc:order_of_the_far_god', 'GENSHIP': 'codex:misc:genship'} S = {'TW': 'thargoid_war', 'SCO': 'supercruise_overcharge', 'WP': 'winters_presidency', 'HC': 'herman_colt', 'PP': 'powerplay', 'COL': 'colonisation', 'HIP': 'hip_87621', 'DW3': 'distant_worlds_3', 'ZI': 'lady_zi', 'C10': 'colonia_anniversary', 'WEL': 'wellness_trend', 'SAL': 'salvation', 'FG': 'far_god', 'CM': 'caine_massey_assassination', 'CN': 'california_nebula', 'IF': 'imperial_family', 'GS': 'grey_swan', 'SP': 'sirius_defence_pact'} S = {k: 'stories:storyline:' + v for k, v in S.items()} R = {'py2': 'python_mk2', 't8': 'type-8_transporter', 'man': 'mandalay', 'corsair': 'corsair', 'cobra_mk5': 'cobra_mk5', 'panther': 'panther_clipper_mk2', 't11': 'type-11_prospector', 'caspian': 'caspian_explorer', 'kestrel': 'kestrel_mk2', 'lynx': 'lynx_highliner', 'nomad': 'nomad', 'ana2': 'anaconda_mk2'} R = {k: 'hangar:ships:' + v for k, v in R.items()} def sys_id(name): return 'galaxy:systems:' + re.sub(r'_+', '_', re.sub(r'[^a-z0-9.\-]', '_', name.lower())).strip('_') def expand(spec): f, c, p, s, x, st, r = spec m = lambda d, v: [d[k] for k in v.split()] return dict(factions=m(F, f), corporations=m(C, c), persons=m(P, p), systems=[sys_id(n.strip()) for n in s.split(';') if n.strip()], codex=sorted(set(m(X, x))), storyline=m(S, st), related=m(R, r))