Files
epub_bilingual_translator/scripts/corpus_regression.py
T

42 lines
2.2 KiB
Python

"""Offline extraction/restoration checks across the supplied EPUB corpus."""
import argparse
import json
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from src.preprocessing.epub_cleaner import EpubCleaner
from src.preprocessing.text_extractor import FineGrainedExtractor
from src.preprocessing.navigation import prepare_navigation
from src.common.data_model import BookStructure
from src.assembly.format_restorer import FormatRestorer
from src.assembly.builder import BilingualBuilder
from src.qa.epub_audit import audit_epub, compare_audits
def main():
parser=argparse.ArgumentParser(description=__doc__)
parser.add_argument('--input', type=Path, default=Path('input'))
parser.add_argument('--out', type=Path, default=Path('.work/corpus-qa'))
args=parser.parse_args(); rows=[]; args.out.mkdir(parents=True, exist_ok=True)
for source in sorted(args.input.glob('*.epub')):
row={'book':source.name}
try:
work=args.out/source.stem
structure=BookStructure.load(EpubCleaner(source,work).clean())
entries=FineGrainedExtractor().extract(structure)
prepare_navigation(source,structure,entries)
bad=[e.entry_id for e in entries if not FormatRestorer().restore(e.original_text,e.placeholders,original_text=e.original_text)[1]]
output=BilingualBuilder(work,source).build(structure,work/'roundtrip.epub')
before,after=audit_epub(source),audit_epub(output)
row.update(entries=len(entries),navigation_titles=len(structure.navigation_titles),
unbound_titles=[r["source_label"] for r in structure.navigation_titles if r.get("binding_note")],format_failures=bad,source_issues=len(before['issues']),
new_issues=compare_audits(before,after))
except Exception as exc:
row['error']=str(exc)
rows.append(row)
print(json.dumps({k:v for k,v in row.items() if k!='format_failures'},ensure_ascii=False),flush=True)
(args.out/'report.json').write_text(json.dumps(rows,ensure_ascii=False,indent=2))
return int(any(r.get('error') or r.get('format_failures') or r.get('new_issues') for r in rows))
if __name__=='__main__': raise SystemExit(main())