better faulty encoding detection
This commit is contained in:
1 parent
ec8e79bb1a
commit
2a4c5f4f7c
12 files changed
+299
-25
No files matched your search
@@ -16,6 +16,7 @@ from copienator import (
|
||||
read_json,
|
||||
workspace_from_args,
|
||||
)
|
||||
from copienator.latex_json import repair_decoded_latex_controls
|
||||
|
||||
WORD_LIST_FILE = Path(__file__).resolve().parents[1] / "data" / "liste_francais.txt"
|
||||
ACCENT_PATTERN = re.compile(r"[éèêëàâäîïôöùûüçœÉÈÊËÀÂÄÎÏÔÖÙÛÜÇŒ]")
|
||||
@@ -89,6 +90,7 @@ def fix_hex_corruption_safe(text: str) -> str:
|
||||
|
||||
def repair_json_escape_corruption(text: str) -> str:
|
||||
r"""Restore observed LaTeX commands consumed as JSON control escapes."""
|
||||
text = repair_decoded_latex_controls(text)
|
||||
replacements = (
|
||||
("\x0crac", r"\frac"),
|
||||
("\x0ceuille", r"\equiv"),
|
||||
@@ -132,6 +134,33 @@ def clean_obj(value: Any, lookup: dict[str, str]) -> Any:
|
||||
return value
|
||||
|
||||
|
||||
def unresolved_math_control_paths(value: Any, path: str = "$") -> list[str]:
|
||||
"""Locate destructive JSON control escapes left in mathematical text."""
|
||||
if isinstance(value, str):
|
||||
return (
|
||||
[path]
|
||||
if any(
|
||||
control in {"\b", "\f"}
|
||||
for match in MATH_PATTERN.finditer(value)
|
||||
for control in match.group(0)
|
||||
)
|
||||
else []
|
||||
)
|
||||
if isinstance(value, list):
|
||||
return [
|
||||
issue
|
||||
for index, item in enumerate(value)
|
||||
for issue in unresolved_math_control_paths(item, f"{path}[{index}]")
|
||||
]
|
||||
if isinstance(value, dict):
|
||||
return [
|
||||
issue
|
||||
for key, item in value.items()
|
||||
for issue in unresolved_math_control_paths(item, f"{path}[{key!r}]")
|
||||
]
|
||||
return []
|
||||
|
||||
|
||||
def run(
|
||||
workspace: EvaluationWorkspace,
|
||||
*,
|
||||
@@ -141,11 +170,18 @@ def run(
|
||||
lookup = build_lookup_map(word_list_path)
|
||||
data = read_json(workspace.correction_file)
|
||||
cleaned = clean_obj(data, lookup)
|
||||
unresolved = unresolved_math_control_paths(cleaned)
|
||||
backup = workspace.root / "correction_precleanup.json"
|
||||
atomic_write_bytes(backup, workspace.correction_file.read_bytes())
|
||||
print(f"Original JSON backed up to {backup}")
|
||||
atomic_write_json(workspace.correction_file, cleaned)
|
||||
print(f"Fixed JSON saved to {workspace.correction_file}")
|
||||
if unresolved:
|
||||
print(
|
||||
"Warning: unresolved JSON control characters remain in mathematical "
|
||||
"text at: " + ", ".join(unresolved)
|
||||
)
|
||||
return ExitCode.PARTIAL
|
||||
return ExitCode.SUCCESS
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user