From dd0a0f3c34899dedf53a28a3d54a972ede4fe530 Mon Sep 17 00:00:00 2001 From: Shawn X Date: Tue, 23 Sep 2025 19:46:13 +0800 Subject: [PATCH 1/2] feat: convert Windows backslashes to forward slashes for logo path compatibility --- src/readmex/core.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/readmex/core.py b/src/readmex/core.py index bbc5f67..18b9e6f 100644 --- a/src/readmex/core.py +++ b/src/readmex/core.py @@ -1115,6 +1115,8 @@ def _generate_readme_content( raise ValueError(f"Output directory is None at line {1060}") relative_logo_path = os.path.relpath(logo_path, self.output_dir) + # Convert Windows backslashes to forward slashes for web compatibility + relative_logo_path = relative_logo_path.replace('\\', '/') self.console.print(f"[cyan]DEBUG: Relative logo path = {relative_logo_path}[/cyan]") # 替换整个logo img标签,使用新的属性 @@ -1427,6 +1429,8 @@ def _generate_debug_readme_content(self, structure, dependencies, descriptions, raise ValueError(f"Output directory is None at line {1315} (debug mode)") relative_logo_path = os.path.relpath(logo_path, self.output_dir) + # Convert Windows backslashes to forward slashes for web compatibility + relative_logo_path = relative_logo_path.replace('\\', '/') self.console.print(f"[cyan]DEBUG (debug mode): Relative logo path = {relative_logo_path}[/cyan]") # 替换整个logo img标签,使用新的属性 From 09c2e48b7307ba1d7de4f2c2ed0741d07d5b86ee Mon Sep 17 00:00:00 2001 From: Shawn X Date: Thu, 2 Oct 2025 09:22:43 +0800 Subject: [PATCH 2/2] feat: support glob patterns for dependency file matching in DependencyAnalyzer --- src/readmex/utils/dependency_analyzer.py | 61 ++++++++++++++++++++---- 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/src/readmex/utils/dependency_analyzer.py b/src/readmex/utils/dependency_analyzer.py index 4b10281..3b1524f 100644 --- a/src/readmex/utils/dependency_analyzer.py +++ b/src/readmex/utils/dependency_analyzer.py @@ -1,6 +1,7 @@ import os import re import json +import glob from typing import Set, List, Dict, Any from pathlib import Path from rich.console import Console @@ -170,18 +171,36 @@ def _get_existing_dependencies(self) -> str: existing_content = "" for dep_file in lang_config["dependency_files"]: - dep_path = os.path.join(self.project_dir, dep_file) - if os.path.exists(dep_path): - try: - with open(dep_path, "r", encoding="utf-8") as f: - content = f.read() - if content.strip(): - existing_content += f"\n=== {dep_file} ===\n{content}\n" - except Exception as e: - self.console.print(f"[yellow]Warning: Could not read {dep_file}: {e}[/yellow]") + # Handle glob patterns like *.csproj + if "*" in dep_file: + # Use glob to find matching files + pattern = os.path.join(self.project_dir, dep_file).replace("\\", "/") + matching_files = glob.glob(pattern) + for file_path in matching_files: + content = self._read_dependency_file(file_path, os.path.basename(file_path)) + if content: + existing_content += content + else: + # Handle regular file names + dep_path = os.path.join(self.project_dir, dep_file) + if os.path.exists(dep_path): + content = self._read_dependency_file(dep_path, dep_file) + if content: + existing_content += content return existing_content.strip() + def _read_dependency_file(self, file_path: str, display_name: str) -> str: + """Helper method to read a dependency file and return its content""" + try: + with open(file_path, "r", encoding="utf-8") as f: + content = f.read() + if content.strip(): + return f"\n=== {display_name} ===\n{content}\n" + except Exception as e: + self.console.print(f"[yellow]Warning: Could not read {display_name}: {e}[/yellow]") + return "" + def _extract_imports_by_language(self, content: str) -> Set[str]: """Extract import statements using language-specific patterns""" lang_config = self.config["languages"][self.primary_language] @@ -293,6 +312,30 @@ def _save_dependency_files( # Determine output filename based on language primary_dep_file = lang_config["dependency_files"][0] + + # Handle glob patterns in primary dependency file + if "*" in primary_dep_file: + # For glob patterns, try to find an existing file or create a generic name + pattern = os.path.join(self.project_dir, primary_dep_file).replace("\\", "/") + existing_files = glob.glob(pattern) + + if existing_files: + # Use the name of the first existing file + primary_dep_file = os.path.basename(existing_files[0]) + else: + # Create a generic filename based on the pattern + if primary_dep_file == "*.csproj": + primary_dep_file = "Project.csproj" + elif primary_dep_file == "*.sln": + primary_dep_file = "Solution.sln" + elif primary_dep_file == "*.gemspec": + primary_dep_file = "gemfile.gemspec" + elif primary_dep_file == "*.prj": + primary_dep_file = "project.prj" + else: + # Generic fallback: replace * with "project" + primary_dep_file = primary_dep_file.replace("*", "project") + output_dep_path = os.path.join(output_dir, primary_dep_file) # Save generated dependency file