update
This commit is contained in:
@@ -13,16 +13,40 @@ _FENCE = re.compile(r"```(?:json)?\s*(.*?)```", re.DOTALL)
|
||||
_UNGUELTIGES_ESCAPE = re.compile(r'\\(?![\"\\/bfnrt]|u[0-9a-fA-F]{4})')
|
||||
|
||||
|
||||
_ESCAPE_JE_ZEICHEN = {"\n": "\\n", "\r": "\\r", "\t": "\\t"}
|
||||
|
||||
|
||||
def _iterativ_reparieren(s: str):
|
||||
"""Positionsgenaue Reparatur am ORIGINAL (das Regex-Doubling beschädigt
|
||||
\\\\x-Folgen): rohe Kontrollzeichen in Strings escapen (Modelle zitieren
|
||||
mehrzeilige Passagen wörtlich — Markup-Zitat-Regel), ungültige Escapes
|
||||
doubeln. Iterativ an der jeweils ersten Fehlerstelle, nur im Fehlerfall."""
|
||||
for _ in range(300):
|
||||
try:
|
||||
return json.loads(s)
|
||||
except json.JSONDecodeError as e:
|
||||
if e.pos >= len(s):
|
||||
return None
|
||||
if "Invalid control character" in e.msg:
|
||||
s = s[:e.pos] + _ESCAPE_JE_ZEICHEN.get(s[e.pos], " ") + s[e.pos + 1:]
|
||||
elif "Invalid \\escape" in e.msg:
|
||||
s = s[:e.pos] + "\\" + s[e.pos:]
|
||||
else:
|
||||
return None
|
||||
return None
|
||||
|
||||
|
||||
def _loads(s: str):
|
||||
"""json.loads mit EINER Reparaturstufe für rohe LaTeX-Backslashes. Valides
|
||||
JSON durchläuft unverändert (Reparatur nur im Fehlerfall)."""
|
||||
"""json.loads mit Reparaturstufen für rohe LaTeX-Backslashes und rohe
|
||||
Kontrollzeichen in Strings. Valides JSON durchläuft unverändert
|
||||
(Reparatur nur im Fehlerfall)."""
|
||||
try:
|
||||
return json.loads(s)
|
||||
except ValueError:
|
||||
try:
|
||||
return json.loads(_UNGUELTIGES_ESCAPE.sub(r"\\\\", s))
|
||||
except ValueError:
|
||||
return None
|
||||
return _iterativ_reparieren(s)
|
||||
|
||||
|
||||
def parse(text: str):
|
||||
|
||||
Reference in New Issue
Block a user