59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
import re
|
|
import unicodedata
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
|
|
class FileNameGenerator:
|
|
"""
|
|
Gera nomes de arquivos seguros e consistentes a partir de uma string de entrada.
|
|
- Remove acentos, espaços e caracteres inválidos
|
|
- Pode adicionar timestamp e extensão
|
|
- Não grava em disco, apenas retorna a string final
|
|
"""
|
|
|
|
@staticmethod
|
|
def _sanitize(text: str) -> str:
|
|
"""Remove acentos, espaços e símbolos inválidos do nome do arquivo."""
|
|
text = (
|
|
unicodedata.normalize("NFKD", text)
|
|
.encode("ASCII", "ignore")
|
|
.decode("ASCII")
|
|
)
|
|
text = re.sub(r"[^a-zA-Z0-9_-]+", "_", text)
|
|
text = re.sub(r"_+", "_", text).strip("_")
|
|
return text.lower()
|
|
|
|
@classmethod
|
|
def generate(
|
|
cls,
|
|
base_name: str,
|
|
extension: str = ".txt",
|
|
include_timestamp: bool = False,
|
|
counter: Optional[int] = None,
|
|
) -> str:
|
|
"""
|
|
Retorna um nome de arquivo limpo, como string.
|
|
|
|
:param base_name: Texto base (ex: título, nome, descrição)
|
|
:param extension: Extensão desejada (ex: .pdf, .json)
|
|
:param include_timestamp: Se True, adiciona timestamp no nome
|
|
:param counter: Número opcional para diferenciar nomes repetidos
|
|
:return: String do nome final do arquivo
|
|
"""
|
|
if not base_name:
|
|
raise ValueError("O nome base não pode estar vazio.")
|
|
|
|
safe_name = cls._sanitize(base_name)
|
|
|
|
if include_timestamp:
|
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
safe_name = f"{safe_name}_{timestamp}"
|
|
|
|
if counter is not None:
|
|
safe_name = f"{safe_name}_{counter}"
|
|
|
|
if not extension.startswith("."):
|
|
extension = f".{extension}"
|
|
|
|
return f"{safe_name}{extension}"
|