Files
wehub-resource-sync 97e91a83f3
Ruff / Ruff (push) Waiting to run
Test / Core Tests (push) Waiting to run
Test / Offline Coverage Tests (Python 3.10) (push) Waiting to run
Test / Offline Coverage Tests (Python 3.11) (push) Waiting to run
Test / Offline Coverage Tests (Python 3.12) (push) Waiting to run
Test / Offline Coverage Tests (Python 3.13) (push) Waiting to run
Test / Offline Coverage Tests (Python 3.9) (push) Waiting to run
Test / Full Coverage (Python 3.11) (push) Waiting to run
Test / Core Provider Tests (OpenAI) (push) Blocked by required conditions
Test / Core Provider Tests (Anthropic) (push) Blocked by required conditions
Test / Core Provider Tests (Google) (push) Blocked by required conditions
Test / Core Provider Tests (Other) (push) Blocked by required conditions
Test / Anthropic Tests (push) Blocked by required conditions
Test / Gemini Tests (push) Blocked by required conditions
Test / Google GenAI Tests (push) Blocked by required conditions
Test / Vertex AI Tests (push) Blocked by required conditions
Test / OpenAI Tests (push) Blocked by required conditions
Test / Writer Tests (push) Blocked by required conditions
Test / Auto Client Tests (push) Blocked by required conditions
ty / type-check (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 13:36:38 +08:00

148 lines
4.9 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
Clean markdown files in the docs directory.
This script:
- Recursively finds all .md files in the docs directory
- Strips special whitespace characters (non-breaking spaces, zero-width spaces, etc.)
- Replaces em dashes (—) with regular dashes (-)
- Preserves the original file structure
"""
import re
import unicodedata
from pathlib import Path
def clean_markdown_content(content: str) -> str:
"""
Clean markdown content by removing special whitespace and replacing em dashes.
Args:
content: The original markdown content
Returns:
The cleaned markdown content
"""
# Replace em dashes with regular dashes
content = content.replace("—", "-")
content = content.replace("", "-") # en dash as well
# Remove special whitespace characters
# This includes non-breaking spaces, zero-width spaces, and other Unicode whitespace
cleaned_lines = []
for line in content.split("\n"):
# Normalize Unicode characters and remove special whitespace
cleaned_line = unicodedata.normalize("NFKC", line)
# Remove zero-width characters and other special whitespace
cleaned_line = re.sub(r"[\u200B\u200C\u200D\uFEFF]", "", cleaned_line)
# Replace non-breaking spaces with regular spaces
cleaned_line = cleaned_line.replace("\u00a0", " ")
# Strip leading/trailing whitespace but preserve intentional indentation
cleaned_line = cleaned_line.rstrip()
cleaned_lines.append(cleaned_line)
return "\n".join(cleaned_lines)
def process_markdown_files(docs_dir: str = "docs", dry_run: bool = False) -> None:
"""
Process all markdown files in the docs directory.
Args:
docs_dir: Path to the docs directory (default: "docs")
dry_run: If True, show what would be changed without modifying files
"""
docs_path = Path(docs_dir)
if not docs_path.exists():
print(f"Error: Directory '{docs_dir}' does not exist.")
return
if not docs_path.is_dir():
print(f"Error: '{docs_dir}' is not a directory.")
return
# Find all markdown files recursively
md_files = list(docs_path.rglob("*.md"))
if not md_files:
print(f"No markdown files found in '{docs_dir}' directory.")
return
mode_text = "DRY RUN - " if dry_run else ""
print(f"{mode_text}Found {len(md_files)} markdown files to process...")
processed_count = 0
modified_count = 0
for md_file in md_files:
try:
# Read the original content
with open(md_file, encoding="utf-8") as f:
original_content = f.read()
# Clean the content
cleaned_content = clean_markdown_content(original_content)
# Check if content was modified
if cleaned_content != original_content:
if dry_run:
print(f"Would modify: {md_file}")
# Show a sample of the changes
original_lines = original_content.split("\n")
cleaned_lines = cleaned_content.split("\n")
for i, (orig, clean) in enumerate(
zip(original_lines, cleaned_lines)
):
if orig != clean:
print(f" Line {i + 1}:")
print(f" Original: {repr(orig)}")
print(f" Cleaned: {repr(clean)}")
# Only show first difference per file
break
else:
# Write the cleaned content back to the file
with open(md_file, "w", encoding="utf-8") as f:
f.write(cleaned_content)
print(f"Modified: {md_file}")
modified_count += 1
else:
if not dry_run:
print(f"No changes needed: {md_file}")
processed_count += 1
except Exception as e:
print(f"Error processing {md_file}: {e}")
action_text = "would be" if dry_run else "were"
print(f"\nProcessing complete!")
print(f"Total files processed: {processed_count}")
print(f"Files {action_text} modified: {modified_count}")
def main():
"""Main function to handle command line arguments."""
import argparse
parser = argparse.ArgumentParser(
description="Clean markdown files by removing special whitespace and replacing em dashes"
)
parser.add_argument(
"--docs-dir", default="docs", help="Path to docs directory (default: docs)"
)
parser.add_argument(
"--dry-run",
action="store_true",
help="Show what would be changed without modifying files",
)
args = parser.parse_args()
process_markdown_files(docs_dir=args.docs_dir, dry_run=args.dry_run)
if __name__ == "__main__":
main()