57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
"""根据模板创建任务归档草稿。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import re
|
|
from datetime import date
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
TEMPLATE = ROOT / "docs" / "templates" / "task-archive.md"
|
|
TASK_DIR = ROOT / "docs" / "task"
|
|
|
|
|
|
def safe_title(title: str) -> str:
|
|
"""把标题转换为适合文件名的短文本。"""
|
|
|
|
cleaned = re.sub(r'[<>:"/\\|?*]', "-", title.strip())
|
|
cleaned = re.sub(r"\s+", "-", cleaned)
|
|
return cleaned.strip(".-")
|
|
|
|
|
|
def create_archive(issue_number: str, title: str) -> Path:
|
|
"""创建归档草稿;目标文件存在时拒绝覆盖。"""
|
|
|
|
short_title = safe_title(title)
|
|
if not issue_number.isdigit():
|
|
raise ValueError("工单号必须是数字")
|
|
if not short_title:
|
|
raise ValueError("标题不能为空")
|
|
|
|
target = TASK_DIR / f"{issue_number}-{short_title}.md"
|
|
if target.exists():
|
|
raise FileExistsError(f"文件已存在:{target}")
|
|
|
|
content = TEMPLATE.read_text(encoding="utf-8")
|
|
content = content.replace("<工单号>", issue_number, 1)
|
|
content = content.replace("<标题>", title.strip(), 1)
|
|
content = content.replace("YYYY-MM-DD", date.today().isoformat(), 1)
|
|
target.write_text(content, encoding="utf-8")
|
|
return target
|
|
|
|
|
|
def main() -> None:
|
|
parser = argparse.ArgumentParser(description="创建 docs/task 任务归档草稿")
|
|
parser.add_argument("issue_number", help="Gitea 工单号,例如 123")
|
|
parser.add_argument("title", help="简短任务标题")
|
|
args = parser.parse_args()
|
|
|
|
target = create_archive(args.issue_number, args.title)
|
|
print(f"已创建:{target.relative_to(ROOT)}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|