update
This commit is contained in:
@@ -6,6 +6,24 @@ import re
|
||||
|
||||
_FENCE = re.compile(r"```(?:json)?\s*(.*?)```", re.DOTALL)
|
||||
|
||||
# LaTeX in JSON-Strings ("$\in$", "\Sigma") ist ein INVALIDES Escape → json.loads
|
||||
# wirft (kostete bis zu 29 % Parse-Fehler bei Mathe-Stages). Nur ungültige Escapes
|
||||
# verdoppeln: gültige (\" \\ \/ \b \f \n \r \t \uXXXX) bleiben; \u ohne 4
|
||||
# Hex-Ziffern (\underline) zählt als ungültig.
|
||||
_UNGUELTIGES_ESCAPE = re.compile(r'\\(?![\"\\/bfnrt]|u[0-9a-fA-F]{4})')
|
||||
|
||||
|
||||
def _loads(s: str):
|
||||
"""json.loads mit EINER Reparaturstufe für rohe LaTeX-Backslashes. 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
|
||||
|
||||
|
||||
def parse(text: str):
|
||||
"""→ Objekt oder None. Nie werfen — der Aufrufer entscheidet über Retry.
|
||||
@@ -54,11 +72,8 @@ def _ein_kandidat(text: str):
|
||||
elif c == end_ch:
|
||||
depth -= 1
|
||||
if depth == 0:
|
||||
try:
|
||||
return json.loads(text[start:i + 1])
|
||||
except ValueError:
|
||||
break
|
||||
try:
|
||||
return json.loads(text)
|
||||
except ValueError:
|
||||
return None
|
||||
daten = _loads(text[start:i + 1])
|
||||
if daten is not None:
|
||||
return daten
|
||||
break
|
||||
return _loads(text)
|
||||
|
||||
Reference in New Issue
Block a user