import sys from pathlib import Path import tempfile import git from datetime import datetime from config.settings import Settings from core.git_manager import GitManager from core.file_scanner import FileScanner, FileInfo from typing import Tuple, List, List, Set, Optional class DirectoryStructureScanner: def __init__(self, root_path: Path): self.root_path = root_path def generate_tree(self, path: Path = None, prefix: str = "", is_last: bool = True) -> str: if path is None: path = self.root_path output = prefix + ("└── " if is_last else "├── ") + (path.name or str(path)) + "\n" entries = list(path.iterdir()) dirs = sorted([d for d in entries if d.is_dir()]) files = sorted([f for f in entries if f.is_file()]) dirs = [d for d in dirs if not d.name.startswith('.') and d.name != '__pycache__'] files = [f for f in files if not f.name.startswith('.')] next_prefix = prefix + (" " if is_last else "│ ") for i, dir_path in enumerate(dirs): is_last_entry = (i == len(dirs) - 1) and not files output += self.generate_tree(dir_path, next_prefix, is_last_entry) for i, file_path in enumerate(files): is_last_file = i == len(files) - 1 output += next_prefix + ("└── " if is_last_file else "├── ") + file_path.name + "\n" return output class MarkdownGenerator: def __init__(self, target_path: str, target_extensions: Set[str] = None): self.target_path = target_path self.timestamp = Settings.get_timestamp() self.temp_dir = None self.is_github = target_path.startswith(('http://', 'https://')) and 'github.com' in target_path # Settings.pyのデフォルト拡張子を使用 self.target_extensions = target_extensions or Settings.DEFAULT_EXTENSIONS def generate_markdowns(self) -> Tuple[str, str, List[FileInfo]]: """リポジトリの内容とディレクトリ構造のMarkdownを生成""" try: if self.is_github: self.temp_dir = Path(tempfile.mkdtemp()) git.Repo.clone_from(self.target_path, self.temp_dir) work_dir = self.temp_dir else: work_dir = Path(self.target_path) if not work_dir.exists(): raise ValueError(f"Directory not found: {work_dir}") # ディレクトリ構造のスキャン dir_scanner = DirectoryStructureScanner(work_dir) tree_structure = dir_scanner.generate_tree() # ファイル内容のスキャン file_scanner = FileScanner(work_dir, self.target_extensions) files = file_scanner.scan_files() # Markdown生成 structure_md = self._create_structure_markdown(tree_structure) content_md = self._create_content_markdown(files) return content_md, structure_md, files finally: if self.is_github and self.temp_dir and Path(self.temp_dir).exists(): import shutil shutil.rmtree(self.temp_dir) def _create_structure_markdown(self, tree_structure: str) -> str: name = self._get_name() content = f"# {name} - ディレクトリ構造\n\n" content += f"生成日時: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n" content += "```\n" content += tree_structure content += "```\n" return content def _create_content_markdown(self, files: List[FileInfo]) -> str: content = "" for file in files: content += f"## {file.path}\n" content += "------------\n" if file.content is not None: content += file.content else: content += "# Failed to read content" content += "\n\n" return content def _get_name(self) -> str: if self.is_github: return self.target_path.split('/')[-1].replace('.git', '') else: return Path(self.target_path).name def main(): if len(sys.argv) != 2: print("Usage: python main.py ") return 1 target_path = sys.argv[1] try: print(f"Processing: {target_path}") generator = MarkdownGenerator(target_path) content_md, structure_md, _ = generator.generate_markdowns() timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') name = generator._get_name() content_file = f"{name}_content_{timestamp}.md" structure_file = f"{name}_structure_{timestamp}.md" with open(content_file, 'w', encoding='utf-8') as f: f.write(content_md) with open(structure_file, 'w', encoding='utf-8') as f: f.write(structure_md) print(f"生成完了:") print(f"- ファイル内容: {content_file}") print(f"- ディレクトリ構造: {structure_file}") return 0 except Exception as e: print(f"エラーが発生しました: {str(e)}") return 1 if __name__ == "__main__": exit(main())