This commit is contained in:
team3
2026-07-12 16:13:50 +02:00
parent a284e03225
commit 31a42bbf1d
48 changed files with 3625 additions and 253 deletions

View File

@@ -65,6 +65,18 @@ def _locker_mit_map(text: str) -> tuple[str, list[int]]:
return "".join(out), mapping
def _casefold_mit_map(text: str) -> tuple[str, list[int]]:
"""Gefaltete Kopie + Map auf die Original-Positionen. casefold() kann ein
Zeichen zu mehreren expandieren (ß→ss) — die Map hält den Rückweg eindeutig."""
out: list[str] = []
mapping: list[int] = []
for i, c in enumerate(text):
for cn in c.casefold():
out.append(cn)
mapping.append(i)
return "".join(out), mapping
_LOCKER_MIN_ZEICHEN = 20 # kürzere Zitate sind alnum-gefaltet nicht mehr eindeutig
@@ -81,11 +93,17 @@ def finde_zitat(text: str, zitat: str) -> tuple[int, int] | None:
haystack, mapping = _normiert_mit_map(text)
needle = _WS.sub(" ", zitat).strip()
pos = haystack.find(needle)
if pos < 0:
pos = haystack.casefold().find(needle.casefold())
if pos >= 0:
start = mapping[pos]
ende = mapping[min(pos + len(needle) - 1, len(mapping) - 1)] + 1
return mapping[pos], mapping[min(pos + len(needle) - 1, len(mapping) - 1)] + 1
# Stufe 2: casefold — eigene Map, weil casefold die Länge ändert (ß→ss, fi→fi).
# Direkt in `mapping` zu indizieren verschob den Span um jede Expansion vor dem
# Treffer und lief am Textende in einen IndexError.
hay_cf, sub = _casefold_mit_map(haystack)
ndl_cf = needle.casefold()
pos = hay_cf.find(ndl_cf)
if pos >= 0:
start = mapping[sub[pos]]
ende = mapping[sub[min(pos + len(ndl_cf) - 1, len(sub) - 1)]] + 1
return start, ende
hay_l, map_l = _locker_mit_map(text)
ndl_l, _ = _locker_mit_map(zitat)