#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Timestamp: 2026-01-27 # File: src/scitex_writer/_cli/figures.py """Figures CLI commands.""" import argparse import sys from pathlib import Path def cmd_list(args: argparse.Namespace) -> int: """List figures in project.""" from .. import figures result = figures.list( args.project, args.extensions.split(",") if args.extensions else None ) if not result["success"]: print(f"Error: {result['error']}", file=sys.stderr) return 1 print(f"# Figures ({result['count']})\n") if result["figures"]: print("| Name | Format | Caption |") print("|------|--------|---------|") for f in result["figures"]: fmt = Path(f["path"]).suffix has_cap = "✓" if f.get("has_caption") else "" print(f"| {f['name']} | {fmt} | {has_cap} |") return 0 def cmd_add(args: argparse.Namespace) -> int: """Add a figure to the project.""" from .. import figures image_path = Path(args.image) if not image_path.exists(): print(f"Error: Image not found: {image_path}", file=sys.stderr) return 1 result = figures.add( args.project, args.name, str(image_path), args.caption, args.label, args.doc_type, ) if not result["success"]: print(f"Error: {result['error']}", file=sys.stderr) return 1 print(f"Added figure: {args.name}") print(f" Image: {result['image_path']}") print(f" Caption: {result['caption_path']}") print(f" Label: {result['label']}") return 0 def cmd_remove(args: argparse.Namespace) -> int: """Remove a figure from the project.""" from .. import figures result = figures.remove(args.project, args.name, args.doc_type) if not result["success"]: print(f"Error: {result['error']}", file=sys.stderr) return 1 print(f"Removed: {', '.join(result['removed'])}") return 0 def register_parser(subparsers) -> argparse.ArgumentParser: """Register figures subcommand parser.""" figures_help = """Figure management. Quick start: scitex-writer figures list # List figures scitex-writer figures add fig01 plot.png "Results plot" scitex-writer figures remove fig01 """ parser = subparsers.add_parser( "figures", help="Figure management", description=figures_help, formatter_class=argparse.RawDescriptionHelpFormatter, ) sub = parser.add_subparsers(dest="figures_command", title="Commands") # list lst = sub.add_parser("list", help="List figures") lst.add_argument("-p", "--project", default=".", help="Project path") lst.add_argument( "-e", "--extensions", help="Extensions to filter (comma-separated)" ) lst.set_defaults(func=cmd_list) # add a = sub.add_parser("add", help="Add a figure") a.add_argument("name", help="Figure name") a.add_argument("image", help="Image file path") a.add_argument("caption", help="Figure caption") a.add_argument("-l", "--label", help="LaTeX label (default: fig:)") a.add_argument("-p", "--project", default=".", help="Project path") a.add_argument( "-t", "--doc-type", default="manuscript", choices=["manuscript", "supplementary"], ) a.set_defaults(func=cmd_add) # remove r = sub.add_parser("remove", help="Remove a figure") r.add_argument("name", help="Figure name") r.add_argument("-p", "--project", default=".", help="Project path") r.add_argument( "-t", "--doc-type", default="manuscript", choices=["manuscript", "supplementary"], ) r.set_defaults(func=cmd_remove) return parser # EOF