Loading...
No commits yet
Not committed History
Blame
figures.py • 3.7 KB
#!/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:<name>)")
    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