Coverage for aipyapp/aipy/utils.py: 23%
44 statements
« prev ^ index » next coverage.py v7.10.3, created at 2025-08-11 12:02 +0200
« prev ^ index » next coverage.py v7.10.3, created at 2025-08-11 12:02 +0200
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
4import os
5import re
6import sys
7from functools import wraps
8from importlib.resources import read_text
10from rich.panel import Panel
12from .. import T, __respkg__
14def restore_output(func):
15 @wraps(func)
16 def wrapper(self, *args, **kwargs):
17 old_stdout, old_stderr = sys.stdout, sys.stderr
18 sys.stdout, sys.stderr = sys.__stdout__, sys.__stderr__
20 try:
21 return func(self, *args, **kwargs)
22 finally:
23 sys.stdout, sys.stderr = old_stdout, old_stderr
24 return wrapper
26def confirm_disclaimer(console):
27 DISCLAIMER_TEXT = read_text(__respkg__, "DISCLAIMER.md")
28 console.print()
29 panel = Panel.fit(DISCLAIMER_TEXT, title="[red]免责声明", border_style="red", padding=(1, 2))
30 console.print(panel)
32 while True:
33 console.print("\n[red]是否确认已阅读并接受以上免责声明?[/red](yes/no):", end=" ")
34 response = input().strip().lower()
35 if response in ("yes", "y"):
36 console.print("[green]感谢确认,程序继续运行。[/green]")
37 return True
38 elif response in ("no", "n"):
39 console.print("[red]您未接受免责声明,程序将退出。[/red]")
40 return False
41 else:
42 console.print("[yellow]请输入 yes 或 no。[/yellow]")
44def get_safe_filename(input_str, extension=".html", max_length=16):
45 input_str = input_str.strip()
46 safe_str = re.sub(r'[\\/:*?"<>|\s]', '', input_str).strip()
47 if not safe_str:
48 return None
50 name = safe_str[:max_length]
51 base_name = name
52 filename = f"{base_name}{extension}" if extension else base_name
53 counter = 1
55 while os.path.exists(filename):
56 filename = f"{base_name}_{counter}{extension}" if extension else f"{base_name}_{counter}"
57 counter += 1
59 return filename