#!/usr/bin/env python3 # -*- coding: utf-8 -*- # File: src/scitex_writer/_cli/migration.py """CLI: migration (import/export Overleaf).""" import argparse import sys def cmd_import(args: argparse.Namespace) -> int: """Import Overleaf ZIP into scitex-writer project.""" from .. import migration result = migration.from_overleaf( args.zip_path, output_dir=args.output, project_name=args.name, dry_run=args.dry_run, force=args.force, ) if not result["success"]: print(f"Error: {result['error']}", file=sys.stderr) return 1 for w in result.get("warnings", []): print(f"Warning: {w}", file=sys.stderr) if args.dry_run: print("Dry run — no files created.\n") report = result.get("mapping_report", {}) if report.get("sections"): print("Section mapping:") for section, files in report["sections"].items(): print(f" {section}: {', '.join(files)}") if report.get("bib_files"): print(f"\nBibliography: {', '.join(report['bib_files'])}") if report.get("images"): print(f"Images: {len(report['images'])} file(s)") if report.get("unmapped_tex"): print(f"Unmapped .tex: {', '.join(report['unmapped_tex'])}") print(f"\n{result['message']}") return 0 def cmd_export(args: argparse.Namespace) -> int: """Export scitex-writer project as Overleaf ZIP.""" from .. import migration result = migration.to_overleaf( args.project, output_path=args.output, dry_run=args.dry_run, ) if not result["success"]: print(f"Error: {result['error']}", file=sys.stderr) return 1 for w in result.get("warnings", []): print(f"Warning: {w}", file=sys.stderr) if args.dry_run: print("Dry run — no ZIP created.\n") for f in result.get("files_included", []): print(f" {f}") print(f"\n{result['message']}") return 0 def register_parser(subparsers) -> argparse.ArgumentParser: """Register migration subcommand with import/export sub-subcommands.""" parser = subparsers.add_parser( "migration", help="Import from / export to external platforms (Overleaf)", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=( "Examples:\n" " scitex-writer migration import project.zip\n" " scitex-writer migration import project.zip --output ./my-paper\n" " scitex-writer migration import project.zip --dry-run\n" " scitex-writer migration export . --output paper.zip\n" ), ) subs = parser.add_subparsers(dest="migration_command") # import subcommand imp = subs.add_parser("import", help="Import Overleaf ZIP") imp.add_argument("zip_path", help="Path to Overleaf ZIP file") imp.add_argument("--output", "-o", default=None, help="Output directory") imp.add_argument("--name", default=None, help="Project name") imp.add_argument("--dry-run", action="store_true") imp.add_argument("--force", action="store_true") imp.set_defaults(func=cmd_import) # export subcommand exp = subs.add_parser("export", help="Export as Overleaf ZIP") exp.add_argument("project", nargs="?", default=".", help="Project directory") exp.add_argument("--output", "-o", default=None, help="Output ZIP path") exp.add_argument("--dry-run", action="store_true") exp.set_defaults(func=cmd_export) return parser # EOF