generate_readme_index.sh (1530B)
1 #!/usr/bin/env bash 2 set -euo pipefail 3 4 README_FILE="${1:-README.md}" 5 6 if [[ ! -f "${README_FILE}" ]]; then 7 echo "README file not found: ${README_FILE}" >&2 8 exit 1 9 fi 10 11 python3 - "$README_FILE" <<'PY' 12 import sys 13 import re 14 from pathlib import Path 15 16 readme_path = Path(sys.argv[1]) 17 text = readme_path.read_text(encoding="utf-8") 18 19 lines = text.splitlines() 20 dash_lines = [idx for idx, line in enumerate(lines) if line.strip() == '---'] 21 if len(dash_lines) < 2: 22 raise SystemExit("Expected at least two lines containing only '---' in README") 23 24 heading_pattern = re.compile(r'^(#{2,3})\s+(.*)$', re.MULTILINE) 25 headings = [] 26 for match in heading_pattern.finditer(text): 27 level = len(match.group(1)) 28 title = match.group(2).strip() 29 if not title: 30 continue 31 slug = title.lower() 32 slug = re.sub(r'[^a-z0-9\s-]', '', slug) 33 slug = re.sub(r'\s+', '-', slug).strip('-') 34 slug = re.sub(r'-+', '-', slug) 35 if not slug: 36 continue 37 headings.append((level, title, f"#{slug}")) 38 39 index_lines = [] 40 for level, title, anchor in headings: 41 indent = '' if level == 2 else ' ' 42 index_lines.append(f"{indent}- [{title}]({anchor})") 43 44 first, second = dash_lines[:2] 45 result_lines = [] 46 result_lines.extend(lines[:first + 1]) 47 result_lines.append('') 48 if index_lines: 49 result_lines.extend(index_lines) 50 result_lines.append('') 51 result_lines.extend(lines[second:]) 52 53 new_text = "\n".join(result_lines) 54 if not new_text.endswith("\n"): 55 new_text += "\n" 56 57 readme_path.write_text(new_text, encoding="utf-8") 58 PY