Ask before reopening a bundle that carries no cuts
A bundle without a source block cannot be round-tripped, but its PDF can still be cut from scratch. Offer that instead of refusing: confirm, run detection, and line the markers up by position when the slice counts match exactly.
This commit is contained in:
+39
-4
@@ -102,20 +102,50 @@ def _export(args: argparse.Namespace) -> int:
|
||||
return 0
|
||||
|
||||
|
||||
def _confirm(question: str) -> bool:
|
||||
"""Ask before doing something the caller did not ask for. No tty, no."""
|
||||
if not sys.stdin.isatty():
|
||||
print(f"{question} (not a terminal — pass --detect to say yes)")
|
||||
return False
|
||||
return input(f"{question} [y/N] ").strip().lower() in ("y", "yes")
|
||||
|
||||
|
||||
def _open(args: argparse.Namespace) -> int:
|
||||
from . import bundle
|
||||
from .editor import launch
|
||||
|
||||
zip_path, where = Path(args.zip), Path(args.pdf) if args.pdf else None
|
||||
try:
|
||||
project, pdf = bundle.read(
|
||||
Path(args.zip), Path(args.pdf) if args.pdf else None, force=args.force
|
||||
)
|
||||
cuts = bundle.has_cuts(zip_path)
|
||||
except (OSError, ValueError) as error:
|
||||
print(f"cannot open: {error}")
|
||||
return 1
|
||||
|
||||
if not cuts and not args.detect:
|
||||
print(f"{zip_path.name} carries no cuts — it was written by a producer that")
|
||||
print("does not record them. Its PDF can be cut again from scratch, but that")
|
||||
print("is a fresh session: the cuts will be detection's, and the markers land")
|
||||
print("only if detection happens to find the same number of slices.")
|
||||
if not _confirm("Open it that way?"):
|
||||
return 1
|
||||
|
||||
try:
|
||||
project, pdf = bundle.read(zip_path, where, force=args.force, detect=not cuts)
|
||||
except (ValueError, KeyError) as error:
|
||||
print(f"cannot open: {error}")
|
||||
return 1
|
||||
|
||||
saved = project.save()
|
||||
print(f"{pdf.name}: {len(project.pages)} pages, {len(project.kept_slices())} slices")
|
||||
kept = project.kept_slices()
|
||||
print(f"{pdf.name}: {len(project.pages)} pages, {len(kept)} slices")
|
||||
if not cuts:
|
||||
marked = sum(len(m) for page in project.pages for m in page.markers)
|
||||
print(" cut from scratch by detection — check every cut before exporting")
|
||||
print(
|
||||
f" {marked} markers placed by position"
|
||||
if marked
|
||||
else " markers not placed: detection found a different number of slices"
|
||||
)
|
||||
print(f" project written to {saved.name}")
|
||||
if args.no_edit:
|
||||
return 0
|
||||
@@ -182,6 +212,11 @@ def main(argv: list[str] | None = None) -> int:
|
||||
opn.add_argument(
|
||||
"--force", action="store_true", help="overwrite an existing PDF or project file"
|
||||
)
|
||||
opn.add_argument(
|
||||
"--detect",
|
||||
action="store_true",
|
||||
help="for a bundle with no cuts: cut its PDF from scratch, without asking",
|
||||
)
|
||||
opn.set_defaults(func=_open)
|
||||
|
||||
ed = sub.add_parser("edit", help="open the editor")
|
||||
|
||||
Reference in New Issue
Block a user