aec0407b87
Convert Ext/Help/ru.html to Markdown and push to a wiki git repository.
177 lines
5.1 KiB
Python
177 lines
5.1 KiB
Python
#!/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 (по умолчанию: <out>/.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())
|