from __future__ import annotations import argparse from pathlib import Path import sys sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) from src.mdx_text_atoms import compare_atom_sets, extract_text_atoms DEFAULT_PAIRS = [ ( "samples/mdx/01. 건설산업 DX의 올바른 이해(0127)(원본).mdx", "samples/mdx/01. 건설산업 DX의 올바른 이해(0127).mdx", ), ( "samples/mdx/02. DX의 시행 목표 및 기대효과(원본).mdx", "samples/mdx/02. DX의 시행 목표 및 기대효과.mdx", ), ( "samples/mdx/04. DX 지연 요인(원본).mdx", "samples/mdx/04. DX 지연 요인.mdx", ), ( "samples/mdx/05. 설계 방식의 왜곡(원본).mdx", "samples/mdx/05. 설계 방식의 왜곡.mdx", ), ] def main() -> int: parser = argparse.ArgumentParser(description="Compare original MDX text atoms with standardized MDX text atoms.") parser.add_argument("--root", default=".", help="Repository root. Defaults to current directory.") parser.add_argument("--max-items", type=int, default=8, help="Max examples per mismatch category.") args = parser.parse_args() root = Path(args.root).resolve() any_failed = False for original_rel, standardized_rel in DEFAULT_PAIRS: original = root / original_rel standardized = root / standardized_rel print(f"=== {standardized.name} ===") if not original.exists(): print(f" ERROR original missing: {original_rel}") any_failed = True continue if not standardized.exists(): print(f" ERROR standardized missing: {standardized_rel}") any_failed = True continue original_atoms = extract_text_atoms(original) standardized_atoms = extract_text_atoms(standardized) comparison = compare_atom_sets(original_atoms, standardized_atoms) missing = comparison["missing_from_standardized"] added = comparison["added_in_standardized"] print(f" original_atoms : {len(original_atoms)}") print(f" standardized_atoms : {len(standardized_atoms)}") print(f" missing : {len(missing)}") print(f" added : {len(added)}") if missing or added: any_failed = True _print_examples("missing_from_standardized", missing, args.max_items) _print_examples("added_in_standardized", added, args.max_items) else: print(" OK text atom parity") print() return 1 if any_failed else 0 def _print_examples(label: str, atoms, max_items: int) -> None: if not atoms: return print(f" {label} examples:") for atom in atoms[:max_items]: print(f" L{atom.line_no} {atom.kind}: {atom.normalized}") if __name__ == "__main__": sys.exit(main())