#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Timestamp: 2026-01-27
# File: src/scitex_writer/_cli/tables.py
"""Tables CLI commands."""
import argparse
import sys
from pathlib import Path
def cmd_list(args: argparse.Namespace) -> int:
"""List tables in project."""
from .. import tables
result = tables.list(args.project, args.doc_type)
if not result["success"]:
print(f"Error: {result['error']}", file=sys.stderr)
return 1
print(f"# Tables ({result['count']})\n")
print("| Name | CSV | Caption |")
print("|------|-----|---------|")
for t in result["tables"]:
has_cap = "✓" if t["has_caption"] else ""
print(f"| {t['name']} | ✓ | {has_cap} |")
return 0
def cmd_add(args: argparse.Namespace) -> int:
"""Add a table to the project."""
from .. import tables
if args.csv == "-":
csv_content = sys.stdin.read()
else:
csv_path = Path(args.csv)
if csv_path.exists():
csv_content = csv_path.read_text(encoding="utf-8")
else:
csv_content = args.csv
result = tables.add(
args.project,
args.name,
csv_content,
args.caption,
args.label,
args.doc_type,
)
if not result["success"]:
print(f"Error: {result['error']}", file=sys.stderr)
return 1
print(f"Added table: {args.name}")
print(f" CSV: {result['csv_path']}")
print(f" Caption: {result['caption_path']}")
print(f" Label: {result['label']}")
return 0
def cmd_remove(args: argparse.Namespace) -> int:
"""Remove a table from the project."""
from .. import tables
result = tables.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 tables subcommand parser."""
tables_help = """Table management.
Quick start:
scitex-writer tables list # List tables
scitex-writer tables add results data.csv "Results summary"
scitex-writer tables remove results
"""
parser = subparsers.add_parser(
"tables",
help="Table management",
description=tables_help,
formatter_class=argparse.RawDescriptionHelpFormatter,
)
sub = parser.add_subparsers(dest="tables_command", title="Commands")
# list
lst = sub.add_parser("list", help="List tables")
lst.add_argument("-p", "--project", default=".", help="Project path")
lst.add_argument(
"-t",
"--doc-type",
default="manuscript",
choices=["manuscript", "supplementary", "revision"],
)
lst.set_defaults(func=cmd_list)
# add
a = sub.add_parser("add", help="Add a table")
a.add_argument("name", help="Table name")
a.add_argument("csv", help="CSV content, file path, or '-' for stdin")
a.add_argument("caption", help="Table caption")
a.add_argument("-l", "--label", help="LaTeX label (default: tab:<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 table")
r.add_argument("name", help="Table 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