Files
geograsim/App/sims/heli/scripts/kill-christo-bulk.py
T
Adminator 1e51ef7def Nachtrag: alle bisher untracked Ordner + hängende Änderungen mit-committen
- 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>
2026-07-08 02:27:02 +02:00

146 lines
4.6 KiB
Python

#!/usr/bin/env python3
"""
Bulk-Cleanup von 'ÖAMTC'/'OEAMTC'/'Christophorus N' in user-sichtbaren Files.
Strategie:
1) ' (ÖAMTC)' / ' (OEAMTC)' Suffix wird gestripped (z.B. 'C8 Nenzing (ÖAMTC)' -> 'C8 Nenzing')
2) 'ÖAMTC Christophorus N' / 'OEAMTC Christophorus N' -> '<station> <callsign>'
3) 'Christophorus N' / 'Christophorus <wort>' -> '<station> <callsign>'
4) Klammer-Annotation '(ÖAMTC)' / '(OEAMTC)' allein -> ''
5) Restliches alleinstehendes 'ÖAMTC' / 'OEAMTC' -> 'Notarzt-Heli' (Legende)
Schreibt .bak-pre-christo-bulk fuer jede beruehrte Datei.
"""
import json, re, os, sys
REPO = 'C:/xampp/htdocs/geograsim/App'
CS_FILE = REPO + '/sims/heli/data/heli-callsigns.json'
cs = json.load(open(CS_FILE, encoding='utf-8'))
mapping = cs['mapping']
zah2hel = {k: v for k, v in cs['_zahl_zu_helikey'].items() if not k.startswith('_')}
# Fallback Stationsdaten fuer Helis die NICHT im Pool sind (C15 Ybbsitz, C17 Vomp)
EXTRA = {
'13': ('Wiener Neustadt', 'OE-XAU'), # Polizei nominally
'15': ('Ybbsitz', 'OE-XSA'),
'17': ('Vomp', 'OE-XAB'),
}
def normalize(s):
return s.lower().replace('ä','ae').replace('ö','oe').replace('ü','ue').replace('ß','ss')
def by_digit(n):
h = 'c' + str(n)
if h in mapping:
return f"{mapping[h]['station']} {mapping[h]['callsign']}"
if str(n) in EXTRA:
st, cs_ = EXTRA[str(n)]
return f"{st} {cs_}"
return f"C{n}" # generischer Fallback
def by_word(w):
w_n = normalize(w)
if w_n in zah2hel:
h = zah2hel[w_n]
if h in mapping:
return f"{mapping[h]['station']} {mapping[h]['callsign']}"
return None
def clean(text):
n = 0
# Step 1: ' (ÖAMTC)' / ' (OEAMTC)' suffix
def repl1(m):
nonlocal n; n += 1; return ''
text = re.sub(r' \((?:ÖAMTC|OEAMTC)\)', repl1, text)
# Step 2: 'ÖAMTC Christophorus N' / 'OEAMTC Christophorus N'
def repl2(m):
nonlocal n
r = by_digit(m.group(1))
if r: n += 1; return r
return m.group(0)
text = re.sub(r'(?:ÖAMTC|OEAMTC)\s+Christophorus\s+(\d+)', repl2, text)
# Step 3a: 'Christophorus N' (digit)
def repl3a(m):
nonlocal n
r = by_digit(m.group(1))
if r: n += 1; return r
return m.group(0)
text = re.sub(r'Christophorus\s+(\d+)', repl3a, text)
# Step 3b: 'Christophorus <wort>'
def repl3b(m):
nonlocal n
r = by_word(m.group(1))
if r: n += 1; return r
return m.group(0)
text = re.sub(r'Christophorus\s+([A-Za-zÄÖÜäöüß]+)', repl3b, text)
# Step 4: '(ÖAMTC)' allein (ohne fuehrendes Space)
def repl4(m):
nonlocal n; n += 1; return ''
text = re.sub(r'\((?:ÖAMTC|OEAMTC)\)', repl4, text)
# Step 5: 'ÖAMTC Christophorus' OHNE Zahl/Wort (vor ' raus)
def repl5a(m):
nonlocal n; n += 1; return 'Notarzt-Heli'
text = re.sub(r'(?:ÖAMTC|OEAMTC)\s+Christophorus(?=\W|$)', repl5a, text)
# Step 5b: einsamer 'Christophorus' (Restposten)
def repl5b(m):
nonlocal n; n += 1; return 'Notarzt-Heli'
text = re.sub(r'\bChristophorus\b', repl5b, text)
# Step 6: alleinstehendes 'ÖAMTC' (Legende, Label) -> 'Notarzt-Heli'
def repl6(m):
nonlocal n; n += 1; return 'Notarzt-Heli'
text = re.sub(r'\b(?:ÖAMTC|OEAMTC)\b', repl6, text)
# Zwei aufeinanderfolgende Spaces vermeiden
text = re.sub(r' +', ' ', text)
return text, n
TARGETS = [
'/sims/heli/waypoints.js',
'/sims/heli/start.html',
'/sims/heli/landing.html',
'/sims/heli/audio-matrix.html',
'/sims/heli/audio-overview.html',
'/heli.html',
'/pages/heli-uebersicht.php',
'/sims/heli/scripts/mission-start-lines.json',
'/sims/heli/scripts/mission-geo-lines.json',
'/sims/heli/scripts/tower-lines.json',
'/sims/heli/scripts/tower-geo-lines.json',
'/sims/heli/scripts/tower-sea-lines.json',
'/sims/heli/scripts/tower-start-lines.json',
'/sims/heli/scripts/tower-heliintro-lines.json',
'/sims/heli/scripts/wp-geo-lines.json',
'/sims/heli/routes.html',
'/sims/heli/game.html',
]
total = 0
for f in TARGETS:
path = REPO + f
if not os.path.exists(path):
print(f' SKIP {f}')
continue
txt = open(path, encoding='utf-8').read()
bak = path + '.bak-pre-christo-bulk'
if not os.path.exists(bak):
with open(bak, 'w', encoding='utf-8') as g:
g.write(txt)
new, n = clean(txt)
if n > 0:
with open(path, 'w', encoding='utf-8') as g:
g.write(new)
print(f' OK {f}: {n} Ersetzungen')
total += n
else:
print(f' -- {f}: nichts zu tun')
print(f'\nGesamt: {total} Ersetzungen ueber {len(TARGETS)} Dateien')