# German Umlaut Cleanup Map for ASCII-ified Text

When creating Notion blocks from Python, always emit proper Unicode. But if blocks were
already created with ASCII-ified German (common when `json.dumps(ensure_ascii=False)` was
forgotten), use this comprehensive replacement map to fix them via PATCH.

## Replacement Map

```python
# Apply these replacements to rich_text[].text.content before PATCHing
replacements = {
    # §§ instead of "Par "/"Par Par"
    # (use regex: re.sub(r'\bPar Par\b', '§§', t); re.sub(r'\bPar\b', '§', t))

    # ü → must be proper ü
    'uberwacht': 'überwacht', 'Uberwacht': 'Überwacht',
    'uberwachung': 'Überwachung', 'Uberwachung': 'Überwachung',
    'fuhrt': 'führt', 'Fuhrt': 'Führt',
    'pruft': 'prüft', 'prufen': 'prüfen', 'Prufung': 'Prüfung',
    'muessen': 'müssen', 'mussen': 'müssen',
    'grunden': 'gründen', 'Grundung': 'Gründung',
    'ubertrag': 'übertrag', 'Ubertrag': 'Übertrag',
    'Stuck': 'Stück', 'Tur': 'Tür', 'Fruh': 'Früh',
    'lucken': 'Lücken', 'ruck': 'rück',
    'einfuhr': 'einführ', 'ausfuhr': 'ausführ',
    'erfull': 'erfüll', 'Erfull': 'Erfüll',
    'Geschaftsfuhr': 'Geschäftsführ',
    'Abschlusspruf': 'Abschlussprüf',
    'fahig': 'fähig', 'Zahlungsunfahigkeit': 'Zahlungsunfähigkeit',
    'Uberschuldung': 'Überschuldung',

    # ä → must be proper ä
    'Geschafts': 'Geschäfts',
    'Tatigkeit': 'Tätigkeit', 'tatigkeit': 'tätigkeit',
    'Anderung': 'Änderung', 'anderung': 'änderung',
    'Klarung': 'Klärung', 'klarung': 'klärung',
    'vorlaufig': 'vorläufig', 'Vorlaufig': 'Vorläufig',
    'Janner': 'Jänner', 'eigenstandig': 'eigenständig',
    'abhangig': 'abhängig', 'naher': 'näher',
    'Kausalitat': 'Kausalität',
    'Aktionarsklage': 'Aktionärsklage',
    'Verjahr': 'Verjähr',
    'verandert': 'verändert',
    'Zunachst': 'Zunächst',
    'moglich': 'möglich',

    # ö → must be proper ö
    'osterreich': 'österreich', 'Osterreich': 'Österreich',
    'Korperschaft': 'Körperschaft',

    # ß → must be proper ß (NOT "ss", NOT "B")
    'Massstab': 'Maßstab', 'MaBstab': 'Maßstab',
    'SorgfaltsmaBstab': 'Sorgfaltsmaßstab',
    'PflichtenmaBstab': 'Pflichtenmaßstab',
    'Schliessung': 'Schließung',
    'schliesst': 'schließt',
    'ausser': 'außer',
    'gross': 'groß',
    'ausschliesslich': 'ausschließlich',
    'Stoss': 'Stoß',
    'Schluss': 'Schluss',
}
```

## PATCH Pattern

```python
# Build clean update — only send the block type, not the full block response
update_payload = {block_type: {"rich_text": new_rich_text}}

# Always json.dumps(ensure_ascii=False) when sending back
resp = subprocess.run(['curl', '-s', '-X', 'PATCH', f'.../blocks/{block_id}',
    '-H', f'Authorization: Bearer {api_key}',
    '-H', 'Notion-Version: 2025-09-03',
    '-H', 'Content-Type: application/json',
    '-d', json.dumps(update_payload, ensure_ascii=False)
], ...)
```

## Common Pitfall Words (easy to miss)

- `AufsichtsratsUberwachung` → `Aufsichtsratsüberwachung` (compound word, camelCase-ish)
- `Einfuhrung` / `Ausfuhrungen` / `Erfullung` → `Einführung` / `Ausführungen` / `Erfüllung`
- `PflichtenmaBstab` → `Pflichtenmaßstab` (capital B looks like ß but isn't)
- `SorgfaltsmaBstab` → `Sorgfaltsmaßstab`

## Validation

After applying replacements, scan with this check:

```python
must_have = {
    'Massstab': 'Maßstab', 'MaBstab': 'Maßstab',
    'Vorlaufig': 'Vorläufig', 'vorlaufig': 'vorläufig',
    'Geschafts': 'Geschäfts', 'Tatigkeit': 'Tätigkeit',
    # ... (use the full map above)
}
for wrong, correct in must_have.items():
    if wrong in text and correct not in text:
        print(f"ISSUE: {wrong} → {correct}")
```
