1e51ef7def
- Konzept/, didaktik_geografie/, didaktik_simulation/, v2-modules/, v2-platform/ - 12 code-workspace-Files - STATUS-*.md - viele M/D/R-Änderungen an bereits getrackten Files - .gitignore verstärkt: **/.humaninput/, **/secret_keys.txt Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
121 lines
4.0 KiB
Python
121 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Killt 'Christophorus' und 'OEAMTC/ÖAMTC' aus audio-texts.json.
|
|
Ersetzt mit Ortsname + NATO-Callsign aus heli-callsigns.json.
|
|
|
|
Logik:
|
|
- 'ÖAMTC Christophorus <wort/zahl>' → '<nato>' (z.B. 'X-Ray Echo November')
|
|
- 'Christophorus <wort/zahl>' allgemein → '<nato>'
|
|
- SONDERFALL r_mission_start_mN: '<Station>, <nato>' (Ort wird genannt — Mission-Opening)
|
|
Ausnahme: wenn Station == Tower-Prefix (z.B. Innsbruck/Innsbruck Tower) -> nur '<nato>'
|
|
|
|
Schreibt audio-texts.json (Backup: audio-texts.json.bak-pre-christo-kill).
|
|
Berührt KEINE MP3s.
|
|
"""
|
|
import json, re, os, shutil, sys
|
|
|
|
REPO = 'C:/xampp/htdocs/geograsim/App/sims/heli'
|
|
TEXTS_FILE = REPO + '/scripts/audio-texts.json'
|
|
CALLSIGNS_FILE = REPO + '/data/heli-callsigns.json'
|
|
BAK = TEXTS_FILE + '.bak-pre-christo-kill'
|
|
|
|
with open(TEXTS_FILE, 'r', encoding='utf-8') as f:
|
|
texts = json.load(f)
|
|
with open(CALLSIGNS_FILE, 'r', encoding='utf-8') as f:
|
|
cs = json.load(f)
|
|
|
|
mapping = cs['mapping']
|
|
z2h = cs['_zahl_zu_helikey']
|
|
|
|
z2h_clean = {k: v for k, v in z2h.items() if not k.startswith('_')}
|
|
word_to_h = {k.lower(): v for k, v in z2h_clean.items()}
|
|
digits_word = {'eins':'1','zwei':'2','drei':'3','vier':'4','fuenf':'5',
|
|
'sechs':'6','sieben':'7','acht':'8','neun':'9','zehn':'10',
|
|
'elf':'11','zwoelf':'12','vierzehn':'14','sechzehn':'16'}
|
|
digit_to_h = {}
|
|
for w, h in z2h_clean.items():
|
|
digit_to_h[digits_word[w]] = h
|
|
|
|
if not os.path.exists(BAK):
|
|
shutil.copy(TEXTS_FILE, BAK)
|
|
print(f'Backup -> {BAK}')
|
|
|
|
def normalize(s):
|
|
return s.lower().replace('ä','ae').replace('ö','oe').replace('ü','ue').replace('ß','ss')
|
|
|
|
def lookup(token):
|
|
t = normalize(token)
|
|
if t in word_to_h:
|
|
return word_to_h[t]
|
|
if token in digit_to_h:
|
|
return digit_to_h[token]
|
|
return None
|
|
|
|
def replace_one(aid, text):
|
|
if 'Christophorus' not in text and 'ÖAMTC' not in text and 'OEAMTC' not in text:
|
|
return text, 0
|
|
count = 0
|
|
is_mission_start = aid.startswith('r_mission_start_')
|
|
|
|
def repl_oeamtc_christo(m):
|
|
nonlocal count
|
|
token = m.group(1)
|
|
h = lookup(token)
|
|
if not h or h not in mapping:
|
|
return m.group(0)
|
|
count += 1
|
|
return mapping[h]['nato']
|
|
|
|
def repl_christo(m):
|
|
nonlocal count
|
|
token = m.group(1)
|
|
h = lookup(token)
|
|
if not h or h not in mapping:
|
|
return m.group(0)
|
|
count += 1
|
|
st = mapping[h]['station']
|
|
nato = mapping[h]['nato']
|
|
tower = mapping[h]['tower']
|
|
if is_mission_start:
|
|
tower_prefix = tower.split()[0]
|
|
if st.split()[0] != tower_prefix:
|
|
return f'{st}, {nato}'
|
|
return nato
|
|
|
|
out = re.sub(r'(?:ÖAMTC|OEAMTC)\s+Christophorus\s+([0-9]+|[A-Za-zÄÖÜäöüß]+)', repl_oeamtc_christo, text)
|
|
out = re.sub(r'Christophorus\s+([0-9]+|[A-Za-zÄÖÜäöüß]+)', repl_christo, out)
|
|
# Reste-Cleanup: '(ÖAMTC)' Klammer-Annotation entfernen, plus doppelte Spaces fixen
|
|
before = out
|
|
out = re.sub(r'\s*\((?:ÖAMTC|OEAMTC)\)', '', out)
|
|
if out != before:
|
|
count += 1
|
|
out = re.sub(r' +', ' ', out)
|
|
return out, count
|
|
|
|
total = 0
|
|
changed = []
|
|
for aid, txt in list(texts.items()):
|
|
if aid.startswith('_'):
|
|
continue
|
|
if not isinstance(txt, str):
|
|
continue
|
|
new_txt, n = replace_one(aid, txt)
|
|
if n > 0:
|
|
texts[aid] = new_txt
|
|
total += n
|
|
changed.append(aid)
|
|
|
|
with open(TEXTS_FILE, 'w', encoding='utf-8') as f:
|
|
json.dump(texts, f, indent=2, ensure_ascii=False)
|
|
|
|
print(f'Ersetzungen: {total} in {len(changed)} Eintraegen\n')
|
|
print('--- Beispiele ---')
|
|
samples = ['r_mission_start_m1','r_mission_start_m2','r_mission_start_m4','r_mission_start_m17',
|
|
'r_nav_heli_intro_c8','r_pilot_call_c8','r_tower_approach_c1','r_tower_extract_c1',
|
|
'r_tower_geo_m1','r_tower_handover_c8','r_tower_start_c8','r_tower_strike_c6',
|
|
'r_wp_geo_graz_c12','r_wp_geo_klagenfurt_c11']
|
|
for s in samples:
|
|
if s in texts:
|
|
print(f' {s}:')
|
|
print(f' {texts[s][:200]}')
|