/
sveta_t
/
checklist_creation
Обзор
Документация
Войти
/
sveta_t
/
checklist_creation
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
cli_tool/utils/file_loader.py
136 строк
4 KB
sveta_t
add open router and markdownify
22 янв 2026, 01:21
22 янв 2026, 01:21
dfec008
Код
Авторство
О чём код?
""" Утилиты для загрузки документов разных форматов """ from pathlib import Path from typing import Optional from docx import Document from markdownify import markdownify as md def load_document(file_path: str | Path, encoding: str = 'utf-8') -> str: """ Загружает документ из файла Поддерживаемые форматы: - .txt - .md - .docx Args: file_path: Путь к файлу encoding: Кодировка файла (по умолчанию utf-8) Returns: str: Содержимое документа Raises: FileNotFoundError: Если файл не найден ValueError: Если формат файла не поддерживается """ file_path = Path(file_path) if not file_path.exists(): raise FileNotFoundError(f"Файл не найден: {file_path}") suffix = file_path.suffix.lower() if suffix == '.docx': return _load_docx(file_path) elif suffix in ['.txt', '.md']: return _load_text(file_path, encoding) else: raise ValueError( f"Неподдерживаемый формат файла: {suffix}. " f"Поддерживаются: .txt, .md, .docx" ) def load_docx_as_markdown(file_path: Path) -> str: """ Загружает .docx и конвертирует в Markdown без LLM """ doc = Document(file_path) html_parts = [] for p in doc.paragraphs: text = p.text.strip() if not text: continue # Простейшая семантика if p.style.name.startswith("Heading"): level = int(p.style.name.replace("Heading", "").strip()) html_parts.append(f"<h{level}>{text}</h{level}>") else: html_parts.append(f"<p>{text}</p>") html = "\n".join(html_parts) return md(html) def _load_text(file_path: Path, encoding: str) -> str: """Загружает текстовый файл""" with open(file_path, 'r', encoding=encoding) as f: return f.read() def _load_docx(file_path: Path) -> str: """Загружает .docx файл""" try: from docx import Document except ImportError: raise ImportError( "Для работы с .docx файлами установите python-docx: " "pip install python-docx" ) doc = Document(file_path) paragraphs = [para.text for para in doc.paragraphs if para.text.strip()] return '\n'.join(paragraphs) def save_document( content: str, output_path: str | Path, encoding: str = 'utf-8' ) -> Path: """ Сохраняет документ в файл Args: content: Содержимое для сохранения output_path: Путь для сохранения encoding: Кодировка файла Returns: Path: Путь к сохраненному файлу """ output_path = Path(output_path) output_path.parent.mkdir(parents=True, exist_ok=True) with open(output_path, 'w', encoding=encoding) as f: f.write(content) return output_path def split_into_paragraphs(text: str, min_length: int = 50) -> list[str]: """ Разбивает текст на параграфы Args: text: Исходный текст min_length: Минимальная длина параграфа Returns: list[str]: Список параграфов """ # Разбиваем по двойным переносам строк paragraphs = text.split('\n\n') # Фильтруем короткие параграфы return [ para.strip() for para in paragraphs if len(para.strip()) >= min_length ]