#!/usr/bin/env python3 """CLI: export 1C Help (ru.html) to Markdown / Gitea wiki.""" from __future__ import annotations import argparse import sys from pathlib import Path TOOL_ROOT = Path(__file__).resolve().parent if str(TOOL_ROOT) not in sys.path: sys.path.insert(0, str(TOOL_ROOT)) from export1c_help import __status__, __version__ # noqa: E402 from export1c_help.export import export_help # noqa: E402 from export1c_help.wiki import WikiPushError, push_wiki # noqa: E402 def build_parser() -> argparse.ArgumentParser: p = argparse.ArgumentParser( prog="export_1c_help", description=( f"Выгрузка встроенной справки 1С (Ext/Help/ru.html) в Markdown / Gitea wiki. " f"v{__version__} ({__status__})." ), ) p.add_argument("--version", action="version", version=f"%(prog)s {__version__}") sub = p.add_subparsers(dest="cmd", required=True) c = sub.add_parser("convert", help="Конвертация Help → Markdown в каталог") c.add_argument( "-s", "--src", type=Path, required=True, help="Каталог src выгрузки конфигурации (…/crm3-26/src)", ) c.add_argument( "-o", "--out", type=Path, required=True, help="Каталог результата (wiki working tree)", ) c.add_argument( "--objects-only", action="store_true", help="Только справка объектов (без Forms/*/Ext/Help)", ) c.add_argument( "--keep-empty", action="store_true", help="Не пропускать почти пустые страницы", ) c.add_argument( "--clean", action="store_true", help="Очистить --out перед записью (кроме .git)", ) c.add_argument( "--source-label", default=None, help="Подпись источника в Home.md", ) c.set_defaults(func=cmd_convert) w = sub.add_parser("push", help="convert + push в Gitea wiki (.wiki.git)") w.add_argument("-s", "--src", type=Path, required=True) w.add_argument( "--wiki-url", required=True, help="URL wiki-репозитория, напр. https://git.p7net.ru/1c/crm3_26.wiki.git", ) w.add_argument( "--work-dir", type=Path, default=None, help="Локальный clone wiki (по умолчанию: /.wiki_clone)", ) w.add_argument( "-o", "--out", type=Path, default=None, help="Промежуточный каталог MD (по умолчанию: ./out/wiki-md)", ) w.add_argument("--objects-only", action="store_true") w.add_argument("--keep-empty", action="store_true") w.add_argument( "--keep-unmanaged", action="store_true", help="Не удалять чужие .md в wiki перед копированием", ) w.add_argument( "-m", "--message", default=None, help="Сообщение коммита wiki", ) w.add_argument("--branch", default="main") w.add_argument( "--dry-run", action="store_true", help="Только convert, без git push", ) w.set_defaults(func=cmd_push) return p def cmd_convert(args: argparse.Namespace) -> int: stats = export_help( args.src, args.out, include_forms=not args.objects_only, skip_empty=not args.keep_empty, clean=args.clean, source_label=args.source_label, ) print( f"OK: written={stats.pages_written} " f"skipped_empty={stats.pages_skipped_empty} " f"total={stats.pages_total} " f"images={stats.images_copied} → {args.out}" ) return 0 def cmd_push(args: argparse.Namespace) -> int: out = args.out or (TOOL_ROOT / "out" / "wiki-md") work = args.work_dir or (out.parent / "wiki_clone") stats = export_help( args.src, out, include_forms=not args.objects_only, skip_empty=not args.keep_empty, clean=True, source_label=str(args.src), ) print( f"convert: written={stats.pages_written} " f"skipped_empty={stats.pages_skipped_empty} " f"total={stats.pages_total} → {out}" ) if args.dry_run: print("dry-run: push skipped") return 0 message = args.message or ( f"export_1c_help v{__version__}: sync help ({stats.pages_written} pages)" ) try: push_wiki( out, args.wiki_url, work_dir=work, message=message, branch=args.branch, keep_unmanaged=args.keep_unmanaged, ) except WikiPushError as exc: print(f"push failed:\n{exc}", file=sys.stderr) return 1 print(f"OK: pushed → {args.wiki_url}") return 0 def main(argv: list[str] | None = None) -> int: parser = build_parser() args = parser.parse_args(argv) return args.func(args) if __name__ == "__main__": raise SystemExit(main())